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