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