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

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

Generated on Tue Jul 1 15:29:58 2008 for Mobile-C by  doxygen 1.5.4