00001 /* SVN FILE INFO 00002 * $Revision: 230 $ : Last Committed Revision 00003 * $Date: 2008年10月24日 15:47:36 -0700 (2008年10月24日) $ : Last Committed Date */ 00004 /*[ 00005 * Copyright (c) 2007 Integration Engineering Laboratory 00006 University of California, Davis 00007 * 00008 * Permission to use, copy, and distribute this software and its 00009 * documentation for any purpose with or without fee is hereby granted, 00010 * provided that the above copyright notice appear in all copies and 00011 * that both that copyright notice and this permission notice appear 00012 * in supporting documentation. 00013 * 00014 * Permission to modify the software is granted, but not the right to 00015 * distribute the complete modified source code. Modifications are to 00016 * be distributed as patches to the released version. Permission to 00017 * distribute binaries produced by compiling modified sources is granted, 00018 * provided you 00019 * 1. distribute the corresponding source modifications from the 00020 * released version in the form of a patch file along with the binaries, 00021 * 2. add special version identification to distinguish your version 00022 * in addition to the base release version number, 00023 * 3. provide your name and address as the primary contact for the 00024 * support of your modified version, and 00025 * 4. retain our contact information in regard to use of the base 00026 * software. 00027 * Permission to distribute the released version of the source code along 00028 * with corresponding source modifications in the form of a patch file is 00029 * granted with same provisions 2 through 4 for binary distributions. 00030 * 00031 * This software is provided "as is" without express or implied warranty 00032 * to the extent permitted by applicable law. 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 /* The Global platform variable */ 00065 mc_platform_p g_mc_platform; 00066 00067 /* **************************** * 00068 * Libmc Binary Space Functions * 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 /* FIXME: We may want to multithread this later for asynchronous 00104 * sending to multiple hosts. But for now, we will use a simple 00105 * loop. */ 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 /* The receiver may or may not have an address. If it does, send the 00125 * message to that address. If not, assume that the target agent is 00126 * local and try to send to that agent. */ 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 /* Send to the first address listed */ 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 /* Set up the message envelope */ 00161 msg->content[0].data = (void*)fipa_envelope_Compose(acl); 00162 00163 msg->content[0].content_type = strdup("application/xml"); 00164 00165 /* Set up the ACL message */ 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 /* ACL Helper Functions Here */ 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 /* There is already a sender. Lets over-write it */ 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 /* Copy existing addresses to new array */ 00246 for(i = 0; i < acl->receiver->num-1; i++) { 00247 tmp[i] = acl->receiver->fipa_agent_identifiers[i]; 00248 } 00249 /* Create new receiver */ 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 /* Copy existing addresses to new array */ 00281 for(i = 0; i < acl->reply_to->num-1; i++) { 00282 tmp[i] = acl->reply_to->fipa_agent_identifiers[i]; 00283 } 00284 /* Create new reply_to */ 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 /* There is already content. Lets over-write it. */ 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 /* End ACL Helper Functions */ 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 /* Wake all agents/threads waiting on this barrier */ 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 /* First see if there already exists a barrier of the same ID. */ 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 int numArgs, 00420 ...) 00421 { 00422 int return_code; 00423 va_list vl; 00424 va_start(vl, numArgs); 00425 MUTEX_LOCK(agent->run_lock); 00426 return_code = Ch_CallFuncByNamev( 00427 agent->agent_interp, 00428 funcName, 00429 returnVal, 00430 vl ); 00431 MUTEX_UNLOCK(agent->run_lock); 00432 return return_code; 00433 } 00434 00435 EXPORTMC int 00436 MC_CallAgentFuncArg( /*{{{*/ 00437 MCAgent_t agent, 00438 const char* funcName, 00439 void* returnVal, /* FIXME: Should this be a double pointer? */ 00440 void* arg) 00441 { 00442 int return_code; 00443 00444 MUTEX_LOCK(agent->run_lock); 00445 return_code = Ch_CallFuncByName( 00446 agent->agent_interp, 00447 funcName, 00448 returnVal, 00449 arg); 00450 MUTEX_UNLOCK(agent->run_lock); 00451 return return_code; 00452 } /*}}}*/ 00453 00454 EXPORTMC int 00455 MC_CallAgentFuncV( 00456 MCAgent_t agent, 00457 const char* funcName, 00458 void* returnVal, 00459 va_list ap) 00460 { 00461 int return_code; 00462 MUTEX_LOCK(agent->run_lock); 00463 return_code = Ch_CallFuncByNamev 00464 ( 00465 agent->agent_interp, 00466 funcName, 00467 returnVal, 00468 ap 00469 ); 00470 MUTEX_UNLOCK(agent->run_lock); 00471 return return_code; 00472 } 00473 00474 EXPORTMC int 00475 MC_CallAgentFuncVar( 00476 MCAgent_t agent, 00477 const char* funcName, 00478 void* returnVal, 00479 ChVaList_t varg) 00480 { 00481 int return_code; 00482 MUTEX_LOCK(agent->run_lock); 00483 return_code = Ch_CallFuncByNameVar 00484 ( 00485 agent->agent_interp, 00486 funcName, 00487 returnVal, 00488 varg 00489 ); 00490 MUTEX_UNLOCK(agent->run_lock); 00491 return return_code; 00492 } 00493 00494 EXPORTMC int 00495 MC_ChInitializeOptions(MCAgency_t attr, ChOptions_t *options) { /*{{{*/ 00496 if(attr->mc_platform == NULL) { 00497 fprintf(stderr, "MC_ChInitializeOptions must be called after MC_Start()\n"); 00498 fprintf(stderr, "Using default interpretor options...\n"); 00499 return 1; 00500 } 00501 else { 00502 if (attr->mc_platform->interp_options == NULL) { 00503 attr->mc_platform->interp_options = (ChOptions_t*)malloc( 00504 sizeof(ChOptions_t) ); 00505 } 00506 *attr->mc_platform->interp_options = *options; 00507 attr->mc_platform->interp_options->chhome = strdup(options->chhome); 00508 return 0; 00509 } 00510 } /*}}}*/ 00511 00512 MCAgent_t 00513 MC_ComposeAgent( 00514 const char* name, 00515 const char* home, 00516 const char* owner, 00517 const char* code, 00518 const char* return_var_name, 00519 const char* server, 00520 int persistent 00521 ) 00522 { 00523 agent_p agent; 00524 agent = agent_New(); 00525 if (agent == NULL) return NULL; 00526 agent->name = strdup(name); 00527 agent->home = strdup(home); 00528 agent->owner = strdup(owner); 00529 00530 agent->orphan = 1; 00531 00532 agent->agent_type = MC_LOCAL_AGENT; 00533 agent->agent_status = MC_WAIT_MESSGSEND; 00534 00535 agent->datastate = agent_datastate_New(); 00536 agent->datastate->number_of_tasks = 1; 00537 agent->datastate->persistent = persistent; 00538 agent->datastate->agent_code_ids = (char**)malloc( 00539 sizeof(char*)*2); 00540 if(agent->datastate->agent_code_ids == NULL) { 00541 fprintf(stderr, "Memory Error %s:%d\n", __FILE__, __LINE__); 00542 } 00543 agent->datastate->agent_code_ids[0] = strdup(""); 00544 if(agent->datastate->agent_code_ids[0] == NULL) { 00545 fprintf(stderr, "Memory Error %s:%d\n", __FILE__, __LINE__); 00546 } 00547 agent->datastate->agent_code_ids[1] = NULL; 00548 00549 agent->datastate->agent_codes = (char**)malloc( 00550 sizeof(char*)*2); 00551 if(agent->datastate->agent_codes == NULL) { 00552 fprintf(stderr, "Memory Error %s:%d\n", __FILE__, __LINE__); 00553 } 00554 agent->datastate->agent_codes[0] = strdup(code); 00555 if(agent->datastate->agent_codes[0] == NULL) { 00556 fprintf(stderr, "Memory Error %s:%d\n", __FILE__, __LINE__); 00557 } 00558 agent->datastate->agent_codes[1] = NULL; 00559 00560 agent->datastate->agent_code = agent->datastate->agent_codes[0]; 00561 00562 agent->datastate->tasks = (agent_task_t**)malloc( 00563 sizeof(agent_task_t*)); 00564 agent->datastate->tasks[0] = agent_task_New(); 00565 if(return_var_name == NULL) { 00566 agent->datastate->tasks[0]->var_name = strdup("no-return"); 00567 } else { 00568 agent->datastate->tasks[0]->var_name = strdup(return_var_name); 00569 } 00570 if(agent->datastate->tasks[0]->var_name == NULL) { 00571 fprintf(stderr, "Memory Error %s:%d\n", __FILE__, __LINE__); 00572 } 00573 00574 agent->datastate->tasks[0]->server_name = strdup(server); 00575 if(agent->datastate->tasks[0]->server_name == NULL) { 00576 fprintf(stderr, "Memory Error %s:%d\n", __FILE__, __LINE__); 00577 } 00578 00579 return agent; 00580 } 00581 00582 EXPORTMC int 00583 MC_CondBroadcast(MCAgency_t attr, int id) /*{{{*/ 00584 { 00585 syncListNode_t *condnode; 00586 condnode = syncListFind(id, attr->mc_platform->syncList); 00587 if (condnode == NULL) { 00588 return MC_ERR_NOT_FOUND; 00589 } 00590 MUTEX_LOCK(condnode->lock); 00591 condnode->signalled=1; 00592 COND_BROADCAST(condnode->cond); 00593 MUTEX_UNLOCK(condnode->lock); 00594 return 0; 00595 } /*}}}*/ 00596 00597 EXPORTMC int 00598 MC_CondSignal(MCAgency_t attr, int id) /*{{{*/ 00599 { 00600 syncListNode_t *condnode; 00601 condnode = syncListFind(id, attr->mc_platform->syncList); 00602 if (condnode == NULL) { 00603 return MC_ERR_NOT_FOUND; 00604 } 00605 MUTEX_LOCK(condnode->lock); 00606 condnode->signalled=1; 00607 COND_SIGNAL(condnode->cond); 00608 MUTEX_UNLOCK(condnode->lock); 00609 return 0; 00610 } /*}}}*/ 00611 00612 EXPORTMC int 00613 MC_CondWait(MCAgency_t attr, int id) /*{{{*/ 00614 { 00615 syncListNode_t *condnode; 00616 condnode = syncListFind(id, attr->mc_platform->syncList); 00617 if (condnode == NULL) { 00618 return MC_ERR_NOT_FOUND; 00619 } 00620 MUTEX_LOCK(condnode->lock); 00621 if (condnode->signalled) { 00622 MUTEX_UNLOCK(condnode->lock); 00623 return 1; 00624 } 00625 00626 while (condnode->signalled == 0) { 00627 COND_WAIT(condnode->cond, condnode->lock); 00628 } 00629 MUTEX_UNLOCK(condnode->lock); 00630 00631 return 0; 00632 } /*}}}*/ 00633 00634 EXPORTMC int 00635 MC_CondReset(MCAgency_t attr, int id) /*{{{*/ 00636 { 00637 syncListNode_t *condnode; 00638 condnode = syncListFind(id, attr->mc_platform->syncList); 00639 if (condnode == NULL) { 00640 return MC_ERR_NOT_FOUND; 00641 } 00642 MUTEX_LOCK(condnode->lock); 00643 if (condnode->signalled) { 00644 condnode->signalled = 0; 00645 MUTEX_UNLOCK(condnode->lock); 00646 return 0; 00647 } 00648 MUTEX_UNLOCK(condnode->lock); 00649 return 1; 00650 } /*}}}*/ 00651 00652 int 00653 MC_CopyAgent(MCAgent_t* agent_out, const MCAgent_t agent_in) /*{{{*/ 00654 { 00655 *agent_out = agent_Copy(agent_in); 00656 return MC_SUCCESS; 00657 } /*}}}*/ 00658 00659 EXPORTMC int 00660 MC_DeleteAgent(MCAgent_t agent) /*{{{*/ 00661 { 00662 /* Error Checking */ 00663 CHECK_NULL(agent, return MC_ERR_INVALID;); 00664 00665 /* First, make sure the agent is no longer running */ 00666 MC_TerminateAgent(agent); 00667 00668 /* Now, we just set it's status to MC_WAIT_FINISHED so that the AMS will 00669 * flush it next chance it gets. */ 00670 MC_SetAgentStatus(agent, MC_WAIT_FINISHED); 00671 return MC_SUCCESS; 00672 } /*}}}*/ 00673 00674 int MC_DestroyServiceSearchResult( 00675 char** agentName, 00676 char** serviceName, 00677 int* agentID, 00678 int numResult) 00679 { 00680 int i; 00681 for(i = 0;i < numResult; i++) 00682 { 00683 free(agentName[i]); 00684 free(serviceName[i]); 00685 } 00686 free(agentName); 00687 free(serviceName); 00688 free(agentID); 00689 00690 return 0; 00691 } 00692 00693 int 00694 MC_DeregisterService( /*{{{*/ 00695 MCAgency_t agency, 00696 int agentID, 00697 const char *serviceName) 00698 { 00699 int err_code; 00700 00701 df_request_list_node_t *req_node; 00702 df_deregister_p deregister_data; 00703 00704 req_node = df_request_list_node_New(); 00705 req_node->command = (char*)malloc(sizeof(char)*11); 00706 00707 strcpy((char*)req_node->command, "deregister"); 00708 00709 deregister_data = (df_deregister_p)malloc(sizeof(df_deregister_t)); 00710 deregister_data->agent_id = agentID; 00711 deregister_data->service_name = (char*)serviceName; 00712 00713 req_node->data = deregister_data; 00714 00715 err_code = df_AddRequest( 00716 agency->mc_platform->df, 00717 req_node 00718 ); 00719 return err_code; 00720 } /*}}}*/ 00721 00722 EXPORTMC int 00723 MC_End(MCAgency_t agency) /*{{{*/ 00724 { 00725 /* Now, we must stop all the running pthreads somehow... */ 00726 /* We will set the quit flag and signal some important threads to make 00727 * sure they exit cleanly. We want the df, ams, and especially the acc 00728 * to be done with whatever they are doing before exiting. */ 00729 MUTEX_LOCK(agency->mc_platform->quit_lock); 00730 agency->mc_platform->quit = 1; 00731 MUTEX_UNLOCK(agency->mc_platform->quit_lock); 00732 00733 /* Stop the command prompt */ 00734 if( GET_THREAD_MODE( agency->threads, MC_THREAD_CP)) { 00735 THREAD_CANCEL( agency->mc_platform->cmd_prompt->thread ); 00736 } 00737 00738 /* Stop the listen thread */ 00739 if( GET_THREAD_MODE( agency->threads, MC_THREAD_ACC)) { 00740 THREAD_CANCEL( agency->mc_platform->acc->listen_thread ); 00741 } 00742 00743 /* Stop the connection queue */ 00744 COND_SIGNAL(agency->mc_platform->connection_queue->cond); 00745 if( GET_THREAD_MODE( agency->threads, MC_THREAD_ACC)) { 00746 THREAD_JOIN(agency->mc_platform->acc->thread); 00747 } 00748 00749 /* Stop the message queue */ 00750 COND_SIGNAL(agency->mc_platform->message_queue->cond); 00751 if( GET_THREAD_MODE( agency->threads, MC_THREAD_ACC)) { 00752 THREAD_JOIN(agency->mc_platform->acc->message_handler_thread); 00753 } 00754 00755 /* Stop the AMS */ 00756 COND_SIGNAL(agency->mc_platform->ams->runflag_cond); 00757 if( GET_THREAD_MODE( agency->threads, MC_THREAD_AMS)) { 00758 THREAD_JOIN(agency->mc_platform->ams->thread); 00759 } 00760 00761 /* Stop the DF */ 00762 COND_SIGNAL(agency->mc_platform->df->request_list->cond); 00763 if( GET_THREAD_MODE( agency->threads, MC_THREAD_DF)) { 00764 THREAD_JOIN(agency->mc_platform->df->thread); 00765 } 00766 00767 mc_platform_Destroy(agency->mc_platform); 00768 00769 if (agency->hostName) 00770 free(agency->hostName); 00771 free(agency); 00772 00773 return 0; 00774 } /*}}}*/ 00775 00776 EXPORTMC MCAgent_t 00777 MC_FindAgentByName( MCAgency_t attr, /*{{{*/ 00778 const char *name) 00779 { 00780 extern mc_platform_p g_mc_platform; 00781 if (attr == NULL) { 00782 return agent_queue_SearchName(g_mc_platform->agent_queue, name); 00783 } else { 00784 return agent_queue_SearchName(attr->mc_platform->agent_queue, 00785 name); 00786 } 00787 } /*}}}*/ 00788 00789 EXPORTMC MCAgent_t 00790 MC_FindAgentByID( MCAgency_t attr, /*{{{*/ 00791 int ID) 00792 { 00793 extern mc_platform_p g_mc_platform; 00794 if (attr == NULL) { 00795 return agent_queue_Search(g_mc_platform->agent_queue, ID); 00796 } else { 00797 return agent_queue_Search(attr->mc_platform->agent_queue, 00798 ID); 00799 } 00800 } /*}}}*/ 00801 00802 #ifndef _WIN32 00803 time_t 00804 #else 00805 SYSTEMTIME 00806 #endif 00807 MC_GetAgentArrivalTime(MCAgent_t agent) /*{{{*/ 00808 { 00809 if (agent != NULL) { 00810 return agent->arrival_time; 00811 } else { 00812 #ifndef _WIN32 00813 return (time_t)-1; 00814 #else 00815 SYSTEMTIME oy; 00816 return oy; 00817 #endif 00818 } 00819 } /*}}}*/ 00820 00821 EXPORTMC int 00822 MC_GetAgentStatus(MCAgent_t agent) /*{{{*/ 00823 { 00824 int status; 00825 MUTEX_LOCK(agent->lock); 00826 status = agent->agent_status; 00827 MUTEX_UNLOCK(agent->lock); 00828 return status; 00829 } /*}}}*/ 00830 00831 EXPORTMC char* 00832 MC_GetAgentXMLString(MCAgent_t agent) /*{{{*/ 00833 { 00834 char *ret; 00835 ret = mxmlSaveAllocString( 00836 agent->datastate->xml_agent_root, 00837 NULL 00838 ); 00839 return ret; 00840 } /*}}}*/ 00841 00842 /*ChInterp_t */ 00843 EXPORTMC void* 00844 MC_GetAgentExecEngine(MCAgent_t agent) /*{{{*/ 00845 { 00846 return agent->agent_interp; 00847 } /*}}}*/ 00848 00849 EXPORTMC int 00850 MC_GetAgentID( /*{{{*/ 00851 MCAgent_t agent 00852 ) 00853 { 00854 return agent->id; 00855 } /*}}}*/ 00856 00857 EXPORTMC char* 00858 MC_GetAgentName( /*{{{*/ 00859 MCAgent_t agent 00860 ) 00861 { 00862 char *name; 00863 MUTEX_LOCK(agent->lock); 00864 name = (char*)malloc(sizeof(char) * 00865 (strlen (agent->name) + 1) 00866 ); 00867 strcpy( 00868 name, 00869 agent->name 00870 ); 00871 MUTEX_UNLOCK(agent->lock); 00872 return name; 00873 } /*}}}*/ 00874 00875 EXPORTMC int 00876 MC_GetAgentReturnData( /*{{{*/ 00877 MCAgent_t agent, 00878 int task_num, 00879 void **data, 00880 int *dim, 00881 int **extent) 00882 { 00883 int num_elements; 00884 int size; 00885 int i; 00886 if (task_num >= agent->datastate->number_of_tasks) { 00887 *data = NULL; 00888 *dim = 0; 00889 *extent = NULL; 00890 return 1; 00891 } 00892 if ( 00893 agent->datastate->tasks[task_num]-> 00894 agent_return_data->data_type == -1 00895 ) 00896 { 00897 return 1; 00898 } 00899 CH_DATATYPE_SIZE( 00900 agent->datastate->tasks[task_num]->agent_return_data->data_type, 00901 size); 00902 num_elements = 1; 00903 for ( 00904 i = 0; 00905 i < agent->datastate->tasks[task_num]->agent_return_data->array_dim; 00906 i++ 00907 ) 00908 { 00909 num_elements *= agent->datastate-> 00910 tasks[task_num]->agent_return_data->array_extent[i]; 00911 } 00912 00913 00914 *data = malloc(num_elements * size); 00915 memcpy( 00916 *data, 00917 agent->datastate->tasks[task_num]-> 00918 agent_return_data->data, 00919 size * num_elements 00920 ); 00921 *dim = agent->datastate->tasks[task_num]->agent_return_data->array_dim; 00922 *extent = (int*)malloc( 00923 sizeof(int) * 00924 agent->datastate->tasks[task_num]->agent_return_data->array_dim 00925 ); 00926 for (i = 0; i < *dim; i++) { 00927 (*extent)[i] = 00928 agent->datastate->tasks[task_num]->agent_return_data->array_extent[i]; 00929 } 00930 /* memcpy( 00931 *extent, 00932 agent->datastate->tasks[0]->agent_return_data->array_extent, 00933 *dim 00934 ); */ 00935 return 0; 00936 } /*}}}*/ 00937 00938 EXPORTMC int 00939 MC_GetAgentNumTasks(MCAgent_t agent) /*{{{*/ 00940 { 00941 return agent->datastate->number_of_tasks; 00942 } /*}}}*/ 00943 00944 EXPORTMC enum MC_AgentType_e 00945 MC_GetAgentType(MCAgent_t agent) /*{{{*/ 00946 { 00947 if (agent != NULL) { 00948 return agent->agent_type; 00949 } else { 00950 return 0; 00951 } 00952 } /*}}}*/ 00953 00954 int 00955 MC_GetAllAgents(MCAgency_t attr, MCAgent_t **agents, int* num_agents) /*{{{*/ 00956 { 00957 int halt; 00958 int index = 0; 00959 MUTEX_LOCK(attr->mc_platform->giant_lock); 00960 halt = (attr->mc_platform->giant == 1) ? 1 : 0; 00961 MUTEX_UNLOCK(attr->mc_platform->giant_lock); 00962 if (halt) 00963 MC_HaltAgency(attr); 00964 /* Count the number of agents */ 00965 while (agent_queue_SearchIndex(attr->mc_platform->agent_queue, index) != NULL) { 00966 index++; 00967 } 00968 *agents = (MCAgent_t *)malloc(sizeof(MCAgent_t*) * index); 00969 *num_agents = index; 00970 /* Assign the agents */ 00971 index = 0; 00972 while 00973 ( 00974 ( 00975 (*agents)[index] = agent_queue_SearchIndex 00976 ( 00977 attr->mc_platform->agent_queue, 00978 index 00979 ) 00980 ) 00981 ) 00982 { 00983 index++; 00984 } 00985 if(halt) 00986 MC_ResumeAgency(attr); 00987 return 0; 00988 } /*}}}*/ 00989 00990 EXPORTMC int 00991 MC_HaltAgency(MCAgency_t attr) /*{{{*/ 00992 { 00993 MUTEX_LOCK(attr->mc_platform->giant_lock); 00994 attr->mc_platform->giant=0; 00995 MUTEX_UNLOCK(attr->mc_platform->giant_lock); 00996 return 0; 00997 } /*}}}*/ 00998 00999 EXPORTMC MCAgency_t 01000 MC_Initialize( /*{{{*/ 01001 int port, 01002 MCAgencyOptions_t *options) 01003 { 01004 MCAgency_t ret; 01005 int i=0; 01006 int options_malloc = 0; 01007 ret = (MCAgency_t)malloc(sizeof(struct agency_s)); 01008 if (ret == NULL) {return NULL;} 01009 01010 ret->hostName = malloc(HOST_NAME_MAX); 01011 if (ret->hostName == NULL) {return NULL;} 01012 gethostname(ret->hostName, HOST_NAME_MAX); 01013 /*Save some memory */ 01014 CHECK_NULL( 01015 realloc(ret->hostName, sizeof(char)*(strlen(ret->hostName)+1)), 01016 return NULL; 01017 ); 01018 if (ret->hostName == NULL) {return NULL;} 01019 ret->portno = port; 01020 ret->server = 1; 01021 ret->client = 0; 01022 ret->default_agentstatus = -1; 01023 #ifdef MC_SECURITY 01024 ret->enable_security = 1; 01025 #endif 01026 01027 /* Set up agency options */ 01028 if(options==NULL) { 01029 options = (MCAgencyOptions_t*)malloc(sizeof(MCAgencyOptions_t)); 01030 MC_InitializeAgencyOptions(options); 01031 options_malloc = 1; 01032 } 01033 ret->threads = options->threads; 01034 ret->default_agentstatus = options->default_agent_status; 01035 #ifdef MC_SECURITY 01036 ret->enable_security = options->enable_security; 01037 #endif 01038 for(i = 0; i < MC_THREAD_ALL; i++) { 01039 ret->stack_size[i] = options->stack_size[i]; 01040 } 01041 /* End agency options */ 01042 01043 ret->mc_platform = mc_platform_Initialize(ret); 01044 01045 /* Set up the global platform */ 01046 g_mc_platform = ret->mc_platform; 01047 01048 if (options_malloc) 01049 free(options); 01050 01051 return ret; 01052 } /*}}}*/ 01053 01054 EXPORTMC int 01055 MC_InitializeAgencyOptions(struct MCAgencyOptions_s* options) /*{{{*/ 01056 { 01057 int i; 01058 /* Set the default options */ 01059 options->threads = 0xFFFF; 01060 options->default_agent_status = MC_WAIT_CH; 01061 options->modified = 0; 01062 #ifdef MC_SECURITY 01063 options->enable_security = 1; 01064 #endif 01065 for(i = 0; i < MC_THREAD_ALL; i++) { 01066 options->stack_size[i] = -1; 01067 } 01068 return 0; 01069 } /*}}}*/ 01070 01071 EXPORTMC int 01072 MC_LoadAgentFromFile(MCAgency_t attr, const char* filename) 01073 { 01074 struct stat filestat; 01075 char *buf; 01076 FILE *fp; 01077 message_p message; 01078 extern mc_platform_p g_mc_platform; 01079 buf = NULL; 01080 filestat.st_size = 0; 01081 stat(filename, &filestat); 01082 if (filestat.st_size != 0 ) { 01083 buf = malloc( sizeof(char) * (filestat.st_size+1) ); 01084 memset(buf, 0, filestat.st_size+1); 01085 } else { 01086 fprintf(stderr, "Error: File %s not found.\n", filename); 01087 return 1; 01088 } 01089 01090 fp = fopen(filename, "r"); 01091 fread((void*)buf, filestat.st_size, 1, fp); 01092 fclose(fp); 01093 01094 message = message_New(); 01095 if ( 01096 message_InitializeFromString ( 01097 attr->mc_platform, 01098 message, 01099 buf, 01100 "", 01101 5050, 01102 "ams" 01103 ) 01104 ) 01105 { 01106 message_Destroy(message); 01107 } 01108 free(message->to_address); 01109 message->to_address = NULL; 01110 message->xml_root = mxmlLoadString( 01111 NULL, 01112 buf, 01113 NULL ); 01114 if (message->xml_root == NULL) { 01115 fprintf(stderr, "Error loading agent. %s:%d\n", __FILE__, __LINE__); 01116 message_Destroy(message); 01117 return 1; 01118 } 01119 message->xml_payload = mxmlFindElement( 01120 message->xml_root, 01121 message->xml_root, 01122 "MOBILE_AGENT", 01123 NULL, 01124 NULL, 01125 MXML_DESCEND ); 01126 if(message->xml_payload == NULL) { 01127 fprintf(stderr, "Error loading agent: <MOBILE_AGENT> tag not found. %s:%d\n", 01128 __FILE__, __LINE__ ); 01129 message_Destroy(message); 01130 return 1; 01131 } 01132 01133 message_queue_Add 01134 ( 01135 attr->mc_platform->message_queue, 01136 message 01137 ); 01138 return 0; 01139 } 01140 01141 EXPORTMC int 01142 MC_MutexLock(MCAgency_t attr, int id) /*{{{*/ 01143 { 01144 syncListNode_t *syncnode; 01145 syncnode = syncListFind(id, attr->mc_platform->syncList); 01146 if (syncnode == NULL) { 01147 return 1; 01148 } 01149 MUTEX_LOCK(syncnode->lock); 01150 return 0; 01151 } /*}}}*/ 01152 01153 EXPORTMC int 01154 MC_MutexUnlock(MCAgency_t attr, int id) /*{{{*/ 01155 { 01156 syncListNode_t *syncnode; 01157 syncnode = syncListFind(id, attr->mc_platform->syncList); 01158 if (syncnode == NULL) { 01159 return 1; 01160 } 01161 MUTEX_UNLOCK(syncnode->lock); 01162 return 0; 01163 } /*}}}*/ 01164 01165 EXPORTMC int 01166 MC_PrintAgentCode(MCAgent_t agent) /*{{{*/ 01167 { 01168 int progress; 01169 MUTEX_LOCK(agent->lock); 01170 progress = agent->datastate->task_progress; 01171 /* If progress is past the last task, print the last task's code. */ 01172 if (progress >= agent->datastate->number_of_tasks) { 01173 progress = agent->datastate->number_of_tasks - 1; 01174 } 01175 printf("%s\n", 01176 agent->datastate->agent_code); 01177 MUTEX_UNLOCK(agent->lock); 01178 return 0; 01179 } /*}}}*/ 01180 01181 EXPORTMC int 01182 MC_RegisterService( /*{{{*/ 01183 MCAgency_t agency, 01184 MCAgent_t agent, 01185 int agentID, 01186 const char *agentName, 01187 char **serviceNames, 01188 int numServices) 01189 { 01190 df_request_list_node_t *req_node; 01191 df_node_t *new_node; 01192 int i; 01193 /* Error checking: Either an agent, or agent Name must be 01194 * provided. */ 01195 if (agent == NULL && agentName == NULL) { 01196 return MC_ERR_INVALID_ARGS; 01197 } 01198 /* init the request node */ 01199 req_node = df_request_list_node_New(); 01200 req_node->command = (char*)malloc(sizeof(char)*9); 01201 strcpy((char*)req_node->command, "register"); 01202 01203 new_node = (df_node_t*)malloc(sizeof(df_node_t)); 01204 CHECK_NULL(new_node, return MC_ERR_MEMORY); 01205 01206 /* Init the lock */ 01207 new_node->lock = (MUTEX_T*)malloc(sizeof(MUTEX_T)); 01208 CHECK_NULL(new_node->lock, return MC_ERR_MEMORY); 01209 MUTEX_INIT(new_node->lock); 01210 01211 /* Init the agentID */ 01212 if (agent==NULL) { 01213 new_node->agent_id = agentID; 01214 } else { 01215 new_node->agent_id = agent->id; 01216 } 01217 01218 /* Init the agent name */ 01219 if (agent==NULL) { 01220 new_node->agent_name = 01221 (char*)malloc(sizeof(char)*(strlen(agentName)+1)); 01222 CHECK_NULL(new_node->agent_name, return MC_ERR_MEMORY;); 01223 strcpy(new_node->agent_name, agentName); 01224 } else { 01225 new_node->agent_name = 01226 (char*)malloc( 01227 sizeof(char) * 01228 (strlen(agent->name)+1) 01229 ); 01230 CHECK_NULL(new_node->agent_name, return MC_ERR_MEMORY;); 01231 strcpy(new_node->agent_name, agent->name); 01232 } 01233 01234 /* Init the services */ 01235 new_node->service_names = (char**)malloc( 01236 sizeof(char*) * numServices 01237 ); 01238 CHECK_NULL(new_node->service_names, return MC_ERR_MEMORY;); 01239 for (i = 0; i < numServices; i++) { 01240 new_node->service_names[i] = (char*) malloc( 01241 sizeof(char) * (strlen(serviceNames[i]) + 1) 01242 ); 01243 CHECK_NULL(new_node->service_names[i], return MC_ERR_MEMORY;); 01244 strcpy( 01245 new_node->service_names[i], 01246 serviceNames[i] 01247 ); 01248 } 01249 new_node->num_services = numServices; 01250 01251 req_node->data = (void*)new_node; 01252 req_node->data_size = (sizeof(new_node)); 01253 01254 return df_AddRequest( 01255 agency->mc_platform->df, 01256 req_node 01257 ); 01258 } /*}}}*/ 01259 01260 EXPORTMC int 01261 MC_ResumeAgency(MCAgency_t attr) /*{{{*/ 01262 { 01263 MUTEX_LOCK(attr->mc_platform->giant_lock); 01264 attr->mc_platform->giant = 1; 01265 MUTEX_UNLOCK(attr->mc_platform->giant_lock); 01266 return 0; 01267 } /*}}}*/ 01268 01269 EXPORTMC MCAgent_t 01270 MC_RetrieveAgent(MCAgency_t attr) /*{{{*/ 01271 /* This function retrieves the first agent with agent_status 01272 MC_AGENT_NEUTRAL it finds. If there are no agents with 01273 the specified attributes, return value is NULL. */ 01274 { 01275 int i; 01276 MCAgent_t agent=NULL, ret; 01277 MUTEX_LOCK(attr->mc_platform->agent_queue->lock); 01278 for (i = 0; i < attr->mc_platform->agent_queue->size; i++) { 01279 agent = ListSearch( 01280 attr->mc_platform->agent_queue->list, i); 01281 if (agent->agent_status == MC_AGENT_NEUTRAL) { 01282 break; 01283 } 01284 } 01285 if (agent == NULL) { 01286 MUTEX_UNLOCK(attr->mc_platform->agent_queue->lock); 01287 return NULL; 01288 } 01289 if (agent->agent_status != MC_AGENT_NEUTRAL) { 01290 MUTEX_UNLOCK(attr->mc_platform->agent_queue->lock); 01291 return NULL; 01292 } 01293 ret = (MCAgent_t)malloc(sizeof(agent_t)); 01294 *ret = *agent; 01295 MUTEX_UNLOCK(attr->mc_platform->agent_queue->lock); 01296 return ret; 01297 }/*}}}*/ 01298 01299 EXPORTMC char * 01300 MC_RetrieveAgentCode(MCAgent_t agent) /*{{{*/ 01301 { 01302 char *buf; 01303 int len, progress; 01304 MUTEX_LOCK(agent->lock); 01305 progress = agent->datastate->task_progress; 01306 len = strlen( 01307 agent->datastate->agent_code); 01308 buf = (char*)malloc( (len+1)*sizeof(char)); 01309 strcpy(buf, 01310 agent->datastate->agent_code); 01311 MUTEX_UNLOCK(agent->lock); 01312 return buf; 01313 } /*}}}*/ 01314 01315 EXPORTMC int 01316 MC_ResetSignal(MCAgency_t attr) /*{{{*/ 01317 { 01318 MUTEX_LOCK(attr->mc_platform->giant_lock); 01319 attr->mc_platform->giant = 1; 01320 attr->mc_platform->MC_signal = MC_NO_SIGNAL; 01321 COND_SIGNAL(attr->mc_platform->giant_cond); 01322 MUTEX_UNLOCK(attr->mc_platform->giant_lock); 01323 return 0; 01324 } /*}}}*/ 01325 01326 EXPORTMC int 01327 MC_SearchForService( /*{{{*/ 01328 /* Input args */ 01329 MCAgency_t attr, 01330 const char *searchString, 01331 /* Return Args */ 01332 char*** agentNames, 01333 char*** serviceNames, 01334 int** agentIDs, 01335 int* numResults) 01336 { 01337 df_request_search_p search; 01338 df_search_results_p results; 01339 df_request_list_node_p request; 01340 search = df_request_search_New(); 01341 CHECK_NULL(search, return MC_ERR_MEMORY;); 01342 results = (df_search_results_p)malloc(sizeof(df_search_results_t)); 01343 CHECK_NULL(results, return MC_ERR_MEMORY;); 01344 request = df_request_list_node_New(); 01345 CHECK_NULL(request, return MC_ERR_MEMORY;); 01346 01347 01348 search->search_results = results; 01349 search->search_string = (char*)searchString; 01350 01351 request->data = (void*)search; 01352 request->command = malloc(sizeof(char) * 7); 01353 strcpy((char*)request->command, "search"); 01354 request->data_size = sizeof(df_request_search_t); 01355 01356 COND_SLEEP_ACTION( 01357 search->cond, 01358 search->lock, 01359 01360 df_AddRequest(attr->mc_platform->df, request); 01361 ); 01362 /* When we get here, search->results should be filled. */ 01363 *agentNames = search->search_results->agent_names; 01364 *serviceNames = search->search_results->service_names; 01365 *agentIDs = search->search_results->agent_ids; 01366 *numResults = search->search_results->num_results; 01367 01368 /* Free unused data structures */ 01369 free((void*)request->command); 01370 df_request_list_node_Destroy(request); 01371 df_request_search_Destroy(search); 01372 01373 return MC_SUCCESS; 01374 } /*}}}*/ 01375 01376 EXPORTMC int 01377 MC_SemaphorePost(MCAgency_t attr, int id) /*{{{*/ 01378 { 01379 syncListNode_t *syncnode; 01380 syncnode = syncListFind(id, attr->mc_platform->syncList); 01381 if (syncnode == NULL) { 01382 return 1; 01383 } 01384 SEMAPHORE_POST(syncnode->sem); 01385 return 0; 01386 } /*}}}*/ 01387 01388 EXPORTMC int 01389 MC_SemaphoreWait(MCAgency_t attr, int id) /*{{{*/ 01390 { 01391 syncListNode_t *syncnode; 01392 syncnode = syncListFind(id, attr->mc_platform->syncList); 01393 if (syncnode == NULL) { 01394 return 1; 01395 } 01396 SEMAPHORE_WAIT(syncnode->sem); 01397 return 0; 01398 } /*}}}*/ 01399 01400 int 01401 MC_SendCh(MCAgency_t attr, /*{{{*/ 01402 const char *filename, 01403 const char *remotehost, 01404 int port) 01405 { 01406 printf("Sorry, not implemented yet.\n"); 01407 return -1; 01408 } /*}}}*/ 01409 01410 EXPORTMC int 01411 MC_SendAgentMigrationMessage(MCAgency_t attr, /*{{{*/ 01412 const char *string, 01413 const char *hostname, 01414 int port) 01415 { 01416 message_p message; 01417 message = message_New(); 01418 if( 01419 message_InitializeFromString 01420 ( 01421 attr->mc_platform, 01422 message, 01423 string, 01424 hostname, 01425 port, 01426 "ams" 01427 ) 01428 ) 01429 { 01430 message_Destroy(message); 01431 return MC_ERR; 01432 } else { 01433 return message_queue_Add 01434 ( 01435 attr->mc_platform->message_queue, 01436 message 01437 ); 01438 } 01439 } /*}}}*/ 01440 01441 EXPORTMC int 01442 MC_SendAgentMigrationMessageFile(MCAgency_t attr, /*{{{*/ 01443 const char *filename, 01444 const char *hostname, 01445 int port) 01446 { 01447 struct stat filestat; 01448 char *buf; 01449 FILE *fp; 01450 int ret; 01451 message_p message; 01452 extern mc_platform_p g_mc_platform; 01453 buf = NULL; 01454 filestat.st_size = 0; 01455 stat(filename, &filestat); 01456 if (filestat.st_size != 0 ) { 01457 buf = malloc( sizeof(char) * (filestat.st_size+1) ); 01458 memset(buf, 0, filestat.st_size+1); 01459 } else { 01460 fprintf(stderr, "Error: File %s not found.\n", filename); 01461 return 1; 01462 } 01463 01464 fp = fopen(filename, "r"); 01465 fread((void*)buf, filestat.st_size, 1, fp); 01466 fclose(fp); 01467 01468 if (attr!=NULL) { 01469 message = message_New(); 01470 if( 01471 message_InitializeFromString 01472 ( 01473 attr->mc_platform, 01474 message, 01475 buf, 01476 hostname, 01477 port, 01478 "ams" 01479 ) 01480 ) 01481 { 01482 message_Destroy(message); 01483 } else { 01484 ret = message_queue_Add 01485 ( 01486 attr->mc_platform->message_queue, 01487 message 01488 ); 01489 } 01490 } else { 01491 message = message_New(); 01492 if( 01493 message_InitializeFromString 01494 ( 01495 g_mc_platform, 01496 message, 01497 buf, 01498 hostname, 01499 port, 01500 "ams" 01501 ) 01502 ) 01503 { 01504 message_Destroy(message); 01505 } else { 01506 ret = message_queue_Add 01507 ( 01508 g_mc_platform->message_queue, 01509 message 01510 ); 01511 } 01512 } 01513 free(buf); 01514 return ret; 01515 } /*}}}*/ 01516 01517 EXPORTMC int 01518 MC_SendSteerCommand(MCAgency_t attr, enum MC_SteerCommand_e cmd) /*{{{*/ 01519 { 01520 MUTEX_LOCK(attr->mc_platform->MC_steer_lock); 01521 attr->mc_platform->MC_steer_command = cmd; 01522 COND_BROADCAST(attr->mc_platform->MC_steer_cond); 01523 MUTEX_UNLOCK(attr->mc_platform->MC_steer_lock); 01524 return 0; 01525 } /*}}}*/ 01526 01527 int 01528 MC_SetAgentStatus(MCAgent_t agent, int status) /*{{{*/ 01529 { 01530 MUTEX_LOCK(agent->lock); 01531 agent->agent_status = status; 01532 if (!agent->orphan) { 01533 MUTEX_LOCK(agent->mc_platform->ams->runflag_lock); 01534 agent->mc_platform->ams->run = 1; 01535 COND_SIGNAL(agent->mc_platform->ams->runflag_cond); 01536 MUTEX_UNLOCK(agent->mc_platform->ams->runflag_lock); 01537 } 01538 MUTEX_UNLOCK(agent->lock); 01539 return 0; 01540 } /*}}}*/ 01541 01542 int 01543 MC_SetDefaultAgentStatus(/*{{{*/ 01544 MCAgency_t agency, 01545 enum MC_AgentStatus_e status 01546 ) 01547 { 01548 agency->mc_platform->default_agentstatus = status; 01549 return 0; 01550 } /*}}}*/ 01551 01552 EXPORTMC int 01553 MC_SetThreadOn(MCAgencyOptions_t *options, enum MC_ThreadIndex_e index) /*{{{*/ 01554 { 01555 SET_THREAD_ON(options->threads, index); 01556 return 0; 01557 } /*}}}*/ 01558 01559 EXPORTMC int 01560 MC_SetThreadsAllOn(MCAgencyOptions_t* options) 01561 { 01562 int i; 01563 for(i = 0; i < MC_THREAD_ALL; i++) { 01564 SET_THREAD_ON(options->threads, i); 01565 } 01566 return 0; 01567 } 01568 01569 EXPORTMC int 01570 MC_SetThreadOff(MCAgencyOptions_t *options, enum MC_ThreadIndex_e index) /*{{{*/ 01571 { 01572 SET_THREAD_OFF(options->threads, index); 01573 return 0; 01574 } /*}}}*/ 01575 01576 EXPORTMC int 01577 MC_SetThreadsAllOff(MCAgencyOptions_t* options) 01578 { 01579 int i; 01580 for(i = 0; i < MC_THREAD_ALL; i++) { 01581 SET_THREAD_OFF(options->threads, i); 01582 } 01583 return 0; 01584 } 01585 01586 EXPORTMC int 01587 MC_Steer( /*{{{*/ 01588 MCAgency_t attr, 01589 int (*funcptr)(void* data), 01590 void *arg 01591 ) 01592 { 01593 MUTEX_LOCK(attr->mc_platform->MC_steer_lock); 01594 do { 01595 attr->mc_platform->MC_steer_command = MC_RUN; 01596 MUTEX_UNLOCK(attr->mc_platform->MC_steer_lock); 01597 (*funcptr)(arg); 01598 } while 01599 ( 01600 attr->mc_platform->MC_steer_command == MC_RESTART 01601 ); 01602 return 0; 01603 } /*}}}*/ 01604 01605 EXPORTMC enum MC_SteerCommand_e 01606 MC_SteerControl(void) /*{{{*/ 01607 { 01608 extern mc_platform_p g_mc_platform; 01609 /* Check to see what current command is */ 01610 MUTEX_LOCK(g_mc_platform->MC_steer_lock); 01611 while (g_mc_platform->MC_steer_command == MC_SUSPEND) { 01612 COND_WAIT( 01613 g_mc_platform->MC_steer_cond, 01614 g_mc_platform->MC_steer_lock 01615 ); 01616 } 01617 MUTEX_UNLOCK(g_mc_platform->MC_steer_lock); 01618 return g_mc_platform->MC_steer_command; 01619 } /*}}}*/ 01620 01621 EXPORTMC int 01622 MC_SyncDelete(MCAgency_t attr, int id) /*{{{*/ 01623 { 01624 syncListNode_t *sync_node; 01625 /* First, lock the entire list. */ 01626 MUTEX_LOCK(attr->mc_platform->syncList->giant_lock); 01627 01628 /* Find and lock the node */ 01629 sync_node = syncListFind(id, attr->mc_platform->syncList); 01630 if (sync_node == NULL) { 01631 MUTEX_UNLOCK(attr->mc_platform->syncList->giant_lock); 01632 return MC_ERR_NOT_FOUND; 01633 } 01634 MUTEX_LOCK(sync_node->lock); 01635 01636 /* Remove it from the list so it may no longer be used */ 01637 if (syncListRemove(id, attr->mc_platform->syncList) == NULL) { 01638 fprintf(stderr, "Fatal error. %s:%d\n", 01639 __FILE__, 01640 __LINE__ ); 01641 exit(0); 01642 } 01643 01644 /* Now, unlock and destroy */ 01645 MUTEX_UNLOCK(sync_node->lock); 01646 MUTEX_UNLOCK(attr->mc_platform->syncList->giant_lock); 01647 01648 return syncListNodeDestroy(sync_node); 01649 } /*}}}*/ 01650 01651 EXPORTMC int 01652 MC_SyncInit(MCAgency_t attr, int id) /*{{{*/ 01653 { 01654 syncListNode_t *node; 01655 node = syncListNodeNew(); 01656 MUTEX_LOCK(attr->mc_platform->syncList->giant_lock); 01657 if (id == 0) { 01658 id = rand(); 01659 } 01660 while ( 01661 syncListFind(id, attr->mc_platform->syncList) != NULL 01662 ) 01663 { 01664 id = rand(); 01665 } 01666 01667 node->id = id; 01668 syncListAddNode( 01669 node, 01670 attr->mc_platform->syncList 01671 ); 01672 MUTEX_UNLOCK(attr->mc_platform->syncList->giant_lock); 01673 return id; 01674 }/*}}}*/ 01675 01676 EXPORTMC int 01677 MC_TerminateAgent(MCAgent_t agent) /*{{{*/ 01678 { 01679 int status=0; 01680 if(agent->agent_interp != NULL) { 01681 status = Ch_Abort (agent->agent_interp); 01682 } 01683 return status; 01684 } /*}}}*/ 01685 01686 01687 #ifdef _WIN32 01688 EXPORTMC BOOL 01689 MC_MainLoop(MCAgency_t attr) /*{{{*/ 01690 { 01691 /* return CloseHandle(attr->global->gaf_ap->thread_id[attr->global->mr_index]); */ 01692 Sleep (INFINITE); 01693 return 0; 01694 } 01695 #else 01696 int 01697 MC_MainLoop(MCAgency_t attr) 01698 { 01699 return pthread_join(attr->mc_platform->ams->thread, NULL); 01700 } /*}}}*/ 01701 #endif 01702 01703 EXPORTMC int 01704 MC_WaitAgent(MCAgency_t attr) /*{{{*/ 01705 { 01706 int size; 01707 MUTEX_LOCK(attr->mc_platform->agent_queue->lock); 01708 while(1) { 01709 size = attr->mc_platform->agent_queue->size; 01710 COND_WAIT( 01711 attr->mc_platform->agent_queue->cond, 01712 attr->mc_platform->agent_queue->lock 01713 ); 01714 if (size < attr->mc_platform->agent_queue->size) { 01715 MUTEX_UNLOCK(attr->mc_platform->agent_queue->lock); 01716 break; 01717 } 01718 } 01719 MUTEX_UNLOCK(attr->mc_platform->agent_queue->lock); 01720 return 0; 01721 } /*}}}*/ 01722 01723 EXPORTMC MCAgent_t 01724 MC_WaitRetrieveAgent(MCAgency_t attr) /*{{{*/ 01725 { 01726 int index; 01727 MCAgent_t agent; 01728 MC_WaitSignal(attr, MC_RECV_AGENT); 01729 MUTEX_LOCK(attr->mc_platform->agent_queue->lock); 01730 index = attr->mc_platform->agent_queue->size-1; 01731 agent = ListSearch( 01732 attr->mc_platform->agent_queue->list, index); 01733 MUTEX_UNLOCK(attr->mc_platform->agent_queue->lock); 01734 return agent; 01735 } /*}}}*/ 01736 01737 /* MC_WaitSignal */ 01738 /* This function blocks until one of the signals in argument 01739 * 'signals' is signalled. 'signals' must be a binary | combination 01740 * of enum MC_Signal_e type. */ 01741 EXPORTMC int 01742 MC_WaitSignal(MCAgency_t attr, int signals) /*{{{*/ 01743 { 01744 MUTEX_LOCK(attr->mc_platform->MC_signal_lock); 01745 while(! (signals & attr->mc_platform->MC_signal)) { 01746 COND_WAIT( 01747 attr->mc_platform->MC_signal_cond, 01748 attr->mc_platform->MC_signal_lock 01749 ); 01750 } 01751 MUTEX_UNLOCK(attr->mc_platform->MC_signal_lock); 01752 MUTEX_LOCK(attr->mc_platform->giant_lock); 01753 attr->mc_platform->giant = 0; 01754 MUTEX_UNLOCK(attr->mc_platform->giant_lock); 01755 return 0; 01756 } /*}}}*/ 01757 01758 /* *********************** * 01759 * Ch Space chdl functions * 01760 * *********************** */ 01761 01762 /* MC_AclDestroy */ 01763 int MC_AclDestroy_chdl(void* varg) 01764 { 01765 int retval; 01766 fipa_acl_message_t* acl_message; 01767 ChInterp_t interp; 01768 ChVaList_t ap; 01769 01770 Ch_VaStart(interp, ap, varg); 01771 acl_message = Ch_VaArg(interp, ap, fipa_acl_message_t*); 01772 retval = MC_AclDestroy(acl_message); 01773 Ch_VaEnd(interp, ap); 01774 return retval; 01775 } 01776 01777 /* MC_AclNew */ 01778 void* MC_AclNew_chdl(void* varg) 01779 { 01780 void* retval; 01781 retval = (void*)MC_AclNew(); 01782 return retval; 01783 } 01784 01785 /* MC_AclPost */ 01786 int MC_AclPost_chdl(void* varg) 01787 { 01788 int retval; 01789 agent_p agent; 01790 fipa_acl_message_t* acl_message; 01791 ChInterp_t interp; 01792 ChVaList_t ap; 01793 01794 Ch_VaStart(interp, ap, varg); 01795 agent = Ch_VaArg(interp, ap, agent_p); 01796 acl_message = Ch_VaArg(interp, ap, fipa_acl_message_t*); 01797 retval = MC_AclPost(agent, acl_message); 01798 Ch_VaEnd(interp, ap); 01799 return retval; 01800 } 01801 01802 /* MC_AclReply */ 01803 EXPORTCH void* 01804 MC_AclReply_chdl(void* varg) 01805 { 01806 void* retval; 01807 fipa_acl_message_t* acl_message; 01808 ChInterp_t interp; 01809 ChVaList_t ap; 01810 01811 Ch_VaStart(interp, ap, varg); 01812 acl_message = Ch_VaArg(interp, ap, fipa_acl_message_t*); 01813 retval = (void*)MC_AclReply(acl_message); 01814 Ch_VaEnd(interp, ap); 01815 return retval; 01816 } 01817 01818 /* MC_AclRetrieve */ 01819 EXPORTCH void* 01820 MC_AclRetrieve_chdl(void* varg) 01821 { 01822 void* retval; 01823 MCAgent_t agent; 01824 ChInterp_t interp; 01825 ChVaList_t ap; 01826 01827 Ch_VaStart(interp, ap, varg); 01828 agent = Ch_VaArg(interp, ap, MCAgent_t); 01829 retval = MC_AclRetrieve(agent); 01830 Ch_VaEnd(interp, ap); 01831 return retval; 01832 } 01833 01834 /* MC_AclSend */ 01835 EXPORTCH int 01836 MC_AclSend_chdl(void* varg) 01837 { 01838 int retval; 01839 fipa_acl_message_t* acl_message; 01840 MCAgency_t temp_attr; 01841 extern mc_platform_p g_mc_platform; 01842 01843 ChInterp_t interp; 01844 ChVaList_t ap; 01845 01846 temp_attr = (MCAgency_t)malloc(sizeof(struct agency_s)); 01847 CHECK_NULL(temp_attr, exit(-1)); 01848 temp_attr->mc_platform = g_mc_platform; 01849 01850 Ch_VaStart(interp, ap, varg); 01851 acl_message = (fipa_acl_message_t*) Ch_VaArg(interp, ap, void*); 01852 retval = MC_AclSend(temp_attr, acl_message); 01853 Ch_VaEnd(interp, ap); 01854 free(temp_attr); 01855 return retval; 01856 } 01857 01858 /* MC_AclWaitRetrieve */ 01859 EXPORTCH void* 01860 MC_AclWaitRetrieve_chdl(void *varg) 01861 { 01862 void* retval; 01863 MCAgent_t agent; 01864 ChInterp_t interp; 01865 ChVaList_t ap; 01866 01867 Ch_VaStart(interp, ap, varg); 01868 agent = Ch_VaArg(interp, ap, MCAgent_t); 01869 retval = MC_AclWaitRetrieve(agent); 01870 Ch_VaEnd(interp, ap); 01871 return retval; 01872 } 01873 01874 /* BEGIN Acl helper functions */ 01875 01876 /* MC_AclSetPerformative */ 01877 EXPORTCH int 01878 MC_AclSetPerformative_chdl(void* varg) 01879 { 01880 ChInterp_t interp; 01881 ChVaList_t ap; 01882 struct fipa_acl_message_s* acl; 01883 enum fipa_performative_e performative; 01884 int retval; 01885 01886 Ch_VaStart(interp, ap, varg); 01887 acl = Ch_VaArg(interp, ap, struct fipa_acl_message_s*); 01888 performative = Ch_VaArg(interp, ap, enum fipa_performative_e); 01889 retval = MC_AclSetPerformative(acl, performative); 01890 Ch_VaEnd(interp, ap); 01891 return retval; 01892 } 01893 01894 /* MC_AclSetSender */ 01895 EXPORTCH int 01896 MC_AclSetSender_chdl(void* varg) 01897 { 01898 ChInterp_t interp; 01899 ChVaList_t ap; 01900 struct fipa_acl_message_s* acl; 01901 char* name; 01902 char* address; 01903 int retval; 01904 01905 Ch_VaStart(interp, ap, varg); 01906 acl = Ch_VaArg(interp, ap, struct fipa_acl_message_s*); 01907 name = Ch_VaArg(interp, ap, char*); 01908 address = Ch_VaArg(interp, ap, char*); 01909 retval = MC_AclSetSender(acl, name, address); 01910 Ch_VaEnd(interp, ap); 01911 return retval; 01912 } 01913 01914 /* MC_AclAddReceiver */ 01915 EXPORTCH int 01916 MC_AclAddReceiver_chdl(void* varg) 01917 { 01918 ChInterp_t interp; 01919 ChVaList_t ap; 01920 struct fipa_acl_message_s* acl; 01921 char* name; 01922 char* address; 01923 int retval; 01924 01925 Ch_VaStart(interp, ap, varg); 01926 acl = Ch_VaArg(interp, ap, struct fipa_acl_message_s*); 01927 name = Ch_VaArg(interp, ap, char*); 01928 address = Ch_VaArg(interp, ap, char*); 01929 retval = MC_AclAddReceiver(acl, name, address); 01930 Ch_VaEnd(interp, ap); 01931 return retval; 01932 } 01933 01934 /* MC_AclAddReplyTo */ 01935 EXPORTCH int 01936 MC_AclAddReplyTo_chdl(void* varg) 01937 { 01938 ChInterp_t interp; 01939 ChVaList_t ap; 01940 struct fipa_acl_message_s* acl; 01941 char* name; 01942 char* address; 01943 int retval; 01944 01945 Ch_VaStart(interp, ap, varg); 01946 acl = Ch_VaArg(interp, ap, struct fipa_acl_message_s*); 01947 name = Ch_VaArg(interp, ap, char*); 01948 address = Ch_VaArg(interp, ap, char*); 01949 retval = MC_AclAddReplyTo(acl, name, address); 01950 Ch_VaEnd(interp, ap); 01951 return retval; 01952 } 01953 01954 /* MC_AclSetContent */ 01955 EXPORTCH int 01956 MC_AclSetContent_chdl(void* varg) 01957 { 01958 ChInterp_t interp; 01959 ChVaList_t ap; 01960 struct fipa_acl_message_s* acl; 01961 char* content; 01962 int retval; 01963 01964 Ch_VaStart(interp, ap, varg); 01965 acl = Ch_VaArg(interp, ap, struct fipa_acl_message_s*); 01966 content = Ch_VaArg(interp, ap, char*); 01967 retval = MC_AclSetContent(acl, content); 01968 Ch_VaEnd(interp, ap); 01969 return retval; 01970 } 01971 01972 /* END Acl Helper Functions */ 01973 01974 /* MC_AddAgent */ 01975 EXPORTCH int 01976 MC_AddAgent_chdl(void *varg) /*{{{*/ 01977 { 01978 int retval; 01979 MCAgent_t agent; 01980 MCAgency_t temp_attr; 01981 extern mc_platform_p g_mc_platform; 01982 01983 ChInterp_t interp; 01984 ChVaList_t ap; 01985 01986 temp_attr = (MCAgency_t)malloc(sizeof(struct agency_s)); 01987 CHECK_NULL(temp_attr, exit(-1)); 01988 temp_attr->mc_platform = g_mc_platform; 01989 01990 Ch_VaStart(interp, ap, varg); 01991 agent = (MCAgent_t) Ch_VaArg(interp, ap, void*); 01992 retval = MC_AddAgent(temp_attr, agent); 01993 Ch_VaEnd(interp, ap); 01994 free(temp_attr); 01995 return retval; 01996 } /*}}}*/ 01997 01998 /* MC_AgentVariableRetrieve */ 01999 EXPORTCH const void* 02000 MC_AgentVariableRetrieve_chdl(void* varg) 02001 { 02002 void* retval; 02003 MCAgent_t agent; 02004 const char* var_name; 02005 int task_num; 02006 02007 ChInterp_t interp; 02008 ChVaList_t ap; 02009 02010 Ch_VaStart(interp, ap, varg); 02011 02012 agent = Ch_VaArg(interp, ap, MCAgent_t); 02013 var_name = Ch_VaArg(interp, ap, const char* ); 02014 task_num = Ch_VaArg(interp, ap, int); 02015 02016 retval = MC_AgentVariableRetrieve(agent, var_name, task_num); 02017 02018 Ch_VaEnd(interp, ap); 02019 return retval; 02020 } 02021 02022 /* MC_AgentVariableSave */ 02023 EXPORTCH int 02024 MC_AgentVariableSave_chdl(void *varg) 02025 { 02026 int retval; 02027 MCAgent_t agent; 02028 const char* var_name; 02029 02030 ChInterp_t interp; 02031 ChVaList_t ap; 02032 02033 Ch_VaStart(interp, ap, varg); 02034 02035 agent = Ch_VaArg(interp, ap, MCAgent_t); 02036 var_name = Ch_VaArg(interp, ap, const char*); 02037 02038 retval = MC_AgentVariableSave(agent, var_name); 02039 02040 Ch_VaEnd(interp, ap); 02041 return retval; 02042 } 02043 02044 /* MC_CallAgentFunc */ 02045 EXPORTCH int 02046 MC_CallAgentFunc_chdl(void *varg) /*{{{*/ 02047 { 02048 int retval; 02049 /* Function Args */ 02050 MCAgent_t agent; 02051 const char* funcName; 02052 void* returnVal; 02053 ChVaList_t args; 02054 02055 ChInterp_t interp; 02056 ChVaList_t ap; 02057 02058 Ch_VaStart(interp, ap, varg); 02059 02060 agent = Ch_VaArg(interp, ap, MCAgent_t); 02061 funcName = Ch_VaArg(interp, ap, const char*); 02062 returnVal = Ch_VaArg(interp, ap, void*); 02063 args = Ch_VaArg(interp, ap, void*); 02064 02065 retval = MC_CallAgentFuncVar( 02066 agent, 02067 funcName, 02068 returnVal, 02069 args); 02070 Ch_VaEnd(interp, ap); 02071 return retval; 02072 } /*}}}*/ 02073 02074 /* MC_Barrier_chdl*/ 02075 EXPORTCH int 02076 MC_Barrier_chdl(void *varg) /*{{{*/ 02077 { 02078 MCAgency_t temp_attr; 02079 extern mc_platform_p g_mc_platform; 02080 int retval; 02081 ChInterp_t interp; 02082 ChVaList_t ap; 02083 int id; 02084 02085 temp_attr = (MCAgency_t)malloc(sizeof(struct agency_s)); 02086 CHECK_NULL(temp_attr, exit(-1)); 02087 temp_attr->mc_platform = g_mc_platform; 02088 02089 Ch_VaStart(interp, ap, varg); 02090 id = Ch_VaArg(interp, ap, int); 02091 retval = MC_Barrier(temp_attr, id); 02092 Ch_VaEnd(interp, ap); 02093 free(temp_attr); 02094 return retval; 02095 } /*}}}*/ 02096 02097 /* MC_BarrierDelete_chdl*/ 02098 EXPORTCH int 02099 MC_BarrierDelete_chdl(void *varg) /*{{{*/ 02100 { 02101 MCAgency_t temp_attr; 02102 extern mc_platform_p g_mc_platform; 02103 int retval; 02104 ChInterp_t interp; 02105 ChVaList_t ap; 02106 int id; 02107 02108 temp_attr = (MCAgency_t)malloc(sizeof(struct agency_s)); 02109 CHECK_NULL(temp_attr, exit(-1)); 02110 temp_attr->mc_platform = g_mc_platform; 02111 02112 Ch_VaStart(interp, ap, varg); 02113 id = Ch_VaArg(interp, ap, int); 02114 retval = MC_BarrierDelete(temp_attr, id); 02115 Ch_VaEnd(interp, ap); 02116 free(temp_attr); 02117 return retval; 02118 } /*}}}*/ 02119 02120 /* MC_BarrierInit_chdl*/ 02121 EXPORTCH int 02122 MC_BarrierInit_chdl(void *varg) /*{{{*/ 02123 { 02124 MCAgency_t temp_attr; 02125 extern mc_platform_p g_mc_platform; 02126 int retval; 02127 ChInterp_t interp; 02128 ChVaList_t ap; 02129 int id; 02130 int num_procs; 02131 02132 temp_attr = (MCAgency_t)malloc(sizeof(struct agency_s)); 02133 CHECK_NULL(temp_attr, exit(-1)); 02134 temp_attr->mc_platform = g_mc_platform; 02135 02136 Ch_VaStart(interp, ap, varg); 02137 id = Ch_VaArg(interp, ap, int); 02138 num_procs = Ch_VaArg(interp, ap, int); 02139 retval = MC_BarrierInit(temp_attr, id, num_procs); 02140 Ch_VaEnd(interp, ap); 02141 free(temp_attr); 02142 return retval; 02143 } /*}}}*/ 02144 02145 /* MC_CondBroadcast_chdl*/ 02146 EXPORTCH int 02147 MC_CondBroadcast_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_CondBroadcast(temp_attr, id); 02163 Ch_VaEnd(interp, ap); 02164 free(temp_attr); 02165 return retval; 02166 } /*}}}*/ 02167 02168 /* MC_ComposeAgent */ 02169 EXPORTCH MCAgent_t 02170 MC_ComposeAgent_chdl(void *varg) /*{{{*/ 02171 { 02172 MCAgent_t retval; 02173 02174 /* Function Args */ 02175 const char* name; 02176 const char* home; 02177 const char* owner; 02178 const char* code; 02179 const char* return_var_name; 02180 const char* server; 02181 int persistent; 02182 02183 ChInterp_t interp; 02184 ChVaList_t ap; 02185 02186 Ch_VaStart(interp, ap, varg); 02187 02188 name = Ch_VaArg(interp, ap, const char*); 02189 home = Ch_VaArg(interp, ap, const char*); 02190 owner = Ch_VaArg(interp, ap, const char*); 02191 code = Ch_VaArg(interp, ap, const char*); 02192 return_var_name = Ch_VaArg(interp, ap, const char*); 02193 server = Ch_VaArg(interp, ap, const char*); 02194 persistent = Ch_VaArg(interp, ap, int); 02195 02196 retval= MC_ComposeAgent( 02197 name, 02198 home, 02199 owner, 02200 code, 02201 return_var_name, 02202 server, 02203 persistent); 02204 Ch_VaEnd(interp, ap); 02205 return retval; 02206 } /*}}}*/ 02207 02208 /* MC_CondSignal_chdl*/ 02209 EXPORTCH int 02210 MC_CondSignal_chdl(void *varg) /*{{{*/ 02211 { 02212 MCAgency_t temp_attr; 02213 extern mc_platform_p g_mc_platform; 02214 int retval; 02215 ChInterp_t interp; 02216 ChVaList_t ap; 02217 int id; 02218 02219 temp_attr = (MCAgency_t)malloc(sizeof(struct agency_s)); 02220 CHECK_NULL(temp_attr, exit(-1)); 02221 temp_attr->mc_platform = g_mc_platform; 02222 02223 Ch_VaStart(interp, ap, varg); 02224 id = Ch_VaArg(interp, ap, int); 02225 retval = MC_CondSignal(temp_attr, id); 02226 Ch_VaEnd(interp, ap); 02227 free(temp_attr); 02228 return retval; 02229 } /*}}}*/ 02230 02231 /* MC_CondReset_chdl*/ 02232 EXPORTCH int 02233 MC_CondReset_chdl(void *varg) /*{{{*/ 02234 { 02235 MCAgency_t temp_attr; 02236 extern mc_platform_p g_mc_platform; 02237 int retval; 02238 ChInterp_t interp; 02239 ChVaList_t ap; 02240 int id; 02241 02242 temp_attr = (MCAgency_t)malloc(sizeof(struct agency_s)); 02243 CHECK_NULL(temp_attr, exit(-1)); 02244 temp_attr->mc_platform = g_mc_platform; 02245 02246 Ch_VaStart(interp, ap, varg); 02247 id = Ch_VaArg(interp, ap, int); 02248 retval = MC_CondReset(temp_attr, id); 02249 Ch_VaEnd(interp, ap); 02250 free(temp_attr); 02251 return retval; 02252 } /*}}}*/ 02253 02254 /* MC_CondWait_chdl*/ 02255 EXPORTCH int 02256 MC_CondWait_chdl(void *varg) /*{{{*/ 02257 { 02258 MCAgency_t temp_attr; 02259 extern mc_platform_p g_mc_platform; 02260 int retval; 02261 ChInterp_t interp; 02262 ChVaList_t ap; 02263 int id; 02264 02265 temp_attr = (MCAgency_t)malloc(sizeof(struct agency_s)); 02266 CHECK_NULL(temp_attr, exit(-1)); 02267 temp_attr->mc_platform = g_mc_platform; 02268 02269 Ch_VaStart(interp, ap, varg); 02270 id = Ch_VaArg(interp, ap, int); 02271 retval = MC_CondWait(temp_attr, id); 02272 Ch_VaEnd(interp, ap); 02273 free(temp_attr); 02274 return retval; 02275 } /*}}}*/ 02276 02277 EXPORTCH int 02278 MC_DeleteAgent_chdl(void *varg) /*{{{*/ 02279 { 02280 ChInterp_t interp; 02281 ChVaList_t ap; 02282 MCAgent_t agent; 02283 int retval; 02284 02285 Ch_VaStart(interp, ap, varg); 02286 agent = Ch_VaArg(interp, ap, MCAgent_t); 02287 retval = MC_DeleteAgent(agent); 02288 Ch_VaEnd(interp, ap); 02289 return retval; 02290 } /*}}}*/ 02291 02292 EXPORTCH int 02293 MC_DestroyServiceSearchResult_chdl(void* varg) 02294 { 02295 ChInterp_t interp; 02296 ChVaList_t ap; 02297 char** agentName; 02298 char** serviceName; 02299 int* agentID; 02300 int numResult; 02301 int retval; 02302 02303 Ch_VaStart(interp, ap, varg); 02304 agentName = Ch_VaArg(interp, ap, char**); 02305 serviceName = Ch_VaArg(interp, ap, char**); 02306 agentID = Ch_VaArg(interp, ap, int*); 02307 numResult = Ch_VaArg(interp, ap, int); 02308 02309 retval = MC_DestroyServiceSearchResult( 02310 agentName, 02311 serviceName, 02312 agentID, 02313 numResult ); 02314 Ch_VaEnd(interp, ap); 02315 return retval; 02316 } 02317 02318 /* MC_DeregisterService_chdl */ 02319 EXPORTCH int 02320 MC_DeregisterService_chdl(void *varg) /*{{{*/ 02321 { 02322 ChInterp_t interp; 02323 ChVaList_t ap; 02324 MCAgency_t temp_attr; 02325 extern mc_platform_p g_mc_platform; 02326 int agentID; 02327 char *serviceName; 02328 int retval; 02329 02330 temp_attr = (MCAgency_t)malloc(sizeof(struct agency_s)); 02331 CHECK_NULL(temp_attr, exit(-1)); 02332 temp_attr->mc_platform = g_mc_platform; 02333 02334 Ch_VaStart(interp, ap, varg); 02335 agentID = Ch_VaArg(interp, ap, int); 02336 serviceName = (char*)Ch_VaArg(interp, ap, const char*); 02337 retval = MC_DeregisterService( 02338 temp_attr, 02339 agentID, 02340 serviceName ); 02341 Ch_VaEnd(interp, ap); 02342 free(temp_attr); 02343 return retval; 02344 } /*}}}*/ 02345 02346 EXPORTCH int 02347 MC_End_chdl(void *varg) /* {{{ */ 02348 { 02349 MCAgency_t temp_attr; 02350 extern mc_platform_p g_mc_platform; 02351 int retval; 02352 02353 temp_attr = (MCAgency_t)malloc(sizeof(struct agency_s)); 02354 CHECK_NULL(temp_attr, exit(-1)); 02355 temp_attr->mc_platform = g_mc_platform; 02356 02357 retval = MC_End(temp_attr); 02358 02359 return retval; 02360 } /* }}} */ 02361 02362 /* MC_FindAgentByID_chdl*/ 02363 EXPORTCH MCAgent_t 02364 MC_FindAgentByID_chdl(void *varg) /*{{{*/ 02365 { 02366 MCAgency_t temp_attr; 02367 extern mc_platform_p g_mc_platform; 02368 MCAgent_t retval; 02369 ChInterp_t interp; 02370 ChVaList_t ap; 02371 int id; 02372 02373 temp_attr = (MCAgency_t)malloc(sizeof(struct agency_s)); 02374 CHECK_NULL(temp_attr, exit(-1)); 02375 temp_attr->mc_platform = g_mc_platform; 02376 02377 Ch_VaStart(interp, ap, varg); 02378 id = Ch_VaArg(interp, ap, int); 02379 retval = MC_FindAgentByID(temp_attr, id); 02380 Ch_VaEnd(interp, ap); 02381 free(temp_attr); 02382 return retval; 02383 } /*}}}*/ 02384 02385 /* MC_FindAgentByName_chdl*/ 02386 EXPORTCH MCAgent_t 02387 MC_FindAgentByName_chdl(void *varg) /*{{{*/ 02388 { 02389 MCAgency_t temp_attr; 02390 extern mc_platform_p g_mc_platform; 02391 MCAgent_t retval; 02392 ChInterp_t interp; 02393 ChVaList_t ap; 02394 const char *name; 02395 02396 temp_attr = (MCAgency_t)malloc(sizeof(struct agency_s)); 02397 CHECK_NULL(temp_attr, exit(-1)); 02398 temp_attr->mc_platform = g_mc_platform; 02399 02400 Ch_VaStart(interp, ap, varg); 02401 name = Ch_VaArg(interp, ap, const char *); 02402 retval = MC_FindAgentByName(temp_attr, name); 02403 Ch_VaEnd(interp, ap); 02404 free(temp_attr); 02405 return retval; 02406 } /*}}}*/ 02407 02408 /* MC_GetAgentArrivalTime */ 02409 #ifndef _WIN32 02410 EXPORTCH time_t 02411 #else 02412 EXPORTCH SYSTEMTIME 02413 #endif 02414 MC_GetAgentArrivalTime_chdl(void *varg) /*{{{*/ 02415 { 02416 MCAgent_t agent; 02417 ChInterp_t interp; 02418 ChVaList_t ap; 02419 #ifndef _WIN32 02420 time_t arrival_time; 02421 #else 02422 SYSTEMTIME arrival_time; 02423 #endif 02424 02425 Ch_VaStart(interp, ap, varg); 02426 agent = Ch_VaArg(interp, ap, MCAgent_t); 02427 arrival_time = MC_GetAgentArrivalTime(agent); 02428 Ch_VaEnd(interp, ap); 02429 return arrival_time; 02430 } /* }}} */ 02431 02432 /* MC_GetAgentID */ 02433 EXPORTCH int 02434 MC_GetAgentID_chdl(void *varg) /*{{{*/ 02435 { 02436 MCAgent_t agent; 02437 ChInterp_t interp; 02438 ChVaList_t ap; 02439 int id; 02440 02441 Ch_VaStart(interp, ap, varg); 02442 agent = Ch_VaArg(interp, ap, MCAgent_t); 02443 id = MC_GetAgentID(agent); 02444 Ch_VaEnd(interp, ap); 02445 return id; 02446 } /*}}}*/ 02447 02448 /* MC_GetAgentName */ 02449 EXPORTCH char* 02450 MC_GetAgentName_chdl(void *varg) /*{{{*/ 02451 { 02452 MCAgent_t agent; 02453 ChInterp_t interp; 02454 ChVaList_t ap; 02455 char* name; 02456 02457 Ch_VaStart(interp, ap, varg); 02458 agent = Ch_VaArg(interp, ap, MCAgent_t); 02459 name = MC_GetAgentName(agent); 02460 Ch_VaEnd(interp, ap); 02461 return name; 02462 } /*}}}*/ 02463 02464 /* MC_GetAgentNumTasks_chdl */ 02465 EXPORTCH int 02466 MC_GetAgentNumTasks_chdl(void *varg) 02467 { 02468 MCAgent_t agent; 02469 ChInterp_t interp; 02470 ChVaList_t ap; 02471 int num_tasks; 02472 02473 Ch_VaStart(interp, ap, varg); 02474 agent = Ch_VaArg(interp, ap, MCAgent_t); 02475 num_tasks = MC_GetAgentNumTasks(agent); 02476 Ch_VaEnd(interp, ap); 02477 return num_tasks; 02478 } 02479 02480 /* MC_GetAgentStatus_chdl */ 02481 EXPORTCH int 02482 MC_GetAgentStatus_chdl(void *varg) /*{{{*/ 02483 { 02484 MCAgent_t agent; 02485 int status; 02486 ChInterp_t interp; 02487 ChVaList_t ap; 02488 02489 Ch_VaStart(interp, ap, varg); 02490 agent = Ch_VaArg(interp, ap, MCAgent_t); 02491 status = MC_GetAgentStatus(agent); 02492 Ch_VaEnd(interp, ap); 02493 return status; 02494 } /*}}}*/ 02495 02496 /* MC_GetAgentXMLString_chdl */ 02497 EXPORTCH char * 02498 MC_GetAgentXMLString_chdl(void *varg) /*{{{*/ 02499 { 02500 ChInterp_t interp; 02501 ChVaList_t ap; 02502 MCAgent_t agent; 02503 char *retval; 02504 02505 Ch_VaStart(interp, ap, varg); 02506 agent = Ch_VaArg(interp, ap, MCAgent_t); 02507 retval = MC_GetAgentXMLString(agent); 02508 Ch_VaEnd(interp, ap); 02509 return retval; 02510 } /*}}}*/ 02511 02512 #ifndef _WIN32 02513 EXPORTCH int 02514 MC_GetTimeOfDay_chdl(void *varg) 02515 { 02516 ChInterp_t interp; 02517 ChVaList_t ap; 02518 struct timeval *tv; 02519 Ch_VaStart(interp, ap, varg); 02520 tv = Ch_VaArg(interp, ap, struct timeval*); 02521 gettimeofday(tv, NULL); 02522 Ch_VaEnd(interp, ap); 02523 return 0; 02524 } 02525 #endif 02526 02527 /* MC_HaltAgency_chdl */ 02528 EXPORTCH int 02529 MC_HaltAgency_chdl(void *varg) 02530 { 02531 MCAgency_t temp_attr; 02532 int retval; 02533 extern mc_platform_p g_mc_platform; 02534 02535 temp_attr = (MCAgency_t)malloc(sizeof(struct agency_s)); 02536 CHECK_NULL(temp_attr, exit(-1)); 02537 temp_attr->mc_platform = g_mc_platform; 02538 02539 retval = MC_HaltAgency(temp_attr); 02540 02541 free(temp_attr); 02542 return retval; 02543 } 02544 02545 /* MC_MutexLock_chdl */ 02546 EXPORTCH int 02547 MC_MutexLock_chdl(void *varg) /*{{{*/ 02548 { 02549 MCAgency_t temp_attr; 02550 extern mc_platform_p g_mc_platform; 02551 02552 ChInterp_t interp; 02553 ChVaList_t ap; 02554 int id; 02555 int retval; 02556 02557 temp_attr = (MCAgency_t)malloc(sizeof(struct agency_s)); 02558 CHECK_NULL(temp_attr, exit(-1)); 02559 temp_attr->mc_platform = g_mc_platform; 02560 02561 Ch_VaStart(interp, ap, varg); 02562 id = Ch_VaArg(interp, ap, int ); 02563 retval = MC_MutexLock(temp_attr, id); 02564 Ch_VaEnd(interp, ap); 02565 free(temp_attr); 02566 return retval; 02567 } /*}}}*/ 02568 02569 /* MC_MutexUnlock_chdl */ 02570 EXPORTCH int 02571 MC_MutexUnlock_chdl(void *varg) /*{{{*/ 02572 { 02573 MCAgency_t temp_attr; 02574 extern mc_platform_p g_mc_platform; 02575 02576 ChInterp_t interp; 02577 ChVaList_t ap; 02578 int id; 02579 int retval; 02580 02581 temp_attr = (MCAgency_t)malloc(sizeof(struct agency_s)); 02582 CHECK_NULL(temp_attr, exit(-1)); 02583 temp_attr->mc_platform = g_mc_platform; 02584 02585 Ch_VaStart(interp, ap, varg); 02586 id = Ch_VaArg(interp, ap, int ); 02587 retval = MC_MutexUnlock(temp_attr, id); 02588 Ch_VaEnd(interp, ap); 02589 free(temp_attr); 02590 return retval; 02591 } /*}}}*/ 02592 02593 /* MC_PrintAgentCode_chdl */ 02594 EXPORTCH int 02595 MC_PrintAgentCode_chdl(void *varg) /*{{{*/ 02596 { 02597 ChInterp_t interp; 02598 ChVaList_t ap; 02599 MCAgent_t agent; 02600 int retval; 02601 02602 Ch_VaStart(interp, ap, varg); 02603 agent = Ch_VaArg(interp, ap, MCAgent_t); 02604 retval = MC_PrintAgentCode(agent); 02605 Ch_VaEnd(interp, ap); 02606 return retval; 02607 } /*}}}*/ 02608 02609 /* MC_RegisterService_chdl */ 02610 EXPORTCH int 02611 MC_RegisterService_chdl(void *varg) /*{{{*/ 02612 { 02613 ChInterp_t interp; 02614 ChVaList_t ap; 02615 int retval; 02616 MCAgency_t temp_attr; 02617 extern mc_platform_p g_mc_platform; 02618 02619 /* varg arguments */ 02620 MCAgent_t agent; 02621 char **serviceNames; 02622 int numServices; 02623 02624 temp_attr = (MCAgency_t)malloc(sizeof(struct agency_s)); 02625 CHECK_NULL(temp_attr, exit(-1)); 02626 temp_attr->mc_platform = g_mc_platform; 02627 02628 Ch_VaStart(interp, ap, varg); 02629 agent = Ch_VaArg(interp, ap, MCAgent_t); 02630 serviceNames = Ch_VaArg(interp, ap, char **); 02631 numServices = Ch_VaArg(interp, ap, int); 02632 02633 retval = MC_RegisterService( 02634 temp_attr, /* agency */ 02635 agent, /* agent */ 02636 0, /* agent id */ 02637 NULL, /* agent name */ 02638 serviceNames, /* services */ 02639 numServices 02640 ); 02641 Ch_VaEnd(interp, ap); 02642 free(temp_attr); 02643 return retval; 02644 } /*}}}*/ 02645 02646 /* MC_ResumeAgency_chdl */ 02647 EXPORTCH int 02648 MC_ResumeAgency_chdl(void *varg) 02649 { 02650 MCAgency_t temp_attr; 02651 int retval; 02652 extern mc_platform_p g_mc_platform; 02653 02654 temp_attr = (MCAgency_t)malloc(sizeof(struct agency_s)); 02655 CHECK_NULL(temp_attr, exit(-1)); 02656 temp_attr->mc_platform = g_mc_platform; 02657 02658 retval = MC_ResumeAgency(temp_attr); 02659 02660 free(temp_attr); 02661 return retval; 02662 } 02663 02664 /* MC_RetrieveAgent_chdl */ 02665 EXPORTCH MCAgent_t 02666 MC_RetrieveAgent_chdl(void *varg) /*{{{*/ 02667 { 02668 MCAgency_t temp_attr; 02669 extern mc_platform_p g_mc_platform; 02670 MCAgent_t agent; 02671 02672 temp_attr = (MCAgency_t)malloc(sizeof(struct agency_s)); 02673 CHECK_NULL(temp_attr, exit(-1)); 02674 temp_attr->mc_platform = g_mc_platform; 02675 02676 agent = MC_RetrieveAgent(temp_attr); 02677 free(temp_attr); 02678 return agent; 02679 } /*}}}*/ 02680 02681 /* MC_RetrieveAgentCode_chdl */ 02682 EXPORTCH char * 02683 MC_RetrieveAgentCode_chdl(void *varg) /*{{{*/ 02684 { 02685 ChInterp_t interp; 02686 ChVaList_t ap; 02687 MCAgent_t agent; 02688 char *retval; 02689 02690 Ch_VaStart(interp, ap, varg); 02691 agent = Ch_VaArg(interp, ap, MCAgent_t); 02692 retval = MC_RetrieveAgentCode(agent); 02693 Ch_VaEnd(interp, ap); 02694 return retval; 02695 } /*}}}*/ 02696 02697 /* MC_SaveData_chdl */ 02698 EXPORTCH int 02699 MC_SaveData_chdl(void* varg) 02700 { 02701 ChInterp_t interp; 02702 ChVaList_t ap; 02703 interpreter_variable_data_p interp_var_data; 02704 MCAgent_t agent; 02705 int progress; 02706 const char* name; 02707 int size; 02708 void* data; 02709 02710 Ch_VaStart(interp, ap, varg); 02711 agent = Ch_VaArg(interp, ap, MCAgent_t); 02712 name = Ch_VaArg(interp, ap, char*); 02713 size = Ch_VaArg(interp, ap, int); 02714 data = Ch_VaArg(interp, ap, void*); 02715 02716 progress = agent->datastate->task_progress; 02717 02718 interp_var_data = interpreter_variable_data_New(); 02719 interp_var_data->name = strdup(name); 02720 interp_var_data->size = size; 02721 interp_var_data->data_type = CH_VOIDPTRTYPE; 02722 interp_var_data->data = malloc(size); 02723 memcpy(interp_var_data->data, data, size); 02724 02725 agent_variable_list_Add( 02726 agent->datastate->tasks[progress]->agent_variable_list, 02727 interp_var_data ); 02728 02729 return 0; 02730 } 02731 02732 /* MC_SearchForService_chdl */ 02733 EXPORTCH int 02734 MC_SearchForService_chdl(void *varg) /*{{{*/ 02735 { 02736 ChInterp_t interp; 02737 ChVaList_t ap; 02738 int retval; 02739 MCAgency_t temp_attr; 02740 extern mc_platform_p g_mc_platform; 02741 02742 /* Args */ 02743 const char* searchString; 02744 char*** agentNames; 02745 char*** serviceNames; 02746 int** agentIDs; 02747 int* numResults; 02748 02749 temp_attr = (MCAgency_t)malloc(sizeof(struct agency_s)); 02750 CHECK_NULL(temp_attr, exit(-1)); 02751 temp_attr->mc_platform = g_mc_platform; 02752 02753 Ch_VaStart(interp, ap, varg); 02754 searchString = Ch_VaArg(interp, ap, const char*); 02755 agentNames = Ch_VaArg(interp, ap, char***); 02756 serviceNames = Ch_VaArg(interp, ap, char***); 02757 agentIDs = Ch_VaArg(interp, ap, int**); 02758 numResults = Ch_VaArg(interp, ap, int*); 02759 02760 retval = MC_SearchForService( 02761 temp_attr, 02762 searchString, 02763 agentNames, 02764 serviceNames, 02765 agentIDs, 02766 numResults 02767 ); 02768 Ch_VaEnd(interp, ap); 02769 free(temp_attr); 02770 return retval; 02771 } /*}}}*/ 02772 02773 /* MC_SemaphorePost_chdl */ 02774 EXPORTCH int 02775 MC_SemaphorePost_chdl(void *varg) /*{{{*/ 02776 { 02777 MCAgency_t temp_attr; 02778 extern mc_platform_p g_mc_platform; 02779 02780 ChInterp_t interp; 02781 ChVaList_t ap; 02782 int id; 02783 int retval; 02784 02785 temp_attr = (MCAgency_t)malloc(sizeof(struct agency_s)); 02786 CHECK_NULL(temp_attr, exit(-1)); 02787 temp_attr->mc_platform = g_mc_platform; 02788 02789 Ch_VaStart(interp, ap, varg); 02790 id = Ch_VaArg(interp, ap, int ); 02791 retval = MC_SemaphorePost(temp_attr, id); 02792 Ch_VaEnd(interp, ap); 02793 free(temp_attr); 02794 return retval; 02795 } /*}}}*/ 02796 02797 /* MC_SemaphoreWait_chdl */ 02798 EXPORTCH int 02799 MC_SemaphoreWait_chdl(void *varg) /*{{{*/ 02800 { 02801 MCAgency_t temp_attr; 02802 extern mc_platform_p g_mc_platform; 02803 02804 ChInterp_t interp; 02805 ChVaList_t ap; 02806 int id; 02807 int retval; 02808 02809 temp_attr = (MCAgency_t)malloc(sizeof(struct agency_s)); 02810 CHECK_NULL(temp_attr, exit(-1)); 02811 temp_attr->mc_platform = g_mc_platform; 02812 02813 Ch_VaStart(interp, ap, varg); 02814 id = Ch_VaArg(interp, ap, int ); 02815 retval = MC_SemaphoreWait(temp_attr, id); 02816 Ch_VaEnd(interp, ap); 02817 free(temp_attr); 02818 return retval; 02819 } /*}}}*/ 02820 02821 /* MC_SendAgentMigrationMessage_chdl*/ 02822 EXPORTCH int 02823 MC_SendAgentMigrationMessage_chdl(void *varg) /*{{{*/ 02824 { 02825 MCAgency_t temp_attr; 02826 extern mc_platform_p g_mc_platform; 02827 const char *message, *hostname; 02828 int port, retval; 02829 ChInterp_t interp; 02830 ChVaList_t ap; 02831 02832 temp_attr = (MCAgency_t)malloc(sizeof(struct agency_s)); 02833 CHECK_NULL(temp_attr, exit(-1)); 02834 temp_attr->mc_platform = g_mc_platform; 02835 02836 Ch_VaStart(interp, ap, varg); 02837 message = Ch_VaArg(interp, ap, char *); 02838 hostname = Ch_VaArg(interp, ap, char *); 02839 port = Ch_VaArg(interp, ap, int); 02840 retval = MC_SendAgentMigrationMessage(temp_attr, message, hostname, port); 02841 Ch_VaEnd(interp, ap); 02842 free(temp_attr); 02843 return retval; 02844 } /*}}}*/ 02845 02846 /* MC_SendAgentMigrationMessageFile_chdl*/ 02847 EXPORTCH int 02848 MC_SendAgentMigrationMessageFile_chdl(void *varg) /*{{{*/ 02849 { 02850 MCAgency_t temp_attr; 02851 char *filename, *hostname; 02852 int port, retval; 02853 ChInterp_t interp; 02854 ChVaList_t ap; 02855 02856 temp_attr = NULL; 02857 02858 Ch_VaStart(interp, ap, varg); 02859 filename = Ch_VaArg(interp, ap, char *); 02860 hostname = Ch_VaArg(interp, ap, char *); 02861 port = Ch_VaArg(interp, ap, int); 02862 retval = MC_SendAgentMigrationMessageFile(temp_attr, filename, hostname, port); 02863 Ch_VaEnd(interp, ap); 02864 return retval; 02865 } /*}}}*/ 02866 02867 EXPORTCH int 02868 MC_SendSteerCommand_chdl(void *varg) /*{{{*/ 02869 { 02870 MCAgency_t temp_attr; 02871 int retval; 02872 enum MC_SteerCommand_e command; 02873 extern mc_platform_p g_mc_platform; 02874 ChInterp_t interp; 02875 ChVaList_t ap; 02876 02877 temp_attr = (MCAgency_t)malloc(sizeof(struct agency_s)); 02878 CHECK_NULL(temp_attr, exit(-1)); 02879 temp_attr->mc_platform = g_mc_platform; 02880 02881 Ch_VaStart(interp, ap, varg); 02882 command = Ch_VaArg(interp, ap, enum MC_SteerCommand_e ); 02883 retval = MC_SendSteerCommand(temp_attr, command); 02884 Ch_VaEnd(interp, ap); 02885 free(temp_attr); 02886 return retval; 02887 } /*}}}*/ 02888 02889 /* MC_SetAgentStatus_chdl */ 02890 EXPORTCH int 02891 MC_SetAgentStatus_chdl(void *varg) /*{{{*/ 02892 { 02893 MCAgent_t agent; 02894 int status; 02895 int ret; 02896 ChInterp_t interp; 02897 ChVaList_t ap; 02898 02899 Ch_VaStart(interp, ap, varg); 02900 agent = Ch_VaArg(interp, ap, MCAgent_t); 02901 status = Ch_VaArg(interp, ap, int); 02902 ret = MC_SetAgentStatus(agent, status); 02903 Ch_VaEnd(interp, ap); 02904 return ret; 02905 } /*}}}*/ 02906 02907 /* MC_SetDefaultAgentStatus_chdl */ 02908 EXPORTCH int 02909 MC_SetDefaultAgentStatus_chdl(void *varg) /*{{{*/ 02910 { 02911 MCAgency_t temp_attr; 02912 extern mc_platform_p g_mc_platform; 02913 int status; 02914 int ret; 02915 ChInterp_t interp; 02916 ChVaList_t ap; 02917 02918 temp_attr = (MCAgency_t)malloc(sizeof(struct agency_s)); 02919 CHECK_NULL(temp_attr, exit(1);); 02920 temp_attr->mc_platform = g_mc_platform; 02921 02922 Ch_VaStart(interp, ap, varg); 02923 status = Ch_VaArg(interp, ap, int); 02924 ret = MC_SetDefaultAgentStatus(temp_attr, status); 02925 Ch_VaEnd(interp, ap); 02926 free(temp_attr); 02927 return ret; 02928 } /*}}}*/ 02929 02930 /* MC_SyncDelete_chdl*/ 02931 EXPORTCH int 02932 MC_SyncDelete_chdl(void *varg) /*{{{*/ 02933 { 02934 MCAgency_t temp_attr; 02935 extern mc_platform_p g_mc_platform; 02936 int retval; 02937 ChInterp_t interp; 02938 ChVaList_t ap; 02939 int id; 02940 02941 temp_attr = (MCAgency_t)malloc(sizeof(struct agency_s)); 02942 CHECK_NULL(temp_attr, exit(-1)); 02943 temp_attr->mc_platform = g_mc_platform; 02944 02945 Ch_VaStart(interp, ap, varg); 02946 id = Ch_VaArg(interp, ap, int); 02947 retval = MC_SyncDelete(temp_attr, id); 02948 Ch_VaEnd(interp, ap); 02949 free(temp_attr); 02950 return retval; 02951 } /*}}}*/ 02952 02953 /* MC_SyncInit_chdl*/ 02954 EXPORTCH int 02955 MC_SyncInit_chdl(void *varg) /*{{{*/ 02956 { 02957 MCAgency_t temp_attr; 02958 extern mc_platform_p g_mc_platform; 02959 int retval; 02960 ChInterp_t interp; 02961 ChVaList_t ap; 02962 int id; 02963 02964 temp_attr = (MCAgency_t)malloc(sizeof(struct agency_s)); 02965 CHECK_NULL(temp_attr, exit(-1)); 02966 temp_attr->mc_platform = g_mc_platform; 02967 02968 Ch_VaStart(interp, ap, varg); 02969 id = Ch_VaArg(interp, ap, int); 02970 02971 retval = MC_SyncInit(temp_attr, id); 02972 Ch_VaEnd(interp, ap); 02973 free(temp_attr); 02974 return retval; 02975 } /*}}}*/ 02976 02977 /* MC_TerminateAgent_chdl */ 02978 EXPORTCH int 02979 MC_TerminateAgent_chdl(void *varg) /*{{{*/ 02980 { 02981 ChInterp_t interp; 02982 ChVaList_t ap; 02983 MCAgent_t agent; 02984 int retval; 02985 02986 Ch_VaStart(interp, ap, varg); 02987 agent = Ch_VaArg(interp, ap, MCAgent_t); 02988 retval = MC_TerminateAgent(agent); 02989 Ch_VaEnd(interp, ap); 02990 return retval; 02991 } /*}}}*/ 02992