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