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