/home/dko/projects/mobilec/tags/MobileC-v1.10.2/MobileC-v1.10.2/src/libmc.c

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

Generated on Fri Jul 11 17:59:45 2008 for Mobile-C by  doxygen 1.5.4