00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034 #ifndef _WIN32
00035 #include "config.h"
00036 #else
00037 #include "winconfig.h"
00038 #endif
00039
00040 #ifndef _WIN32
00041 #include <unistd.h>
00042 #include <pthread.h>
00043 #else
00044 #include <windows.h>
00045 #include <memory.h>
00046 #endif
00047 #include <embedch.h>
00048
00049 #include <sys/types.h>
00050 #include <sys/stat.h>
00051 #ifndef _WIN32
00052 #include <sys/time.h>
00053 #else
00054 #include <time.h>
00055 #endif
00056
00057 #include "include/libmc.h"
00058 #include "include/macros.h"
00059 #include "include/mc_platform.h"
00060 #include "include/message.h"
00061 #include "include/data_structures.h"
00062 #include "include/fipa_acl_envelope.h"
00063 #include "include/fipa_acl.h"
00064 #include "include/agent.h"
00065 #include "include/agent_task.h"
00066 #include "include/agent_lib.h"
00067 #ifndef HOST_NAME_MAX
00068 #define HOST_NAME_MAX 255
00069 #endif
00070
00071
00072 mc_platform_p g_mc_platform;
00073
00074
00075
00076
00077
00078 EXPORTMC int
00079 MC_AclDestroy(struct fipa_acl_message_s* message)
00080 {
00081 return fipa_acl_message_Destroy(message);
00082 }
00083
00084 EXPORTMC fipa_acl_message_t*
00085 MC_AclNew(void) {
00086 return fipa_acl_message_New();
00087 }
00088
00089 EXPORTMC int
00090 MC_AclPost(MCAgent_t agent, struct fipa_acl_message_s* message)
00091 {
00092 return agent_mailbox_Post(agent->mailbox, message);
00093 }
00094
00095 EXPORTMC fipa_acl_message_t*
00096 MC_AclReply(fipa_acl_message_t* acl_message)
00097 {
00098 return fipa_Reply(acl_message);
00099 }
00100
00101 EXPORTMC fipa_acl_message_t*
00102 MC_AclRetrieve(MCAgent_t agent)
00103 {
00104 return agent_mailbox_Retrieve(agent->mailbox);
00105 }
00106
00107 EXPORTMC int
00108 MC_AclSend(MCAgency_t attr, fipa_acl_message_t* acl)
00109 {
00110
00111
00112
00113 int i;
00114 int err;
00115 mtp_http_t* msg;
00116 dynstring_t* msg_string;
00117 message_p mc_message;
00118
00119 char* host;
00120 int port;
00121 char* target;
00122 MCAgent_t agent;
00123 int num_addresses = 0;
00124
00125 fipa_acl_message_t* tmp;
00126
00127 err = fipa_acl_Compose(&msg_string, acl);
00128 if( err ) {
00129 fprintf(stderr, "ACL Message Compose Error. %s:%d\n", __FILE__, __LINE__);
00130 return err;
00131 }
00132 for(i = 0; i < acl->receiver->num; i++) {
00133
00134
00135
00136 if (acl->receiver->fipa_agent_identifiers[i]->addresses == NULL) {
00137 num_addresses = 0;
00138 } else {
00139 num_addresses = acl->receiver->fipa_agent_identifiers[i]->addresses->num;
00140 }
00141
00142 if (num_addresses == 0) {
00143 agent = MC_FindAgentByName(
00144 attr,
00145 acl->receiver->fipa_agent_identifiers[i]->name );
00146 if (agent == NULL) {
00147 fprintf(stderr, "Could not find local agent:%s. %s:%d\n",
00148 acl->receiver->fipa_agent_identifiers[i]->name,
00149 __FILE__, __LINE__);
00150 continue;
00151 }
00152 tmp = fipa_acl_message_Copy(acl);
00153 MC_AclPost(agent, tmp);
00154 } else {
00155 msg = mtp_http_New();
00156
00157 err = http_to_hostport(
00158 acl->receiver->fipa_agent_identifiers[i]->addresses->urls[0]->str,
00159 &host,
00160 &port,
00161 &target );
00162 if (err) {
00163 fprintf(stderr, "Invalid address. %s:%d\n", __FILE__, __LINE__);
00164 return err;
00165 }
00166 msg->host = strdup(host);
00167 msg->target = strdup(target);
00168 msg->message_parts = 2;
00169 msg->content = (mtp_http_content_t *)malloc(
00170 sizeof(mtp_http_content_t) * 2);
00171
00172
00173 msg->content[0].data = (void*)fipa_envelope_Compose(acl);
00174
00175 msg->content[0].content_type = strdup("application/xml");
00176
00177
00178 msg->content[1].data = (void*)strdup(msg_string->message);
00179 msg->content[1].content_type = strdup("application/text");
00180
00181 mc_message = mtp_http_CreateMessage(
00182 msg,
00183 host,
00184 port );
00185 mc_message->message_type = FIPA_ACL;
00186 mc_message->target = strdup("acc");
00187
00188 message_Send
00189 (
00190 attr->mc_platform,
00191 mc_message,
00192 attr->mc_platform->private_key
00193 );
00194
00195
00196 mtp_http_Destroy(msg);
00197 free(host);
00198 free(target);
00199 }
00200 }
00201 dynstring_Destroy(msg_string);
00202 return 0;
00203 }
00204
00205 EXPORTMC fipa_acl_message_t*
00206 MC_AclWaitRetrieve(MCAgent_t agent)
00207 {
00208 return agent_mailbox_WaitRetrieve(agent->mailbox);
00209 }
00210
00211
00212
00213 EXPORTMC enum fipa_protocol_e MC_AclGetProtocol(
00214 struct fipa_acl_message_s* acl)
00215 {
00216 return (enum fipa_protocol_e)acl->performative;
00217 }
00218
00219 EXPORTMC char* MC_AclGetConversationID(
00220 struct fipa_acl_message_s* acl)
00221 {
00222 return acl->conversation_id->content.string->content;
00223 }
00224
00225 EXPORTMC enum fipa_performative_e MC_AclGetPerformative(
00226 struct fipa_acl_message_s* acl)
00227 {
00228 return acl->performative;
00229 }
00230
00231 EXPORTMC int MC_AclGetSender(
00232 struct fipa_acl_message_s* acl,
00233 char** name,
00234
00235 char** address
00236
00237 )
00238 {
00239 *name = strdup(acl->sender->name);
00240 *address = strdup( acl->sender->addresses->urls[0]->str );
00241 return 0;
00242 }
00243
00244 EXPORTMC const char* MC_AclGetContent(
00245 struct fipa_acl_message_s* acl)
00246 {
00247 return acl->content->content;
00248 }
00249
00250 EXPORTMC int MC_AclSetProtocol(
00251 fipa_acl_message_t* acl,
00252 enum fipa_protocol_e protocol)
00253 {
00254 if(protocol <= FIPA_PROTOCOL_ERROR ||
00255 protocol >= FIPA_PROTOCOL_END)
00256 {
00257 fprintf(stderr,
00258 "AclSetProtocol: Incorrect protocol. %s:%d\n",
00259 __FILE__, __LINE__);
00260 return -1;
00261 }
00262 acl->protocol = protocol;
00263 return 0;
00264 }
00265
00266 EXPORTMC int MC_AclSetConversationID(
00267 fipa_acl_message_t* acl,
00268 char* id)
00269 {
00270
00271 if(!id)
00272 {
00273 fprintf(stderr,
00274 "AclSetConversationID: NULL id string. %s:%d\n",
00275 __FILE__, __LINE__);
00276 return -1;
00277 }
00278 acl->conversation_id = fipa_expression_New();
00279 acl->conversation_id->type = FIPA_EXPR_STRING;
00280 acl->conversation_id->content.string = fipa_string_New();
00281 acl->conversation_id->content.string->content = strdup(id);
00282 return 0;
00283 }
00284
00285 EXPORTMC int MC_AclSetPerformative(
00286 fipa_acl_message_t* acl,
00287 enum fipa_performative_e performative )
00288 {
00289 acl->performative = performative;
00290 return 0;
00291 }
00292
00293 EXPORTMC int MC_AclSetSender(
00294 fipa_acl_message_t* acl,
00295 const char* name,
00296 const char* address )
00297 {
00298 if(acl->sender != NULL) {
00299
00300 fipa_agent_identifier_Destroy(acl->sender);
00301 }
00302 acl->sender = fipa_agent_identifier_New();
00303 acl->sender->name = strdup(name);
00304 if (address != NULL) {
00305 acl->sender->addresses = fipa_url_sequence_New();
00306 acl->sender->addresses->num = 1;
00307 acl->sender->addresses->urls = (struct fipa_url_s**)malloc(
00308 sizeof(struct fipa_url_s*));
00309 acl->sender->addresses->urls[0] = fipa_url_New();
00310 acl->sender->addresses->urls[0]->str = strdup(address);
00311 }
00312
00313 return 0;
00314 }
00315
00316 EXPORTMC int MC_AclAddReceiver(
00317 fipa_acl_message_t* acl,
00318 const char* name,
00319 const char* address )
00320 {
00321 int i;
00322 struct fipa_agent_identifier_s** tmp;
00323 if (acl->receiver == NULL) {
00324 acl->receiver = fipa_agent_identifier_set_New();
00325 }
00326 acl->receiver_num++;
00327
00328 acl->receiver->num++;
00329 tmp = (struct fipa_agent_identifier_s**)malloc(
00330 sizeof(struct fipa_agent_identifier_s*)
00331 * acl->receiver->num);
00332
00333 for(i = 0; i < acl->receiver->num-1; i++) {
00334 tmp[i] = acl->receiver->fipa_agent_identifiers[i];
00335 }
00336
00337 tmp[i] = fipa_agent_identifier_New();
00338 tmp[i]->name = strdup(name);
00339 if(address != NULL) {
00340 tmp[i]->addresses = fipa_url_sequence_New();
00341 tmp[i]->addresses->num = 1;
00342 tmp[i]->addresses->urls = (struct fipa_url_s**)malloc(
00343 sizeof(struct fipa_url_s*));
00344 tmp[i]->addresses->urls[0] = fipa_url_New();
00345 tmp[i]->addresses->urls[0]->str = strdup(address);
00346 }
00347 free(acl->receiver->fipa_agent_identifiers);
00348 acl->receiver->fipa_agent_identifiers = tmp;
00349 return 0;
00350 }
00351
00352 EXPORTMC int MC_AclAddReplyTo(
00353 fipa_acl_message_t* acl,
00354 const char* name,
00355 const char* address)
00356 {
00357 int i;
00358 struct fipa_agent_identifier_s** tmp;
00359 if (acl->reply_to == NULL) {
00360 acl->reply_to = fipa_agent_identifier_set_New();
00361 }
00362
00363 acl->reply_to->num++;
00364 tmp = (struct fipa_agent_identifier_s**)malloc(
00365 sizeof(struct fipa_agent_identifier_s*)
00366 * acl->reply_to->num);
00367
00368 for(i = 0; i < acl->reply_to->num-1; i++) {
00369 tmp[i] = acl->reply_to->fipa_agent_identifiers[i];
00370 }
00371
00372 tmp[i] = fipa_agent_identifier_New();
00373 tmp[i]->name = strdup(name);
00374 if(address != NULL) {
00375 tmp[i]->addresses = fipa_url_sequence_New();
00376 tmp[i]->addresses->num = 1;
00377 tmp[i]->addresses->urls = (struct fipa_url_s**)malloc(
00378 sizeof(struct fipa_url_s*));
00379 tmp[i]->addresses->urls[0] = fipa_url_New();
00380 tmp[i]->addresses->urls[0]->str = strdup(address);
00381 }
00382 free (acl->reply_to->fipa_agent_identifiers);
00383 acl->reply_to->fipa_agent_identifiers = tmp;
00384 return 0;
00385 }
00386
00387 EXPORTMC int MC_AclSetContent(
00388 fipa_acl_message_t* acl,
00389 const char* content )
00390 {
00391 if (acl->content != NULL) {
00392
00393 fipa_string_Destroy(acl->content);
00394 }
00395 acl->content = fipa_string_New();
00396 acl->content->content = strdup(content);
00397
00398 return 0;
00399 }
00400
00401
00402
00403 EXPORTMC int
00404 MC_AddAgent(MCAgency_t attr, MCAgent_t agent)
00405 {
00406 agent->mc_platform = attr->mc_platform;
00407
00408 agent_queue_Add(attr->mc_platform->agent_queue, agent);
00409
00410 MUTEX_LOCK(attr->mc_platform->ams->runflag_lock);
00411 attr->mc_platform->ams->run = 1;
00412 COND_SIGNAL(attr->mc_platform->ams->runflag_cond);
00413 MUTEX_UNLOCK(attr->mc_platform->ams->runflag_lock);
00414 return 0;
00415 }
00416
00417 EXPORTMC int MC_AddStationaryAgent(
00418 MCAgency_t agency,
00419 void* (*agent_thread)(stationary_agent_info_t*),
00420 const char* name,
00421 void* agent_args)
00422 {
00423 #ifndef _WIN32
00424 pthread_attr_t attr;
00425 pthread_attr_init(&attr);
00426 #else
00427 int stack_size = 0;
00428 #endif
00429 stationary_agent_info_t* stationary_agent_info;
00430 stationary_agent_info = (stationary_agent_info_t*)malloc(sizeof(stationary_agent_info_t));
00431 stationary_agent_info->args = agent_args;
00432 stationary_agent_info->agent = agent_NewBinary(agency->mc_platform);
00433 stationary_agent_info->agent->name = strdup(name);
00434 stationary_agent_info->attr = agency;
00435 stationary_agent_info->agency = agency;
00436 agent_queue_Add(agency->mc_platform->agent_queue, stationary_agent_info->agent);
00437 #ifndef _WIN32
00438 THREAD_CREATE(&stationary_agent_info->thread, agent_thread, stationary_agent_info);
00439 #else
00440 THREAD_CREATE(&stationary_agent_info->thread, (LPTHREAD_START_ROUTINE)agent_thread, stationary_agent_info);
00441 #endif
00442 return 0;
00443 }
00444
00445 EXPORTMC MCAgency_t MC_AgentInfo_GetAgency(stationary_agent_info_t* stationary_agent_info)
00446 {
00447 return stationary_agent_info->agency;
00448 }
00449
00450 EXPORTMC MCAgent_t MC_AgentInfo_GetAgent(stationary_agent_info_t* stationary_agent_info)
00451 {
00452 return stationary_agent_info->agent;
00453 }
00454
00455 EXPORTMC void* MC_AgentInfo_GetAgentArgs(stationary_agent_info_t* stationary_agent_info)
00456 {
00457 return stationary_agent_info->args;
00458 }
00459
00460 EXPORTMC int MC_AgentAddTask(
00461 MCAgent_t agent,
00462 const char* code,
00463 const char* return_var_name,
00464 const char* server,
00465 int persistent)
00466 {
00467 int new_num_tasks;
00468 int num_code_ids;
00469 int i, j;
00470 agent->datastate->number_of_tasks++;
00471 new_num_tasks = agent->datastate->number_of_tasks;
00472
00473
00474
00475 for(num_code_ids = 0;
00476 agent->datastate->agent_code_ids[num_code_ids] != NULL;
00477 num_code_ids++);
00478
00479 agent->datastate->agent_code_ids = (char**)realloc(
00480 agent->datastate->agent_code_ids,
00481 sizeof(char*)*(num_code_ids + 2));
00482 agent->datastate->agent_code_ids[num_code_ids] = NULL;
00483 agent->datastate->agent_code_ids[num_code_ids+1] = NULL;
00484 if(agent->datastate->agent_code_ids == NULL) {
00485 fprintf(stderr, "Memory Error %s:%d\n", __FILE__, __LINE__);
00486 }
00487
00488
00489
00490 for(i = 0; agent->datastate->agent_code_ids[i] != NULL; i++) {
00491 if(strlen(agent->datastate->agent_code_ids[i]) == 0) {
00492 free(agent->datastate->agent_code_ids[i]);
00493 agent->datastate->agent_code_ids[i] = (char*)malloc(sizeof(char)*20);
00494 sprintf(agent->datastate->agent_code_ids[i], "code%d", rand());
00495 for(j = 0; j < agent->datastate->number_of_tasks-1; j++) {
00496 if (agent->datastate->tasks[j]->code_id == NULL) {
00497 agent->datastate->tasks[j]->code_id = strdup(agent->datastate->agent_code_ids[i]);
00498 }
00499 }
00500 break;
00501 }
00502 }
00503
00504
00505 agent->datastate->agent_code_ids[num_code_ids] = (char*)malloc(sizeof(char)*20);
00506 sprintf(agent->datastate->agent_code_ids[num_code_ids], "code%d", rand());
00507
00508
00509 agent->datastate->agent_codes = (char**)realloc(
00510 agent->datastate->agent_codes,
00511 sizeof(char*)*(num_code_ids + 2));
00512 agent->datastate->agent_codes[num_code_ids] = NULL;
00513 agent->datastate->agent_codes[num_code_ids+1] = NULL;
00514 agent->datastate->agent_codes[num_code_ids] = strdup(code);
00515
00516
00517 agent->datastate->tasks = (agent_task_t**)realloc(
00518 agent->datastate->tasks,
00519 sizeof(agent_task_t*) * new_num_tasks );
00520 agent->datastate->tasks[new_num_tasks-1] = agent_task_New();
00521 if(return_var_name == NULL) {
00522 agent->datastate->tasks[new_num_tasks-1]->var_name = strdup("no-return");
00523 } else {
00524 agent->datastate->tasks[new_num_tasks-1]->var_name = strdup(return_var_name);
00525 }
00526 agent->datastate->tasks[new_num_tasks-1]->server_name = strdup(server);
00527 agent->datastate->tasks[new_num_tasks-1]->persistent = persistent;
00528 agent->datastate->tasks[new_num_tasks-1]->code_id =
00529 strdup(agent->datastate->agent_code_ids[num_code_ids]);
00530 return 0;
00531 }
00532
00533 EXPORTMC int MC_AgentAddTaskFromFile(
00534 MCAgent_t agent,
00535 const char* filename,
00536 const char* return_var_name,
00537 const char* server,
00538 int persistent)
00539 {
00540 struct stat buffer;
00541 char *code;
00542 int codesize;
00543 FILE* fptr;
00544 int return_val;
00545 if(stat(filename, &buffer)) {
00546
00547 fprintf(stderr, "MC_AgentAddTaskFromFile failed. File %s does not exist.\n",
00548 filename);
00549 return -1;
00550 }
00551 codesize = buffer.st_size;
00552 code = (char *)malloc((codesize+1)*sizeof(char));
00553 memset(code, 0, codesize+1);
00554 fptr = fopen(filename, "r");
00555 fread(code, sizeof(char), codesize, fptr);
00556 fclose(fptr);
00557 return_val = MC_AgentAddTask(
00558 agent,
00559 code,
00560 return_var_name,
00561 server,
00562 persistent );
00563 free(code);
00564 return return_val;
00565 }
00566
00567 EXPORTMC int MC_AgentReturnArrayExtent(
00568 MCAgent_t agent,
00569 int task_num,
00570 int index )
00571 {
00572 if (task_num >= agent->datastate->number_of_tasks) {
00573 return -1;
00574 }
00575
00576 if (
00577 agent->datastate->tasks[task_num]->
00578 agent_return_data->data_type == -1
00579 )
00580 {
00581 return -1;
00582 }
00583
00584 if (index >= agent->datastate->tasks[task_num]->agent_return_data->array_dim) {
00585 return -1;
00586 }
00587
00588 return agent->datastate->tasks[task_num]->agent_return_data->array_extent[index];
00589 }
00590
00591 EXPORTMC int MC_AgentReturnArrayDim(
00592 MCAgent_t agent,
00593 int task_num )
00594 {
00595 if (task_num >= agent->datastate->number_of_tasks) {
00596 return -1;
00597 }
00598
00599 if (
00600 agent->datastate->tasks[task_num]->
00601 agent_return_data->data_type == -1
00602 )
00603 {
00604 return -1;
00605 }
00606 return agent->datastate->tasks[task_num]->agent_return_data->array_dim;
00607 }
00608
00609 EXPORTMC int MC_AgentReturnArrayNum(
00610 MCAgent_t agent,
00611 int task_num )
00612 {
00613 int num_elements, i;
00614 if (task_num >= agent->datastate->number_of_tasks) {
00615 return -1;
00616 }
00617
00618 if (
00619 agent->datastate->tasks[task_num]->
00620 agent_return_data->data_type == -1
00621 )
00622 {
00623 return -1;
00624 }
00625
00626 num_elements = 1;
00627 for (
00628 i = 0;
00629 i < agent->datastate->tasks[task_num]->agent_return_data->array_dim;
00630 i++
00631 )
00632 {
00633 num_elements *= agent->datastate->
00634 tasks[task_num]->agent_return_data->array_extent[i];
00635 }
00636 return num_elements;
00637 }
00638
00639 EXPORTMC const void* MC_AgentReturnDataGetSymbolAddr(
00640 MCAgent_t agent,
00641 int task_num )
00642 {
00643 if (task_num >= agent->datastate->number_of_tasks) {
00644 return NULL;
00645 }
00646 if (
00647 agent->datastate->tasks[task_num]->
00648 agent_return_data->data_type == -1
00649 )
00650 {
00651 return NULL;
00652 }
00653 return agent->datastate->tasks[task_num]->agent_return_data->data;
00654 }
00655
00656 EXPORTMC size_t MC_AgentReturnDataSize(
00657 MCAgent_t agent,
00658 int task_num )
00659 {
00660 int size;
00661 if (task_num >= agent->datastate->number_of_tasks) {
00662 return -1;
00663 }
00664
00665 if (
00666 agent->datastate->tasks[task_num]->
00667 agent_return_data->data_type == -1
00668 )
00669 {
00670 return -1;
00671 }
00672
00673 CH_DATATYPE_SIZE(
00674 agent->datastate->tasks[task_num]->agent_return_data->data_type,
00675 size);
00676 return size;
00677 }
00678
00679 EXPORTMC int MC_AgentReturnDataType(
00680 MCAgent_t agent,
00681 int task_num )
00682 {
00683 if (task_num >= agent->datastate->number_of_tasks) {
00684 return -1;
00685 }
00686 return agent->datastate->tasks[task_num]->agent_return_data->data_type;
00687 }
00688
00689 EXPORTMC int MC_AgentReturnIsArray(
00690 MCAgent_t agent,
00691 int task_num )
00692 {
00693 if (task_num >= agent->datastate->number_of_tasks) {
00694 return -1;
00695 }
00696 if (
00697 agent->datastate->tasks[task_num]->
00698 agent_return_data->data_type == -1
00699 )
00700 {
00701 return -1;
00702 }
00703 if(agent->datastate->tasks[task_num]->agent_return_data->array_dim) {
00704 return 1;
00705 } else {
00706 return 0;
00707 }
00708 }
00709
00710 EXPORTMC const void* MC_AgentVariableRetrieve(MCAgent_t agent, const char* var_name, int task_num)
00711 {
00712 interpreter_variable_data_t* interp_var;
00713
00714 if (task_num > agent->datastate->task_progress) {
00715 return NULL;
00716 }
00717
00718 interp_var = agent_variable_list_Search(
00719 agent->datastate->tasks[task_num]->agent_variable_list,
00720 var_name );
00721 if (interp_var == NULL) {
00722 return NULL;
00723 }
00724
00725 return interp_var->data;
00726 }
00727
00728 EXPORTMC int MC_AgentVariableRetrieveInfo(MCAgent_t agent, const char* var_name, int task_num, const void** data, int* dim, const int** extent)
00729 {
00730 interpreter_variable_data_t* interp_var;
00731
00732 if (task_num >= agent->datastate->task_progress) {
00733 return MC_ERR_NOT_FOUND;
00734 }
00735
00736 interp_var = agent_variable_list_Search(
00737 agent->datastate->tasks[task_num]->agent_variable_list,
00738 var_name );
00739 if (interp_var == NULL) {
00740 return MC_ERR_NOT_FOUND;
00741 }
00742 *data = interp_var->data;
00743 *dim = interp_var->array_dim;
00744 *extent = interp_var->array_extent;
00745
00746 return MC_SUCCESS;
00747 }
00748
00749 EXPORTMC int MC_AgentVariableSave(MCAgent_t agent, const char* var_name)
00750 {
00751 int current_task = agent->datastate->task_progress;
00752 const int default_num_vars = 50;
00753 agent_task_p task = agent->datastate->tasks[current_task];
00754
00755 if(task->num_saved_variables == 0) {
00756 task->saved_variables = (char**)malloc(sizeof(char*)*default_num_vars);
00757 memset(task->saved_variables, 0, sizeof(char*)*default_num_vars);
00758 }
00759 task->saved_variables[task->num_saved_variables] = strdup(var_name);
00760 if(task->saved_variables[task->num_saved_variables] == NULL) {
00761 fprintf(stderr, "Memory error. %s:%d\n", __FILE__, __LINE__);
00762 return MC_ERR_MEMORY;
00763 }
00764 task->num_saved_variables++;
00765
00766 return 0;
00767 }
00768
00769 EXPORTMC int
00770 MC_Barrier(MCAgency_t attr, int id)
00771 {
00772 barrier_queue_p list = attr->mc_platform->barrier_queue;
00773 barrier_node_p node;
00774 node = barrier_queue_Get(list, id);
00775 if(node == NULL) {
00776 return MC_ERR_NOT_FOUND;
00777 }
00778
00779 MUTEX_LOCK(node->lock);
00780 node->num_waiting++;
00781 if (node->num_waiting >= node->num_registered) {
00782
00783 COND_BROADCAST(node->cond);
00784 MUTEX_UNLOCK(node->lock);
00785 return MC_SUCCESS;
00786 } else {
00787 while (node->num_waiting < node->num_registered) {
00788 COND_WAIT(node->cond, node->lock);
00789 }
00790 MUTEX_UNLOCK(node->lock);
00791 }
00792 return MC_SUCCESS;
00793 }
00794
00795 EXPORTMC int
00796 MC_BarrierInit(MCAgency_t attr, int id, int num_procs)
00797 {
00798 barrier_node_p node;
00799
00800 node = barrier_queue_Get(attr->mc_platform->barrier_queue, id);
00801 if (node != NULL) {
00802 return MC_ERR;
00803 }
00804 node = barrier_node_Initialize(id, num_procs);
00805 barrier_queue_Add(attr->mc_platform->barrier_queue, node);
00806 return MC_SUCCESS;
00807 }
00808
00809 EXPORTMC int
00810 MC_BarrierDelete(MCAgency_t attr, int id)
00811 {
00812 return barrier_queue_Delete(id, attr->mc_platform->barrier_queue);
00813 }
00814
00815 EXPORTMC int
00816 MC_CallAgentFunc(
00817 MCAgent_t agent,
00818 const char* funcName,
00819 void* returnVal,
00820 int numArgs,
00821 ...)
00822 {
00823 int return_code;
00824 va_list vl;
00825 va_start(vl, numArgs);
00826 MUTEX_LOCK(agent->run_lock);
00827 return_code = Ch_CallFuncByNamev(
00828 *agent->agent_interp,
00829 funcName,
00830 returnVal,
00831 vl );
00832 MUTEX_UNLOCK(agent->run_lock);
00833 return return_code;
00834 }
00835
00836 EXPORTMC int
00837 MC_CallAgentFuncArg(
00838 MCAgent_t agent,
00839 const char* funcName,
00840 void* returnVal,
00841 void* arg)
00842 {
00843 int return_code;
00844
00845 MUTEX_LOCK(agent->run_lock);
00846 return_code = Ch_CallFuncByName(
00847 agent->agent_interp,
00848 funcName,
00849 returnVal,
00850 arg);
00851 MUTEX_UNLOCK(agent->run_lock);
00852 return return_code;
00853 }
00854
00855 EXPORTMC int
00856 MC_CallAgentFuncV(
00857 MCAgent_t agent,
00858 const char* funcName,
00859 void* returnVal,
00860 va_list ap)
00861 {
00862 int return_code;
00863 MUTEX_LOCK(agent->run_lock);
00864 return_code = Ch_CallFuncByNamev
00865 (
00866 agent->agent_interp,
00867 funcName,
00868 returnVal,
00869 ap
00870 );
00871 MUTEX_UNLOCK(agent->run_lock);
00872 return return_code;
00873 }
00874
00875 EXPORTMC int
00876 MC_CallAgentFuncVar(
00877 MCAgent_t agent,
00878 const char* funcName,
00879 void* returnVal,
00880 ChVaList_t varg)
00881 {
00882 int return_code;
00883 MUTEX_LOCK(agent->run_lock);
00884 return_code = Ch_CallFuncByNameVar
00885 (
00886 *agent->agent_interp,
00887 funcName,
00888 returnVal,
00889 varg
00890 );
00891 MUTEX_UNLOCK(agent->run_lock);
00892 return return_code;
00893 }
00894
00895 #ifdef OBS
00896 EXPORTMC int
00897 MC_ChInitializeOptions(MCAgency_t attr, ChOptions_t *options) {
00898 if(attr->mc_platform == NULL) {
00899 fprintf(stderr, "MC_ChInitializeOptions must be called after MC_Start()\n");
00900 fprintf(stderr, "Using default interpretor options...\n");
00901 return 1;
00902 }
00903 else {
00904 if (attr->mc_platform->interp_options == NULL) {
00905 attr->mc_platform->interp_options = (ChOptions_t*)malloc(
00906 sizeof(ChOptions_t) );
00907 }
00908 *attr->mc_platform->interp_options = *options;
00909 attr->mc_platform->interp_options->chhome = strdup(options->chhome);
00910 return 0;
00911 }
00912 }
00913 #endif
00914
00915 EXPORTMC MCAgent_t
00916 MC_ComposeAgent(
00917 const char* name,
00918 const char* home,
00919 const char* owner,
00920 const char* code,
00921 const char* return_var_name,
00922 const char* server,
00923 int persistent
00924 )
00925 {
00926 return MC_ComposeAgentWithWorkgroup(
00927 name,
00928 home,
00929 owner,
00930 code,
00931 return_var_name,
00932 server,
00933 persistent,
00934 NULL
00935 );
00936 }
00937
00938 EXPORTMC MCAgent_t
00939 MC_ComposeAgentS(
00940 const char* name,
00941 const char* home,
00942 const char* owner,
00943 const char* code,
00944 const char* return_var_name,
00945 const char* server,
00946 int persistent,
00947 const char* workgroup_code
00948 )
00949 {
00950 printf("\nThe MC_ComposeAgentS function is now deprecated due to its\n\
00951 misleading name. Please use the MC_ComposeAgentWithWorkgroup() function\n\
00952 instead.\n");
00953 return MC_ComposeAgentWithWorkgroup(
00954 name,
00955 home,
00956 owner,
00957 code,
00958 return_var_name,
00959 server,
00960 persistent,
00961 workgroup_code );
00962 }
00963
00964 EXPORTMC MCAgent_t
00965 MC_ComposeAgentWithWorkgroup(
00966 const char* name,
00967 const char* home,
00968 const char* owner,
00969 const char* code,
00970 const char* return_var_name,
00971 const char* server,
00972 int persistent,
00973 const char* workgroup_code
00974 )
00975 {
00976 agent_p agent;
00977 agent = agent_New();
00978 if (agent == NULL) return NULL;
00979 agent->name = strdup(name);
00980 agent->home = strdup(home);
00981 agent->owner = strdup(owner);
00982
00983 agent->orphan = 1;
00984
00985 agent->agent_type = MC_LOCAL_AGENT;
00986 agent->agent_status = MC_WAIT_MESSGSEND;
00987
00988 agent->datastate = agent_datastate_New();
00989 agent->datastate->number_of_tasks = 1;
00990 agent->datastate->agent_code_ids = (char**)malloc(
00991 sizeof(char*)*2);
00992 if(agent->datastate->agent_code_ids == NULL) {
00993 fprintf(stderr, "Memory Error %s:%d\n", __FILE__, __LINE__);
00994 }
00995 agent->datastate->agent_code_ids[0] = strdup("");
00996 if(agent->datastate->agent_code_ids[0] == NULL) {
00997 fprintf(stderr, "Memory Error %s:%d\n", __FILE__, __LINE__);
00998 }
00999 agent->datastate->agent_code_ids[1] = NULL;
01000
01001 agent->datastate->agent_codes = (char**)malloc(
01002 sizeof(char*)*2);
01003 if(agent->datastate->agent_codes == NULL) {
01004 fprintf(stderr, "Memory Error %s:%d\n", __FILE__, __LINE__);
01005 }
01006 agent->datastate->agent_codes[0] = strdup(code);
01007 if(agent->datastate->agent_codes[0] == NULL) {
01008 fprintf(stderr, "Memory Error %s:%d\n", __FILE__, __LINE__);
01009 }
01010 agent->datastate->agent_codes[1] = NULL;
01011
01012 agent->datastate->agent_code = agent->datastate->agent_codes[0];
01013
01014 agent->datastate->tasks = (agent_task_t**)malloc(
01015 sizeof(agent_task_t*));
01016 agent->datastate->tasks[0] = agent_task_New();
01017 if(return_var_name == NULL) {
01018 agent->datastate->tasks[0]->var_name = strdup("no-return");
01019 } else {
01020 agent->datastate->tasks[0]->var_name = strdup(return_var_name);
01021 }
01022 if(agent->datastate->tasks[0]->var_name == NULL) {
01023 fprintf(stderr, "Memory Error %s:%d\n", __FILE__, __LINE__);
01024 }
01025
01026 agent->datastate->tasks[0]->server_name = strdup(server);
01027 if(agent->datastate->tasks[0]->server_name == NULL) {
01028 fprintf(stderr, "Memory Error %s:%d\n", __FILE__, __LINE__);
01029 }
01030
01031 if(workgroup_code != NULL) {
01032 agent->wg_code = strdup(workgroup_code);
01033 if (agent->wg_code == NULL) {
01034 fprintf(stderr, "Memory Error %s:%d\n", __FILE__, __LINE__);
01035 }
01036 }
01037 agent->datastate->tasks[0]->persistent = persistent;
01038
01039 return agent;
01040 }
01041
01042 EXPORTMC MCAgent_t MC_ComposeAgentFromFile(
01043 const char* name,
01044 const char* home,
01045 const char* owner,
01046 const char* filename,
01047 const char* return_var_name,
01048 const char* server,
01049 int persistent
01050 )
01051 {
01052 return MC_ComposeAgentFromFileWithWorkgroup(
01053 name,
01054 home,
01055 owner,
01056 filename,
01057 return_var_name,
01058 server,
01059 persistent,
01060 NULL
01061 );
01062 }
01063
01064 EXPORTMC MCAgent_t MC_ComposeAgentFromFileS(
01065 const char* name,
01066 const char* home,
01067 const char* owner,
01068 const char* filename,
01069 const char* return_var_name,
01070 const char* server,
01071 int persistent,
01072 const char* workgroup_code
01073 )
01074 {
01075 printf("\nThe MC_ComposeAgentFromFileS() function is deprecated due to \n\
01076 its misleading name. Please use the MC_ComposeAgentFromFileWithWorkgroup\n\
01077 function instead.\n");
01078 return MC_ComposeAgentFromFileWithWorkgroup(
01079 name,
01080 home,
01081 owner,
01082 filename,
01083 return_var_name,
01084 server,
01085 persistent,
01086 workgroup_code);
01087 }
01088
01089 EXPORTMC MCAgent_t MC_ComposeAgentFromFileWithWorkgroup(
01090 const char* name,
01091 const char* home,
01092 const char* owner,
01093 const char* filename,
01094 const char* return_var_name,
01095 const char* server,
01096 int persistent,
01097 const char* workgroup_code
01098 )
01099 {
01100 MCAgent_t agent;
01101 struct stat buffer;
01102 char *code;
01103 int codesize;
01104 FILE* fptr;
01105
01106 if(stat(filename, &buffer)) {
01107
01108 return NULL;
01109 }
01110 codesize = buffer.st_size;
01111 code = (char *)malloc((codesize+1)*sizeof(char));
01112 memset(code, 0, codesize+1);
01113 fptr = fopen(filename, "r");
01114 fread(code, sizeof(char), codesize, fptr);
01115 fclose(fptr);
01116
01117 agent = MC_ComposeAgentWithWorkgroup(
01118 name,
01119 home,
01120 owner,
01121 code,
01122 return_var_name,
01123 server,
01124 persistent,
01125 workgroup_code
01126 );
01127 free(code);
01128
01129 return agent;
01130 }
01131
01132 EXPORTMC int
01133 MC_CondBroadcast(MCAgency_t attr, int id)
01134 {
01135 syncListNode_t *condnode;
01136 condnode = syncListFind(id, attr->mc_platform->syncList);
01137 if (condnode == NULL) {
01138 return MC_ERR_NOT_FOUND;
01139 }
01140 MUTEX_LOCK(condnode->lock);
01141 condnode->signalled=1;
01142 COND_BROADCAST(condnode->cond);
01143 MUTEX_UNLOCK(condnode->lock);
01144 return 0;
01145 }
01146
01147 EXPORTMC int
01148 MC_CondSignal(MCAgency_t attr, int id)
01149 {
01150 syncListNode_t *condnode;
01151 condnode = syncListFind(id, attr->mc_platform->syncList);
01152 if (condnode == NULL) {
01153 return MC_ERR_NOT_FOUND;
01154 }
01155 MUTEX_LOCK(condnode->lock);
01156 condnode->signalled=1;
01157 COND_SIGNAL(condnode->cond);
01158 MUTEX_UNLOCK(condnode->lock);
01159 return 0;
01160 }
01161
01162 EXPORTMC int
01163 MC_CondWait(MCAgency_t attr, int id)
01164 {
01165 syncListNode_t *condnode;
01166 condnode = syncListFind(id, attr->mc_platform->syncList);
01167 if (condnode == NULL) {
01168 return MC_ERR_NOT_FOUND;
01169 }
01170 MUTEX_LOCK(condnode->lock);
01171 if (condnode->signalled) {
01172 MUTEX_UNLOCK(condnode->lock);
01173 return 1;
01174 }
01175
01176 while (condnode->signalled == 0) {
01177 COND_WAIT(condnode->cond, condnode->lock);
01178 }
01179 MUTEX_UNLOCK(condnode->lock);
01180
01181 return 0;
01182 }
01183
01184 EXPORTMC int
01185 MC_CondReset(MCAgency_t attr, int id)
01186 {
01187 syncListNode_t *condnode;
01188 condnode = syncListFind(id, attr->mc_platform->syncList);
01189 if (condnode == NULL) {
01190 return MC_ERR_NOT_FOUND;
01191 }
01192 MUTEX_LOCK(condnode->lock);
01193 if (condnode->signalled) {
01194 condnode->signalled = 0;
01195 MUTEX_UNLOCK(condnode->lock);
01196 return 0;
01197 }
01198 MUTEX_UNLOCK(condnode->lock);
01199 return 1;
01200 }
01201
01202 EXPORTMC int
01203 MC_CopyAgent(MCAgent_t* agent_out, const MCAgent_t agent_in)
01204 {
01205 *agent_out = agent_Copy(agent_in);
01206 return MC_SUCCESS;
01207 }
01208
01209 EXPORTMC int
01210 MC_DeleteAgent(MCAgent_t agent)
01211 {
01212
01213 CHECK_NULL(agent, return MC_ERR_INVALID;);
01214
01215
01216 if ( agent->wg_code != NULL ) {
01217 return MC_ERR_INVALID_ARGS;
01218 }
01219
01220
01221 MC_TerminateAgent(agent);
01222
01223 return MC_SUCCESS;
01224 }
01225
01226 EXPORTMC int
01227 MC_DeleteAgentWG(MCAgent_t calling_agent, MCAgent_t agent)
01228 {
01229
01230 CHECK_NULL(agent, return MC_ERR_INVALID;);
01231
01232
01233 if (agent->wg_code != NULL) {
01234 if (calling_agent->wg_code == NULL) {
01235 return MC_ERR_INVALID_ARGS;
01236 } else if (strcmp(calling_agent->wg_code, agent->wg_code)) {
01237 return MC_ERR_INVALID_ARGS;
01238 }
01239 }
01240
01241
01242 MC_TerminateAgentWG(calling_agent, agent);
01243
01244 return MC_SUCCESS;
01245 }
01246
01247 EXPORTMC int MC_DestroyServiceSearchResult(
01248 char** agentName,
01249 char** serviceName,
01250 int* agentID,
01251 int numResult)
01252 {
01253 int i;
01254 for(i = 0;i < numResult; i++)
01255 {
01256 free(agentName[i]);
01257 free(serviceName[i]);
01258 }
01259 free(agentName);
01260 free(serviceName);
01261 free(agentID);
01262
01263 return 0;
01264 }
01265
01266 EXPORTMC int
01267 MC_DeregisterService(
01268 MCAgency_t agency,
01269 int agentID,
01270 const char *serviceName)
01271 {
01272 int err_code;
01273
01274 df_request_list_node_t *req_node;
01275 df_deregister_p deregister_data;
01276
01277 req_node = df_request_list_node_New();
01278 req_node->command = (char*)malloc(sizeof(char)*11);
01279
01280 strcpy((char*)req_node->command, "deregister");
01281
01282 deregister_data = (df_deregister_p)malloc(sizeof(df_deregister_t));
01283 deregister_data->agent_id = agentID;
01284 deregister_data->service_name = (char*)serviceName;
01285
01286 req_node->data = deregister_data;
01287
01288 err_code = df_AddRequest(
01289 agency->mc_platform->df,
01290 req_node
01291 );
01292 return err_code;
01293 }
01294
01295 EXPORTMC int
01296 MC_End(MCAgency_t agency)
01297 {
01298
01299
01300
01301
01302 MUTEX_LOCK(agency->mc_platform->quit_lock);
01303 agency->mc_platform->quit = 1;
01304 COND_BROADCAST( agency->mc_platform->quit_cond );
01305 MUTEX_UNLOCK(agency->mc_platform->quit_lock);
01306
01307
01308 if( GET_THREAD_MODE( agency->threads, MC_THREAD_ACC)) {
01309 THREAD_CANCEL( agency->mc_platform->acc->listen_thread );
01310 }
01311
01312
01313 MUTEX_LOCK(agency->mc_platform->connection_queue->lock);
01314 COND_SIGNAL(agency->mc_platform->connection_queue->cond);
01315 MUTEX_UNLOCK(agency->mc_platform->connection_queue->lock);
01316 if( GET_THREAD_MODE( agency->threads, MC_THREAD_ACC)) {
01317 THREAD_JOIN(agency->mc_platform->acc->thread);
01318 }
01319
01320
01321 MUTEX_LOCK(agency->mc_platform->ams->runflag_lock);
01322 COND_SIGNAL(agency->mc_platform->ams->runflag_cond);
01323 MUTEX_UNLOCK(agency->mc_platform->ams->runflag_lock);
01324 if( GET_THREAD_MODE( agency->threads, MC_THREAD_AMS)) {
01325 THREAD_JOIN(agency->mc_platform->ams->thread);
01326 }
01327
01328
01329 MUTEX_LOCK(agency->mc_platform->message_queue->lock);
01330 COND_SIGNAL(agency->mc_platform->message_queue->cond);
01331 MUTEX_UNLOCK(agency->mc_platform->message_queue->lock);
01332 if( GET_THREAD_MODE( agency->threads, MC_THREAD_ACC)) {
01333 THREAD_JOIN(agency->mc_platform->acc->message_handler_thread);
01334 }
01335
01336
01337 MUTEX_LOCK(agency->mc_platform->df->request_list->lock);
01338 COND_SIGNAL(agency->mc_platform->df->request_list->cond);
01339 MUTEX_UNLOCK(agency->mc_platform->df->request_list->lock);
01340 if( GET_THREAD_MODE( agency->threads, MC_THREAD_DF)) {
01341 THREAD_JOIN(agency->mc_platform->df->thread);
01342 }
01343
01344
01345 if( GET_THREAD_MODE( agency->threads, MC_THREAD_CP)) {
01346 THREAD_CANCEL( agency->mc_platform->cmd_prompt->thread );
01347 }
01348
01349 mc_platform_Destroy(agency->mc_platform);
01350
01351 if (agency->hostName)
01352 free(agency->hostName);
01353 free(agency);
01354
01355 return 0;
01356 }
01357
01358 EXPORTMC MCAgent_t
01359 MC_FindAgentByName( MCAgency_t attr,
01360 const char *name)
01361 {
01362 extern mc_platform_p g_mc_platform;
01363 if (attr == NULL) {
01364 return agent_queue_SearchName(g_mc_platform->agent_queue, name);
01365 } else {
01366 return agent_queue_SearchName(attr->mc_platform->agent_queue,
01367 name);
01368 }
01369 }
01370
01371 EXPORTMC MCAgent_t
01372 MC_FindAgentByID( MCAgency_t attr,
01373 int ID)
01374 {
01375 extern mc_platform_p g_mc_platform;
01376 if (attr == NULL) {
01377 return agent_queue_Search(g_mc_platform->agent_queue, ID);
01378 } else {
01379 return agent_queue_Search(attr->mc_platform->agent_queue,
01380 ID);
01381 }
01382 }
01383
01384 EXPORTMC
01385 #ifndef _WIN32
01386 time_t
01387 #else
01388 SYSTEMTIME
01389 #endif
01390 MC_GetAgentArrivalTime(MCAgent_t agent)
01391 {
01392 if (agent != NULL) {
01393 return agent->arrival_time;
01394 } else {
01395 #ifndef _WIN32
01396 return (time_t)-1;
01397 #else
01398 SYSTEMTIME oy;
01399 return oy;
01400 #endif
01401 }
01402 }
01403
01404 EXPORTMC int
01405 MC_GetAgentStatus(MCAgent_t agent)
01406 {
01407 int status;
01408 MUTEX_LOCK(agent->lock);
01409 status = agent->agent_status;
01410 MUTEX_UNLOCK(agent->lock);
01411 return status;
01412 }
01413
01414 EXPORTMC char*
01415 MC_GetAgentXMLString(MCAgent_t agent)
01416 {
01417 char *ret;
01418 ret = mxmlSaveAllocString(
01419 agent->datastate->xml_agent_root,
01420 NULL
01421 );
01422 return ret;
01423 }
01424
01425
01426 EXPORTMC void*
01427 MC_GetAgentExecEngine(MCAgent_t agent)
01428 {
01429 return agent->agent_interp;
01430 }
01431
01432 EXPORTMC int
01433 MC_GetAgentID(
01434 MCAgent_t agent
01435 )
01436 {
01437 return agent->id;
01438 }
01439
01440 EXPORTMC char*
01441 MC_GetAgentName(
01442 MCAgent_t agent
01443 )
01444 {
01445 char *name;
01446 MUTEX_LOCK(agent->lock);
01447 name = (char*)malloc(sizeof(char) *
01448 (strlen (agent->name) + 1)
01449 );
01450 strcpy(
01451 name,
01452 agent->name
01453 );
01454 MUTEX_UNLOCK(agent->lock);
01455 return name;
01456 }
01457
01458 EXPORTMC int
01459 MC_GetAgentReturnData(
01460 MCAgent_t agent,
01461 int task_num,
01462 void **data,
01463 int *dim,
01464 int **extent)
01465 {
01466 int num_elements;
01467 int size;
01468 int i;
01469 printf("\nThe function MC_GetAgentReturnData() is deprecated.\n\
01470 Please use the MC_AgentReturn*() series of functions instead.\n");
01471 if (task_num >= agent->datastate->number_of_tasks) {
01472 *data = NULL;
01473 *dim = 0;
01474 *extent = NULL;
01475 return 1;
01476 }
01477 if (
01478 agent->datastate->tasks[task_num]->
01479 agent_return_data->data_type == -1
01480 )
01481 {
01482 return 1;
01483 }
01484 CH_DATATYPE_SIZE(
01485 agent->datastate->tasks[task_num]->agent_return_data->data_type,
01486 size);
01487 num_elements = 1;
01488 for (
01489 i = 0;
01490 i < agent->datastate->tasks[task_num]->agent_return_data->array_dim;
01491 i++
01492 )
01493 {
01494 num_elements *= agent->datastate->
01495 tasks[task_num]->agent_return_data->array_extent[i];
01496 }
01497
01498
01499 *data = malloc(num_elements * size);
01500 memcpy(
01501 *data,
01502 agent->datastate->tasks[task_num]->
01503 agent_return_data->data,
01504 size * num_elements
01505 );
01506 *dim = agent->datastate->tasks[task_num]->agent_return_data->array_dim;
01507 *extent = (int*)malloc(
01508 sizeof(int) *
01509 agent->datastate->tasks[task_num]->agent_return_data->array_dim
01510 );
01511 for (i = 0; i < *dim; i++) {
01512 (*extent)[i] =
01513 agent->datastate->tasks[task_num]->agent_return_data->array_extent[i];
01514 }
01515
01516
01517
01518
01519
01520 return 0;
01521 }
01522
01523 EXPORTMC int
01524 MC_GetAgentNumTasks(MCAgent_t agent)
01525 {
01526 return agent->datastate->number_of_tasks;
01527 }
01528
01529 EXPORTMC enum MC_AgentType_e
01530 MC_GetAgentType(MCAgent_t agent)
01531 {
01532 if (agent != NULL) {
01533 return agent->agent_type;
01534 } else {
01535 return (enum MC_AgentType_e)0;
01536 }
01537 }
01538
01539 EXPORTMC int
01540 MC_GetAllAgents(MCAgency_t attr, MCAgent_t **agents, int* num_agents)
01541 {
01542 int halt;
01543 int index = 0;
01544 MUTEX_LOCK(attr->mc_platform->giant_lock);
01545 halt = (attr->mc_platform->giant == 1) ? 1 : 0;
01546 MUTEX_UNLOCK(attr->mc_platform->giant_lock);
01547 if (halt)
01548 MC_HaltAgency(attr);
01549
01550 while (agent_queue_SearchIndex(attr->mc_platform->agent_queue, index) != NULL) {
01551 index++;
01552 }
01553
01554 if (index == 0) {
01555 *agents = NULL;
01556 *num_agents = 0;
01557 return -1;
01558 }
01559
01560 *agents = (MCAgent_t *)malloc(sizeof(MCAgent_t*) * index);
01561 *num_agents = index;
01562
01563 for(index = 0; index < *num_agents; index++) {
01564 (*agents)[index] = agent_queue_SearchIndex
01565 (
01566 attr->mc_platform->agent_queue,
01567 index
01568 );
01569 }
01570 if(halt)
01571 MC_ResumeAgency(attr);
01572 return 0;
01573 }
01574
01575 EXPORTMC int
01576 MC_HaltAgency(MCAgency_t attr)
01577 {
01578 MUTEX_LOCK(attr->mc_platform->giant_lock);
01579 attr->mc_platform->giant=0;
01580 MUTEX_UNLOCK(attr->mc_platform->giant_lock);
01581 return 0;
01582 }
01583
01584 EXPORTMC MCAgency_t
01585 MC_Initialize(
01586 int port,
01587 MCAgencyOptions_t *options)
01588 {
01589 MCAgency_t ret;
01590 int i=0;
01591 int options_malloc = 0;
01592 char privkey[1210];
01593
01594 memset(privkey, '\0', 1210);
01595 ret = (MCAgency_t)malloc(sizeof(struct agency_s));
01596 if (ret == NULL) {return NULL;}
01597
01598 ret->hostName = (char*)malloc(HOST_NAME_MAX);
01599 if (ret->hostName == NULL) {return NULL;}
01600 gethostname(ret->hostName, HOST_NAME_MAX);
01601
01602 ret->hostName = (char*)realloc(ret->hostName, sizeof(char)*(strlen(ret->hostName)+1));
01603 if (ret->hostName == NULL) {return NULL;}
01604 ret->portno = port;
01605 ret->server = 1;
01606 ret->client = 0;
01607 ret->default_agentstatus = -1;
01608
01609
01610 if(options==NULL) {
01611 options = (MCAgencyOptions_t*)malloc(sizeof(MCAgencyOptions_t));
01612 MC_InitializeAgencyOptions(options);
01613 options_malloc = 1;
01614 }
01615 ret->threads = options->threads;
01616 ret->default_agentstatus = options->default_agent_status;
01617 for(i = 0; i < MC_THREAD_ALL; i++) {
01618 ret->stack_size[i] = options->stack_size[i];
01619 }
01620 ret->initInterps = options->initInterps;
01621
01622
01623 ret->mc_platform = mc_platform_Initialize(ret, options->ch_options);
01624
01625
01626 #ifdef NEW_SECURITY
01627 if (options->priv_key_filename != NULL) {
01628 ret->priv_key_filename = strdup(options->priv_key_filename);
01629 } else {
01630 ret->priv_key_filename = strdup("rsa_priv");
01631 }
01632 if (options->known_host_filename != NULL) {
01633 ret->known_host_filename = strdup(options->known_host_filename);
01634 } else {
01635 ret->known_host_filename = strdup("known_host");
01636 }
01637
01638 memset(buf,'\0', 4);
01639
01640 if( (f = fopen(ret->priv_key_filename, "r") ) == NULL) {
01641 fprintf(stderr, "rsa_priv_en file not found \n");
01642 fprintf(stderr, "Aborting... at %s:%d\n", __FILE__, __LINE__);
01643 exit(0);
01644 }
01645
01646 fread (buf, 1, 4, f);
01647
01648 if(buf[0]=='N' && buf[1] == ' ' && buf[2]=='=' && buf[3]==' '){
01649 fread(privkey, 1210, 1, f);
01650 fclose(f);
01651 }
01652 else{
01653 fclose(f);
01654
01655 if(options->passphrase[0] == '\0'){
01656 printf("Please enter the passphrase to decrypt private key ");
01657 scanf("%s", options->passphrase);
01658 }
01659
01660 if( read_encrypted_file(ret->priv_key_filename, privkey, options->passphrase) == -1){
01661 printf("Unable to read private key: passphase is wrong or file not exist\n");
01662 printf("Press any key to exit \n");
01663 getchar();
01664 exit(0);
01665 }
01666 }
01667
01668 if (privkey == NULL){
01669 printf("Note: private key is Null \n");
01670 printf("please verify the private key file or generate it again. \n");
01671 printf("Exiting Mobile-C Agency ... \n");
01672 getchar();
01673 exit(0);
01674 }
01675 memset(ret -> mc_platform -> private_key, '\0', 1210);
01676 strcpy(ret -> mc_platform -> private_key, privkey);
01677
01678 #endif
01679
01680
01681 g_mc_platform = ret->mc_platform;
01682
01683 if (options_malloc)
01684 free(options);
01685
01686 ret->mc_platform->agency = ret;
01687 return ret;
01688 }
01689
01690 EXPORTMC int
01691 MC_InitializeAgencyOptions(struct MCAgencyOptions_s* options)
01692 {
01693 int i;
01694 memset(options, 0, sizeof(struct MCAgencyOptions_s));
01695
01696 options->threads = 0xFFFF;
01697 options->default_agent_status = MC_WAIT_CH;
01698 options->modified = 0;
01699 for(i = 0; i < MC_THREAD_ALL; i++) {
01700 options->stack_size[i] = -1;
01701 }
01702 memset(options->passphrase, '\0', 32);
01703
01704 options->known_host_filename = NULL;
01705 options->priv_key_filename = NULL;
01706
01707 options->initInterps = 4;
01708 return 0;
01709 }
01710
01711 EXPORTMC int
01712 MC_LoadAgentFromFile(MCAgency_t attr, const char* filename)
01713 {
01714 struct stat filestat;
01715 char *buf;
01716 FILE *fp;
01717 message_p message;
01718 extern mc_platform_p g_mc_platform;
01719 buf = NULL;
01720 filestat.st_size = 0;
01721 stat(filename, &filestat);
01722 if (filestat.st_size != 0 ) {
01723 buf = (char*)malloc( sizeof(char) * (filestat.st_size+1) );
01724 memset(buf, 0, filestat.st_size+1);
01725 } else {
01726 fprintf(stderr, "Error: File %s not found.\n", filename);
01727 return 1;
01728 }
01729
01730 fp = fopen(filename, "r");
01731 fread((void*)buf, filestat.st_size, 1, fp);
01732 fclose(fp);
01733
01734 message = message_New();
01735 if (
01736 message_InitializeFromString (
01737 attr->mc_platform,
01738 message,
01739 buf,
01740 "",
01741 5050,
01742 "ams"
01743 )
01744 )
01745 {
01746 message_Destroy(message);
01747 }
01748 free(message->to_address);
01749 message->to_address = NULL;
01750 message->xml_root = mxmlLoadString(
01751 NULL,
01752 buf,
01753 NULL );
01754 if (message->xml_root == NULL) {
01755 fprintf(stderr, "Error loading agent. %s:%d\n", __FILE__, __LINE__);
01756 message_Destroy(message);
01757 return 1;
01758 }
01759 message->xml_payload = mxmlFindElement(
01760 message->xml_root,
01761 message->xml_root,
01762 "MOBILE_AGENT",
01763 NULL,
01764 NULL,
01765 MXML_DESCEND );
01766 if(message->xml_payload == NULL) {
01767 fprintf(stderr, "Error loading agent: <MOBILE_AGENT> tag not found. %s:%d\n",
01768 __FILE__, __LINE__ );
01769 message_Destroy(message);
01770 return 1;
01771 }
01772
01773 message_queue_Add
01774 (
01775 attr->mc_platform->message_queue,
01776 message
01777 );
01778 return 0;
01779 }
01780
01781 EXPORTMC int
01782 MC_MigrateAgent(MCAgent_t agent, const char* hostname, int port)
01783 {
01784
01785
01786 int progress;
01787 progress = agent->datastate->task_progress;
01788
01789
01790 agent->datastate->progress_modifier = -1;
01791
01792
01793 free(agent->datastate->tasks[progress]->server_name);
01794 agent->datastate->tasks[progress]->server_name = (char*)malloc(
01795 sizeof(char)*(strlen(hostname) + 10) );
01796 sprintf(agent->datastate->tasks[progress]->server_name, "%s:%d",
01797 hostname, port);
01798
01799
01800 return 0;
01801 }
01802
01803 EXPORTMC int
01804 MC_MutexLock(MCAgency_t attr, int id)
01805 {
01806 syncListNode_t *syncnode;
01807 syncnode = syncListFind(id, attr->mc_platform->syncList);
01808 if (syncnode == NULL) {
01809 return 1;
01810 }
01811 MUTEX_LOCK(syncnode->lock);
01812 return 0;
01813 }
01814
01815 EXPORTMC int
01816 MC_MutexUnlock(MCAgency_t attr, int id)
01817 {
01818 syncListNode_t *syncnode;
01819 syncnode = syncListFind(id, attr->mc_platform->syncList);
01820 if (syncnode == NULL) {
01821 return 1;
01822 }
01823 MUTEX_UNLOCK(syncnode->lock);
01824 return 0;
01825 }
01826
01827 EXPORTMC int
01828 MC_PrintAgentCode(MCAgent_t agent)
01829 {
01830 int progress;
01831 MUTEX_LOCK(agent->lock);
01832 progress = agent->datastate->task_progress;
01833
01834 if (progress >= agent->datastate->number_of_tasks) {
01835 progress = agent->datastate->number_of_tasks - 1;
01836 }
01837 printf("%s\n",
01838 agent->datastate->agent_code);
01839 MUTEX_UNLOCK(agent->lock);
01840 return 0;
01841 }
01842
01843 EXPORTMC int
01844 MC_RegisterService(
01845 MCAgency_t agency,
01846 MCAgent_t agent,
01847 int agentID,
01848 const char *agentName,
01849 char **serviceNames,
01850 int numServices)
01851 {
01852 df_request_list_node_t *req_node;
01853 df_node_t *new_node;
01854 int i;
01855
01856
01857 if (agent == NULL && agentName == NULL) {
01858 return MC_ERR_INVALID_ARGS;
01859 }
01860
01861 req_node = df_request_list_node_New();
01862 req_node->command = (char*)malloc(sizeof(char)*9);
01863 strcpy((char*)req_node->command, "register");
01864
01865 new_node = (df_node_t*)malloc(sizeof(df_node_t));
01866 CHECK_NULL(new_node, return MC_ERR_MEMORY);
01867
01868
01869 new_node->lock = (MUTEX_T*)malloc(sizeof(MUTEX_T));
01870 CHECK_NULL(new_node->lock, return MC_ERR_MEMORY);
01871 MUTEX_INIT(new_node->lock);
01872
01873
01874 if (agent==NULL) {
01875 new_node->agent_id = agentID;
01876 } else {
01877 new_node->agent_id = agent->id;
01878 }
01879
01880
01881 if (agent==NULL) {
01882 new_node->agent_name =
01883 (char*)malloc(sizeof(char)*(strlen(agentName)+1));
01884 CHECK_NULL(new_node->agent_name, return MC_ERR_MEMORY;);
01885 strcpy(new_node->agent_name, agentName);
01886 } else {
01887 new_node->agent_name =
01888 (char*)malloc(
01889 sizeof(char) *
01890 (strlen(agent->name)+1)
01891 );
01892 CHECK_NULL(new_node->agent_name, return MC_ERR_MEMORY;);
01893 strcpy(new_node->agent_name, agent->name);
01894 }
01895
01896
01897 new_node->service_names = (char**)malloc(
01898 sizeof(char*) * numServices
01899 );
01900 CHECK_NULL(new_node->service_names, return MC_ERR_MEMORY;);
01901 for (i = 0; i < numServices; i++) {
01902 new_node->service_names[i] = (char*) malloc(
01903 sizeof(char) * (strlen(serviceNames[i]) + 1)
01904 );
01905 CHECK_NULL(new_node->service_names[i], return MC_ERR_MEMORY;);
01906 strcpy(
01907 new_node->service_names[i],
01908 serviceNames[i]
01909 );
01910 }
01911 new_node->num_services = numServices;
01912
01913 req_node->data = (void*)new_node;
01914 req_node->data_size = (sizeof(new_node));
01915
01916 return df_AddRequest(
01917 agency->mc_platform->df,
01918 req_node
01919 );
01920 }
01921
01922 EXPORTMC int
01923 MC_ResumeAgency(MCAgency_t attr)
01924 {
01925 MUTEX_LOCK(attr->mc_platform->giant_lock);
01926 attr->mc_platform->giant = 1;
01927 MUTEX_UNLOCK(attr->mc_platform->giant_lock);
01928 return 0;
01929 }
01930
01931 EXPORTMC MCAgent_t
01932 MC_RetrieveAgent(MCAgency_t attr)
01933
01934
01935
01936 {
01937 int i;
01938 MCAgent_t agent=NULL;
01939 MUTEX_LOCK(attr->mc_platform->agent_queue->lock);
01940 for (i = 0; i < attr->mc_platform->agent_queue->size; i++) {
01941 agent = (MCAgent_t)ListSearch(
01942 attr->mc_platform->agent_queue->list, i);
01943 if (agent->agent_status == MC_AGENT_NEUTRAL) {
01944 break;
01945 }
01946 }
01947 if (agent == NULL) {
01948 MUTEX_UNLOCK(attr->mc_platform->agent_queue->lock);
01949 return NULL;
01950 }
01951 if (agent->agent_status != MC_AGENT_NEUTRAL) {
01952 MUTEX_UNLOCK(attr->mc_platform->agent_queue->lock);
01953 return NULL;
01954 }
01955 MUTEX_UNLOCK(attr->mc_platform->agent_queue->lock);
01956 return agent;
01957 }
01958
01959 EXPORTMC char *
01960 MC_RetrieveAgentCode(MCAgent_t agent)
01961 {
01962 char *buf;
01963 int len, progress;
01964 MUTEX_LOCK(agent->lock);
01965 progress = agent->datastate->task_progress;
01966 len = strlen(
01967 agent->datastate->agent_code);
01968 buf = (char*)malloc( (len+1)*sizeof(char));
01969 strcpy(buf,
01970 agent->datastate->agent_code);
01971 MUTEX_UNLOCK(agent->lock);
01972 return buf;
01973 }
01974
01975 EXPORTMC int
01976 MC_ResetSignal(MCAgency_t attr)
01977 {
01978 MUTEX_LOCK(attr->mc_platform->giant_lock);
01979 attr->mc_platform->giant = 1;
01980 attr->mc_platform->MC_signal = MC_NO_SIGNAL;
01981 COND_SIGNAL(attr->mc_platform->giant_cond);
01982 MUTEX_UNLOCK(attr->mc_platform->giant_lock);
01983 return 0;
01984 }
01985
01986 EXPORTMC int
01987 MC_SearchForService(
01988
01989 MCAgency_t attr,
01990 const char *searchString,
01991
01992 char*** agentNames,
01993 char*** serviceNames,
01994 int** agentIDs,
01995 int* numResults)
01996 {
01997 df_request_search_p search;
01998 df_search_results_p results;
01999 df_request_list_node_p request;
02000 search = df_request_search_New();
02001 CHECK_NULL(search, return MC_ERR_MEMORY;);
02002 results = (df_search_results_p)malloc(sizeof(df_search_results_t));
02003 CHECK_NULL(results, return MC_ERR_MEMORY;);
02004 request = df_request_list_node_New();
02005 CHECK_NULL(request, return MC_ERR_MEMORY;);
02006
02007
02008 search->search_results = results;
02009 search->search_string = (char*)searchString;
02010
02011 request->data = (void*)search;
02012 request->command = (char*)malloc(sizeof(char) * 7);
02013 strcpy((char*)request->command, "search");
02014 request->data_size = sizeof(df_request_search_t);
02015
02016 COND_SLEEP_ACTION(
02017 search->cond,
02018 search->lock,
02019
02020 df_AddRequest(attr->mc_platform->df, request);
02021 );
02022
02023 *agentNames = search->search_results->agent_names;
02024 *serviceNames = search->search_results->service_names;
02025 *agentIDs = search->search_results->agent_ids;
02026 *numResults = search->search_results->num_results;
02027
02028
02029 free((void*)request->command);
02030 df_request_list_node_Destroy(request);
02031 df_request_search_Destroy(search);
02032
02033 return MC_SUCCESS;
02034 }
02035
02036 EXPORTMC int
02037 MC_SemaphorePost(MCAgency_t attr, int id)
02038 {
02039 syncListNode_t *syncnode;
02040 syncnode = syncListFind(id, attr->mc_platform->syncList);
02041 if (syncnode == NULL) {
02042 return 1;
02043 }
02044 SEMAPHORE_POST(syncnode->sem);
02045 return 0;
02046 }
02047
02048 EXPORTMC int
02049 MC_SemaphoreWait(MCAgency_t attr, int id)
02050 {
02051 syncListNode_t *syncnode;
02052 syncnode = syncListFind(id, attr->mc_platform->syncList);
02053 if (syncnode == NULL) {
02054 return 1;
02055 }
02056 SEMAPHORE_WAIT(syncnode->sem);
02057 return 0;
02058 }
02059
02060 EXPORTMC int
02061 MC_SendCh(MCAgency_t attr,
02062 const char *filename,
02063 const char *remotehost,
02064 int port)
02065 {
02066 printf("Sorry, not implemented yet.\n");
02067 return -1;
02068 }
02069
02070 EXPORTMC int
02071 MC_SendAgent(MCAgency_t attr,
02072 const char *string)
02073 {
02074 message_p message;
02075 message = message_New();
02076 if(
02077 message_InitializeFromString
02078 (
02079 attr->mc_platform,
02080 message,
02081 string,
02082 NULL,
02083 0,
02084 "ams"
02085 )
02086 )
02087 {
02088 message_Destroy(message);
02089 return MC_ERR;
02090 } else {
02091 return message_queue_Add
02092 (
02093 attr->mc_platform->message_queue,
02094 message
02095 );
02096 }
02097 }
02098
02099 EXPORTMC int
02100 MC_SendAgentFile(MCAgency_t attr,
02101 const char *filename)
02102 {
02103 struct stat filestat;
02104 char *buf;
02105 FILE *fp;
02106 int ret;
02107 message_p message;
02108 agent_t *agent;
02109 extern mc_platform_p g_mc_platform;
02110 mc_platform_p platform;
02111 buf = NULL;
02112 filestat.st_size = 0;
02113 stat(filename, &filestat);
02114 if (filestat.st_size != 0 ) {
02115 buf = (char*)malloc( sizeof(char) * (filestat.st_size+1) );
02116 memset(buf, 0, filestat.st_size+1);
02117 } else {
02118 fprintf(stderr, "Error: File %s not found.\n", filename);
02119 return 1;
02120 }
02121
02122 if (attr == NULL) {
02123 platform = g_mc_platform;
02124 } else {
02125 platform = attr->mc_platform;
02126 }
02127
02128 fp = fopen(filename, "r");
02129 fread((void*)buf, filestat.st_size, 1, fp);
02130 fclose(fp);
02131
02132 message = message_New();
02133 if(
02134 message_InitializeFromString
02135 (
02136 platform,
02137 message,
02138 buf,
02139 NULL,
02140 0,
02141 "ams"
02142 )
02143 )
02144 {
02145 message_Destroy(message);
02146 } else {
02147
02148
02149 agent = agent_Initialize( platform, message, rand() );
02150 if (agent == NULL) {
02151 fprintf(stderr, "Error initializing agent. %s:%d", __FILE__, __LINE__);
02152 }
02153 agent->agent_status = MC_WAIT_MESSGSEND;
02154 agent_queue_Add( platform->agent_queue, agent);
02155
02156 MUTEX_LOCK(platform->ams->runflag_lock);
02157 platform->ams->run = 1;
02158 COND_BROADCAST(platform->ams->runflag_cond);
02159 MUTEX_UNLOCK(platform->ams->runflag_lock);
02160 }
02161 free(buf);
02162 return ret;
02163 }
02164
02165 EXPORTMC int
02166 MC_SendAgentMigrationMessage(MCAgency_t attr,
02167 const char *string,
02168 const char *hostname,
02169 int port)
02170 {
02171
02172 message_p message;
02173 printf("\nThe function MC_SendAgentMigrationMessage() is deprecated.\n\
02174 Please use MC_SendAgentFile() instead.\n");
02175 message = message_New();
02176 if(
02177 message_InitializeFromString
02178 (
02179 attr->mc_platform,
02180 message,
02181 string,
02182 hostname,
02183 port,
02184 "ams"
02185 )
02186 )
02187 {
02188 message_Destroy(message);
02189 return MC_ERR;
02190 } else {
02191 return message_queue_Add
02192 (
02193 attr->mc_platform->message_queue,
02194 message
02195 );
02196 }
02197 }
02198
02199 EXPORTMC int
02200 MC_SendAgentMigrationMessageFile(MCAgency_t attr,
02201 const char *filename,
02202 const char *hostname,
02203 int port)
02204 {
02205 struct stat filestat;
02206 char *buf;
02207 FILE *fp;
02208 int ret;
02209 message_p message;
02210 agent_t *agent;
02211 extern mc_platform_p g_mc_platform;
02212 mc_platform_p platform;
02213 printf("\nThe function MC_SendAgentMigrationMessage() is deprecated.\n\
02214 Please use MC_SendAgentFile() instead.");
02215 buf = NULL;
02216 filestat.st_size = 0;
02217 stat(filename, &filestat);
02218 if (filestat.st_size != 0 ) {
02219 buf = (char*)malloc( sizeof(char) * (filestat.st_size+1) );
02220 memset(buf, 0, filestat.st_size+1);
02221 } else {
02222 fprintf(stderr, "Error: File %s not found.\n", filename);
02223 return 1;
02224 }
02225
02226 if (attr == NULL) {
02227 platform = g_mc_platform;
02228 } else {
02229 platform = attr->mc_platform;
02230 }
02231
02232 fp = fopen(filename, "r");
02233 fread((void*)buf, filestat.st_size, 1, fp);
02234 fclose(fp);
02235
02236 message = message_New();
02237 if(
02238 message_InitializeFromString
02239 (
02240 platform,
02241 message,
02242 buf,
02243 hostname,
02244 port,
02245 "ams"
02246 )
02247 )
02248 {
02249 message_Destroy(message);
02250 } else {
02251
02252
02253 agent = agent_Initialize( platform, message, rand() );
02254 if (agent == NULL) {
02255 fprintf(stderr, "Error initializing agent. %s:%d", __FILE__, __LINE__);
02256 }
02257 agent->agent_status = MC_WAIT_MESSGSEND;
02258 agent_queue_Add( platform->agent_queue, agent);
02259
02260 MUTEX_LOCK(platform->ams->runflag_lock);
02261 platform->ams->run = 1;
02262 COND_BROADCAST(platform->ams->runflag_cond);
02263 MUTEX_UNLOCK(platform->ams->runflag_lock);
02264 }
02265 free(buf);
02266 return ret;
02267 }
02268
02269 EXPORTMC int
02270 MC_SendSteerCommand(MCAgency_t attr, enum MC_SteerCommand_e cmd)
02271 {
02272 MUTEX_LOCK(attr->mc_platform->MC_steer_lock);
02273 attr->mc_platform->MC_steer_command = cmd;
02274 COND_BROADCAST(attr->mc_platform->MC_steer_cond);
02275 MUTEX_UNLOCK(attr->mc_platform->MC_steer_lock);
02276 return 0;
02277 }
02278
02279 EXPORTMC int
02280 MC_SetAgentStatus(MCAgent_t agent, enum MC_AgentStatus_e status)
02281 {
02282 MUTEX_LOCK(agent->lock);
02283 agent->agent_status = status;
02284 if (!agent->orphan) {
02285 MUTEX_LOCK(agent->mc_platform->ams->runflag_lock);
02286 agent->mc_platform->ams->run = 1;
02287 COND_SIGNAL(agent->mc_platform->ams->runflag_cond);
02288 MUTEX_UNLOCK(agent->mc_platform->ams->runflag_lock);
02289 }
02290 MUTEX_UNLOCK(agent->lock);
02291 return 0;
02292 }
02293
02294 EXPORTMC int
02295 MC_SetDefaultAgentStatus(
02296 MCAgency_t agency,
02297 enum MC_AgentStatus_e status
02298 )
02299 {
02300 agency->mc_platform->default_agentstatus = status;
02301 return 0;
02302 }
02303
02304 EXPORTMC int
02305 MC_SetThreadOn(MCAgencyOptions_t *options, enum MC_ThreadIndex_e index)
02306 {
02307 SET_THREAD_ON(options->threads, index);
02308 return 0;
02309 }
02310
02311 EXPORTMC int
02312 MC_SetThreadsAllOn(MCAgencyOptions_t* options)
02313 {
02314 int i;
02315 for(i = 0; i < MC_THREAD_ALL; i++) {
02316 SET_THREAD_ON(options->threads, i);
02317 }
02318 return 0;
02319 }
02320
02321 EXPORTMC int
02322 MC_SetThreadOff(MCAgencyOptions_t *options, enum MC_ThreadIndex_e index)
02323 {
02324 SET_THREAD_OFF(options->threads, index);
02325 return 0;
02326 }
02327
02328 EXPORTMC int
02329 MC_SetThreadsAllOff(MCAgencyOptions_t* options)
02330 {
02331 int i;
02332 for(i = 0; i < MC_THREAD_ALL; i++) {
02333 SET_THREAD_OFF(options->threads, i);
02334 }
02335 return 0;
02336 }
02337
02338 EXPORTMC int
02339 MC_Steer(
02340 MCAgency_t attr,
02341 int (*funcptr)(void* data),
02342 void *arg
02343 )
02344 {
02345 MUTEX_LOCK(attr->mc_platform->MC_steer_lock);
02346 do {
02347 attr->mc_platform->MC_steer_command = MC_RUN;
02348 MUTEX_UNLOCK(attr->mc_platform->MC_steer_lock);
02349 (*funcptr)(arg);
02350 } while
02351 (
02352 attr->mc_platform->MC_steer_command == MC_RESTART
02353 );
02354 return 0;
02355 }
02356
02357 EXPORTMC enum MC_SteerCommand_e
02358 MC_SteerControl(void)
02359 {
02360 extern mc_platform_p g_mc_platform;
02361
02362 MUTEX_LOCK(g_mc_platform->MC_steer_lock);
02363 while (g_mc_platform->MC_steer_command == MC_SUSPEND) {
02364 COND_WAIT(
02365 g_mc_platform->MC_steer_cond,
02366 g_mc_platform->MC_steer_lock
02367 );
02368 }
02369 MUTEX_UNLOCK(g_mc_platform->MC_steer_lock);
02370 return g_mc_platform->MC_steer_command;
02371 }
02372
02373 EXPORTMC int
02374 MC_SyncDelete(MCAgency_t attr, int id)
02375 {
02376 syncListNode_t *sync_node;
02377
02378 MUTEX_LOCK(attr->mc_platform->syncList->giant_lock);
02379
02380
02381 sync_node = syncListFind(id, attr->mc_platform->syncList);
02382 if (sync_node == NULL) {
02383 MUTEX_UNLOCK(attr->mc_platform->syncList->giant_lock);
02384 return MC_ERR_NOT_FOUND;
02385 }
02386 MUTEX_LOCK(sync_node->lock);
02387
02388
02389 if (syncListRemove(id, attr->mc_platform->syncList) == NULL) {
02390 fprintf(stderr, "Fatal error. %s:%d\n",
02391 __FILE__,
02392 __LINE__ );
02393 exit(0);
02394 }
02395
02396
02397 MUTEX_UNLOCK(sync_node->lock);
02398 MUTEX_UNLOCK(attr->mc_platform->syncList->giant_lock);
02399
02400 return syncListNodeDestroy(sync_node);
02401 }
02402
02403 EXPORTMC int
02404 MC_SyncInit(MCAgency_t attr, int id)
02405 {
02406 syncListNode_t *node;
02407 node = syncListNodeNew();
02408 MUTEX_LOCK(attr->mc_platform->syncList->giant_lock);
02409 if (id == 0) {
02410 id = rand();
02411 }
02412 while (
02413 syncListFind(id, attr->mc_platform->syncList) != NULL
02414 )
02415 {
02416 id = rand();
02417 }
02418
02419 node->id = id;
02420 syncListAddNode(
02421 node,
02422 attr->mc_platform->syncList
02423 );
02424 MUTEX_UNLOCK(attr->mc_platform->syncList->giant_lock);
02425 return id;
02426 }
02427
02428 EXPORTMC int
02429 MC_TerminateAgent(MCAgent_t agent)
02430 {
02431 int status=0;
02432 if(agent->agent_interp != NULL) {
02433 status = Ch_Abort (*agent->agent_interp);
02434 }
02435 return status;
02436 }
02437
02438 EXPORTMC int
02439 MC_TerminateAgentWG(MCAgent_t calling_agent, MCAgent_t agent)
02440 {
02441 int status=0;
02442
02443 if (agent->wg_code != NULL) {
02444 if (calling_agent->wg_code == NULL) {
02445 return MC_ERR_INVALID_ARGS;
02446 } else if (strcmp(calling_agent->wg_code, agent->wg_code)) {
02447 return MC_ERR_INVALID_ARGS;
02448 }
02449 }
02450 if(agent->agent_interp != NULL) {
02451 status = Ch_Abort (*agent->agent_interp);
02452 }
02453 return status;
02454 }
02455
02456 EXPORTMC int
02457 MC_MainLoop(MCAgency_t attr)
02458 {
02459 MUTEX_LOCK( attr->mc_platform->quit_lock );
02460 while( attr->mc_platform->quit != 1 ) {
02461 COND_WAIT( attr->mc_platform->quit_cond, attr->mc_platform->quit_lock );
02462 }
02463 MUTEX_UNLOCK( attr->mc_platform->quit_lock );
02464 return 0;
02465 }
02466
02467 EXPORTMC int
02468 MC_WaitAgent(MCAgency_t attr)
02469 {
02470 int size;
02471 MUTEX_LOCK(attr->mc_platform->agent_queue->lock);
02472 while(1) {
02473 size = attr->mc_platform->agent_queue->size;
02474 COND_WAIT(
02475 attr->mc_platform->agent_queue->cond,
02476 attr->mc_platform->agent_queue->lock
02477 );
02478 if (size < attr->mc_platform->agent_queue->size) {
02479 MUTEX_UNLOCK(attr->mc_platform->agent_queue->lock);
02480 break;
02481 }
02482 }
02483 MUTEX_UNLOCK(attr->mc_platform->agent_queue->lock);
02484 return 0;
02485 }
02486
02487 EXPORTMC MCAgent_t
02488 MC_WaitRetrieveAgent(MCAgency_t attr)
02489 {
02490 int index;
02491 MCAgent_t agent;
02492 MC_WaitSignal(attr, MC_RECV_AGENT);
02493 MUTEX_LOCK(attr->mc_platform->agent_queue->lock);
02494 index = attr->mc_platform->agent_queue->size-1;
02495 agent = (MCAgent_t)ListSearch(
02496 attr->mc_platform->agent_queue->list, index);
02497 MUTEX_UNLOCK(attr->mc_platform->agent_queue->lock);
02498 return agent;
02499 }
02500
02501
02502
02503
02504
02505 EXPORTMC int
02506 MC_WaitSignal(MCAgency_t attr, int signals)
02507 {
02508 MUTEX_LOCK(attr->mc_platform->MC_signal_lock);
02509 while(! (signals & attr->mc_platform->MC_signal)) {
02510 COND_WAIT(
02511 attr->mc_platform->MC_signal_cond,
02512 attr->mc_platform->MC_signal_lock
02513 );
02514 }
02515 MUTEX_UNLOCK(attr->mc_platform->MC_signal_lock);
02516 MUTEX_LOCK(attr->mc_platform->giant_lock);
02517 attr->mc_platform->giant = 0;
02518 MUTEX_UNLOCK(attr->mc_platform->giant_lock);
02519 return 0;
02520 }
02521
02522
02523
02524
02525
02526
02527 EXPORTMC int MC_AclDestroy_chdl(void* varg)
02528 {
02529 int retval;
02530 fipa_acl_message_t* acl_message;
02531 ChInterp_t interp;
02532 ChVaList_t ap;
02533
02534 Ch_VaStart(interp, ap, varg);
02535 acl_message = Ch_VaArg(interp, ap, fipa_acl_message_t*);
02536 retval = MC_AclDestroy(acl_message);
02537 Ch_VaEnd(interp, ap);
02538 return retval;
02539 }
02540
02541
02542 EXPORTMC void* MC_AclNew_chdl(void* varg)
02543 {
02544 void* retval;
02545 retval = (void*)MC_AclNew();
02546 return retval;
02547 }
02548
02549
02550 EXPORTMC int MC_AclPost_chdl(void* varg)
02551 {
02552 int retval;
02553 agent_p agent;
02554 fipa_acl_message_t* acl_message;
02555 ChInterp_t interp;
02556 ChVaList_t ap;
02557
02558 Ch_VaStart(interp, ap, varg);
02559 agent = Ch_VaArg(interp, ap, agent_p);
02560 acl_message = Ch_VaArg(interp, ap, fipa_acl_message_t*);
02561 retval = MC_AclPost(agent, acl_message);
02562 Ch_VaEnd(interp, ap);
02563 return retval;
02564 }
02565
02566
02567 EXPORTCH void*
02568 MC_AclReply_chdl(void* varg)
02569 {
02570 void* retval;
02571 fipa_acl_message_t* acl_message;
02572 ChInterp_t interp;
02573 ChVaList_t ap;
02574
02575 Ch_VaStart(interp, ap, varg);
02576 acl_message = Ch_VaArg(interp, ap, fipa_acl_message_t*);
02577 retval = (void*)MC_AclReply(acl_message);
02578 Ch_VaEnd(interp, ap);
02579 return retval;
02580 }
02581
02582
02583 EXPORTCH void*
02584 MC_AclRetrieve_chdl(void* varg)
02585 {
02586 void* retval;
02587 MCAgent_t agent;
02588 ChInterp_t interp;
02589 ChVaList_t ap;
02590
02591 Ch_VaStart(interp, ap, varg);
02592 agent = Ch_VaArg(interp, ap, MCAgent_t);
02593 retval = MC_AclRetrieve(agent);
02594 Ch_VaEnd(interp, ap);
02595 return retval;
02596 }
02597
02598
02599 EXPORTCH int
02600 MC_AclSend_chdl(void* varg)
02601 {
02602 int retval;
02603 fipa_acl_message_t* acl_message;
02604 MCAgency_t temp_attr;
02605 extern mc_platform_p g_mc_platform;
02606
02607 ChInterp_t interp;
02608 ChVaList_t ap;
02609
02610 temp_attr = (MCAgency_t)malloc(sizeof(struct agency_s));
02611 CHECK_NULL(temp_attr, exit(-1));
02612 temp_attr->mc_platform = g_mc_platform;
02613
02614 Ch_VaStart(interp, ap, varg);
02615 acl_message = (fipa_acl_message_t*) Ch_VaArg(interp, ap, void*);
02616 retval = MC_AclSend(temp_attr, acl_message);
02617 Ch_VaEnd(interp, ap);
02618 free(temp_attr);
02619 return retval;
02620 }
02621
02622
02623 EXPORTCH void*
02624 MC_AclWaitRetrieve_chdl(void *varg)
02625 {
02626 void* retval;
02627 MCAgent_t agent;
02628 ChInterp_t interp;
02629 ChVaList_t ap;
02630
02631 Ch_VaStart(interp, ap, varg);
02632 agent = Ch_VaArg(interp, ap, MCAgent_t);
02633 retval = MC_AclWaitRetrieve(agent);
02634 Ch_VaEnd(interp, ap);
02635 return retval;
02636 }
02637
02638
02639
02640
02641 EXPORTCH int
02642 MC_AclGetProtocol_chdl(void* varg)
02643 {
02644 ChInterp_t interp;
02645 ChVaList_t ap;
02646 struct fipa_acl_message_s* acl;
02647 int retval;
02648
02649 Ch_VaStart(interp, ap, varg);
02650 acl = Ch_VaArg(interp, ap, struct fipa_acl_message_s*);
02651 retval = MC_AclGetProtocol(acl);
02652 Ch_VaEnd(interp, ap);
02653 return retval;
02654 }
02655
02656 EXPORTCH char*
02657 MC_AclGetConversationID_chdl(void* varg)
02658 {
02659 ChInterp_t interp;
02660 ChVaList_t ap;
02661 struct fipa_acl_message_s* acl;
02662 char* retval;
02663
02664 Ch_VaStart(interp, ap, varg);
02665 acl = Ch_VaArg(interp, ap, struct fipa_acl_message_s*);
02666 retval = MC_AclGetConversationID(acl);
02667 Ch_VaEnd(interp, ap);
02668 return retval;
02669 }
02670
02671 EXPORTCH int
02672 MC_AclGetPerformative_chdl(void* varg)
02673 {
02674 ChInterp_t interp;
02675 ChVaList_t ap;
02676 struct fipa_acl_message_s* acl;
02677 int retval;
02678
02679 Ch_VaStart(interp, ap, varg);
02680 acl = Ch_VaArg(interp, ap, struct fipa_acl_message_s*);
02681 retval = MC_AclGetPerformative(acl);
02682 Ch_VaEnd(interp, ap);
02683 return retval;
02684 }
02685
02686 EXPORTCH int
02687 MC_AclGetSender_chdl(void* varg)
02688 {
02689 ChInterp_t interp;
02690 ChVaList_t ap;
02691 struct fipa_acl_message_s* acl;
02692 char** name;
02693 char** address;
02694 int retval;
02695
02696 Ch_VaStart(interp, ap, varg);
02697 acl = Ch_VaArg(interp, ap, struct fipa_acl_message_s*);
02698 name = Ch_VaArg(interp, ap, char**);
02699 address = Ch_VaArg(interp, ap, char**);
02700 retval = MC_AclGetSender(acl, name, address);
02701 Ch_VaEnd(interp, ap);
02702 return retval;
02703 }
02704
02705 EXPORTCH char*
02706 MC_AclGetContent_chdl(void* varg)
02707 {
02708 ChInterp_t interp;
02709 ChVaList_t ap;
02710 struct fipa_acl_message_s* acl;
02711 char* retval;
02712
02713 Ch_VaStart(interp, ap, varg);
02714 acl = Ch_VaArg(interp, ap, struct fipa_acl_message_s*);
02715 retval = (char*)MC_AclGetContent(acl);
02716 Ch_VaEnd(interp, ap);
02717 return retval;
02718 }
02719
02720 EXPORTCH int
02721 MC_AclSetProtocol_chdl(void* varg)
02722 {
02723 ChInterp_t interp;
02724 ChVaList_t ap;
02725 struct fipa_acl_message_s* acl;
02726 enum fipa_protocol_e protocol;
02727 int retval;
02728
02729 Ch_VaStart(interp, ap, varg);
02730 acl = Ch_VaArg(interp, ap, struct fipa_acl_message_s*);
02731 protocol = Ch_VaArg(interp, ap, enum fipa_protocol_e);
02732 retval = MC_AclSetProtocol(acl, protocol);
02733 Ch_VaEnd(interp, ap);
02734 return retval;
02735 }
02736
02737
02738 EXPORTCH int
02739 MC_AclSetConversationID_chdl(void* varg)
02740 {
02741 ChInterp_t interp;
02742 ChVaList_t ap;
02743 struct fipa_acl_message_s* acl;
02744 char* id;
02745 int retval;
02746
02747 Ch_VaStart(interp, ap, varg);
02748 acl = Ch_VaArg(interp, ap, struct fipa_acl_message_s*);
02749 id = Ch_VaArg(interp, ap, char*);
02750 retval = MC_AclSetConversationID(acl, id);
02751 Ch_VaEnd(interp, ap);
02752 return retval;
02753 }
02754
02755
02756 EXPORTCH int
02757 MC_AclSetPerformative_chdl(void* varg)
02758 {
02759 ChInterp_t interp;
02760 ChVaList_t ap;
02761 struct fipa_acl_message_s* acl;
02762 enum fipa_performative_e performative;
02763 int retval;
02764
02765 Ch_VaStart(interp, ap, varg);
02766 acl = Ch_VaArg(interp, ap, struct fipa_acl_message_s*);
02767 performative = Ch_VaArg(interp, ap, enum fipa_performative_e);
02768 retval = MC_AclSetPerformative(acl, performative);
02769 Ch_VaEnd(interp, ap);
02770 return retval;
02771 }
02772
02773
02774 EXPORTCH int
02775 MC_AclSetSender_chdl(void* varg)
02776 {
02777 ChInterp_t interp;
02778 ChVaList_t ap;
02779 struct fipa_acl_message_s* acl;
02780 char* name;
02781 char* address;
02782 int retval;
02783
02784 Ch_VaStart(interp, ap, varg);
02785 acl = Ch_VaArg(interp, ap, struct fipa_acl_message_s*);
02786 name = Ch_VaArg(interp, ap, char*);
02787 address = Ch_VaArg(interp, ap, char*);
02788 retval = MC_AclSetSender(acl, name, address);
02789 Ch_VaEnd(interp, ap);
02790 return retval;
02791 }
02792
02793
02794 EXPORTCH int
02795 MC_AclAddReceiver_chdl(void* varg)
02796 {
02797 ChInterp_t interp;
02798 ChVaList_t ap;
02799 struct fipa_acl_message_s* acl;
02800 char* name;
02801 char* address;
02802 int retval;
02803
02804 Ch_VaStart(interp, ap, varg);
02805 acl = Ch_VaArg(interp, ap, struct fipa_acl_message_s*);
02806 name = Ch_VaArg(interp, ap, char*);
02807 address = Ch_VaArg(interp, ap, char*);
02808 retval = MC_AclAddReceiver(acl, name, address);
02809 Ch_VaEnd(interp, ap);
02810 return retval;
02811 }
02812
02813
02814 EXPORTCH int
02815 MC_AclAddReplyTo_chdl(void* varg)
02816 {
02817 ChInterp_t interp;
02818 ChVaList_t ap;
02819 struct fipa_acl_message_s* acl;
02820 char* name;
02821 char* address;
02822 int retval;
02823
02824 Ch_VaStart(interp, ap, varg);
02825 acl = Ch_VaArg(interp, ap, struct fipa_acl_message_s*);
02826 name = Ch_VaArg(interp, ap, char*);
02827 address = Ch_VaArg(interp, ap, char*);
02828 retval = MC_AclAddReplyTo(acl, name, address);
02829 Ch_VaEnd(interp, ap);
02830 return retval;
02831 }
02832
02833
02834 EXPORTCH int
02835 MC_AclSetContent_chdl(void* varg)
02836 {
02837 ChInterp_t interp;
02838 ChVaList_t ap;
02839 struct fipa_acl_message_s* acl;
02840 char* content;
02841 int retval;
02842
02843 Ch_VaStart(interp, ap, varg);
02844 acl = Ch_VaArg(interp, ap, struct fipa_acl_message_s*);
02845 content = Ch_VaArg(interp, ap, char*);
02846 retval = MC_AclSetContent(acl, content);
02847 Ch_VaEnd(interp, ap);
02848 return retval;
02849 }
02850
02851
02852
02853
02854 EXPORTCH int
02855 MC_AddAgent_chdl(void *varg)
02856 {
02857 int retval;
02858 MCAgent_t agent;
02859 MCAgency_t temp_attr;
02860 extern mc_platform_p g_mc_platform;
02861
02862 ChInterp_t interp;
02863 ChVaList_t ap;
02864
02865 temp_attr = (MCAgency_t)malloc(sizeof(struct agency_s));
02866 CHECK_NULL(temp_attr, exit(-1));
02867 temp_attr->mc_platform = g_mc_platform;
02868
02869 Ch_VaStart(interp, ap, varg);
02870 agent = (MCAgent_t) Ch_VaArg(interp, ap, void*);
02871 retval = MC_AddAgent(temp_attr, agent);
02872 Ch_VaEnd(interp, ap);
02873 free(temp_attr);
02874 return retval;
02875 }
02876
02877
02878 EXPORTCH int
02879 MC_AgentAddTask_chdl(void *varg)
02880 {
02881 int retval;
02882
02883
02884 MCAgent_t agent;
02885 const char* code;
02886 const char* return_var_name;
02887 const char* server;
02888 int persistent;
02889
02890 ChInterp_t interp;
02891 ChVaList_t ap;
02892
02893 Ch_VaStart(interp, ap, varg);
02894
02895 agent = Ch_VaArg(interp, ap, MCAgent_t);
02896 code = Ch_VaArg(interp, ap, const char*);
02897 return_var_name = Ch_VaArg(interp, ap, const char*);
02898 server = Ch_VaArg(interp, ap, const char*);
02899 persistent = Ch_VaArg(interp, ap, int);
02900
02901 retval= MC_AgentAddTask(
02902 agent,
02903 code,
02904 return_var_name,
02905 server,
02906 persistent);
02907 Ch_VaEnd(interp, ap);
02908 return retval;
02909 }
02910
02911
02912 EXPORTCH const void*
02913 MC_AgentVariableRetrieve_chdl(void* varg)
02914 {
02915 const void* retval;
02916 MCAgent_t agent;
02917 const char* var_name;
02918 int task_num;
02919
02920 ChInterp_t interp;
02921 ChVaList_t ap;
02922
02923 Ch_VaStart(interp, ap, varg);
02924
02925 agent = Ch_VaArg(interp, ap, MCAgent_t);
02926 var_name = Ch_VaArg(interp, ap, const char* );
02927 task_num = Ch_VaArg(interp, ap, int);
02928
02929 retval = MC_AgentVariableRetrieve(agent, var_name, task_num);
02930
02931 Ch_VaEnd(interp, ap);
02932 return retval;
02933 }
02934
02935
02936 EXPORTCH int
02937 MC_AgentVariableSave_chdl(void *varg)
02938 {
02939 int retval;
02940 MCAgent_t agent;
02941 const char* var_name;
02942
02943 ChInterp_t interp;
02944 ChVaList_t ap;
02945
02946 Ch_VaStart(interp, ap, varg);
02947
02948 agent = Ch_VaArg(interp, ap, MCAgent_t);
02949 var_name = Ch_VaArg(interp, ap, const char*);
02950
02951 retval = MC_AgentVariableSave(agent, var_name);
02952
02953 Ch_VaEnd(interp, ap);
02954 return retval;
02955 }
02956
02957
02958 EXPORTCH int
02959 MC_CallAgentFunc_chdl(void *varg)
02960 {
02961 int retval;
02962
02963 MCAgent_t agent;
02964 const char* funcName;
02965 void* returnVal;
02966 ChVaList_t args;
02967
02968 ChInterp_t interp;
02969 ChVaList_t ap;
02970
02971 Ch_VaStart(interp, ap, varg);
02972
02973 agent = Ch_VaArg(interp, ap, MCAgent_t);
02974 funcName = Ch_VaArg(interp, ap, const char*);
02975 returnVal = Ch_VaArg(interp, ap, void*);
02976 args = Ch_VaArg(interp, ap, void*);
02977
02978 retval = MC_CallAgentFuncVar(
02979 agent,
02980 funcName,
02981 returnVal,
02982 args);
02983 Ch_VaEnd(interp, ap);
02984 return retval;
02985 }
02986
02987
02988 EXPORTCH int
02989 MC_Barrier_chdl(void *varg)
02990 {
02991 MCAgency_t temp_attr;
02992 extern mc_platform_p g_mc_platform;
02993 int retval;
02994 ChInterp_t interp;
02995 ChVaList_t ap;
02996 int id;
02997
02998 temp_attr = (MCAgency_t)malloc(sizeof(struct agency_s));
02999 CHECK_NULL(temp_attr, exit(-1));
03000 temp_attr->mc_platform = g_mc_platform;
03001
03002 Ch_VaStart(interp, ap, varg);
03003 id = Ch_VaArg(interp, ap, int);
03004 retval = MC_Barrier(temp_attr, id);
03005 Ch_VaEnd(interp, ap);
03006 free(temp_attr);
03007 return retval;
03008 }
03009
03010
03011 EXPORTCH int
03012 MC_BarrierDelete_chdl(void *varg)
03013 {
03014 MCAgency_t temp_attr;
03015 extern mc_platform_p g_mc_platform;
03016 int retval;
03017 ChInterp_t interp;
03018 ChVaList_t ap;
03019 int id;
03020
03021 temp_attr = (MCAgency_t)malloc(sizeof(struct agency_s));
03022 CHECK_NULL(temp_attr, exit(-1));
03023 temp_attr->mc_platform = g_mc_platform;
03024
03025 Ch_VaStart(interp, ap, varg);
03026 id = Ch_VaArg(interp, ap, int);
03027 retval = MC_BarrierDelete(temp_attr, id);
03028 Ch_VaEnd(interp, ap);
03029 free(temp_attr);
03030 return retval;
03031 }
03032
03033
03034 EXPORTCH int
03035 MC_BarrierInit_chdl(void *varg)
03036 {
03037 MCAgency_t temp_attr;
03038 extern mc_platform_p g_mc_platform;
03039 int retval;
03040 ChInterp_t interp;
03041 ChVaList_t ap;
03042 int id;
03043 int num_procs;
03044
03045 temp_attr = (MCAgency_t)malloc(sizeof(struct agency_s));
03046 CHECK_NULL(temp_attr, exit(-1));
03047 temp_attr->mc_platform = g_mc_platform;
03048
03049 Ch_VaStart(interp, ap, varg);
03050 id = Ch_VaArg(interp, ap, int);
03051 num_procs = Ch_VaArg(interp, ap, int);
03052 retval = MC_BarrierInit(temp_attr, id, num_procs);
03053 Ch_VaEnd(interp, ap);
03054 free(temp_attr);
03055 return retval;
03056 }
03057
03058
03059 EXPORTCH int
03060 MC_CondBroadcast_chdl(void *varg)
03061 {
03062 MCAgency_t temp_attr;
03063 extern mc_platform_p g_mc_platform;
03064 int retval;
03065 ChInterp_t interp;
03066 ChVaList_t ap;
03067 int id;
03068
03069 temp_attr = (MCAgency_t)malloc(sizeof(struct agency_s));
03070 CHECK_NULL(temp_attr, exit(-1));
03071 temp_attr->mc_platform = g_mc_platform;
03072
03073 Ch_VaStart(interp, ap, varg);
03074 id = Ch_VaArg(interp, ap, int);
03075 retval = MC_CondBroadcast(temp_attr, id);
03076 Ch_VaEnd(interp, ap);
03077 free(temp_attr);
03078 return retval;
03079 }
03080
03081
03082 EXPORTCH MCAgent_t
03083 MC_ComposeAgent_chdl(void *varg)
03084 {
03085 MCAgent_t retval;
03086
03087
03088 const char* name;
03089 const char* home;
03090 const char* owner;
03091 const char* code;
03092 const char* return_var_name;
03093 const char* server;
03094 int persistent;
03095
03096 ChInterp_t interp;
03097 ChVaList_t ap;
03098
03099 Ch_VaStart(interp, ap, varg);
03100
03101 name = Ch_VaArg(interp, ap, const char*);
03102 home = Ch_VaArg(interp, ap, const char*);
03103 owner = Ch_VaArg(interp, ap, const char*);
03104 code = Ch_VaArg(interp, ap, const char*);
03105 return_var_name = Ch_VaArg(interp, ap, const char*);
03106 server = Ch_VaArg(interp, ap, const char*);
03107 persistent = Ch_VaArg(interp, ap, int);
03108
03109 retval= MC_ComposeAgentS(
03110 name,
03111 home,
03112 owner,
03113 code,
03114 return_var_name,
03115 server,
03116 persistent,
03117 NULL);
03118 Ch_VaEnd(interp, ap);
03119 return retval;
03120 }
03121
03122
03123 EXPORTCH MCAgent_t
03124 MC_ComposeAgentWithWorkgroup_chdl(void *varg)
03125 {
03126 MCAgent_t retval;
03127
03128
03129 const char* name;
03130 const char* home;
03131 const char* owner;
03132 const char* code;
03133 const char* return_var_name;
03134 const char* server;
03135 const char* workgroup_code;
03136 int persistent;
03137
03138 ChInterp_t interp;
03139 ChVaList_t ap;
03140
03141 Ch_VaStart(interp, ap, varg);
03142
03143 name = Ch_VaArg(interp, ap, const char*);
03144 home = Ch_VaArg(interp, ap, const char*);
03145 owner = Ch_VaArg(interp, ap, const char*);
03146 code = Ch_VaArg(interp, ap, const char*);
03147 return_var_name = Ch_VaArg(interp, ap, const char*);
03148 server = Ch_VaArg(interp, ap, const char*);
03149 persistent = Ch_VaArg(interp, ap, int);
03150 workgroup_code = Ch_VaArg(interp, ap, const char*);
03151
03152 retval= MC_ComposeAgentS(
03153 name,
03154 home,
03155 owner,
03156 code,
03157 return_var_name,
03158 server,
03159 persistent,
03160 workgroup_code);
03161 Ch_VaEnd(interp, ap);
03162 return retval;
03163 }
03164
03165
03166 EXPORTCH MCAgent_t
03167 MC_ComposeAgentFromFile_chdl(void *varg)
03168 {
03169 MCAgent_t retval;
03170
03171
03172 const char* name;
03173 const char* home;
03174 const char* owner;
03175 const char* filename;
03176 const char* return_var_name;
03177 const char* server;
03178 int persistent;
03179
03180 ChInterp_t interp;
03181 ChVaList_t ap;
03182
03183 Ch_VaStart(interp, ap, varg);
03184
03185 name = Ch_VaArg(interp, ap, const char*);
03186 home = Ch_VaArg(interp, ap, const char*);
03187 owner = Ch_VaArg(interp, ap, const char*);
03188 filename = Ch_VaArg(interp, ap, const char*);
03189 return_var_name = Ch_VaArg(interp, ap, const char*);
03190 server = Ch_VaArg(interp, ap, const char*);
03191 persistent = Ch_VaArg(interp, ap, int);
03192
03193 retval= MC_ComposeAgentFromFileWithWorkgroup(
03194 name,
03195 home,
03196 owner,
03197 filename,
03198 return_var_name,
03199 server,
03200 persistent,
03201 NULL);
03202 Ch_VaEnd(interp, ap);
03203 return retval;
03204 }
03205
03206
03207 EXPORTCH MCAgent_t
03208 MC_ComposeAgentFromFileWithWorkgroup_chdl(void *varg)
03209 {
03210 MCAgent_t retval;
03211
03212
03213 const char* name;
03214 const char* home;
03215 const char* owner;
03216 const char* filename;
03217 const char* return_var_name;
03218 const char* server;
03219 const char* workgroup;
03220 int persistent;
03221
03222 ChInterp_t interp;
03223 ChVaList_t ap;
03224
03225 Ch_VaStart(interp, ap, varg);
03226
03227 name = Ch_VaArg(interp, ap, const char*);
03228 home = Ch_VaArg(interp, ap, const char*);
03229 owner = Ch_VaArg(interp, ap, const char*);
03230 filename = Ch_VaArg(interp, ap, const char*);
03231 return_var_name = Ch_VaArg(interp, ap, const char*);
03232 server = Ch_VaArg(interp, ap, const char*);
03233 workgroup = Ch_VaArg(interp, ap, const char*);
03234 persistent = Ch_VaArg(interp, ap, int);
03235
03236 retval= MC_ComposeAgentFromFileWithWorkgroup(
03237 name,
03238 home,
03239 owner,
03240 filename,
03241 return_var_name,
03242 server,
03243 persistent,
03244 workgroup);
03245 Ch_VaEnd(interp, ap);
03246 return retval;
03247 }
03248
03249
03250 EXPORTCH int
03251 MC_CondSignal_chdl(void *varg)
03252 {
03253 MCAgency_t temp_attr;
03254 extern mc_platform_p g_mc_platform;
03255 int retval;
03256 ChInterp_t interp;
03257 ChVaList_t ap;
03258 int id;
03259
03260 temp_attr = (MCAgency_t)malloc(sizeof(struct agency_s));
03261 CHECK_NULL(temp_attr, exit(-1));
03262 temp_attr->mc_platform = g_mc_platform;
03263
03264 Ch_VaStart(interp, ap, varg);
03265 id = Ch_VaArg(interp, ap, int);
03266 retval = MC_CondSignal(temp_attr, id);
03267 Ch_VaEnd(interp, ap);
03268 free(temp_attr);
03269 return retval;
03270 }
03271
03272
03273 EXPORTCH int
03274 MC_CondReset_chdl(void *varg)
03275 {
03276 MCAgency_t temp_attr;
03277 extern mc_platform_p g_mc_platform;
03278 int retval;
03279 ChInterp_t interp;
03280 ChVaList_t ap;
03281 int id;
03282
03283 temp_attr = (MCAgency_t)malloc(sizeof(struct agency_s));
03284 CHECK_NULL(temp_attr, exit(-1));
03285 temp_attr->mc_platform = g_mc_platform;
03286
03287 Ch_VaStart(interp, ap, varg);
03288 id = Ch_VaArg(interp, ap, int);
03289 retval = MC_CondReset(temp_attr, id);
03290 Ch_VaEnd(interp, ap);
03291 free(temp_attr);
03292 return retval;
03293 }
03294
03295
03296 EXPORTCH int
03297 MC_CondWait_chdl(void *varg)
03298 {
03299 MCAgency_t temp_attr;
03300 extern mc_platform_p g_mc_platform;
03301 int retval;
03302 ChInterp_t interp;
03303 ChVaList_t ap;
03304 int id;
03305
03306 temp_attr = (MCAgency_t)malloc(sizeof(struct agency_s));
03307 CHECK_NULL(temp_attr, exit(-1));
03308 temp_attr->mc_platform = g_mc_platform;
03309
03310 Ch_VaStart(interp, ap, varg);
03311 id = Ch_VaArg(interp, ap, int);
03312 retval = MC_CondWait(temp_attr, id);
03313 Ch_VaEnd(interp, ap);
03314 free(temp_attr);
03315 return retval;
03316 }
03317
03318 EXPORTCH int
03319 MC_DeleteAgent_chdl(void *varg)
03320 {
03321 ChInterp_t interp;
03322 ChVaList_t ap;
03323 MCAgent_t agent;
03324 const char* agentName;
03325 int retval;
03326
03327 Ch_VaStart(interp, ap, varg);
03328 agentName = Ch_VaArg(interp, ap, const char*);
03329 agent = MC_FindAgentByName(NULL, agentName);
03330 if (agent == NULL) {
03331 return MC_ERR_NOT_FOUND;
03332 }
03333 retval = MC_DeleteAgent(agent);
03334 Ch_VaEnd(interp, ap);
03335 return retval;
03336 }
03337
03338 EXPORTCH int
03339 MC_DeleteAgentWG_chdl(void *varg)
03340 {
03341 ChInterp_t interp;
03342 ChVaList_t ap;
03343 const char* agentName;
03344 MCAgent_t calling_agent;
03345 MCAgent_t agent;
03346 int retval;
03347
03348 Ch_VaStart(interp, ap, varg);
03349 calling_agent = Ch_VaArg(interp, ap, MCAgent_t);
03350 agentName = Ch_VaArg(interp, ap, const char*);
03351 agent = MC_FindAgentByName(NULL, agentName);
03352 if (agent == NULL) {
03353 return MC_ERR_NOT_FOUND;
03354 }
03355 retval = MC_DeleteAgentWG(calling_agent, agent);
03356 Ch_VaEnd(interp, ap);
03357 return retval;
03358 }
03359
03360 EXPORTCH int
03361 MC_DestroyServiceSearchResult_chdl(void* varg)
03362 {
03363 ChInterp_t interp;
03364 ChVaList_t ap;
03365 char** agentName;
03366 char** serviceName;
03367 int* agentID;
03368 int numResult;
03369 int retval;
03370
03371 Ch_VaStart(interp, ap, varg);
03372 agentName = Ch_VaArg(interp, ap, char**);
03373 serviceName = Ch_VaArg(interp, ap, char**);
03374 agentID = Ch_VaArg(interp, ap, int*);
03375 numResult = Ch_VaArg(interp, ap, int);
03376
03377 retval = MC_DestroyServiceSearchResult(
03378 agentName,
03379 serviceName,
03380 agentID,
03381 numResult );
03382 Ch_VaEnd(interp, ap);
03383 return retval;
03384 }
03385
03386
03387 EXPORTCH int
03388 MC_DeregisterService_chdl(void *varg)
03389 {
03390 ChInterp_t interp;
03391 ChVaList_t ap;
03392 MCAgency_t temp_attr;
03393 extern mc_platform_p g_mc_platform;
03394 int agentID;
03395 char *serviceName;
03396 int retval;
03397
03398 temp_attr = (MCAgency_t)malloc(sizeof(struct agency_s));
03399 CHECK_NULL(temp_attr, exit(-1));
03400 temp_attr->mc_platform = g_mc_platform;
03401
03402 Ch_VaStart(interp, ap, varg);
03403 agentID = Ch_VaArg(interp, ap, int);
03404 serviceName = (char*)Ch_VaArg(interp, ap, const char*);
03405 retval = MC_DeregisterService(
03406 temp_attr,
03407 agentID,
03408 serviceName );
03409 Ch_VaEnd(interp, ap);
03410 free(temp_attr);
03411 return retval;
03412 }
03413
03414 EXPORTCH int
03415 MC_End_chdl(void *varg)
03416 {
03417 MCAgency_t temp_attr;
03418 extern mc_platform_p g_mc_platform;
03419 int retval;
03420
03421 temp_attr = (MCAgency_t)malloc(sizeof(struct agency_s));
03422 CHECK_NULL(temp_attr, exit(-1));
03423 temp_attr->mc_platform = g_mc_platform;
03424
03425 retval = MC_End(temp_attr);
03426
03427 return retval;
03428 }
03429
03430
03431 EXPORTCH MCAgent_t
03432 MC_FindAgentByID_chdl(void *varg)
03433 {
03434 MCAgency_t temp_attr;
03435 extern mc_platform_p g_mc_platform;
03436 MCAgent_t retval;
03437 ChInterp_t interp;
03438 ChVaList_t ap;
03439 int id;
03440
03441 temp_attr = (MCAgency_t)malloc(sizeof(struct agency_s));
03442 CHECK_NULL(temp_attr, exit(-1));
03443 temp_attr->mc_platform = g_mc_platform;
03444
03445 Ch_VaStart(interp, ap, varg);
03446 id = Ch_VaArg(interp, ap, int);
03447 retval = MC_FindAgentByID(temp_attr, id);
03448 Ch_VaEnd(interp, ap);
03449 free(temp_attr);
03450 return retval;
03451 }
03452
03453
03454 EXPORTCH MCAgent_t
03455 MC_FindAgentByName_chdl(void *varg)
03456 {
03457 MCAgency_t temp_attr;
03458 extern mc_platform_p g_mc_platform;
03459 MCAgent_t retval;
03460 ChInterp_t interp;
03461 ChVaList_t ap;
03462 const char *name;
03463
03464 temp_attr = (MCAgency_t)malloc(sizeof(struct agency_s));
03465 CHECK_NULL(temp_attr, exit(-1));
03466 temp_attr->mc_platform = g_mc_platform;
03467
03468 Ch_VaStart(interp, ap, varg);
03469 name = Ch_VaArg(interp, ap, const char *);
03470 retval = MC_FindAgentByName(temp_attr, name);
03471 Ch_VaEnd(interp, ap);
03472 free(temp_attr);
03473 return retval;
03474 }
03475
03476
03477 #ifndef _WIN32
03478 EXPORTCH time_t
03479 #else
03480 EXPORTCH SYSTEMTIME
03481 #endif
03482 MC_GetAgentArrivalTime_chdl(void *varg)
03483 {
03484 MCAgent_t agent;
03485 ChInterp_t interp;
03486 ChVaList_t ap;
03487 #ifndef _WIN32
03488 time_t arrival_time;
03489 #else
03490 SYSTEMTIME arrival_time;
03491 #endif
03492
03493 Ch_VaStart(interp, ap, varg);
03494 agent = Ch_VaArg(interp, ap, MCAgent_t);
03495 arrival_time = MC_GetAgentArrivalTime(agent);
03496 Ch_VaEnd(interp, ap);
03497 return arrival_time;
03498 }
03499
03500
03501 EXPORTCH int
03502 MC_GetAgentID_chdl(void *varg)
03503 {
03504 MCAgent_t agent;
03505 ChInterp_t interp;
03506 ChVaList_t ap;
03507 int id;
03508
03509 Ch_VaStart(interp, ap, varg);
03510 agent = Ch_VaArg(interp, ap, MCAgent_t);
03511 id = MC_GetAgentID(agent);
03512 Ch_VaEnd(interp, ap);
03513 return id;
03514 }
03515
03516
03517 EXPORTCH char*
03518 MC_GetAgentName_chdl(void *varg)
03519 {
03520 MCAgent_t agent;
03521 ChInterp_t interp;
03522 ChVaList_t ap;
03523 char* name;
03524
03525 Ch_VaStart(interp, ap, varg);
03526 agent = Ch_VaArg(interp, ap, MCAgent_t);
03527 name = MC_GetAgentName(agent);
03528 Ch_VaEnd(interp, ap);
03529 return name;
03530 }
03531
03532
03533 EXPORTCH int
03534 MC_GetAgentNumTasks_chdl(void *varg)
03535 {
03536 MCAgent_t agent;
03537 ChInterp_t interp;
03538 ChVaList_t ap;
03539 int num_tasks;
03540
03541 Ch_VaStart(interp, ap, varg);
03542 agent = Ch_VaArg(interp, ap, MCAgent_t);
03543 num_tasks = MC_GetAgentNumTasks(agent);
03544 Ch_VaEnd(interp, ap);
03545 return num_tasks;
03546 }
03547
03548
03549 EXPORTCH int
03550 MC_GetAgentStatus_chdl(void *varg)
03551 {
03552 MCAgent_t agent;
03553 int status;
03554 ChInterp_t interp;
03555 ChVaList_t ap;
03556
03557 Ch_VaStart(interp, ap, varg);
03558 agent = Ch_VaArg(interp, ap, MCAgent_t);
03559 status = MC_GetAgentStatus(agent);
03560 Ch_VaEnd(interp, ap);
03561 return status;
03562 }
03563
03564
03565 EXPORTCH char *
03566 MC_GetAgentXMLString_chdl(void *varg)
03567 {
03568 ChInterp_t interp;
03569 ChVaList_t ap;
03570 MCAgent_t agent;
03571 char *retval;
03572
03573 Ch_VaStart(interp, ap, varg);
03574 agent = Ch_VaArg(interp, ap, MCAgent_t);
03575 retval = MC_GetAgentXMLString(agent);
03576 Ch_VaEnd(interp, ap);
03577 return retval;
03578 }
03579
03580 #ifndef _WIN32
03581 EXPORTCH int
03582 MC_GetTimeOfDay_chdl(void *varg)
03583 {
03584 ChInterp_t interp;
03585 ChVaList_t ap;
03586 struct timeval *tv;
03587 Ch_VaStart(interp, ap, varg);
03588 tv = Ch_VaArg(interp, ap, struct timeval*);
03589 gettimeofday(tv, NULL);
03590 Ch_VaEnd(interp, ap);
03591 return 0;
03592 }
03593 #endif
03594
03595
03596 EXPORTCH int
03597 MC_HaltAgency_chdl(void *varg)
03598 {
03599 MCAgency_t temp_attr;
03600 int retval;
03601 extern mc_platform_p g_mc_platform;
03602
03603 temp_attr = (MCAgency_t)malloc(sizeof(struct agency_s));
03604 CHECK_NULL(temp_attr, exit(-1));
03605 temp_attr->mc_platform = g_mc_platform;
03606
03607 retval = MC_HaltAgency(temp_attr);
03608
03609 free(temp_attr);
03610 return retval;
03611 }
03612
03613 EXPORTCH int
03614 MC_MigrateAgent_chdl(void *varg)
03615 {
03616 MCAgent_t agent;
03617 const char* hostname;
03618 int port;
03619 int retval;
03620 ChInterp_t interp;
03621 ChVaList_t ap;
03622
03623 Ch_VaStart(interp, ap, varg);
03624 agent = Ch_VaArg(interp, ap, MCAgent_t);
03625 hostname = Ch_VaArg(interp, ap, const char*);
03626 port = Ch_VaArg(interp, ap, int);
03627 retval = MC_MigrateAgent(agent, hostname, port);
03628 return retval;
03629 }
03630
03631
03632 EXPORTCH int
03633 MC_MutexLock_chdl(void *varg)
03634 {
03635 MCAgency_t temp_attr;
03636 extern mc_platform_p g_mc_platform;
03637
03638 ChInterp_t interp;
03639 ChVaList_t ap;
03640 int id;
03641 int retval;
03642
03643 temp_attr = (MCAgency_t)malloc(sizeof(struct agency_s));
03644 CHECK_NULL(temp_attr, exit(-1));
03645 temp_attr->mc_platform = g_mc_platform;
03646
03647 Ch_VaStart(interp, ap, varg);
03648 id = Ch_VaArg(interp, ap, int );
03649 retval = MC_MutexLock(temp_attr, id);
03650 Ch_VaEnd(interp, ap);
03651 free(temp_attr);
03652 return retval;
03653 }
03654
03655
03656 EXPORTCH int
03657 MC_MutexUnlock_chdl(void *varg)
03658 {
03659 MCAgency_t temp_attr;
03660 extern mc_platform_p g_mc_platform;
03661
03662 ChInterp_t interp;
03663 ChVaList_t ap;
03664 int id;
03665 int retval;
03666
03667 temp_attr = (MCAgency_t)malloc(sizeof(struct agency_s));
03668 CHECK_NULL(temp_attr, exit(-1));
03669 temp_attr->mc_platform = g_mc_platform;
03670
03671 Ch_VaStart(interp, ap, varg);
03672 id = Ch_VaArg(interp, ap, int );
03673 retval = MC_MutexUnlock(temp_attr, id);
03674 Ch_VaEnd(interp, ap);
03675 free(temp_attr);
03676 return retval;
03677 }
03678
03679
03680 EXPORTCH int
03681 MC_PrintAgentCode_chdl(void *varg)
03682 {
03683 ChInterp_t interp;
03684 ChVaList_t ap;
03685 MCAgent_t agent;
03686 int retval;
03687
03688 Ch_VaStart(interp, ap, varg);
03689 agent = Ch_VaArg(interp, ap, MCAgent_t);
03690 retval = MC_PrintAgentCode(agent);
03691 Ch_VaEnd(interp, ap);
03692 return retval;
03693 }
03694
03695
03696 EXPORTCH int
03697 MC_RegisterService_chdl(void *varg)
03698 {
03699 ChInterp_t interp;
03700 ChVaList_t ap;
03701 int retval;
03702 MCAgency_t temp_attr;
03703 extern mc_platform_p g_mc_platform;
03704
03705
03706 MCAgent_t agent;
03707 char **serviceNames;
03708 int numServices;
03709
03710 temp_attr = (MCAgency_t)malloc(sizeof(struct agency_s));
03711 CHECK_NULL(temp_attr, exit(-1));
03712 temp_attr->mc_platform = g_mc_platform;
03713
03714 Ch_VaStart(interp, ap, varg);
03715 agent = Ch_VaArg(interp, ap, MCAgent_t);
03716 serviceNames = Ch_VaArg(interp, ap, char **);
03717 numServices = Ch_VaArg(interp, ap, int);
03718
03719 retval = MC_RegisterService(
03720 temp_attr,
03721 agent,
03722 0,
03723 NULL,
03724 serviceNames,
03725 numServices
03726 );
03727 Ch_VaEnd(interp, ap);
03728 free(temp_attr);
03729 return retval;
03730 }
03731
03732
03733 EXPORTCH int
03734 MC_ResumeAgency_chdl(void *varg)
03735 {
03736 MCAgency_t temp_attr;
03737 int retval;
03738 extern mc_platform_p g_mc_platform;
03739
03740 temp_attr = (MCAgency_t)malloc(sizeof(struct agency_s));
03741 CHECK_NULL(temp_attr, exit(-1));
03742 temp_attr->mc_platform = g_mc_platform;
03743
03744 retval = MC_ResumeAgency(temp_attr);
03745
03746 free(temp_attr);
03747 return retval;
03748 }
03749
03750
03751 EXPORTCH MCAgent_t
03752 MC_RetrieveAgent_chdl(void *varg)
03753 {
03754 MCAgency_t temp_attr;
03755 extern mc_platform_p g_mc_platform;
03756 MCAgent_t agent;
03757
03758 temp_attr = (MCAgency_t)malloc(sizeof(struct agency_s));
03759 CHECK_NULL(temp_attr, exit(-1));
03760 temp_attr->mc_platform = g_mc_platform;
03761
03762 agent = MC_RetrieveAgent(temp_attr);
03763 free(temp_attr);
03764 return agent;
03765 }
03766
03767
03768 EXPORTCH char *
03769 MC_RetrieveAgentCode_chdl(void *varg)
03770 {
03771 ChInterp_t interp;
03772 ChVaList_t ap;
03773 MCAgent_t agent;
03774 char *retval;
03775
03776 Ch_VaStart(interp, ap, varg);
03777 agent = Ch_VaArg(interp, ap, MCAgent_t);
03778 retval = MC_RetrieveAgentCode(agent);
03779 Ch_VaEnd(interp, ap);
03780 return retval;
03781 }
03782
03783
03784 EXPORTCH int
03785 MC_SaveData_chdl(void* varg)
03786 {
03787 ChInterp_t interp;
03788 ChVaList_t ap;
03789 interpreter_variable_data_p interp_var_data;
03790 MCAgent_t agent;
03791 int progress;
03792 const char* name;
03793 int size;
03794 void* data;
03795
03796 Ch_VaStart(interp, ap, varg);
03797 agent = Ch_VaArg(interp, ap, MCAgent_t);
03798 name = Ch_VaArg(interp, ap, char*);
03799 size = Ch_VaArg(interp, ap, int);
03800 data = Ch_VaArg(interp, ap, void*);
03801
03802 progress = agent->datastate->task_progress;
03803
03804 interp_var_data = interpreter_variable_data_New();
03805 interp_var_data->name = strdup(name);
03806 interp_var_data->size = size;
03807 interp_var_data->data_type = CH_VOIDPTRTYPE;
03808 interp_var_data->data = malloc(size);
03809 memcpy(interp_var_data->data, data, size);
03810
03811 agent_variable_list_Add(
03812 agent->datastate->tasks[progress]->agent_variable_list,
03813 interp_var_data );
03814
03815 return 0;
03816 }
03817
03818
03819 EXPORTCH int
03820 MC_SearchForService_chdl(void *varg)
03821 {
03822 ChInterp_t interp;
03823 ChVaList_t ap;
03824 int retval;
03825 MCAgency_t temp_attr;
03826 extern mc_platform_p g_mc_platform;
03827
03828
03829 const char* searchString;
03830 char*** agentNames;
03831 char*** serviceNames;
03832 int** agentIDs;
03833 int* numResults;
03834
03835 temp_attr = (MCAgency_t)malloc(sizeof(struct agency_s));
03836 CHECK_NULL(temp_attr, exit(-1));
03837 temp_attr->mc_platform = g_mc_platform;
03838
03839 Ch_VaStart(interp, ap, varg);
03840 searchString = Ch_VaArg(interp, ap, const char*);
03841 agentNames = Ch_VaArg(interp, ap, char***);
03842 serviceNames = Ch_VaArg(interp, ap, char***);
03843 agentIDs = Ch_VaArg(interp, ap, int**);
03844 numResults = Ch_VaArg(interp, ap, int*);
03845
03846 retval = MC_SearchForService(
03847 temp_attr,
03848 searchString,
03849 agentNames,
03850 serviceNames,
03851 agentIDs,
03852 numResults
03853 );
03854 Ch_VaEnd(interp, ap);
03855 free(temp_attr);
03856 return retval;
03857 }
03858
03859
03860 EXPORTCH int
03861 MC_SemaphorePost_chdl(void *varg)
03862 {
03863 MCAgency_t temp_attr;
03864 extern mc_platform_p g_mc_platform;
03865
03866 ChInterp_t interp;
03867 ChVaList_t ap;
03868 int id;
03869 int retval;
03870
03871 temp_attr = (MCAgency_t)malloc(sizeof(struct agency_s));
03872 CHECK_NULL(temp_attr, exit(-1));
03873 temp_attr->mc_platform = g_mc_platform;
03874
03875 Ch_VaStart(interp, ap, varg);
03876 id = Ch_VaArg(interp, ap, int );
03877 retval = MC_SemaphorePost(temp_attr, id);
03878 Ch_VaEnd(interp, ap);
03879 free(temp_attr);
03880 return retval;
03881 }
03882
03883
03884 EXPORTCH int
03885 MC_SemaphoreWait_chdl(void *varg)
03886 {
03887 MCAgency_t temp_attr;
03888 extern mc_platform_p g_mc_platform;
03889
03890 ChInterp_t interp;
03891 ChVaList_t ap;
03892 int id;
03893 int retval;
03894
03895 temp_attr = (MCAgency_t)malloc(sizeof(struct agency_s));
03896 CHECK_NULL(temp_attr, exit(-1));
03897 temp_attr->mc_platform = g_mc_platform;
03898
03899 Ch_VaStart(interp, ap, varg);
03900 id = Ch_VaArg(interp, ap, int );
03901 retval = MC_SemaphoreWait(temp_attr, id);
03902 Ch_VaEnd(interp, ap);
03903 free(temp_attr);
03904 return retval;
03905 }
03906
03907
03908 EXPORTCH int
03909 MC_SendAgentMigrationMessage_chdl(void *varg)
03910 {
03911 MCAgency_t temp_attr;
03912 extern mc_platform_p g_mc_platform;
03913 const char *message, *hostname;
03914 int port, retval;
03915 ChInterp_t interp;
03916 ChVaList_t ap;
03917
03918 temp_attr = (MCAgency_t)malloc(sizeof(struct agency_s));
03919 CHECK_NULL(temp_attr, exit(-1));
03920 temp_attr->mc_platform = g_mc_platform;
03921
03922 Ch_VaStart(interp, ap, varg);
03923 message = Ch_VaArg(interp, ap, char *);
03924 hostname = Ch_VaArg(interp, ap, char *);
03925 port = Ch_VaArg(interp, ap, int);
03926 retval = MC_SendAgentMigrationMessage(temp_attr, message, hostname, port);
03927 Ch_VaEnd(interp, ap);
03928 free(temp_attr);
03929 return retval;
03930 }
03931
03932
03933 EXPORTCH int
03934 MC_SendAgentMigrationMessageFile_chdl(void *varg)
03935 {
03936 MCAgency_t temp_attr;
03937 char *filename, *hostname;
03938 int port, retval;
03939 ChInterp_t interp;
03940 ChVaList_t ap;
03941
03942 temp_attr = NULL;
03943
03944 Ch_VaStart(interp, ap, varg);
03945 filename = Ch_VaArg(interp, ap, char *);
03946 hostname = Ch_VaArg(interp, ap, char *);
03947 port = Ch_VaArg(interp, ap, int);
03948 retval = MC_SendAgentMigrationMessageFile(temp_attr, filename, hostname, port);
03949 Ch_VaEnd(interp, ap);
03950 return retval;
03951 }
03952
03953 EXPORTCH int
03954 MC_SendSteerCommand_chdl(void *varg)
03955 {
03956 MCAgency_t temp_attr;
03957 int retval;
03958 enum MC_SteerCommand_e command;
03959 extern mc_platform_p g_mc_platform;
03960 ChInterp_t interp;
03961 ChVaList_t ap;
03962
03963 temp_attr = (MCAgency_t)malloc(sizeof(struct agency_s));
03964 CHECK_NULL(temp_attr, exit(-1));
03965 temp_attr->mc_platform = g_mc_platform;
03966
03967 Ch_VaStart(interp, ap, varg);
03968 command = Ch_VaArg(interp, ap, enum MC_SteerCommand_e );
03969 retval = MC_SendSteerCommand(temp_attr, command);
03970 Ch_VaEnd(interp, ap);
03971 free(temp_attr);
03972 return retval;
03973 }
03974
03975
03976 EXPORTCH int
03977 MC_SetAgentStatus_chdl(void *varg)
03978 {
03979 MCAgent_t agent;
03980 int status;
03981 int ret;
03982 ChInterp_t interp;
03983 ChVaList_t ap;
03984
03985 Ch_VaStart(interp, ap, varg);
03986 agent = Ch_VaArg(interp, ap, MCAgent_t);
03987 status = Ch_VaArg(interp, ap, int);
03988 ret = MC_SetAgentStatus(agent, (enum MC_AgentStatus_e) status);
03989 Ch_VaEnd(interp, ap);
03990 return ret;
03991 }
03992
03993
03994 EXPORTCH int
03995 MC_SetDefaultAgentStatus_chdl(void *varg)
03996 {
03997 MCAgency_t temp_attr;
03998 extern mc_platform_p g_mc_platform;
03999 int status;
04000 int ret;
04001 ChInterp_t interp;
04002 ChVaList_t ap;
04003
04004 temp_attr = (MCAgency_t)malloc(sizeof(struct agency_s));
04005 CHECK_NULL(temp_attr, exit(1););
04006 temp_attr->mc_platform = g_mc_platform;
04007
04008 Ch_VaStart(interp, ap, varg);
04009 status = Ch_VaArg(interp, ap, int);
04010 ret = (int)MC_SetDefaultAgentStatus(temp_attr, (enum MC_AgentStatus_e)status);
04011 Ch_VaEnd(interp, ap);
04012 free(temp_attr);
04013 return ret;
04014 }
04015
04016
04017 EXPORTCH int
04018 MC_SyncDelete_chdl(void *varg)
04019 {
04020 MCAgency_t temp_attr;
04021 extern mc_platform_p g_mc_platform;
04022 int retval;
04023 ChInterp_t interp;
04024 ChVaList_t ap;
04025 int id;
04026
04027 temp_attr = (MCAgency_t)malloc(sizeof(struct agency_s));
04028 CHECK_NULL(temp_attr, exit(-1));
04029 temp_attr->mc_platform = g_mc_platform;
04030
04031 Ch_VaStart(interp, ap, varg);
04032 id = Ch_VaArg(interp, ap, int);
04033 retval = MC_SyncDelete(temp_attr, id);
04034 Ch_VaEnd(interp, ap);
04035 free(temp_attr);
04036 return retval;
04037 }
04038
04039
04040 EXPORTCH int
04041 MC_SyncInit_chdl(void *varg)
04042 {
04043 MCAgency_t temp_attr;
04044 extern mc_platform_p g_mc_platform;
04045 int retval;
04046 ChInterp_t interp;
04047 ChVaList_t ap;
04048 int id;
04049
04050 temp_attr = (MCAgency_t)malloc(sizeof(struct agency_s));
04051 CHECK_NULL(temp_attr, exit(-1));
04052 temp_attr->mc_platform = g_mc_platform;
04053
04054 Ch_VaStart(interp, ap, varg);
04055 id = Ch_VaArg(interp, ap, int);
04056
04057 retval = MC_SyncInit(temp_attr, id);
04058 Ch_VaEnd(interp, ap);
04059 free(temp_attr);
04060 return retval;
04061 }
04062
04063
04064 EXPORTCH int
04065 MC_TerminateAgent_chdl(void *varg)
04066 {
04067 ChInterp_t interp;
04068 ChVaList_t ap;
04069 const char* agentName;
04070 MCAgent_t agent;
04071 int retval;
04072
04073 Ch_VaStart(interp, ap, varg);
04074 agentName = Ch_VaArg(interp, ap, const char*);
04075 agent = MC_FindAgentByName(NULL, agentName);
04076 if (agent == NULL) {
04077 return MC_ERR_NOT_FOUND;
04078 }
04079 retval = MC_TerminateAgent(agent);
04080 Ch_VaEnd(interp, ap);
04081 return retval;
04082 }
04083
04084
04085 EXPORTCH int
04086 MC_TerminateAgentWG_chdl(void *varg)
04087 {
04088 ChInterp_t interp;
04089 ChVaList_t ap;
04090 const char* agentName;
04091 MCAgent_t calling_agent;
04092 MCAgent_t agent;
04093 int retval;
04094
04095 Ch_VaStart(interp, ap, varg);
04096 calling_agent = Ch_VaArg(interp, ap, MCAgent_t);
04097 agentName = Ch_VaArg(interp, ap, const char*);
04098 agent = MC_FindAgentByName(NULL, agentName);
04099 if (agent == NULL) {
04100 return MC_ERR_NOT_FOUND;
04101 }
04102 retval = MC_TerminateAgentWG(calling_agent, agent);
04103 Ch_VaEnd(interp, ap);
04104 return retval;
04105 }