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