/home/dko/projects/mobilec/trunk/src/libmc.c

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

Generated on Mon Jun 23 16:01:10 2008 for Mobile-C by  doxygen 1.5.4