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