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