00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034 #ifndef _WIN32
00035 #include "config.h"
00036 #else
00037 #include "winconfig.h"
00038 #endif
00039
00040 #ifndef _WIN32
00041 #include <unistd.h>
00042 #include <pthread.h>
00043 #include <sys/socket.h>
00044 #include <netdb.h>
00045 #else
00046 #include <windows.h>
00047 #include <memory.h>
00048 #endif
00049 #include <embedch.h>
00050
00051 #include <sys/types.h>
00052 #include <sys/stat.h>
00053 #ifndef _WIN32
00054 #include <sys/time.h>
00055 #else
00056 #include <time.h>
00057 #endif
00058
00059 #include "include/libmc.h"
00060 #include "include/macros.h"
00061 #include "include/mc_platform.h"
00062 #include "include/message.h"
00063 #include "include/data_structures.h"
00064 #include "include/fipa_acl_envelope.h"
00065 #include "include/fipa_acl.h"
00066 #include "include/agent.h"
00067 #include "include/agent_task.h"
00068 #include "include/agent_lib.h"
00069 #ifndef HOST_NAME_MAX
00070 #define HOST_NAME_MAX 255
00071 #endif
00072
00073
00074 mc_platform_p g_mc_platform;
00075
00076
00077
00078
00079
00080 EXPORTMC int
00081 MC_AclDestroy(struct fipa_acl_message_s* message)
00082 {
00083 return fipa_acl_message_Destroy(message);
00084 }
00085
00086 EXPORTMC fipa_acl_message_t*
00087 MC_AclNew(void) {
00088 return fipa_acl_message_New();
00089 }
00090
00091 EXPORTMC int
00092 MC_AclPost(MCAgent_t agent, struct fipa_acl_message_s* message)
00093 {
00094 return agent_mailbox_Post(agent->mailbox, message);
00095 }
00096
00097 EXPORTMC fipa_acl_message_t*
00098 MC_AclReply(fipa_acl_message_t* acl_message)
00099 {
00100 return fipa_Reply(acl_message);
00101 }
00102
00103 EXPORTMC fipa_acl_message_t*
00104 MC_AclRetrieve(MCAgent_t agent)
00105 {
00106 return agent_mailbox_Retrieve(agent->mailbox);
00107 }
00108
00109 EXPORTMC int
00110 MC_AclSend(MCAgency_t attr, fipa_acl_message_t* acl)
00111 {
00112
00113
00114
00115 int i;
00116 int err;
00117 mtp_http_t* msg;
00118 dynstring_t* msg_string;
00119 message_p mc_message;
00120
00121 char* host;
00122 int port;
00123 char* target;
00124 MCAgent_t agent;
00125 int num_addresses = 0;
00126
00127 fipa_acl_message_t* tmp;
00128
00129 err = fipa_acl_Compose(&msg_string, acl);
00130 if( err ) {
00131 fprintf(stderr, "ACL Message Compose Error. %s:%d\n", __FILE__, __LINE__);
00132 return err;
00133 }
00134 for(i = 0; i < acl->receiver->num; i++) {
00135
00136
00137
00138 if (acl->receiver->fipa_agent_identifiers[i]->addresses == NULL) {
00139 num_addresses = 0;
00140 } else {
00141 num_addresses = acl->receiver->fipa_agent_identifiers[i]->addresses->num;
00142 }
00143
00144 if (num_addresses == 0) {
00145 agent = MC_FindAgentByName(
00146 attr,
00147 acl->receiver->fipa_agent_identifiers[i]->name );
00148 if (agent == NULL) {
00149 fprintf(stderr, "Could not find local agent:%s. %s:%d\n",
00150 acl->receiver->fipa_agent_identifiers[i]->name,
00151 __FILE__, __LINE__);
00152 continue;
00153 }
00154 tmp = fipa_acl_message_Copy(acl);
00155 MC_AclPost(agent, tmp);
00156 } else {
00157 msg = mtp_http_New();
00158
00159 err = http_to_hostport(
00160 acl->receiver->fipa_agent_identifiers[i]->addresses->urls[0]->str,
00161 &host,
00162 &port,
00163 &target );
00164 if (err) {
00165 fprintf(stderr, "Invalid address. %s:%d\n", __FILE__, __LINE__);
00166 return err;
00167 }
00168 msg->host = strdup(host);
00169 msg->target = strdup(target);
00170 msg->message_parts = 2;
00171 msg->content = (mtp_http_content_t *)malloc(
00172 sizeof(mtp_http_content_t) * 2);
00173
00174
00175 msg->content[0].data = (void*)fipa_envelope_Compose(acl);
00176
00177 msg->content[0].content_type = strdup("application/xml");
00178
00179
00180 msg->content[1].data = (void*)strdup(msg_string->message);
00181 msg->content[1].content_type = strdup("application/text");
00182
00183 mc_message = mtp_http_CreateMessage(
00184 msg,
00185 host,
00186 port );
00187 mc_message->message_type = FIPA_ACL;
00188 mc_message->target = strdup("acc");
00189
00190 message_Send
00191 (
00192 attr->mc_platform,
00193 mc_message,
00194 attr->mc_platform->private_key
00195 );
00196
00197
00198 mtp_http_Destroy(msg);
00199 free(host);
00200 free(target);
00201 }
00202 }
00203 dynstring_Destroy(msg_string);
00204 return 0;
00205 }
00206
00207 EXPORTMC fipa_acl_message_t*
00208 MC_AclWaitRetrieve(MCAgent_t agent)
00209 {
00210 return agent_mailbox_WaitRetrieve(agent->mailbox);
00211 }
00212
00213
00214
00215 EXPORTMC enum fipa_protocol_e MC_AclGetProtocol(
00216 struct fipa_acl_message_s* acl)
00217 {
00218 return (enum fipa_protocol_e)acl->performative;
00219 }
00220
00221 EXPORTMC char* MC_AclGetConversationID(
00222 struct fipa_acl_message_s* acl)
00223 {
00224 return acl->conversation_id->content.string->content;
00225 }
00226
00227 EXPORTMC enum fipa_performative_e MC_AclGetPerformative(
00228 struct fipa_acl_message_s* acl)
00229 {
00230 return acl->performative;
00231 }
00232
00233 EXPORTMC int MC_AclGetSender(
00234 struct fipa_acl_message_s* acl,
00235 char** name,
00236
00237 char** address
00238
00239 )
00240 {
00241 *name = strdup(acl->sender->name);
00242 *address = strdup( acl->sender->addresses->urls[0]->str );
00243 return 0;
00244 }
00245
00246 EXPORTMC const char* MC_AclGetContent(
00247 struct fipa_acl_message_s* acl)
00248 {
00249 return acl->content->content;
00250 }
00251
00252 EXPORTMC int MC_AclSetProtocol(
00253 fipa_acl_message_t* acl,
00254 enum fipa_protocol_e protocol)
00255 {
00256 if(protocol <= FIPA_PROTOCOL_ERROR ||
00257 protocol >= FIPA_PROTOCOL_END)
00258 {
00259 fprintf(stderr,
00260 "AclSetProtocol: Incorrect protocol. %s:%d\n",
00261 __FILE__, __LINE__);
00262 return -1;
00263 }
00264 acl->protocol = protocol;
00265 return 0;
00266 }
00267
00268 EXPORTMC int MC_AclSetConversationID(
00269 fipa_acl_message_t* acl,
00270 char* id)
00271 {
00272
00273 if(!id)
00274 {
00275 fprintf(stderr,
00276 "AclSetConversationID: NULL id string. %s:%d\n",
00277 __FILE__, __LINE__);
00278 return -1;
00279 }
00280 acl->conversation_id = fipa_expression_New();
00281 acl->conversation_id->type = FIPA_EXPR_STRING;
00282 acl->conversation_id->content.string = fipa_string_New();
00283 acl->conversation_id->content.string->content = strdup(id);
00284 return 0;
00285 }
00286
00287 EXPORTMC int MC_AclSetPerformative(
00288 fipa_acl_message_t* acl,
00289 enum fipa_performative_e performative )
00290 {
00291 acl->performative = performative;
00292 return 0;
00293 }
00294
00295 EXPORTMC int MC_AclSetSender(
00296 fipa_acl_message_t* acl,
00297 const char* name,
00298 const char* address )
00299 {
00300 if(acl->sender != NULL) {
00301
00302 fipa_agent_identifier_Destroy(acl->sender);
00303 }
00304 acl->sender = fipa_agent_identifier_New();
00305 acl->sender->name = strdup(name);
00306 if (address != NULL) {
00307 acl->sender->addresses = fipa_url_sequence_New();
00308 acl->sender->addresses->num = 1;
00309 acl->sender->addresses->urls = (struct fipa_url_s**)malloc(
00310 sizeof(struct fipa_url_s*));
00311 acl->sender->addresses->urls[0] = fipa_url_New();
00312 acl->sender->addresses->urls[0]->str = strdup(address);
00313 }
00314
00315 return 0;
00316 }
00317
00318 EXPORTMC int MC_AclAddReceiver(
00319 fipa_acl_message_t* acl,
00320 const char* name,
00321 const char* address )
00322 {
00323 int i;
00324 struct fipa_agent_identifier_s** tmp;
00325 if (acl->receiver == NULL) {
00326 acl->receiver = fipa_agent_identifier_set_New();
00327 }
00328 acl->receiver_num++;
00329
00330 acl->receiver->num++;
00331 tmp = (struct fipa_agent_identifier_s**)malloc(
00332 sizeof(struct fipa_agent_identifier_s*)
00333 * acl->receiver->num);
00334
00335 for(i = 0; i < acl->receiver->num-1; i++) {
00336 tmp[i] = acl->receiver->fipa_agent_identifiers[i];
00337 }
00338
00339 tmp[i] = fipa_agent_identifier_New();
00340 tmp[i]->name = strdup(name);
00341 if(address != NULL) {
00342 tmp[i]->addresses = fipa_url_sequence_New();
00343 tmp[i]->addresses->num = 1;
00344 tmp[i]->addresses->urls = (struct fipa_url_s**)malloc(
00345 sizeof(struct fipa_url_s*));
00346 tmp[i]->addresses->urls[0] = fipa_url_New();
00347 tmp[i]->addresses->urls[0]->str = strdup(address);
00348 }
00349 free(acl->receiver->fipa_agent_identifiers);
00350 acl->receiver->fipa_agent_identifiers = tmp;
00351 return 0;
00352 }
00353
00354 EXPORTMC int MC_AclAddReplyTo(
00355 fipa_acl_message_t* acl,
00356 const char* name,
00357 const char* address)
00358 {
00359 int i;
00360 struct fipa_agent_identifier_s** tmp;
00361 if (acl->reply_to == NULL) {
00362 acl->reply_to = fipa_agent_identifier_set_New();
00363 }
00364
00365 acl->reply_to->num++;
00366 tmp = (struct fipa_agent_identifier_s**)malloc(
00367 sizeof(struct fipa_agent_identifier_s*)
00368 * acl->reply_to->num);
00369
00370 for(i = 0; i < acl->reply_to->num-1; i++) {
00371 tmp[i] = acl->reply_to->fipa_agent_identifiers[i];
00372 }
00373
00374 tmp[i] = fipa_agent_identifier_New();
00375 tmp[i]->name = strdup(name);
00376 if(address != NULL) {
00377 tmp[i]->addresses = fipa_url_sequence_New();
00378 tmp[i]->addresses->num = 1;
00379 tmp[i]->addresses->urls = (struct fipa_url_s**)malloc(
00380 sizeof(struct fipa_url_s*));
00381 tmp[i]->addresses->urls[0] = fipa_url_New();
00382 tmp[i]->addresses->urls[0]->str = strdup(address);
00383 }
00384 free (acl->reply_to->fipa_agent_identifiers);
00385 acl->reply_to->fipa_agent_identifiers = tmp;
00386 return 0;
00387 }
00388
00389 EXPORTMC int MC_AclSetContent(
00390 fipa_acl_message_t* acl,
00391 const char* content )
00392 {
00393 if (acl->content != NULL) {
00394
00395 fipa_string_Destroy(acl->content);
00396 }
00397 acl->content = fipa_string_New();
00398 acl->content->content = strdup(content);
00399
00400 return 0;
00401 }
00402
00403
00404
00405 EXPORTMC int
00406 MC_AddAgent(MCAgency_t attr, MCAgent_t agent)
00407 {
00408 agent->mc_platform = attr->mc_platform;
00409
00410 agent_queue_Add(attr->mc_platform->agent_queue, agent);
00411
00412 MUTEX_LOCK(attr->mc_platform->ams->runflag_lock);
00413 attr->mc_platform->ams->run = 1;
00414 COND_SIGNAL(attr->mc_platform->ams->runflag_cond);
00415 MUTEX_UNLOCK(attr->mc_platform->ams->runflag_lock);
00416 return 0;
00417 }
00418
00419 EXPORTMC int MC_AddStationaryAgent(
00420 MCAgency_t agency,
00421 void* (*agent_thread)(stationary_agent_info_t*),
00422 const char* name,
00423 void* agent_args)
00424 {
00425 #ifndef _WIN32
00426 pthread_attr_t attr;
00427 pthread_attr_init(&attr);
00428 #else
00429 int stack_size = 0;
00430 #endif
00431 stationary_agent_info_t* stationary_agent_info;
00432 stationary_agent_info = (stationary_agent_info_t*)malloc(sizeof(stationary_agent_info_t));
00433 stationary_agent_info->args = agent_args;
00434 stationary_agent_info->agent = agent_NewBinary(agency->mc_platform);
00435 stationary_agent_info->agent->name = strdup(name);
00436 stationary_agent_info->attr = agency;
00437 stationary_agent_info->agency = agency;
00438 agent_queue_Add(agency->mc_platform->agent_queue, stationary_agent_info->agent);
00439 #ifndef _WIN32
00440 THREAD_CREATE(&stationary_agent_info->thread, agent_thread, stationary_agent_info);
00441 #else
00442 THREAD_CREATE(&stationary_agent_info->thread, (LPTHREAD_START_ROUTINE)agent_thread, stationary_agent_info);
00443 #endif
00444 return 0;
00445 }
00446
00447 EXPORTMC int MC_AddAgentInitCallback(
00448 MCAgency_t agency,
00449 MC_AgentInitCallbackFunc_t function,
00450 void* user_data)
00451 {
00452 agency->agentInitCallback = function;
00453 agency->agentInitUserData = user_data;
00454 return 0;
00455 }
00456
00457 EXPORTMC MCAgency_t MC_AgentInfo_GetAgency(stationary_agent_info_t* stationary_agent_info)
00458 {
00459 return stationary_agent_info->agency;
00460 }
00461
00462 EXPORTMC MCAgent_t MC_AgentInfo_GetAgent(stationary_agent_info_t* stationary_agent_info)
00463 {
00464 return stationary_agent_info->agent;
00465 }
00466
00467 EXPORTMC void* MC_AgentInfo_GetAgentArgs(stationary_agent_info_t* stationary_agent_info)
00468 {
00469 return stationary_agent_info->args;
00470 }
00471
00472 EXPORTMC int MC_AgentAddTask(
00473 MCAgent_t agent,
00474 const char* code,
00475 const char* return_var_name,
00476 const char* server,
00477 int persistent)
00478 {
00479 int new_num_tasks;
00480 int num_code_ids;
00481 int i, j;
00482 agent->datastate->number_of_tasks++;
00483 new_num_tasks = agent->datastate->number_of_tasks;
00484
00485
00486
00487 for(num_code_ids = 0;
00488 agent->datastate->agent_code_ids[num_code_ids] != NULL;
00489 num_code_ids++);
00490
00491 agent->datastate->agent_code_ids = (char**)realloc(
00492 agent->datastate->agent_code_ids,
00493 sizeof(char*)*(num_code_ids + 2));
00494 agent->datastate->agent_code_ids[num_code_ids] = NULL;
00495 agent->datastate->agent_code_ids[num_code_ids+1] = NULL;
00496 if(agent->datastate->agent_code_ids == NULL) {
00497 fprintf(stderr, "Memory Error %s:%d\n", __FILE__, __LINE__);
00498 }
00499
00500
00501
00502 for(i = 0; agent->datastate->agent_code_ids[i] != NULL; i++) {
00503 if(strlen(agent->datastate->agent_code_ids[i]) == 0) {
00504 free(agent->datastate->agent_code_ids[i]);
00505 agent->datastate->agent_code_ids[i] = (char*)malloc(sizeof(char)*20);
00506 sprintf(agent->datastate->agent_code_ids[i], "code%d", rand());
00507 for(j = 0; j < agent->datastate->number_of_tasks-1; j++) {
00508 if (agent->datastate->tasks[j]->code_id == NULL) {
00509 agent->datastate->tasks[j]->code_id = strdup(agent->datastate->agent_code_ids[i]);
00510 }
00511 }
00512 break;
00513 }
00514 }
00515
00516
00517 agent->datastate->agent_code_ids[num_code_ids] = (char*)malloc(sizeof(char)*20);
00518 sprintf(agent->datastate->agent_code_ids[num_code_ids], "code%d", rand());
00519
00520
00521 agent->datastate->agent_codes = (char**)realloc(
00522 agent->datastate->agent_codes,
00523 sizeof(char*)*(num_code_ids + 2));
00524 agent->datastate->agent_codes[num_code_ids] = NULL;
00525 agent->datastate->agent_codes[num_code_ids+1] = NULL;
00526 agent->datastate->agent_codes[num_code_ids] = strdup(code);
00527
00528
00529 agent->datastate->tasks = (agent_task_t**)realloc(
00530 agent->datastate->tasks,
00531 sizeof(agent_task_t*) * new_num_tasks );
00532 agent->datastate->tasks[new_num_tasks-1] = agent_task_New();
00533 if(return_var_name == NULL) {
00534 agent->datastate->tasks[new_num_tasks-1]->var_name = strdup("no-return");
00535 } else {
00536 agent->datastate->tasks[new_num_tasks-1]->var_name = strdup(return_var_name);
00537 }
00538 agent->datastate->tasks[new_num_tasks-1]->server_name = strdup(server);
00539 agent->datastate->tasks[new_num_tasks-1]->persistent = persistent;
00540 agent->datastate->tasks[new_num_tasks-1]->code_id =
00541 strdup(agent->datastate->agent_code_ids[num_code_ids]);
00542 return 0;
00543 }
00544
00545 EXPORTMC int MC_AgentAddTaskFromFile(
00546 MCAgent_t agent,
00547 const char* filename,
00548 const char* return_var_name,
00549 const char* server,
00550 int persistent)
00551 {
00552 struct stat buffer;
00553 char *code;
00554 int codesize;
00555 FILE* fptr;
00556 int return_val;
00557 if(stat(filename, &buffer)) {
00558
00559 fprintf(stderr, "MC_AgentAddTaskFromFile failed. File %s does not exist.\n",
00560 filename);
00561 return -1;
00562 }
00563 codesize = buffer.st_size;
00564 code = (char *)malloc((codesize+1)*sizeof(char));
00565 memset(code, 0, codesize+1);
00566 fptr = fopen(filename, "r");
00567 fread(code, sizeof(char), codesize, fptr);
00568 fclose(fptr);
00569 return_val = MC_AgentAddTask(
00570 agent,
00571 code,
00572 return_var_name,
00573 server,
00574 persistent );
00575 free(code);
00576 return return_val;
00577 }
00578
00579 EXPORTMC int MC_AgentReturnArrayExtent(
00580 MCAgent_t agent,
00581 int task_num,
00582 int index )
00583 {
00584 if (task_num >= agent->datastate->number_of_tasks) {
00585 return -1;
00586 }
00587
00588 if (
00589 agent->datastate->tasks[task_num]->
00590 agent_return_data->data_type == -1
00591 )
00592 {
00593 return -1;
00594 }
00595
00596 if (index >= agent->datastate->tasks[task_num]->agent_return_data->array_dim) {
00597 return -1;
00598 }
00599
00600 return agent->datastate->tasks[task_num]->agent_return_data->array_extent[index];
00601 }
00602
00603 EXPORTMC int MC_AgentReturnArrayDim(
00604 MCAgent_t agent,
00605 int task_num )
00606 {
00607 if (task_num >= agent->datastate->number_of_tasks) {
00608 return -1;
00609 }
00610
00611 if (
00612 agent->datastate->tasks[task_num]->
00613 agent_return_data->data_type == -1
00614 )
00615 {
00616 return -1;
00617 }
00618 return agent->datastate->tasks[task_num]->agent_return_data->array_dim;
00619 }
00620
00621 EXPORTMC int MC_AgentReturnArrayNum(
00622 MCAgent_t agent,
00623 int task_num )
00624 {
00625 int num_elements, i;
00626 if (task_num >= agent->datastate->number_of_tasks) {
00627 return -1;
00628 }
00629
00630 if (
00631 agent->datastate->tasks[task_num]->
00632 agent_return_data->data_type == -1
00633 )
00634 {
00635 return -1;
00636 }
00637
00638 num_elements = 1;
00639 for (
00640 i = 0;
00641 i < agent->datastate->tasks[task_num]->agent_return_data->array_dim;
00642 i++
00643 )
00644 {
00645 num_elements *= agent->datastate->
00646 tasks[task_num]->agent_return_data->array_extent[i];
00647 }
00648 return num_elements;
00649 }
00650
00651 EXPORTMC const void* MC_AgentReturnDataGetSymbolAddr(
00652 MCAgent_t agent,
00653 int task_num )
00654 {
00655 if (task_num >= agent->datastate->number_of_tasks) {
00656 return NULL;
00657 }
00658 if (
00659 agent->datastate->tasks[task_num]->
00660 agent_return_data->data_type == -1
00661 )
00662 {
00663 return NULL;
00664 }
00665 return agent->datastate->tasks[task_num]->agent_return_data->data;
00666 }
00667
00668 EXPORTMC size_t MC_AgentReturnDataSize(
00669 MCAgent_t agent,
00670 int task_num )
00671 {
00672 int size;
00673 if (task_num >= agent->datastate->number_of_tasks) {
00674 return -1;
00675 }
00676
00677 if (
00678 agent->datastate->tasks[task_num]->
00679 agent_return_data->data_type == -1
00680 )
00681 {
00682 return -1;
00683 }
00684
00685 CH_DATATYPE_SIZE(
00686 agent->datastate->tasks[task_num]->agent_return_data->data_type,
00687 size);
00688 return size;
00689 }
00690
00691 EXPORTMC int MC_AgentReturnDataType(
00692 MCAgent_t agent,
00693 int task_num )
00694 {
00695 if (task_num >= agent->datastate->number_of_tasks) {
00696 return -1;
00697 }
00698 return agent->datastate->tasks[task_num]->agent_return_data->data_type;
00699 }
00700
00701 EXPORTMC int MC_AgentReturnIsArray(
00702 MCAgent_t agent,
00703 int task_num )
00704 {
00705 if (task_num >= agent->datastate->number_of_tasks) {
00706 return -1;
00707 }
00708 if (
00709 agent->datastate->tasks[task_num]->
00710 agent_return_data->data_type == -1
00711 )
00712 {
00713 return -1;
00714 }
00715 if(agent->datastate->tasks[task_num]->agent_return_data->array_dim) {
00716 return 1;
00717 } else {
00718 return 0;
00719 }
00720 }
00721
00722 EXPORTMC const void* MC_AgentVariableRetrieve(MCAgent_t agent, const char* var_name, int task_num)
00723 {
00724 interpreter_variable_data_t* interp_var;
00725
00726 if (task_num > agent->datastate->task_progress) {
00727 return NULL;
00728 }
00729
00730 interp_var = agent_variable_list_Search(
00731 agent->datastate->tasks[task_num]->agent_variable_list,
00732 var_name );
00733 if (interp_var == NULL) {
00734 return NULL;
00735 }
00736
00737 return interp_var->data;
00738 }
00739
00740 EXPORTMC int MC_AgentVariableRetrieveInfo(MCAgent_t agent, const char* var_name, int task_num, const void** data, int* dim, const int** extent)
00741 {
00742 interpreter_variable_data_t* interp_var;
00743
00744 if (task_num >= agent->datastate->task_progress) {
00745 return MC_ERR_NOT_FOUND;
00746 }
00747
00748 interp_var = agent_variable_list_Search(
00749 agent->datastate->tasks[task_num]->agent_variable_list,
00750 var_name );
00751 if (interp_var == NULL) {
00752 return MC_ERR_NOT_FOUND;
00753 }
00754 *data = interp_var->data;
00755 *dim = interp_var->array_dim;
00756 *extent = interp_var->array_extent;
00757
00758 return MC_SUCCESS;
00759 }
00760
00761 EXPORTMC int MC_AgentVariableSave(MCAgent_t agent, const char* var_name)
00762 {
00763 int current_task = agent->datastate->task_progress;
00764 const int default_num_vars = 50;
00765 agent_task_p task = agent->datastate->tasks[current_task];
00766
00767 if(task->num_saved_variables == 0) {
00768 task->saved_variables = (char**)malloc(sizeof(char*)*default_num_vars);
00769 memset(task->saved_variables, 0, sizeof(char*)*default_num_vars);
00770 }
00771 task->saved_variables[task->num_saved_variables] = strdup(var_name);
00772 if(task->saved_variables[task->num_saved_variables] == NULL) {
00773 fprintf(stderr, "Memory error. %s:%d\n", __FILE__, __LINE__);
00774 return MC_ERR_MEMORY;
00775 }
00776 task->num_saved_variables++;
00777
00778 return 0;
00779 }
00780
00781 EXPORTMC int
00782 MC_Barrier(MCAgency_t attr, int id)
00783 {
00784 barrier_queue_p list = attr->mc_platform->barrier_queue;
00785 barrier_node_p node;
00786 node = barrier_queue_Get(list, id);
00787 if(node == NULL) {
00788 return MC_ERR_NOT_FOUND;
00789 }
00790
00791 MUTEX_LOCK(node->lock);
00792 node->num_waiting++;
00793 if (node->num_waiting >= node->num_registered) {
00794
00795 COND_BROADCAST(node->cond);
00796 MUTEX_UNLOCK(node->lock);
00797 return MC_SUCCESS;
00798 } else {
00799 while (node->num_waiting < node->num_registered) {
00800 COND_WAIT(node->cond, node->lock);
00801 }
00802 MUTEX_UNLOCK(node->lock);
00803 }
00804 return MC_SUCCESS;
00805 }
00806
00807 EXPORTMC int
00808 MC_BarrierInit(MCAgency_t attr, int id, int num_procs)
00809 {
00810 barrier_node_p node;
00811
00812 node = barrier_queue_Get(attr->mc_platform->barrier_queue, id);
00813 if (node != NULL) {
00814 return MC_ERR;
00815 }
00816 node = barrier_node_Initialize(id, num_procs);
00817 barrier_queue_Add(attr->mc_platform->barrier_queue, node);
00818 return MC_SUCCESS;
00819 }
00820
00821 EXPORTMC int
00822 MC_BarrierDelete(MCAgency_t attr, int id)
00823 {
00824 return barrier_queue_Delete(id, attr->mc_platform->barrier_queue);
00825 }
00826
00827 EXPORTMC int
00828 MC_CallAgentFunc(
00829 MCAgent_t agent,
00830 const char* funcName,
00831 void* returnVal,
00832 int numArgs,
00833 ...)
00834 {
00835 int return_code;
00836 va_list vl;
00837 va_start(vl, numArgs);
00838 MUTEX_LOCK(agent->run_lock);
00839 return_code = Ch_CallFuncByNamev(
00840 *agent->agent_interp,
00841 funcName,
00842 returnVal,
00843 vl );
00844 MUTEX_UNLOCK(agent->run_lock);
00845 return return_code;
00846 }
00847
00848 EXPORTMC int
00849 MC_CallAgentFuncArg(
00850 MCAgent_t agent,
00851 const char* funcName,
00852 void* returnVal,
00853 void* arg)
00854 {
00855 int return_code;
00856
00857 MUTEX_LOCK(agent->run_lock);
00858 return_code = Ch_CallFuncByName(
00859 agent->agent_interp,
00860 funcName,
00861 returnVal,
00862 arg);
00863 MUTEX_UNLOCK(agent->run_lock);
00864 return return_code;
00865 }
00866
00867 EXPORTMC int
00868 MC_CallAgentFuncV(
00869 MCAgent_t agent,
00870 const char* funcName,
00871 void* returnVal,
00872 va_list ap)
00873 {
00874 int return_code;
00875 MUTEX_LOCK(agent->run_lock);
00876 return_code = Ch_CallFuncByNamev
00877 (
00878 agent->agent_interp,
00879 funcName,
00880 returnVal,
00881 ap
00882 );
00883 MUTEX_UNLOCK(agent->run_lock);
00884 return return_code;
00885 }
00886
00887 EXPORTMC int
00888 MC_CallAgentFuncVar(
00889 MCAgent_t agent,
00890 const char* funcName,
00891 void* returnVal,
00892 ChVaList_t varg)
00893 {
00894 int return_code;
00895 MUTEX_LOCK(agent->run_lock);
00896 return_code = Ch_CallFuncByNameVar
00897 (
00898 *agent->agent_interp,
00899 funcName,
00900 returnVal,
00901 varg
00902 );
00903 MUTEX_UNLOCK(agent->run_lock);
00904 return return_code;
00905 }
00906
00907 #ifdef OBS
00908 EXPORTMC int
00909 MC_ChInitializeOptions(MCAgency_t attr, ChOptions_t *options) {
00910 if(attr->mc_platform == NULL) {
00911 fprintf(stderr, "MC_ChInitializeOptions must be called after MC_Start()\n");
00912 fprintf(stderr, "Using default interpretor options...\n");
00913 return 1;
00914 }
00915 else {
00916 if (attr->mc_platform->interp_options == NULL) {
00917 attr->mc_platform->interp_options = (ChOptions_t*)malloc(
00918 sizeof(ChOptions_t) );
00919 }
00920 *attr->mc_platform->interp_options = *options;
00921 attr->mc_platform->interp_options->chhome = strdup(options->chhome);
00922 return 0;
00923 }
00924 }
00925 #endif
00926
00927 EXPORTMC MCAgent_t
00928 MC_ComposeAgent(
00929 const char* name,
00930 const char* home,
00931 const char* owner,
00932 const char* code,
00933 const char* return_var_name,
00934 const char* server,
00935 int persistent
00936 )
00937 {
00938 return MC_ComposeAgentWithWorkgroup(
00939 name,
00940 home,
00941 owner,
00942 code,
00943 return_var_name,
00944 server,
00945 persistent,
00946 NULL
00947 );
00948 }
00949
00950 EXPORTMC MCAgent_t
00951 MC_ComposeAgentS(
00952 const char* name,
00953 const char* home,
00954 const char* owner,
00955 const char* code,
00956 const char* return_var_name,
00957 const char* server,
00958 int persistent,
00959 const char* workgroup_code
00960 )
00961 {
00962 printf("\nThe MC_ComposeAgentS function is now deprecated due to its\n\
00963 misleading name. Please use the MC_ComposeAgentWithWorkgroup() function\n\
00964 instead.\n");
00965 return MC_ComposeAgentWithWorkgroup(
00966 name,
00967 home,
00968 owner,
00969 code,
00970 return_var_name,
00971 server,
00972 persistent,
00973 workgroup_code );
00974 }
00975
00976 EXPORTMC MCAgent_t
00977 MC_ComposeAgentWithWorkgroup(
00978 const char* name,
00979 const char* home,
00980 const char* owner,
00981 const char* code,
00982 const char* return_var_name,
00983 const char* server,
00984 int persistent,
00985 const char* workgroup_code
00986 )
00987 {
00988 agent_p agent;
00989 agent = agent_New();
00990 if (agent == NULL) return NULL;
00991 agent->name = strdup(name);
00992 agent->home = strdup(home);
00993 agent->owner = strdup(owner);
00994
00995 agent->orphan = 1;
00996
00997 agent->agent_type = MC_LOCAL_AGENT;
00998 agent->agent_status = MC_WAIT_MESSGSEND;
00999
01000 agent->datastate = agent_datastate_New();
01001 agent->datastate->number_of_tasks = 1;
01002 agent->datastate->agent_code_ids = (char**)malloc(
01003 sizeof(char*)*2);
01004 if(agent->datastate->agent_code_ids == NULL) {
01005 fprintf(stderr, "Memory Error %s:%d\n", __FILE__, __LINE__);
01006 }
01007 agent->datastate->agent_code_ids[0] = strdup("");
01008 if(agent->datastate->agent_code_ids[0] == NULL) {
01009 fprintf(stderr, "Memory Error %s:%d\n", __FILE__, __LINE__);
01010 }
01011 agent->datastate->agent_code_ids[1] = NULL;
01012
01013 agent->datastate->agent_codes = (char**)malloc(
01014 sizeof(char*)*2);
01015 if(agent->datastate->agent_codes == NULL) {
01016 fprintf(stderr, "Memory Error %s:%d\n", __FILE__, __LINE__);
01017 }
01018 agent->datastate->agent_codes[0] = strdup(code);
01019 if(agent->datastate->agent_codes[0] == NULL) {
01020 fprintf(stderr, "Memory Error %s:%d\n", __FILE__, __LINE__);
01021 }
01022 agent->datastate->agent_codes[1] = NULL;
01023
01024 agent->datastate->agent_code = agent->datastate->agent_codes[0];
01025
01026 agent->datastate->tasks = (agent_task_t**)malloc(
01027 sizeof(agent_task_t*));
01028 agent->datastate->tasks[0] = agent_task_New();
01029 if(return_var_name == NULL) {
01030 agent->datastate->tasks[0]->var_name = strdup("no-return");
01031 } else {
01032 agent->datastate->tasks[0]->var_name = strdup(return_var_name);
01033 }
01034 if(agent->datastate->tasks[0]->var_name == NULL) {
01035 fprintf(stderr, "Memory Error %s:%d\n", __FILE__, __LINE__);
01036 }
01037
01038 agent->datastate->tasks[0]->server_name = strdup(server);
01039 if(agent->datastate->tasks[0]->server_name == NULL) {
01040 fprintf(stderr, "Memory Error %s:%d\n", __FILE__, __LINE__);
01041 }
01042
01043 if(workgroup_code != NULL) {
01044 agent->wg_code = strdup(workgroup_code);
01045 if (agent->wg_code == NULL) {
01046 fprintf(stderr, "Memory Error %s:%d\n", __FILE__, __LINE__);
01047 }
01048 }
01049 agent->datastate->tasks[0]->persistent = persistent;
01050
01051 return agent;
01052 }
01053
01054 EXPORTMC MCAgent_t MC_ComposeAgentFromFile(
01055 const char* name,
01056 const char* home,
01057 const char* owner,
01058 const char* filename,
01059 const char* return_var_name,
01060 const char* server,
01061 int persistent
01062 )
01063 {
01064 return MC_ComposeAgentFromFileWithWorkgroup(
01065 name,
01066 home,
01067 owner,
01068 filename,
01069 return_var_name,
01070 server,
01071 persistent,
01072 NULL
01073 );
01074 }
01075
01076 EXPORTMC MCAgent_t MC_ComposeAgentFromFileS(
01077 const char* name,
01078 const char* home,
01079 const char* owner,
01080 const char* filename,
01081 const char* return_var_name,
01082 const char* server,
01083 int persistent,
01084 const char* workgroup_code
01085 )
01086 {
01087 printf("\nThe MC_ComposeAgentFromFileS() function is deprecated due to \n\
01088 its misleading name. Please use the MC_ComposeAgentFromFileWithWorkgroup\n\
01089 function instead.\n");
01090 return MC_ComposeAgentFromFileWithWorkgroup(
01091 name,
01092 home,
01093 owner,
01094 filename,
01095 return_var_name,
01096 server,
01097 persistent,
01098 workgroup_code);
01099 }
01100
01101 EXPORTMC MCAgent_t MC_ComposeAgentFromFileWithWorkgroup(
01102 const char* name,
01103 const char* home,
01104 const char* owner,
01105 const char* filename,
01106 const char* return_var_name,
01107 const char* server,
01108 int persistent,
01109 const char* workgroup_code
01110 )
01111 {
01112 MCAgent_t agent;
01113 struct stat buffer;
01114 char *code;
01115 int codesize;
01116 FILE* fptr;
01117
01118 if(stat(filename, &buffer)) {
01119
01120 return NULL;
01121 }
01122 codesize = buffer.st_size;
01123 code = (char *)malloc((codesize+1)*sizeof(char));
01124 memset(code, 0, codesize+1);
01125 fptr = fopen(filename, "r");
01126 fread(code, sizeof(char), codesize, fptr);
01127 fclose(fptr);
01128
01129 agent = MC_ComposeAgentWithWorkgroup(
01130 name,
01131 home,
01132 owner,
01133 code,
01134 return_var_name,
01135 server,
01136 persistent,
01137 workgroup_code
01138 );
01139 free(code);
01140
01141 return agent;
01142 }
01143
01144 EXPORTMC int
01145 MC_CondBroadcast(MCAgency_t attr, int id)
01146 {
01147 syncListNode_t *condnode;
01148 condnode = syncListFind(id, attr->mc_platform->syncList);
01149 if (condnode == NULL) {
01150 return MC_ERR_NOT_FOUND;
01151 }
01152 MUTEX_LOCK(condnode->lock);
01153 condnode->signalled=1;
01154 COND_BROADCAST(condnode->cond);
01155 MUTEX_UNLOCK(condnode->lock);
01156 return 0;
01157 }
01158
01159 EXPORTMC int
01160 MC_CondSignal(MCAgency_t attr, int id)
01161 {
01162 syncListNode_t *condnode;
01163 condnode = syncListFind(id, attr->mc_platform->syncList);
01164 if (condnode == NULL) {
01165 return MC_ERR_NOT_FOUND;
01166 }
01167 MUTEX_LOCK(condnode->lock);
01168 condnode->signalled=1;
01169 COND_SIGNAL(condnode->cond);
01170 MUTEX_UNLOCK(condnode->lock);
01171 return 0;
01172 }
01173
01174 EXPORTMC int
01175 MC_CondWait(MCAgency_t attr, int id)
01176 {
01177 syncListNode_t *condnode;
01178 condnode = syncListFind(id, attr->mc_platform->syncList);
01179 if (condnode == NULL) {
01180 return MC_ERR_NOT_FOUND;
01181 }
01182 MUTEX_LOCK(condnode->lock);
01183 if (condnode->signalled) {
01184 MUTEX_UNLOCK(condnode->lock);
01185 return 1;
01186 }
01187
01188 while (condnode->signalled == 0) {
01189 COND_WAIT(condnode->cond, condnode->lock);
01190 }
01191 MUTEX_UNLOCK(condnode->lock);
01192
01193 return 0;
01194 }
01195
01196 EXPORTMC int
01197 MC_CondReset(MCAgency_t attr, int id)
01198 {
01199 syncListNode_t *condnode;
01200 condnode = syncListFind(id, attr->mc_platform->syncList);
01201 if (condnode == NULL) {
01202 return MC_ERR_NOT_FOUND;
01203 }
01204 MUTEX_LOCK(condnode->lock);
01205 if (condnode->signalled) {
01206 condnode->signalled = 0;
01207 MUTEX_UNLOCK(condnode->lock);
01208 return 0;
01209 }
01210 MUTEX_UNLOCK(condnode->lock);
01211 return 1;
01212 }
01213
01214 EXPORTMC int
01215 MC_CopyAgent(MCAgent_t* agent_out, const MCAgent_t agent_in)
01216 {
01217 *agent_out = agent_Copy(agent_in);
01218 return MC_SUCCESS;
01219 }
01220
01221 EXPORTMC int
01222 MC_DeleteAgent(MCAgent_t agent)
01223 {
01224
01225 CHECK_NULL(agent, return MC_ERR_INVALID;);
01226
01227
01228 if ( agent->wg_code != NULL ) {
01229 return MC_ERR_INVALID_ARGS;
01230 }
01231
01232
01233 MC_TerminateAgent(agent);
01234
01235 return MC_SUCCESS;
01236 }
01237
01238 EXPORTMC int
01239 MC_DeleteAgentWG(MCAgent_t calling_agent, MCAgent_t agent)
01240 {
01241
01242 CHECK_NULL(agent, return MC_ERR_INVALID;);
01243
01244
01245 if (agent->wg_code != NULL) {
01246 if (calling_agent->wg_code == NULL) {
01247 return MC_ERR_INVALID_ARGS;
01248 } else if (strcmp(calling_agent->wg_code, agent->wg_code)) {
01249 return MC_ERR_INVALID_ARGS;
01250 }
01251 }
01252
01253
01254 MC_TerminateAgentWG(calling_agent, agent);
01255
01256 return MC_SUCCESS;
01257 }
01258
01259 EXPORTMC int MC_DestroyServiceSearchResult(
01260 char** agentName,
01261 char** serviceName,
01262 int* agentID,
01263 int numResult)
01264 {
01265 int i;
01266 for(i = 0;i < numResult; i++)
01267 {
01268 free(agentName[i]);
01269 free(serviceName[i]);
01270 }
01271 free(agentName);
01272 free(serviceName);
01273 free(agentID);
01274
01275 return 0;
01276 }
01277
01278 EXPORTMC int
01279 MC_DeregisterService(
01280 MCAgency_t agency,
01281 int agentID,
01282 const char *serviceName)
01283 {
01284 int err_code;
01285
01286 df_request_list_node_t *req_node;
01287 df_deregister_p deregister_data;
01288
01289 req_node = df_request_list_node_New();
01290 req_node->command = (char*)malloc(sizeof(char)*11);
01291
01292 strcpy((char*)req_node->command, "deregister");
01293
01294 deregister_data = (df_deregister_p)malloc(sizeof(df_deregister_t));
01295 deregister_data->agent_id = agentID;
01296 deregister_data->service_name = (char*)serviceName;
01297
01298 req_node->data = deregister_data;
01299
01300 err_code = df_AddRequest(
01301 agency->mc_platform->df,
01302 req_node
01303 );
01304 return err_code;
01305 }
01306
01307 EXPORTMC int
01308 MC_End(MCAgency_t agency)
01309 {
01310 #ifndef _WIN32
01311 int skt;
01312 struct addrinfo hints, *res;
01313 char buf[20];
01314 #else
01315 SOCKET skt;
01316 SOCKADDR_IN sktin;
01317 struct hostent host;
01318 struct hostent* host_result;
01319 #endif
01320
01321
01322
01323
01324
01325 MUTEX_LOCK(agency->mc_platform->quit_lock);
01326 agency->mc_platform->quit = 1;
01327 COND_BROADCAST( agency->mc_platform->quit_cond );
01328 MUTEX_UNLOCK(agency->mc_platform->quit_lock);
01329
01330
01331 #ifndef _WIN32
01332 memset(&hints, 0, sizeof(hints));
01333 hints.ai_family = AF_UNSPEC;
01334 hints.ai_socktype = SOCK_STREAM;
01335 sprintf(buf, "%d", agency->portno);
01336 getaddrinfo("localhost", buf, &hints, &res);
01337 skt = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
01338 connect(skt, res->ai_addr, res->ai_addrlen);
01339 send(skt, "\0", 1, 0);
01340 close(skt);
01341 freeaddrinfo(res);
01342
01343 sleep(1);
01344 #else
01345 sktin.sin_family = PF_INET;
01346 sktin.sin_port = htons(agency->portno);
01347 host_result = gethostbyname("localhost");
01348 host = *host_result;
01349 memcpy(&sktin.sin_addr, host.h_addr, host.h_length);
01350 sktin.sin_addr.s_addr = inet_addr("localhost");
01351 connect(skt, (struct sockaddr *) &sktin, sizeof(sktin));
01352 send(skt, "\0", 1, 0);
01353 closesocket(skt);
01354
01355 Sleep(1000);
01356 #endif
01357
01358
01359 if( GET_THREAD_MODE( agency->threads, MC_THREAD_ACC)) {
01360 THREAD_CANCEL( agency->mc_platform->acc->listen_thread );
01361 }
01362
01363
01364 MUTEX_LOCK(agency->mc_platform->connection_queue->lock);
01365 COND_SIGNAL(agency->mc_platform->connection_queue->cond);
01366 MUTEX_UNLOCK(agency->mc_platform->connection_queue->lock);
01367 if( GET_THREAD_MODE( agency->threads, MC_THREAD_ACC)) {
01368 THREAD_JOIN(agency->mc_platform->acc->thread);
01369 }
01370
01371
01372 MUTEX_LOCK(agency->mc_platform->ams->runflag_lock);
01373 COND_SIGNAL(agency->mc_platform->ams->runflag_cond);
01374 MUTEX_UNLOCK(agency->mc_platform->ams->runflag_lock);
01375 if( GET_THREAD_MODE( agency->threads, MC_THREAD_AMS)) {
01376 THREAD_JOIN(agency->mc_platform->ams->thread);
01377 }
01378
01379
01380 MUTEX_LOCK(agency->mc_platform->message_queue->lock);
01381 COND_SIGNAL(agency->mc_platform->message_queue->cond);
01382 MUTEX_UNLOCK(agency->mc_platform->message_queue->lock);
01383 if( GET_THREAD_MODE( agency->threads, MC_THREAD_ACC)) {
01384 THREAD_JOIN(agency->mc_platform->acc->message_handler_thread);
01385 }
01386
01387
01388 MUTEX_LOCK(agency->mc_platform->df->request_list->lock);
01389 COND_SIGNAL(agency->mc_platform->df->request_list->cond);
01390 MUTEX_UNLOCK(agency->mc_platform->df->request_list->lock);
01391 if( GET_THREAD_MODE( agency->threads, MC_THREAD_DF)) {
01392 THREAD_JOIN(agency->mc_platform->df->thread);
01393 }
01394
01395
01396 if( GET_THREAD_MODE( agency->threads, MC_THREAD_CP)) {
01397 THREAD_CANCEL( agency->mc_platform->cmd_prompt->thread );
01398 }
01399
01400 mc_platform_Destroy(agency->mc_platform);
01401
01402 if (agency->hostName)
01403 free(agency->hostName);
01404 free(agency);
01405
01406 return 0;
01407 }
01408
01409 EXPORTMC MCAgent_t
01410 MC_FindAgentByName( MCAgency_t attr,
01411 const char *name)
01412 {
01413 extern mc_platform_p g_mc_platform;
01414 if (attr == NULL) {
01415 return agent_queue_SearchName(g_mc_platform->agent_queue, name);
01416 } else {
01417 return agent_queue_SearchName(attr->mc_platform->agent_queue,
01418 name);
01419 }
01420 }
01421
01422 EXPORTMC MCAgent_t
01423 MC_FindAgentByID( MCAgency_t attr,
01424 int ID)
01425 {
01426 extern mc_platform_p g_mc_platform;
01427 if (attr == NULL) {
01428 return agent_queue_Search(g_mc_platform->agent_queue, ID);
01429 } else {
01430 return agent_queue_Search(attr->mc_platform->agent_queue,
01431 ID);
01432 }
01433 }
01434
01435 EXPORTMC
01436 #ifndef _WIN32
01437 time_t
01438 #else
01439 SYSTEMTIME
01440 #endif
01441 MC_GetAgentArrivalTime(MCAgent_t agent)
01442 {
01443 if (agent != NULL) {
01444 return agent->arrival_time;
01445 } else {
01446 #ifndef _WIN32
01447 return (time_t)-1;
01448 #else
01449 SYSTEMTIME oy;
01450 return oy;
01451 #endif
01452 }
01453 }
01454
01455 EXPORTMC int
01456 MC_GetAgentStatus(MCAgent_t agent)
01457 {
01458 int status;
01459 MUTEX_LOCK(agent->lock);
01460 status = agent->agent_status;
01461 MUTEX_UNLOCK(agent->lock);
01462 return status;
01463 }
01464
01465 EXPORTMC char*
01466 MC_GetAgentXMLString(MCAgent_t agent)
01467 {
01468 char *ret;
01469 ret = mxmlSaveAllocString(
01470 agent->datastate->xml_agent_root,
01471 NULL
01472 );
01473 return ret;
01474 }
01475
01476
01477 EXPORTMC void*
01478 MC_GetAgentExecEngine(MCAgent_t agent)
01479 {
01480 return agent->agent_interp;
01481 }
01482
01483 EXPORTMC int
01484 MC_GetAgentID(
01485 MCAgent_t agent
01486 )
01487 {
01488 return agent->id;
01489 }
01490
01491 EXPORTMC char*
01492 MC_GetAgentName(
01493 MCAgent_t agent
01494 )
01495 {
01496 char *name;
01497 MUTEX_LOCK(agent->lock);
01498 name = (char*)malloc(sizeof(char) *
01499 (strlen (agent->name) + 1)
01500 );
01501 strcpy(
01502 name,
01503 agent->name
01504 );
01505 MUTEX_UNLOCK(agent->lock);
01506 return name;
01507 }
01508
01509 EXPORTMC int
01510 MC_GetAgentReturnData(
01511 MCAgent_t agent,
01512 int task_num,
01513 void **data,
01514 int *dim,
01515 int **extent)
01516 {
01517 int num_elements;
01518 int size;
01519 int i;
01520 printf("\nThe function MC_GetAgentReturnData() is deprecated.\n\
01521 Please use the MC_AgentReturn*() series of functions instead.\n");
01522 if (task_num >= agent->datastate->number_of_tasks) {
01523 *data = NULL;
01524 *dim = 0;
01525 *extent = NULL;
01526 return 1;
01527 }
01528 if (
01529 agent->datastate->tasks[task_num]->
01530 agent_return_data->data_type == -1
01531 )
01532 {
01533 return 1;
01534 }
01535 CH_DATATYPE_SIZE(
01536 agent->datastate->tasks[task_num]->agent_return_data->data_type,
01537 size);
01538 num_elements = 1;
01539 for (
01540 i = 0;
01541 i < agent->datastate->tasks[task_num]->agent_return_data->array_dim;
01542 i++
01543 )
01544 {
01545 num_elements *= agent->datastate->
01546 tasks[task_num]->agent_return_data->array_extent[i];
01547 }
01548
01549
01550 *data = malloc(num_elements * size);
01551 memcpy(
01552 *data,
01553 agent->datastate->tasks[task_num]->
01554 agent_return_data->data,
01555 size * num_elements
01556 );
01557 *dim = agent->datastate->tasks[task_num]->agent_return_data->array_dim;
01558 *extent = (int*)malloc(
01559 sizeof(int) *
01560 agent->datastate->tasks[task_num]->agent_return_data->array_dim
01561 );
01562 for (i = 0; i < *dim; i++) {
01563 (*extent)[i] =
01564 agent->datastate->tasks[task_num]->agent_return_data->array_extent[i];
01565 }
01566
01567
01568
01569
01570
01571 return 0;
01572 }
01573
01574 EXPORTMC int
01575 MC_GetAgentNumTasks(MCAgent_t agent)
01576 {
01577 return agent->datastate->number_of_tasks;
01578 }
01579
01580 EXPORTMC enum MC_AgentType_e
01581 MC_GetAgentType(MCAgent_t agent)
01582 {
01583 if (agent != NULL) {
01584 return agent->agent_type;
01585 } else {
01586 return (enum MC_AgentType_e)0;
01587 }
01588 }
01589
01590 EXPORTMC int
01591 MC_GetAllAgents(MCAgency_t attr, MCAgent_t **agents, int* num_agents)
01592 {
01593 int halt;
01594 int index = 0;
01595 MUTEX_LOCK(attr->mc_platform->giant_lock);
01596 halt = (attr->mc_platform->giant == 1) ? 1 : 0;
01597 MUTEX_UNLOCK(attr->mc_platform->giant_lock);
01598 if (halt)
01599 MC_HaltAgency(attr);
01600
01601 while (agent_queue_SearchIndex(attr->mc_platform->agent_queue, index) != NULL) {
01602 index++;
01603 }
01604
01605 if (index == 0) {
01606 *agents = NULL;
01607 *num_agents = 0;
01608 return -1;
01609 }
01610
01611 *agents = (MCAgent_t *)malloc(sizeof(MCAgent_t*) * index);
01612 *num_agents = index;
01613
01614 for(index = 0; index < *num_agents; index++) {
01615 (*agents)[index] = agent_queue_SearchIndex
01616 (
01617 attr->mc_platform->agent_queue,
01618 index
01619 );
01620 }
01621 if(halt)
01622 MC_ResumeAgency(attr);
01623 return 0;
01624 }
01625
01626 EXPORTMC int
01627 MC_HaltAgency(MCAgency_t attr)
01628 {
01629 MUTEX_LOCK(attr->mc_platform->giant_lock);
01630 attr->mc_platform->giant=0;
01631 MUTEX_UNLOCK(attr->mc_platform->giant_lock);
01632 return 0;
01633 }
01634
01635 EXPORTMC MCAgency_t
01636 MC_Initialize(
01637 int port,
01638 MCAgencyOptions_t *options)
01639 {
01640 MCAgency_t ret;
01641 int i=0;
01642 int options_malloc = 0;
01643 char privkey[1210];
01644 #ifdef NEW_SECURITY
01645 char buf[5];
01646 FILE* f;
01647 #endif
01648
01649 memset(privkey, '\0', 1210);
01650 ret = (MCAgency_t)malloc(sizeof(struct agency_s));
01651 if (ret == NULL) {return NULL;}
01652
01653 ret->hostName = (char*)malloc(HOST_NAME_MAX);
01654 if (ret->hostName == NULL) {return NULL;}
01655 gethostname(ret->hostName, HOST_NAME_MAX);
01656
01657 ret->hostName = (char*)realloc(ret->hostName, sizeof(char)*(strlen(ret->hostName)+1));
01658 if (ret->hostName == NULL) {return NULL;}
01659 ret->portno = port;
01660 ret->server = 1;
01661 ret->client = 0;
01662 ret->default_agentstatus = -1;
01663
01664
01665 if(options==NULL) {
01666 options = (MCAgencyOptions_t*)malloc(sizeof(MCAgencyOptions_t));
01667 MC_InitializeAgencyOptions(options);
01668 options_malloc = 1;
01669 }
01670 ret->threads = options->threads;
01671 ret->default_agentstatus = options->default_agent_status;
01672 for(i = 0; i < MC_THREAD_ALL; i++) {
01673 ret->stack_size[i] = options->stack_size[i];
01674 }
01675 ret->initInterps = options->initInterps;
01676
01677
01678 ret->bluetooth = options->bluetooth;
01679 ret->mc_platform = mc_platform_Initialize(ret, options->ch_options);
01680
01681
01682 #ifdef NEW_SECURITY
01683 if (options->priv_key_filename != NULL) {
01684 ret->priv_key_filename = strdup(options->priv_key_filename);
01685 } else {
01686 ret->priv_key_filename = strdup("rsa_priv");
01687 }
01688 if (options->known_host_filename != NULL) {
01689 ret->known_host_filename = strdup(options->known_host_filename);
01690 } else {
01691 ret->known_host_filename = strdup("known_host");
01692 }
01693
01694 memset(buf,'\0', 4);
01695
01696 if( (f = fopen(ret->priv_key_filename, "r") ) == NULL) {
01697 fprintf(stderr, "rsa_priv_en file not found \n");
01698 fprintf(stderr, "Aborting... at %s:%d\n", __FILE__, __LINE__);
01699 exit(0);
01700 }
01701
01702 fread (buf, 1, 4, f);
01703
01704 if(buf[0]=='N' && buf[1] == ' ' && buf[2]=='=' && buf[3]==' '){
01705 fread(privkey, 1210, 1, f);
01706 fclose(f);
01707 }
01708 else{
01709 fclose(f);
01710
01711 if(options->passphrase[0] == '\0'){
01712 printf("Please enter the passphrase to decrypt private key ");
01713 scanf("%s", options->passphrase);
01714 }
01715
01716 if( read_encrypted_file(ret->priv_key_filename, privkey, options->passphrase) == -1){
01717 printf("Unable to read private key: passphase is wrong or file not exist\n");
01718 printf("Press any key to exit \n");
01719 getchar();
01720 exit(0);
01721 }
01722 }
01723
01724 if (privkey == NULL){
01725 printf("Note: private key is Null \n");
01726 printf("please verify the private key file or generate it again. \n");
01727 printf("Exiting Mobile-C Agency ... \n");
01728 getchar();
01729 exit(0);
01730 }
01731 memset(ret -> mc_platform -> private_key, '\0', 1210);
01732 strcpy(ret -> mc_platform -> private_key, privkey);
01733
01734 #endif
01735
01736 ret->agentInitCallback = NULL;
01737 ret->agentInitUserData = NULL;
01738
01739
01740 g_mc_platform = ret->mc_platform;
01741
01742 if (options_malloc)
01743 free(options);
01744
01745 return ret;
01746 }
01747
01748 EXPORTMC int
01749 MC_InitializeAgencyOptions(struct MCAgencyOptions_s* options)
01750 {
01751 int i;
01752 memset(options, 0, sizeof(struct MCAgencyOptions_s));
01753
01754 options->threads = 0xFFFF;
01755 options->default_agent_status = MC_WAIT_CH;
01756 options->modified = 0;
01757 for(i = 0; i < MC_THREAD_ALL; i++) {
01758 options->stack_size[i] = -1;
01759 }
01760 memset(options->passphrase, '\0', 32);
01761
01762 options->known_host_filename = NULL;
01763 options->priv_key_filename = NULL;
01764 options->bluetooth = 0;
01765
01766 options->initInterps = 4;
01767 return 0;
01768 }
01769
01770 EXPORTMC int
01771 MC_LoadAgentFromFile(MCAgency_t attr, const char* filename)
01772 {
01773 struct stat filestat;
01774 char *buf;
01775 FILE *fp;
01776 message_p message;
01777 extern mc_platform_p g_mc_platform;
01778 buf = NULL;
01779 filestat.st_size = 0;
01780 stat(filename, &filestat);
01781 if (filestat.st_size != 0 ) {
01782 buf = (char*)malloc( sizeof(char) * (filestat.st_size+1) );
01783 memset(buf, 0, filestat.st_size+1);
01784 } else {
01785 fprintf(stderr, "Error: File %s not found.\n", filename);
01786 return 1;
01787 }
01788
01789 fp = fopen(filename, "r");
01790 fread((void*)buf, filestat.st_size, 1, fp);
01791 fclose(fp);
01792
01793 message = message_New();
01794 if (
01795 message_InitializeFromString (
01796 attr->mc_platform,
01797 message,
01798 buf,
01799 "",
01800 5050,
01801 "ams"
01802 )
01803 )
01804 {
01805 message_Destroy(message);
01806 }
01807 free(message->to_address);
01808 message->to_address = NULL;
01809 message->xml_root = mxmlLoadString(
01810 NULL,
01811 buf,
01812 NULL );
01813 if (message->xml_root == NULL) {
01814 fprintf(stderr, "Error loading agent. %s:%d\n", __FILE__, __LINE__);
01815 message_Destroy(message);
01816 return 1;
01817 }
01818 message->xml_payload = mxmlFindElement(
01819 message->xml_root,
01820 message->xml_root,
01821 "MOBILE_AGENT",
01822 NULL,
01823 NULL,
01824 MXML_DESCEND );
01825 if(message->xml_payload == NULL) {
01826 fprintf(stderr, "Error loading agent: <MOBILE_AGENT> tag not found. %s:%d\n",
01827 __FILE__, __LINE__ );
01828 message_Destroy(message);
01829 return 1;
01830 }
01831
01832 message_queue_Add
01833 (
01834 attr->mc_platform->message_queue,
01835 message
01836 );
01837 return 0;
01838 }
01839
01840 EXPORTMC int
01841 MC_MigrateAgent(MCAgent_t agent, const char* hostname, int port)
01842 {
01843
01844
01845 int progress;
01846 progress = agent->datastate->task_progress;
01847
01848
01849 agent->datastate->progress_modifier = -1;
01850
01851
01852 free(agent->datastate->tasks[progress]->server_name);
01853 agent->datastate->tasks[progress]->server_name = (char*)malloc(
01854 sizeof(char)*(strlen(hostname) + 10) );
01855 sprintf(agent->datastate->tasks[progress]->server_name, "%s:%d",
01856 hostname, port);
01857
01858
01859 return 0;
01860 }
01861
01862 EXPORTMC int
01863 MC_MutexLock(MCAgency_t attr, int id)
01864 {
01865 syncListNode_t *syncnode;
01866 syncnode = syncListFind(id, attr->mc_platform->syncList);
01867 if (syncnode == NULL) {
01868 return 1;
01869 }
01870 MUTEX_LOCK(syncnode->lock);
01871 return 0;
01872 }
01873
01874 EXPORTMC int
01875 MC_MutexUnlock(MCAgency_t attr, int id)
01876 {
01877 syncListNode_t *syncnode;
01878 syncnode = syncListFind(id, attr->mc_platform->syncList);
01879 if (syncnode == NULL) {
01880 return 1;
01881 }
01882 MUTEX_UNLOCK(syncnode->lock);
01883 return 0;
01884 }
01885
01886 EXPORTMC int
01887 MC_PrintAgentCode(MCAgent_t agent)
01888 {
01889 int progress;
01890 MUTEX_LOCK(agent->lock);
01891 progress = agent->datastate->task_progress;
01892
01893 if (progress >= agent->datastate->number_of_tasks) {
01894 progress = agent->datastate->number_of_tasks - 1;
01895 }
01896 printf("%s\n",
01897 agent->datastate->agent_code);
01898 MUTEX_UNLOCK(agent->lock);
01899 return 0;
01900 }
01901
01902 EXPORTMC int
01903 MC_RegisterService(
01904 MCAgency_t agency,
01905 MCAgent_t agent,
01906 int agentID,
01907 const char *agentName,
01908 char **serviceNames,
01909 int numServices)
01910 {
01911 df_request_list_node_t *req_node;
01912 df_node_t *new_node;
01913 int i;
01914
01915
01916 if (agent == NULL && agentName == NULL) {
01917 return MC_ERR_INVALID_ARGS;
01918 }
01919
01920 req_node = df_request_list_node_New();
01921 req_node->command = (char*)malloc(sizeof(char)*9);
01922 strcpy((char*)req_node->command, "register");
01923
01924 new_node = (df_node_t*)malloc(sizeof(df_node_t));
01925 CHECK_NULL(new_node, return MC_ERR_MEMORY);
01926
01927
01928 new_node->lock = (MUTEX_T*)malloc(sizeof(MUTEX_T));
01929 CHECK_NULL(new_node->lock, return MC_ERR_MEMORY);
01930 MUTEX_INIT(new_node->lock);
01931
01932
01933 if (agent==NULL) {
01934 new_node->agent_id = agentID;
01935 } else {
01936 new_node->agent_id = agent->id;
01937 }
01938
01939
01940 if (agent==NULL) {
01941 new_node->agent_name =
01942 (char*)malloc(sizeof(char)*(strlen(agentName)+1));
01943 CHECK_NULL(new_node->agent_name, return MC_ERR_MEMORY;);
01944 strcpy(new_node->agent_name, agentName);
01945 } else {
01946 new_node->agent_name =
01947 (char*)malloc(
01948 sizeof(char) *
01949 (strlen(agent->name)+1)
01950 );
01951 CHECK_NULL(new_node->agent_name, return MC_ERR_MEMORY;);
01952 strcpy(new_node->agent_name, agent->name);
01953 }
01954
01955
01956 new_node->service_names = (char**)malloc(
01957 sizeof(char*) * numServices
01958 );
01959 CHECK_NULL(new_node->service_names, return MC_ERR_MEMORY;);
01960 for (i = 0; i < numServices; i++) {
01961 new_node->service_names[i] = (char*) malloc(
01962 sizeof(char) * (strlen(serviceNames[i]) + 1)
01963 );
01964 CHECK_NULL(new_node->service_names[i], return MC_ERR_MEMORY;);
01965 strcpy(
01966 new_node->service_names[i],
01967 serviceNames[i]
01968 );
01969 }
01970 new_node->num_services = numServices;
01971
01972 req_node->data = (void*)new_node;
01973 req_node->data_size = (sizeof(new_node));
01974
01975 return df_AddRequest(
01976 agency->mc_platform->df,
01977 req_node
01978 );
01979 }
01980
01981 EXPORTMC int
01982 MC_ResumeAgency(MCAgency_t attr)
01983 {
01984 MUTEX_LOCK(attr->mc_platform->giant_lock);
01985 attr->mc_platform->giant = 1;
01986 MUTEX_UNLOCK(attr->mc_platform->giant_lock);
01987 return 0;
01988 }
01989
01990 EXPORTMC MCAgent_t
01991 MC_RetrieveAgent(MCAgency_t attr)
01992
01993
01994
01995 {
01996 int i;
01997 MCAgent_t agent=NULL;
01998 MUTEX_LOCK(attr->mc_platform->agent_queue->lock);
01999 for (i = 0; i < attr->mc_platform->agent_queue->size; i++) {
02000 agent = (MCAgent_t)ListSearch(
02001 attr->mc_platform->agent_queue->list, i);
02002 if (agent->agent_status == MC_AGENT_NEUTRAL) {
02003 break;
02004 }
02005 }
02006 if (agent == NULL) {
02007 MUTEX_UNLOCK(attr->mc_platform->agent_queue->lock);
02008 return NULL;
02009 }
02010 if (agent->agent_status != MC_AGENT_NEUTRAL) {
02011 MUTEX_UNLOCK(attr->mc_platform->agent_queue->lock);
02012 return NULL;
02013 }
02014 MUTEX_UNLOCK(attr->mc_platform->agent_queue->lock);
02015 return agent;
02016 }
02017
02018 EXPORTMC char *
02019 MC_RetrieveAgentCode(MCAgent_t agent)
02020 {
02021 char *buf;
02022 int len, progress;
02023 MUTEX_LOCK(agent->lock);
02024 progress = agent->datastate->task_progress;
02025 len = strlen(
02026 agent->datastate->agent_code);
02027 buf = (char*)malloc( (len+1)*sizeof(char));
02028 strcpy(buf,
02029 agent->datastate->agent_code);
02030 MUTEX_UNLOCK(agent->lock);
02031 return buf;
02032 }
02033
02034 EXPORTMC int
02035 MC_ResetSignal(MCAgency_t attr)
02036 {
02037 MUTEX_LOCK(attr->mc_platform->giant_lock);
02038 attr->mc_platform->giant = 1;
02039 attr->mc_platform->MC_signal = MC_NO_SIGNAL;
02040 COND_SIGNAL(attr->mc_platform->giant_cond);
02041 MUTEX_UNLOCK(attr->mc_platform->giant_lock);
02042 return 0;
02043 }
02044
02045 EXPORTMC int
02046 MC_SearchForService(
02047
02048 MCAgency_t attr,
02049 const char *searchString,
02050
02051 char*** agentNames,
02052 char*** serviceNames,
02053 int** agentIDs,
02054 int* numResults)
02055 {
02056 df_request_search_p search;
02057 df_search_results_p results;
02058 df_request_list_node_p request;
02059 search = df_request_search_New();
02060 CHECK_NULL(search, return MC_ERR_MEMORY;);
02061 results = (df_search_results_p)malloc(sizeof(df_search_results_t));
02062 CHECK_NULL(results, return MC_ERR_MEMORY;);
02063 request = df_request_list_node_New();
02064 CHECK_NULL(request, return MC_ERR_MEMORY;);
02065
02066
02067 search->search_results = results;
02068 search->search_string = (char*)searchString;
02069
02070 request->data = (void*)search;
02071 request->command = (char*)malloc(sizeof(char) * 7);
02072 strcpy((char*)request->command, "search");
02073 request->data_size = sizeof(df_request_search_t);
02074
02075 COND_SLEEP_ACTION(
02076 search->cond,
02077 search->lock,
02078
02079 df_AddRequest(attr->mc_platform->df, request);
02080 );
02081
02082 *agentNames = search->search_results->agent_names;
02083 *serviceNames = search->search_results->service_names;
02084 *agentIDs = search->search_results->agent_ids;
02085 *numResults = search->search_results->num_results;
02086
02087
02088 free((void*)request->command);
02089 df_request_list_node_Destroy(request);
02090 df_request_search_Destroy(search);
02091
02092 return MC_SUCCESS;
02093 }
02094
02095 EXPORTMC int
02096 MC_SemaphorePost(MCAgency_t attr, int id)
02097 {
02098 syncListNode_t *syncnode;
02099 syncnode = syncListFind(id, attr->mc_platform->syncList);
02100 if (syncnode == NULL) {
02101 return 1;
02102 }
02103 SEMAPHORE_POST(syncnode->sem);
02104 return 0;
02105 }
02106
02107 EXPORTMC int
02108 MC_SemaphoreWait(MCAgency_t attr, int id)
02109 {
02110 syncListNode_t *syncnode;
02111 syncnode = syncListFind(id, attr->mc_platform->syncList);
02112 if (syncnode == NULL) {
02113 return 1;
02114 }
02115 SEMAPHORE_WAIT(syncnode->sem);
02116 return 0;
02117 }
02118
02119 EXPORTMC int
02120 MC_SendCh(MCAgency_t attr,
02121 const char *filename,
02122 const char *remotehost,
02123 int port)
02124 {
02125 printf("Sorry, not implemented yet.\n");
02126 return -1;
02127 }
02128
02129 EXPORTMC int
02130 MC_SendAgent(MCAgency_t attr,
02131 const char *string)
02132 {
02133 message_p message;
02134 MCAgent_t agent;
02135 extern mc_platform_p g_mc_platform;
02136 mc_platform_p platform;
02137
02138 if (attr == NULL) {
02139 platform = g_mc_platform;
02140 } else {
02141 platform = attr->mc_platform;
02142 }
02143
02144 message = message_New();
02145 if(
02146 message_InitializeFromString
02147 (
02148 attr->mc_platform,
02149 message,
02150 string,
02151 NULL,
02152 0,
02153 "ams"
02154 )
02155 )
02156 {
02157 message_Destroy(message);
02158 return MC_ERR;
02159 } else {
02160
02161
02162 agent = agent_Initialize( platform, message, rand() );
02163 if (agent == NULL) {
02164 fprintf(stderr, "Error initializing agent. %s:%d", __FILE__, __LINE__);
02165 }
02166 agent->agent_status = MC_WAIT_MESSGSEND;
02167 agent_queue_Add( platform->agent_queue, agent);
02168
02169 MUTEX_LOCK(platform->ams->runflag_lock);
02170 platform->ams->run = 1;
02171 COND_BROADCAST(platform->ams->runflag_cond);
02172 MUTEX_UNLOCK(platform->ams->runflag_lock);
02173 }
02174 return 0;
02175 }
02176
02177 EXPORTMC int
02178 MC_SendAgentFile(MCAgency_t attr,
02179 const char *filename)
02180 {
02181 struct stat filestat;
02182 char *buf;
02183 FILE *fp;
02184 int ret = 0;
02185 message_p message;
02186 agent_t *agent;
02187 extern mc_platform_p g_mc_platform;
02188 mc_platform_p platform;
02189 buf = NULL;
02190 filestat.st_size = 0;
02191 stat(filename, &filestat);
02192 if (filestat.st_size != 0 ) {
02193 buf = (char*)malloc( sizeof(char) * (filestat.st_size+1) );
02194 memset(buf, 0, filestat.st_size+1);
02195 } else {
02196 fprintf(stderr, "Error: File %s not found.\n", filename);
02197 return 1;
02198 }
02199
02200 if (attr == NULL) {
02201 platform = g_mc_platform;
02202 } else {
02203 platform = attr->mc_platform;
02204 }
02205
02206 fp = fopen(filename, "r");
02207 fread((void*)buf, filestat.st_size, 1, fp);
02208 fclose(fp);
02209
02210 message = message_New();
02211 if(
02212 message_InitializeFromString
02213 (
02214 platform,
02215 message,
02216 buf,
02217 NULL,
02218 0,
02219 "ams"
02220 )
02221 )
02222 {
02223 message_Destroy(message);
02224 } else {
02225
02226
02227 agent = agent_Initialize( platform, message, rand() );
02228 if (agent == NULL) {
02229 fprintf(stderr, "Error initializing agent. %s:%d", __FILE__, __LINE__);
02230 }
02231 agent->agent_status = MC_WAIT_MESSGSEND;
02232 agent_queue_Add( platform->agent_queue, agent);
02233
02234 MUTEX_LOCK(platform->ams->runflag_lock);
02235 platform->ams->run = 1;
02236 COND_BROADCAST(platform->ams->runflag_cond);
02237 MUTEX_UNLOCK(platform->ams->runflag_lock);
02238 }
02239 free(buf);
02240 return ret;
02241 }
02242
02243 EXPORTMC int
02244 MC_SendAgentMigrationMessage(MCAgency_t attr,
02245 const char *string,
02246 const char *hostname,
02247 int port)
02248 {
02249
02250 message_p message;
02251 printf("\nThe function MC_SendAgentMigrationMessage() is deprecated.\n\
02252 Please use MC_SendAgent() instead.\n");
02253 message = message_New();
02254 if(
02255 message_InitializeFromString
02256 (
02257 attr->mc_platform,
02258 message,
02259 string,
02260 hostname,
02261 port,
02262 "ams"
02263 )
02264 )
02265 {
02266 message_Destroy(message);
02267 return MC_ERR;
02268 } else {
02269 return message_queue_Add
02270 (
02271 attr->mc_platform->message_queue,
02272 message
02273 );
02274 }
02275 }
02276
02277 EXPORTMC int
02278 MC_SendAgentMigrationMessageFile(MCAgency_t attr,
02279 const char *filename,
02280 const char *hostname,
02281 int port)
02282 {
02283 struct stat filestat;
02284 char *buf;
02285 FILE *fp;
02286 int ret = 0;
02287 message_p message;
02288 agent_t *agent;
02289 extern mc_platform_p g_mc_platform;
02290 mc_platform_p platform;
02291 printf("\nThe function MC_SendAgentMigrationMessage() is deprecated.\n\
02292 Please use MC_SendAgentFile() instead.");
02293 buf = NULL;
02294 filestat.st_size = 0;
02295 stat(filename, &filestat);
02296 if (filestat.st_size != 0 ) {
02297 buf = (char*)malloc( sizeof(char) * (filestat.st_size+1) );
02298 memset(buf, 0, filestat.st_size+1);
02299 } else {
02300 fprintf(stderr, "Error: File %s not found.\n", filename);
02301 return 1;
02302 }
02303
02304 if (attr == NULL) {
02305 platform = g_mc_platform;
02306 } else {
02307 platform = attr->mc_platform;
02308 }
02309
02310 fp = fopen(filename, "r");
02311 fread((void*)buf, filestat.st_size, 1, fp);
02312 fclose(fp);
02313
02314 message = message_New();
02315 if(
02316 message_InitializeFromString
02317 (
02318 platform,
02319 message,
02320 buf,
02321 hostname,
02322 port,
02323 "ams"
02324 )
02325 )
02326 {
02327 message_Destroy(message);
02328 } else {
02329
02330
02331 agent = agent_Initialize( platform, message, rand() );
02332 if (agent == NULL) {
02333 fprintf(stderr, "Error initializing agent. %s:%d", __FILE__, __LINE__);
02334 }
02335 agent->agent_status = MC_WAIT_MESSGSEND;
02336 agent_queue_Add( platform->agent_queue, agent);
02337
02338 MUTEX_LOCK(platform->ams->runflag_lock);
02339 platform->ams->run = 1;
02340 COND_BROADCAST(platform->ams->runflag_cond);
02341 MUTEX_UNLOCK(platform->ams->runflag_lock);
02342 }
02343 free(buf);
02344 return ret;
02345 }
02346
02347 EXPORTMC int
02348 MC_SendSteerCommand(MCAgency_t attr, enum MC_SteerCommand_e cmd)
02349 {
02350 MUTEX_LOCK(attr->mc_platform->MC_steer_lock);
02351 attr->mc_platform->MC_steer_command = cmd;
02352 COND_BROADCAST(attr->mc_platform->MC_steer_cond);
02353 MUTEX_UNLOCK(attr->mc_platform->MC_steer_lock);
02354 return 0;
02355 }
02356
02357 EXPORTMC int
02358 MC_SetAgentStatus(MCAgent_t agent, enum MC_AgentStatus_e status)
02359 {
02360 MUTEX_LOCK(agent->lock);
02361 agent->agent_status = status;
02362 if (!agent->orphan) {
02363 MUTEX_LOCK(agent->mc_platform->ams->runflag_lock);
02364 agent->mc_platform->ams->run = 1;
02365 COND_SIGNAL(agent->mc_platform->ams->runflag_cond);
02366 MUTEX_UNLOCK(agent->mc_platform->ams->runflag_lock);
02367 }
02368 MUTEX_UNLOCK(agent->lock);
02369 return 0;
02370 }
02371
02372 EXPORTMC int
02373 MC_SetDefaultAgentStatus(
02374 MCAgency_t agency,
02375 enum MC_AgentStatus_e status
02376 )
02377 {
02378 agency->mc_platform->default_agentstatus = status;
02379 return 0;
02380 }
02381
02382 EXPORTMC int
02383 MC_SetThreadOn(MCAgencyOptions_t *options, enum MC_ThreadIndex_e index)
02384 {
02385 SET_THREAD_ON(options->threads, index);
02386 return 0;
02387 }
02388
02389 EXPORTMC int
02390 MC_SetThreadsAllOn(MCAgencyOptions_t* options)
02391 {
02392 int i;
02393 for(i = 0; i < MC_THREAD_ALL; i++) {
02394 SET_THREAD_ON(options->threads, i);
02395 }
02396 return 0;
02397 }
02398
02399 EXPORTMC int
02400 MC_SetThreadOff(MCAgencyOptions_t *options, enum MC_ThreadIndex_e index)
02401 {
02402 SET_THREAD_OFF(options->threads, index);
02403 return 0;
02404 }
02405
02406 EXPORTMC int
02407 MC_SetThreadsAllOff(MCAgencyOptions_t* options)
02408 {
02409 int i;
02410 for(i = 0; i < MC_THREAD_ALL; i++) {
02411 SET_THREAD_OFF(options->threads, i);
02412 }
02413 return 0;
02414 }
02415
02416 EXPORTMC int
02417 MC_Steer(
02418 MCAgency_t attr,
02419 int (*funcptr)(void* data),
02420 void *arg
02421 )
02422 {
02423 MUTEX_LOCK(attr->mc_platform->MC_steer_lock);
02424 do {
02425 attr->mc_platform->MC_steer_command = MC_RUN;
02426 MUTEX_UNLOCK(attr->mc_platform->MC_steer_lock);
02427 (*funcptr)(arg);
02428 } while
02429 (
02430 attr->mc_platform->MC_steer_command == MC_RESTART
02431 );
02432 return 0;
02433 }
02434
02435 EXPORTMC enum MC_SteerCommand_e
02436 MC_SteerControl(void)
02437 {
02438 extern mc_platform_p g_mc_platform;
02439
02440 MUTEX_LOCK(g_mc_platform->MC_steer_lock);
02441 while (g_mc_platform->MC_steer_command == MC_SUSPEND) {
02442 COND_WAIT(
02443 g_mc_platform->MC_steer_cond,
02444 g_mc_platform->MC_steer_lock
02445 );
02446 }
02447 MUTEX_UNLOCK(g_mc_platform->MC_steer_lock);
02448 return g_mc_platform->MC_steer_command;
02449 }
02450
02451 EXPORTMC int
02452 MC_SyncDelete(MCAgency_t attr, int id)
02453 {
02454 syncListNode_t *sync_node;
02455
02456 MUTEX_LOCK(attr->mc_platform->syncList->giant_lock);
02457
02458
02459 sync_node = syncListFind(id, attr->mc_platform->syncList);
02460 if (sync_node == NULL) {
02461 MUTEX_UNLOCK(attr->mc_platform->syncList->giant_lock);
02462 return MC_ERR_NOT_FOUND;
02463 }
02464 MUTEX_LOCK(sync_node->lock);
02465
02466
02467 if (syncListRemove(id, attr->mc_platform->syncList) == NULL) {
02468 fprintf(stderr, "Fatal error. %s:%d\n",
02469 __FILE__,
02470 __LINE__ );
02471 exit(0);
02472 }
02473
02474
02475 MUTEX_UNLOCK(sync_node->lock);
02476 MUTEX_UNLOCK(attr->mc_platform->syncList->giant_lock);
02477
02478 return syncListNodeDestroy(sync_node);
02479 }
02480
02481 EXPORTMC int
02482 MC_SyncInit(MCAgency_t attr, int id)
02483 {
02484 syncListNode_t *node;
02485 node = syncListNodeNew();
02486 MUTEX_LOCK(attr->mc_platform->syncList->giant_lock);
02487 if (id == 0) {
02488 id = rand();
02489 }
02490 while (
02491 syncListFind(id, attr->mc_platform->syncList) != NULL
02492 )
02493 {
02494 id = rand();
02495 }
02496
02497 node->id = id;
02498 syncListAddNode(
02499 node,
02500 attr->mc_platform->syncList
02501 );
02502 MUTEX_UNLOCK(attr->mc_platform->syncList->giant_lock);
02503 return id;
02504 }
02505
02506 EXPORTMC int
02507 MC_TerminateAgent(MCAgent_t agent)
02508 {
02509 int status=0;
02510 if(agent->agent_interp != NULL) {
02511 status = Ch_Abort (*agent->agent_interp);
02512 }
02513 return status;
02514 }
02515
02516 EXPORTMC int
02517 MC_TerminateAgentWG(MCAgent_t calling_agent, MCAgent_t agent)
02518 {
02519 int status=0;
02520
02521 if (agent->wg_code != NULL) {
02522 if (calling_agent->wg_code == NULL) {
02523 return MC_ERR_INVALID_ARGS;
02524 } else if (strcmp(calling_agent->wg_code, agent->wg_code)) {
02525 return MC_ERR_INVALID_ARGS;
02526 }
02527 }
02528 if(agent->agent_interp != NULL) {
02529 status = Ch_Abort (*agent->agent_interp);
02530 }
02531 return status;
02532 }
02533
02534 EXPORTMC int
02535 MC_MainLoop(MCAgency_t attr)
02536 {
02537 MUTEX_LOCK( attr->mc_platform->quit_lock );
02538 while( attr->mc_platform->quit != 1 ) {
02539 COND_WAIT( attr->mc_platform->quit_cond, attr->mc_platform->quit_lock );
02540 }
02541 MUTEX_UNLOCK( attr->mc_platform->quit_lock );
02542 return 0;
02543 }
02544
02545 EXPORTMC int
02546 MC_WaitAgent(MCAgency_t attr)
02547 {
02548 int size;
02549 MUTEX_LOCK(attr->mc_platform->agent_queue->lock);
02550 while(1) {
02551 size = attr->mc_platform->agent_queue->size;
02552 COND_WAIT(
02553 attr->mc_platform->agent_queue->cond,
02554 attr->mc_platform->agent_queue->lock
02555 );
02556 if (size < attr->mc_platform->agent_queue->size) {
02557 MUTEX_UNLOCK(attr->mc_platform->agent_queue->lock);
02558 break;
02559 }
02560 }
02561 MUTEX_UNLOCK(attr->mc_platform->agent_queue->lock);
02562 return 0;
02563 }
02564
02565 EXPORTMC MCAgent_t
02566 MC_WaitRetrieveAgent(MCAgency_t attr)
02567 {
02568 int index;
02569 MCAgent_t agent;
02570 MC_WaitSignal(attr, MC_RECV_AGENT);
02571 MUTEX_LOCK(attr->mc_platform->agent_queue->lock);
02572 index = attr->mc_platform->agent_queue->size-1;
02573 agent = (MCAgent_t)ListSearch(
02574 attr->mc_platform->agent_queue->list, index);
02575 MUTEX_UNLOCK(attr->mc_platform->agent_queue->lock);
02576 return agent;
02577 }
02578
02579
02580
02581
02582
02583 EXPORTMC int
02584 MC_WaitSignal(MCAgency_t attr, int signals)
02585 {
02586 MUTEX_LOCK(attr->mc_platform->MC_signal_lock);
02587 while(! (signals & attr->mc_platform->MC_signal)) {
02588 COND_WAIT(
02589 attr->mc_platform->MC_signal_cond,
02590 attr->mc_platform->MC_signal_lock
02591 );
02592 }
02593 MUTEX_UNLOCK(attr->mc_platform->MC_signal_lock);
02594 MUTEX_LOCK(attr->mc_platform->giant_lock);
02595 attr->mc_platform->giant = 0;
02596 MUTEX_UNLOCK(attr->mc_platform->giant_lock);
02597 return 0;
02598 }
02599
02600
02601
02602
02603
02604
02605 EXPORTMC int MC_AclDestroy_chdl(void* varg)
02606 {
02607 int retval;
02608 fipa_acl_message_t* acl_message;
02609 ChInterp_t interp;
02610 ChVaList_t ap;
02611
02612 Ch_VaStart(interp, ap, varg);
02613 acl_message = Ch_VaArg(interp, ap, fipa_acl_message_t*);
02614 retval = MC_AclDestroy(acl_message);
02615 Ch_VaEnd(interp, ap);
02616 return retval;
02617 }
02618
02619
02620 EXPORTMC void* MC_AclNew_chdl(void* varg)
02621 {
02622 void* retval;
02623 retval = (void*)MC_AclNew();
02624 return retval;
02625 }
02626
02627
02628 EXPORTMC int MC_AclPost_chdl(void* varg)
02629 {
02630 int retval;
02631 agent_p agent;
02632 fipa_acl_message_t* acl_message;
02633 ChInterp_t interp;
02634 ChVaList_t ap;
02635
02636 Ch_VaStart(interp, ap, varg);
02637 agent = Ch_VaArg(interp, ap, agent_p);
02638 acl_message = Ch_VaArg(interp, ap, fipa_acl_message_t*);
02639 retval = MC_AclPost(agent, acl_message);
02640 Ch_VaEnd(interp, ap);
02641 return retval;
02642 }
02643
02644
02645 EXPORTCH void*
02646 MC_AclReply_chdl(void* varg)
02647 {
02648 void* retval;
02649 fipa_acl_message_t* acl_message;
02650 ChInterp_t interp;
02651 ChVaList_t ap;
02652
02653 Ch_VaStart(interp, ap, varg);
02654 acl_message = Ch_VaArg(interp, ap, fipa_acl_message_t*);
02655 retval = (void*)MC_AclReply(acl_message);
02656 Ch_VaEnd(interp, ap);
02657 return retval;
02658 }
02659
02660
02661 EXPORTCH void*
02662 MC_AclRetrieve_chdl(void* varg)
02663 {
02664 void* retval;
02665 MCAgent_t agent;
02666 ChInterp_t interp;
02667 ChVaList_t ap;
02668
02669 Ch_VaStart(interp, ap, varg);
02670 agent = Ch_VaArg(interp, ap, MCAgent_t);
02671 retval = MC_AclRetrieve(agent);
02672 Ch_VaEnd(interp, ap);
02673 return retval;
02674 }
02675
02676
02677 EXPORTCH int
02678 MC_AclSend_chdl(void* varg)
02679 {
02680 int retval;
02681 fipa_acl_message_t* acl_message;
02682 MCAgency_t temp_attr;
02683 extern mc_platform_p g_mc_platform;
02684
02685 ChInterp_t interp;
02686 ChVaList_t ap;
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 acl_message = (fipa_acl_message_t*) Ch_VaArg(interp, ap, void*);
02694 retval = MC_AclSend(temp_attr, acl_message);
02695 Ch_VaEnd(interp, ap);
02696 free(temp_attr);
02697 return retval;
02698 }
02699
02700
02701 EXPORTCH void*
02702 MC_AclWaitRetrieve_chdl(void *varg)
02703 {
02704 void* retval;
02705 MCAgent_t agent;
02706 ChInterp_t interp;
02707 ChVaList_t ap;
02708
02709 Ch_VaStart(interp, ap, varg);
02710 agent = Ch_VaArg(interp, ap, MCAgent_t);
02711 retval = MC_AclWaitRetrieve(agent);
02712 Ch_VaEnd(interp, ap);
02713 return retval;
02714 }
02715
02716
02717
02718
02719 EXPORTCH int
02720 MC_AclGetProtocol_chdl(void* varg)
02721 {
02722 ChInterp_t interp;
02723 ChVaList_t ap;
02724 struct fipa_acl_message_s* acl;
02725 int retval;
02726
02727 Ch_VaStart(interp, ap, varg);
02728 acl = Ch_VaArg(interp, ap, struct fipa_acl_message_s*);
02729 retval = MC_AclGetProtocol(acl);
02730 Ch_VaEnd(interp, ap);
02731 return retval;
02732 }
02733
02734 EXPORTCH char*
02735 MC_AclGetConversationID_chdl(void* varg)
02736 {
02737 ChInterp_t interp;
02738 ChVaList_t ap;
02739 struct fipa_acl_message_s* acl;
02740 char* retval;
02741
02742 Ch_VaStart(interp, ap, varg);
02743 acl = Ch_VaArg(interp, ap, struct fipa_acl_message_s*);
02744 retval = MC_AclGetConversationID(acl);
02745 Ch_VaEnd(interp, ap);
02746 return retval;
02747 }
02748
02749 EXPORTCH int
02750 MC_AclGetPerformative_chdl(void* varg)
02751 {
02752 ChInterp_t interp;
02753 ChVaList_t ap;
02754 struct fipa_acl_message_s* acl;
02755 int retval;
02756
02757 Ch_VaStart(interp, ap, varg);
02758 acl = Ch_VaArg(interp, ap, struct fipa_acl_message_s*);
02759 retval = MC_AclGetPerformative(acl);
02760 Ch_VaEnd(interp, ap);
02761 return retval;
02762 }
02763
02764 EXPORTCH int
02765 MC_AclGetSender_chdl(void* varg)
02766 {
02767 ChInterp_t interp;
02768 ChVaList_t ap;
02769 struct fipa_acl_message_s* acl;
02770 char** name;
02771 char** address;
02772 int retval;
02773
02774 Ch_VaStart(interp, ap, varg);
02775 acl = Ch_VaArg(interp, ap, struct fipa_acl_message_s*);
02776 name = Ch_VaArg(interp, ap, char**);
02777 address = Ch_VaArg(interp, ap, char**);
02778 retval = MC_AclGetSender(acl, name, address);
02779 Ch_VaEnd(interp, ap);
02780 return retval;
02781 }
02782
02783 EXPORTCH char*
02784 MC_AclGetContent_chdl(void* varg)
02785 {
02786 ChInterp_t interp;
02787 ChVaList_t ap;
02788 struct fipa_acl_message_s* acl;
02789 char* retval;
02790
02791 Ch_VaStart(interp, ap, varg);
02792 acl = Ch_VaArg(interp, ap, struct fipa_acl_message_s*);
02793 retval = (char*)MC_AclGetContent(acl);
02794 Ch_VaEnd(interp, ap);
02795 return retval;
02796 }
02797
02798 EXPORTCH int
02799 MC_AclSetProtocol_chdl(void* varg)
02800 {
02801 ChInterp_t interp;
02802 ChVaList_t ap;
02803 struct fipa_acl_message_s* acl;
02804 enum fipa_protocol_e protocol;
02805 int retval;
02806
02807 Ch_VaStart(interp, ap, varg);
02808 acl = Ch_VaArg(interp, ap, struct fipa_acl_message_s*);
02809 protocol = Ch_VaArg(interp, ap, enum fipa_protocol_e);
02810 retval = MC_AclSetProtocol(acl, protocol);
02811 Ch_VaEnd(interp, ap);
02812 return retval;
02813 }
02814
02815
02816 EXPORTCH int
02817 MC_AclSetConversationID_chdl(void* varg)
02818 {
02819 ChInterp_t interp;
02820 ChVaList_t ap;
02821 struct fipa_acl_message_s* acl;
02822 char* id;
02823 int retval;
02824
02825 Ch_VaStart(interp, ap, varg);
02826 acl = Ch_VaArg(interp, ap, struct fipa_acl_message_s*);
02827 id = Ch_VaArg(interp, ap, char*);
02828 retval = MC_AclSetConversationID(acl, id);
02829 Ch_VaEnd(interp, ap);
02830 return retval;
02831 }
02832
02833
02834 EXPORTCH int
02835 MC_AclSetPerformative_chdl(void* varg)
02836 {
02837 ChInterp_t interp;
02838 ChVaList_t ap;
02839 struct fipa_acl_message_s* acl;
02840 enum fipa_performative_e performative;
02841 int retval;
02842
02843 Ch_VaStart(interp, ap, varg);
02844 acl = Ch_VaArg(interp, ap, struct fipa_acl_message_s*);
02845 performative = Ch_VaArg(interp, ap, enum fipa_performative_e);
02846 retval = MC_AclSetPerformative(acl, performative);
02847 Ch_VaEnd(interp, ap);
02848 return retval;
02849 }
02850
02851
02852 EXPORTCH int
02853 MC_AclSetSender_chdl(void* varg)
02854 {
02855 ChInterp_t interp;
02856 ChVaList_t ap;
02857 struct fipa_acl_message_s* acl;
02858 char* name;
02859 char* address;
02860 int retval;
02861
02862 Ch_VaStart(interp, ap, varg);
02863 acl = Ch_VaArg(interp, ap, struct fipa_acl_message_s*);
02864 name = Ch_VaArg(interp, ap, char*);
02865 address = Ch_VaArg(interp, ap, char*);
02866 retval = MC_AclSetSender(acl, name, address);
02867 Ch_VaEnd(interp, ap);
02868 return retval;
02869 }
02870
02871
02872 EXPORTCH int
02873 MC_AclAddReceiver_chdl(void* varg)
02874 {
02875 ChInterp_t interp;
02876 ChVaList_t ap;
02877 struct fipa_acl_message_s* acl;
02878 char* name;
02879 char* address;
02880 int retval;
02881
02882 Ch_VaStart(interp, ap, varg);
02883 acl = Ch_VaArg(interp, ap, struct fipa_acl_message_s*);
02884 name = Ch_VaArg(interp, ap, char*);
02885 address = Ch_VaArg(interp, ap, char*);
02886 retval = MC_AclAddReceiver(acl, name, address);
02887 Ch_VaEnd(interp, ap);
02888 return retval;
02889 }
02890
02891
02892 EXPORTCH int
02893 MC_AclAddReplyTo_chdl(void* varg)
02894 {
02895 ChInterp_t interp;
02896 ChVaList_t ap;
02897 struct fipa_acl_message_s* acl;
02898 char* name;
02899 char* address;
02900 int retval;
02901
02902 Ch_VaStart(interp, ap, varg);
02903 acl = Ch_VaArg(interp, ap, struct fipa_acl_message_s*);
02904 name = Ch_VaArg(interp, ap, char*);
02905 address = Ch_VaArg(interp, ap, char*);
02906 retval = MC_AclAddReplyTo(acl, name, address);
02907 Ch_VaEnd(interp, ap);
02908 return retval;
02909 }
02910
02911
02912 EXPORTCH int
02913 MC_AclSetContent_chdl(void* varg)
02914 {
02915 ChInterp_t interp;
02916 ChVaList_t ap;
02917 struct fipa_acl_message_s* acl;
02918 char* content;
02919 int retval;
02920
02921 Ch_VaStart(interp, ap, varg);
02922 acl = Ch_VaArg(interp, ap, struct fipa_acl_message_s*);
02923 content = Ch_VaArg(interp, ap, char*);
02924 retval = MC_AclSetContent(acl, content);
02925 Ch_VaEnd(interp, ap);
02926 return retval;
02927 }
02928
02929
02930
02931
02932 EXPORTCH int
02933 MC_AddAgent_chdl(void *varg)
02934 {
02935 int retval;
02936 MCAgent_t agent;
02937 MCAgency_t temp_attr;
02938 extern mc_platform_p g_mc_platform;
02939
02940 ChInterp_t interp;
02941 ChVaList_t ap;
02942
02943 temp_attr = (MCAgency_t)malloc(sizeof(struct agency_s));
02944 CHECK_NULL(temp_attr, exit(-1));
02945 temp_attr->mc_platform = g_mc_platform;
02946
02947 Ch_VaStart(interp, ap, varg);
02948 agent = (MCAgent_t) Ch_VaArg(interp, ap, void*);
02949 retval = MC_AddAgent(temp_attr, agent);
02950 Ch_VaEnd(interp, ap);
02951 free(temp_attr);
02952 return retval;
02953 }
02954
02955
02956 EXPORTCH int
02957 MC_AgentAddTask_chdl(void *varg)
02958 {
02959 int retval;
02960
02961
02962 MCAgent_t agent;
02963 const char* code;
02964 const char* return_var_name;
02965 const char* server;
02966 int persistent;
02967
02968 ChInterp_t interp;
02969 ChVaList_t ap;
02970
02971 Ch_VaStart(interp, ap, varg);
02972
02973 agent = Ch_VaArg(interp, ap, MCAgent_t);
02974 code = Ch_VaArg(interp, ap, const char*);
02975 return_var_name = Ch_VaArg(interp, ap, const char*);
02976 server = Ch_VaArg(interp, ap, const char*);
02977 persistent = Ch_VaArg(interp, ap, int);
02978
02979 retval= MC_AgentAddTask(
02980 agent,
02981 code,
02982 return_var_name,
02983 server,
02984 persistent);
02985 Ch_VaEnd(interp, ap);
02986 return retval;
02987 }
02988
02989
02990 EXPORTCH const void*
02991 MC_AgentVariableRetrieve_chdl(void* varg)
02992 {
02993 const void* retval;
02994 MCAgent_t agent;
02995 const char* var_name;
02996 int task_num;
02997
02998 ChInterp_t interp;
02999 ChVaList_t ap;
03000
03001 Ch_VaStart(interp, ap, varg);
03002
03003 agent = Ch_VaArg(interp, ap, MCAgent_t);
03004 var_name = Ch_VaArg(interp, ap, const char* );
03005 task_num = Ch_VaArg(interp, ap, int);
03006
03007 retval = MC_AgentVariableRetrieve(agent, var_name, task_num);
03008
03009 Ch_VaEnd(interp, ap);
03010 return retval;
03011 }
03012
03013
03014 EXPORTCH int
03015 MC_AgentVariableSave_chdl(void *varg)
03016 {
03017 int retval;
03018 MCAgent_t agent;
03019 const char* var_name;
03020
03021 ChInterp_t interp;
03022 ChVaList_t ap;
03023
03024 Ch_VaStart(interp, ap, varg);
03025
03026 agent = Ch_VaArg(interp, ap, MCAgent_t);
03027 var_name = Ch_VaArg(interp, ap, const char*);
03028
03029 retval = MC_AgentVariableSave(agent, var_name);
03030
03031 Ch_VaEnd(interp, ap);
03032 return retval;
03033 }
03034
03035
03036 EXPORTCH int
03037 MC_CallAgentFunc_chdl(void *varg)
03038 {
03039 int retval;
03040
03041 MCAgent_t agent;
03042 const char* funcName;
03043 void* returnVal;
03044 ChVaList_t args;
03045
03046 ChInterp_t interp;
03047 ChVaList_t ap;
03048
03049 Ch_VaStart(interp, ap, varg);
03050
03051 agent = Ch_VaArg(interp, ap, MCAgent_t);
03052 funcName = Ch_VaArg(interp, ap, const char*);
03053 returnVal = Ch_VaArg(interp, ap, void*);
03054 args = Ch_VaArg(interp, ap, void*);
03055
03056 retval = MC_CallAgentFuncVar(
03057 agent,
03058 funcName,
03059 returnVal,
03060 args);
03061 Ch_VaEnd(interp, ap);
03062 return retval;
03063 }
03064
03065
03066 EXPORTCH int
03067 MC_Barrier_chdl(void *varg)
03068 {
03069 MCAgency_t temp_attr;
03070 extern mc_platform_p g_mc_platform;
03071 int retval;
03072 ChInterp_t interp;
03073 ChVaList_t ap;
03074 int id;
03075
03076 temp_attr = (MCAgency_t)malloc(sizeof(struct agency_s));
03077 CHECK_NULL(temp_attr, exit(-1));
03078 temp_attr->mc_platform = g_mc_platform;
03079
03080 Ch_VaStart(interp, ap, varg);
03081 id = Ch_VaArg(interp, ap, int);
03082 retval = MC_Barrier(temp_attr, id);
03083 Ch_VaEnd(interp, ap);
03084 free(temp_attr);
03085 return retval;
03086 }
03087
03088
03089 EXPORTCH int
03090 MC_BarrierDelete_chdl(void *varg)
03091 {
03092 MCAgency_t temp_attr;
03093 extern mc_platform_p g_mc_platform;
03094 int retval;
03095 ChInterp_t interp;
03096 ChVaList_t ap;
03097 int id;
03098
03099 temp_attr = (MCAgency_t)malloc(sizeof(struct agency_s));
03100 CHECK_NULL(temp_attr, exit(-1));
03101 temp_attr->mc_platform = g_mc_platform;
03102
03103 Ch_VaStart(interp, ap, varg);
03104 id = Ch_VaArg(interp, ap, int);
03105 retval = MC_BarrierDelete(temp_attr, id);
03106 Ch_VaEnd(interp, ap);
03107 free(temp_attr);
03108 return retval;
03109 }
03110
03111
03112 EXPORTCH int
03113 MC_BarrierInit_chdl(void *varg)
03114 {
03115 MCAgency_t temp_attr;
03116 extern mc_platform_p g_mc_platform;
03117 int retval;
03118 ChInterp_t interp;
03119 ChVaList_t ap;
03120 int id;
03121 int num_procs;
03122
03123 temp_attr = (MCAgency_t)malloc(sizeof(struct agency_s));
03124 CHECK_NULL(temp_attr, exit(-1));
03125 temp_attr->mc_platform = g_mc_platform;
03126
03127 Ch_VaStart(interp, ap, varg);
03128 id = Ch_VaArg(interp, ap, int);
03129 num_procs = Ch_VaArg(interp, ap, int);
03130 retval = MC_BarrierInit(temp_attr, id, num_procs);
03131 Ch_VaEnd(interp, ap);
03132 free(temp_attr);
03133 return retval;
03134 }
03135
03136
03137 EXPORTCH int
03138 MC_CondBroadcast_chdl(void *varg)
03139 {
03140 MCAgency_t temp_attr;
03141 extern mc_platform_p g_mc_platform;
03142 int retval;
03143 ChInterp_t interp;
03144 ChVaList_t ap;
03145 int id;
03146
03147 temp_attr = (MCAgency_t)malloc(sizeof(struct agency_s));
03148 CHECK_NULL(temp_attr, exit(-1));
03149 temp_attr->mc_platform = g_mc_platform;
03150
03151 Ch_VaStart(interp, ap, varg);
03152 id = Ch_VaArg(interp, ap, int);
03153 retval = MC_CondBroadcast(temp_attr, id);
03154 Ch_VaEnd(interp, ap);
03155 free(temp_attr);
03156 return retval;
03157 }
03158
03159
03160 EXPORTCH MCAgent_t
03161 MC_ComposeAgent_chdl(void *varg)
03162 {
03163 MCAgent_t retval;
03164
03165
03166 const char* name;
03167 const char* home;
03168 const char* owner;
03169 const char* code;
03170 const char* return_var_name;
03171 const char* server;
03172 int persistent;
03173
03174 ChInterp_t interp;
03175 ChVaList_t ap;
03176
03177 Ch_VaStart(interp, ap, varg);
03178
03179 name = Ch_VaArg(interp, ap, const char*);
03180 home = Ch_VaArg(interp, ap, const char*);
03181 owner = Ch_VaArg(interp, ap, const char*);
03182 code = Ch_VaArg(interp, ap, const char*);
03183 return_var_name = Ch_VaArg(interp, ap, const char*);
03184 server = Ch_VaArg(interp, ap, const char*);
03185 persistent = Ch_VaArg(interp, ap, int);
03186
03187 retval= MC_ComposeAgentWithWorkgroup(
03188 name,
03189 home,
03190 owner,
03191 code,
03192 return_var_name,
03193 server,
03194 persistent,
03195 NULL);
03196 Ch_VaEnd(interp, ap);
03197 return retval;
03198 }
03199
03200
03201 EXPORTCH MCAgent_t
03202 MC_ComposeAgentWithWorkgroup_chdl(void *varg)
03203 {
03204 MCAgent_t retval;
03205
03206
03207 const char* name;
03208 const char* home;
03209 const char* owner;
03210 const char* code;
03211 const char* return_var_name;
03212 const char* server;
03213 const char* workgroup_code;
03214 int persistent;
03215
03216 ChInterp_t interp;
03217 ChVaList_t ap;
03218
03219 Ch_VaStart(interp, ap, varg);
03220
03221 name = Ch_VaArg(interp, ap, const char*);
03222 home = Ch_VaArg(interp, ap, const char*);
03223 owner = Ch_VaArg(interp, ap, const char*);
03224 code = Ch_VaArg(interp, ap, const char*);
03225 return_var_name = Ch_VaArg(interp, ap, const char*);
03226 server = Ch_VaArg(interp, ap, const char*);
03227 persistent = Ch_VaArg(interp, ap, int);
03228 workgroup_code = Ch_VaArg(interp, ap, const char*);
03229
03230 retval= MC_ComposeAgentS(
03231 name,
03232 home,
03233 owner,
03234 code,
03235 return_var_name,
03236 server,
03237 persistent,
03238 workgroup_code);
03239 Ch_VaEnd(interp, ap);
03240 return retval;
03241 }
03242
03243
03244 EXPORTCH MCAgent_t
03245 MC_ComposeAgentFromFile_chdl(void *varg)
03246 {
03247 MCAgent_t retval;
03248
03249
03250 const char* name;
03251 const char* home;
03252 const char* owner;
03253 const char* filename;
03254 const char* return_var_name;
03255 const char* server;
03256 int persistent;
03257
03258 ChInterp_t interp;
03259 ChVaList_t ap;
03260
03261 Ch_VaStart(interp, ap, varg);
03262
03263 name = Ch_VaArg(interp, ap, const char*);
03264 home = Ch_VaArg(interp, ap, const char*);
03265 owner = Ch_VaArg(interp, ap, const char*);
03266 filename = Ch_VaArg(interp, ap, const char*);
03267 return_var_name = Ch_VaArg(interp, ap, const char*);
03268 server = Ch_VaArg(interp, ap, const char*);
03269 persistent = Ch_VaArg(interp, ap, int);
03270
03271 retval= MC_ComposeAgentFromFileWithWorkgroup(
03272 name,
03273 home,
03274 owner,
03275 filename,
03276 return_var_name,
03277 server,
03278 persistent,
03279 NULL);
03280 Ch_VaEnd(interp, ap);
03281 return retval;
03282 }
03283
03284
03285 EXPORTCH MCAgent_t
03286 MC_ComposeAgentFromFileWithWorkgroup_chdl(void *varg)
03287 {
03288 MCAgent_t retval;
03289
03290
03291 const char* name;
03292 const char* home;
03293 const char* owner;
03294 const char* filename;
03295 const char* return_var_name;
03296 const char* server;
03297 const char* workgroup;
03298 int persistent;
03299
03300 ChInterp_t interp;
03301 ChVaList_t ap;
03302
03303 Ch_VaStart(interp, ap, varg);
03304
03305 name = Ch_VaArg(interp, ap, const char*);
03306 home = Ch_VaArg(interp, ap, const char*);
03307 owner = Ch_VaArg(interp, ap, const char*);
03308 filename = Ch_VaArg(interp, ap, const char*);
03309 return_var_name = Ch_VaArg(interp, ap, const char*);
03310 server = Ch_VaArg(interp, ap, const char*);
03311 workgroup = Ch_VaArg(interp, ap, const char*);
03312 persistent = Ch_VaArg(interp, ap, int);
03313
03314 retval= MC_ComposeAgentFromFileWithWorkgroup(
03315 name,
03316 home,
03317 owner,
03318 filename,
03319 return_var_name,
03320 server,
03321 persistent,
03322 workgroup);
03323 Ch_VaEnd(interp, ap);
03324 return retval;
03325 }
03326
03327
03328 EXPORTCH int
03329 MC_CondSignal_chdl(void *varg)
03330 {
03331 MCAgency_t temp_attr;
03332 extern mc_platform_p g_mc_platform;
03333 int retval;
03334 ChInterp_t interp;
03335 ChVaList_t ap;
03336 int id;
03337
03338 temp_attr = (MCAgency_t)malloc(sizeof(struct agency_s));
03339 CHECK_NULL(temp_attr, exit(-1));
03340 temp_attr->mc_platform = g_mc_platform;
03341
03342 Ch_VaStart(interp, ap, varg);
03343 id = Ch_VaArg(interp, ap, int);
03344 retval = MC_CondSignal(temp_attr, id);
03345 Ch_VaEnd(interp, ap);
03346 free(temp_attr);
03347 return retval;
03348 }
03349
03350
03351 EXPORTCH int
03352 MC_CondReset_chdl(void *varg)
03353 {
03354 MCAgency_t temp_attr;
03355 extern mc_platform_p g_mc_platform;
03356 int retval;
03357 ChInterp_t interp;
03358 ChVaList_t ap;
03359 int id;
03360
03361 temp_attr = (MCAgency_t)malloc(sizeof(struct agency_s));
03362 CHECK_NULL(temp_attr, exit(-1));
03363 temp_attr->mc_platform = g_mc_platform;
03364
03365 Ch_VaStart(interp, ap, varg);
03366 id = Ch_VaArg(interp, ap, int);
03367 retval = MC_CondReset(temp_attr, id);
03368 Ch_VaEnd(interp, ap);
03369 free(temp_attr);
03370 return retval;
03371 }
03372
03373
03374 EXPORTCH int
03375 MC_CondWait_chdl(void *varg)
03376 {
03377 MCAgency_t temp_attr;
03378 extern mc_platform_p g_mc_platform;
03379 int retval;
03380 ChInterp_t interp;
03381 ChVaList_t ap;
03382 int id;
03383
03384 temp_attr = (MCAgency_t)malloc(sizeof(struct agency_s));
03385 CHECK_NULL(temp_attr, exit(-1));
03386 temp_attr->mc_platform = g_mc_platform;
03387
03388 Ch_VaStart(interp, ap, varg);
03389 id = Ch_VaArg(interp, ap, int);
03390 retval = MC_CondWait(temp_attr, id);
03391 Ch_VaEnd(interp, ap);
03392 free(temp_attr);
03393 return retval;
03394 }
03395
03396 EXPORTCH int
03397 MC_DeleteAgent_chdl(void *varg)
03398 {
03399 ChInterp_t interp;
03400 ChVaList_t ap;
03401 MCAgent_t agent;
03402 const char* agentName;
03403 int retval;
03404
03405 Ch_VaStart(interp, ap, varg);
03406 agentName = Ch_VaArg(interp, ap, const char*);
03407 agent = MC_FindAgentByName(NULL, agentName);
03408 if (agent == NULL) {
03409 return MC_ERR_NOT_FOUND;
03410 }
03411 retval = MC_DeleteAgent(agent);
03412 Ch_VaEnd(interp, ap);
03413 return retval;
03414 }
03415
03416 EXPORTCH int
03417 MC_DeleteAgentWG_chdl(void *varg)
03418 {
03419 ChInterp_t interp;
03420 ChVaList_t ap;
03421 const char* agentName;
03422 MCAgent_t calling_agent;
03423 MCAgent_t agent;
03424 int retval;
03425
03426 Ch_VaStart(interp, ap, varg);
03427 calling_agent = Ch_VaArg(interp, ap, MCAgent_t);
03428 agentName = Ch_VaArg(interp, ap, const char*);
03429 agent = MC_FindAgentByName(NULL, agentName);
03430 if (agent == NULL) {
03431 return MC_ERR_NOT_FOUND;
03432 }
03433 retval = MC_DeleteAgentWG(calling_agent, agent);
03434 Ch_VaEnd(interp, ap);
03435 return retval;
03436 }
03437
03438 EXPORTCH int
03439 MC_DestroyServiceSearchResult_chdl(void* varg)
03440 {
03441 ChInterp_t interp;
03442 ChVaList_t ap;
03443 char** agentName;
03444 char** serviceName;
03445 int* agentID;
03446 int numResult;
03447 int retval;
03448
03449 Ch_VaStart(interp, ap, varg);
03450 agentName = Ch_VaArg(interp, ap, char**);
03451 serviceName = Ch_VaArg(interp, ap, char**);
03452 agentID = Ch_VaArg(interp, ap, int*);
03453 numResult = Ch_VaArg(interp, ap, int);
03454
03455 retval = MC_DestroyServiceSearchResult(
03456 agentName,
03457 serviceName,
03458 agentID,
03459 numResult );
03460 Ch_VaEnd(interp, ap);
03461 return retval;
03462 }
03463
03464
03465 EXPORTCH int
03466 MC_DeregisterService_chdl(void *varg)
03467 {
03468 ChInterp_t interp;
03469 ChVaList_t ap;
03470 MCAgency_t temp_attr;
03471 extern mc_platform_p g_mc_platform;
03472 int agentID;
03473 char *serviceName;
03474 int retval;
03475
03476 temp_attr = (MCAgency_t)malloc(sizeof(struct agency_s));
03477 CHECK_NULL(temp_attr, exit(-1));
03478 temp_attr->mc_platform = g_mc_platform;
03479
03480 Ch_VaStart(interp, ap, varg);
03481 agentID = Ch_VaArg(interp, ap, int);
03482 serviceName = (char*)Ch_VaArg(interp, ap, const char*);
03483 retval = MC_DeregisterService(
03484 temp_attr,
03485 agentID,
03486 serviceName );
03487 Ch_VaEnd(interp, ap);
03488 free(temp_attr);
03489 return retval;
03490 }
03491
03492 EXPORTCH int
03493 MC_End_chdl(void *varg)
03494 {
03495 MCAgency_t temp_attr;
03496 extern mc_platform_p g_mc_platform;
03497 int retval;
03498
03499 temp_attr = (MCAgency_t)malloc(sizeof(struct agency_s));
03500 CHECK_NULL(temp_attr, exit(-1));
03501 temp_attr->mc_platform = g_mc_platform;
03502
03503 retval = MC_End(temp_attr);
03504
03505 return retval;
03506 }
03507
03508
03509 EXPORTCH MCAgent_t
03510 MC_FindAgentByID_chdl(void *varg)
03511 {
03512 MCAgency_t temp_attr;
03513 extern mc_platform_p g_mc_platform;
03514 MCAgent_t retval;
03515 ChInterp_t interp;
03516 ChVaList_t ap;
03517 int id;
03518
03519 temp_attr = (MCAgency_t)malloc(sizeof(struct agency_s));
03520 CHECK_NULL(temp_attr, exit(-1));
03521 temp_attr->mc_platform = g_mc_platform;
03522
03523 Ch_VaStart(interp, ap, varg);
03524 id = Ch_VaArg(interp, ap, int);
03525 retval = MC_FindAgentByID(temp_attr, id);
03526 Ch_VaEnd(interp, ap);
03527 free(temp_attr);
03528 return retval;
03529 }
03530
03531
03532 EXPORTCH MCAgent_t
03533 MC_FindAgentByName_chdl(void *varg)
03534 {
03535 MCAgency_t temp_attr;
03536 extern mc_platform_p g_mc_platform;
03537 MCAgent_t retval;
03538 ChInterp_t interp;
03539 ChVaList_t ap;
03540 const char *name;
03541
03542 temp_attr = (MCAgency_t)malloc(sizeof(struct agency_s));
03543 CHECK_NULL(temp_attr, exit(-1));
03544 temp_attr->mc_platform = g_mc_platform;
03545
03546 Ch_VaStart(interp, ap, varg);
03547 name = Ch_VaArg(interp, ap, const char *);
03548 retval = MC_FindAgentByName(temp_attr, name);
03549 Ch_VaEnd(interp, ap);
03550 free(temp_attr);
03551 return retval;
03552 }
03553
03554
03555 #ifndef _WIN32
03556 EXPORTCH time_t
03557 #else
03558 EXPORTCH SYSTEMTIME
03559 #endif
03560 MC_GetAgentArrivalTime_chdl(void *varg)
03561 {
03562 MCAgent_t agent;
03563 ChInterp_t interp;
03564 ChVaList_t ap;
03565 #ifndef _WIN32
03566 time_t arrival_time;
03567 #else
03568 SYSTEMTIME arrival_time;
03569 #endif
03570
03571 Ch_VaStart(interp, ap, varg);
03572 agent = Ch_VaArg(interp, ap, MCAgent_t);
03573 arrival_time = MC_GetAgentArrivalTime(agent);
03574 Ch_VaEnd(interp, ap);
03575 return arrival_time;
03576 }
03577
03578
03579 EXPORTCH int
03580 MC_GetAgentID_chdl(void *varg)
03581 {
03582 MCAgent_t agent;
03583 ChInterp_t interp;
03584 ChVaList_t ap;
03585 int id;
03586
03587 Ch_VaStart(interp, ap, varg);
03588 agent = Ch_VaArg(interp, ap, MCAgent_t);
03589 id = MC_GetAgentID(agent);
03590 Ch_VaEnd(interp, ap);
03591 return id;
03592 }
03593
03594
03595 EXPORTCH char*
03596 MC_GetAgentName_chdl(void *varg)
03597 {
03598 MCAgent_t agent;
03599 ChInterp_t interp;
03600 ChVaList_t ap;
03601 char* name;
03602
03603 Ch_VaStart(interp, ap, varg);
03604 agent = Ch_VaArg(interp, ap, MCAgent_t);
03605 name = MC_GetAgentName(agent);
03606 Ch_VaEnd(interp, ap);
03607 return name;
03608 }
03609
03610
03611 EXPORTCH int
03612 MC_GetAgentNumTasks_chdl(void *varg)
03613 {
03614 MCAgent_t agent;
03615 ChInterp_t interp;
03616 ChVaList_t ap;
03617 int num_tasks;
03618
03619 Ch_VaStart(interp, ap, varg);
03620 agent = Ch_VaArg(interp, ap, MCAgent_t);
03621 num_tasks = MC_GetAgentNumTasks(agent);
03622 Ch_VaEnd(interp, ap);
03623 return num_tasks;
03624 }
03625
03626
03627 EXPORTCH int
03628 MC_GetAgentStatus_chdl(void *varg)
03629 {
03630 MCAgent_t agent;
03631 int status;
03632 ChInterp_t interp;
03633 ChVaList_t ap;
03634
03635 Ch_VaStart(interp, ap, varg);
03636 agent = Ch_VaArg(interp, ap, MCAgent_t);
03637 status = MC_GetAgentStatus(agent);
03638 Ch_VaEnd(interp, ap);
03639 return status;
03640 }
03641
03642
03643 EXPORTCH char *
03644 MC_GetAgentXMLString_chdl(void *varg)
03645 {
03646 ChInterp_t interp;
03647 ChVaList_t ap;
03648 MCAgent_t agent;
03649 char *retval;
03650
03651 Ch_VaStart(interp, ap, varg);
03652 agent = Ch_VaArg(interp, ap, MCAgent_t);
03653 retval = MC_GetAgentXMLString(agent);
03654 Ch_VaEnd(interp, ap);
03655 return retval;
03656 }
03657
03658 #ifndef _WIN32
03659 EXPORTCH int
03660 MC_GetTimeOfDay_chdl(void *varg)
03661 {
03662 ChInterp_t interp;
03663 ChVaList_t ap;
03664 struct timeval *tv;
03665 Ch_VaStart(interp, ap, varg);
03666 tv = Ch_VaArg(interp, ap, struct timeval*);
03667 gettimeofday(tv, NULL);
03668 Ch_VaEnd(interp, ap);
03669 return 0;
03670 }
03671 #endif
03672
03673
03674 EXPORTCH int
03675 MC_HaltAgency_chdl(void *varg)
03676 {
03677 MCAgency_t temp_attr;
03678 int retval;
03679 extern mc_platform_p g_mc_platform;
03680
03681 temp_attr = (MCAgency_t)malloc(sizeof(struct agency_s));
03682 CHECK_NULL(temp_attr, exit(-1));
03683 temp_attr->mc_platform = g_mc_platform;
03684
03685 retval = MC_HaltAgency(temp_attr);
03686
03687 free(temp_attr);
03688 return retval;
03689 }
03690
03691 EXPORTCH int
03692 MC_MigrateAgent_chdl(void *varg)
03693 {
03694 MCAgent_t agent;
03695 const char* hostname;
03696 int port;
03697 int retval;
03698 ChInterp_t interp;
03699 ChVaList_t ap;
03700
03701 Ch_VaStart(interp, ap, varg);
03702 agent = Ch_VaArg(interp, ap, MCAgent_t);
03703 hostname = Ch_VaArg(interp, ap, const char*);
03704 port = Ch_VaArg(interp, ap, int);
03705 retval = MC_MigrateAgent(agent, hostname, port);
03706 return retval;
03707 }
03708
03709
03710 EXPORTCH int
03711 MC_MutexLock_chdl(void *varg)
03712 {
03713 MCAgency_t temp_attr;
03714 extern mc_platform_p g_mc_platform;
03715
03716 ChInterp_t interp;
03717 ChVaList_t ap;
03718 int id;
03719 int retval;
03720
03721 temp_attr = (MCAgency_t)malloc(sizeof(struct agency_s));
03722 CHECK_NULL(temp_attr, exit(-1));
03723 temp_attr->mc_platform = g_mc_platform;
03724
03725 Ch_VaStart(interp, ap, varg);
03726 id = Ch_VaArg(interp, ap, int );
03727 retval = MC_MutexLock(temp_attr, id);
03728 Ch_VaEnd(interp, ap);
03729 free(temp_attr);
03730 return retval;
03731 }
03732
03733
03734 EXPORTCH int
03735 MC_MutexUnlock_chdl(void *varg)
03736 {
03737 MCAgency_t temp_attr;
03738 extern mc_platform_p g_mc_platform;
03739
03740 ChInterp_t interp;
03741 ChVaList_t ap;
03742 int id;
03743 int retval;
03744
03745 temp_attr = (MCAgency_t)malloc(sizeof(struct agency_s));
03746 CHECK_NULL(temp_attr, exit(-1));
03747 temp_attr->mc_platform = g_mc_platform;
03748
03749 Ch_VaStart(interp, ap, varg);
03750 id = Ch_VaArg(interp, ap, int );
03751 retval = MC_MutexUnlock(temp_attr, id);
03752 Ch_VaEnd(interp, ap);
03753 free(temp_attr);
03754 return retval;
03755 }
03756
03757
03758 EXPORTCH int
03759 MC_PrintAgentCode_chdl(void *varg)
03760 {
03761 ChInterp_t interp;
03762 ChVaList_t ap;
03763 MCAgent_t agent;
03764 int retval;
03765
03766 Ch_VaStart(interp, ap, varg);
03767 agent = Ch_VaArg(interp, ap, MCAgent_t);
03768 retval = MC_PrintAgentCode(agent);
03769 Ch_VaEnd(interp, ap);
03770 return retval;
03771 }
03772
03773
03774 EXPORTCH int
03775 MC_RegisterService_chdl(void *varg)
03776 {
03777 ChInterp_t interp;
03778 ChVaList_t ap;
03779 int retval;
03780 MCAgency_t temp_attr;
03781 extern mc_platform_p g_mc_platform;
03782
03783
03784 MCAgent_t agent;
03785 char **serviceNames;
03786 int numServices;
03787
03788 temp_attr = (MCAgency_t)malloc(sizeof(struct agency_s));
03789 CHECK_NULL(temp_attr, exit(-1));
03790 temp_attr->mc_platform = g_mc_platform;
03791
03792 Ch_VaStart(interp, ap, varg);
03793 agent = Ch_VaArg(interp, ap, MCAgent_t);
03794 serviceNames = Ch_VaArg(interp, ap, char **);
03795 numServices = Ch_VaArg(interp, ap, int);
03796
03797 retval = MC_RegisterService(
03798 temp_attr,
03799 agent,
03800 0,
03801 NULL,
03802 serviceNames,
03803 numServices
03804 );
03805 Ch_VaEnd(interp, ap);
03806 free(temp_attr);
03807 return retval;
03808 }
03809
03810
03811 EXPORTCH int
03812 MC_ResumeAgency_chdl(void *varg)
03813 {
03814 MCAgency_t temp_attr;
03815 int retval;
03816 extern mc_platform_p g_mc_platform;
03817
03818 temp_attr = (MCAgency_t)malloc(sizeof(struct agency_s));
03819 CHECK_NULL(temp_attr, exit(-1));
03820 temp_attr->mc_platform = g_mc_platform;
03821
03822 retval = MC_ResumeAgency(temp_attr);
03823
03824 free(temp_attr);
03825 return retval;
03826 }
03827
03828
03829 EXPORTCH MCAgent_t
03830 MC_RetrieveAgent_chdl(void *varg)
03831 {
03832 MCAgency_t temp_attr;
03833 extern mc_platform_p g_mc_platform;
03834 MCAgent_t agent;
03835
03836 temp_attr = (MCAgency_t)malloc(sizeof(struct agency_s));
03837 CHECK_NULL(temp_attr, exit(-1));
03838 temp_attr->mc_platform = g_mc_platform;
03839
03840 agent = MC_RetrieveAgent(temp_attr);
03841 free(temp_attr);
03842 return agent;
03843 }
03844
03845
03846 EXPORTCH char *
03847 MC_RetrieveAgentCode_chdl(void *varg)
03848 {
03849 ChInterp_t interp;
03850 ChVaList_t ap;
03851 MCAgent_t agent;
03852 char *retval;
03853
03854 Ch_VaStart(interp, ap, varg);
03855 agent = Ch_VaArg(interp, ap, MCAgent_t);
03856 retval = MC_RetrieveAgentCode(agent);
03857 Ch_VaEnd(interp, ap);
03858 return retval;
03859 }
03860
03861
03862 EXPORTCH int
03863 MC_SaveData_chdl(void* varg)
03864 {
03865 ChInterp_t interp;
03866 ChVaList_t ap;
03867 interpreter_variable_data_p interp_var_data;
03868 MCAgent_t agent;
03869 int progress;
03870 const char* name;
03871 int size;
03872 void* data;
03873
03874 Ch_VaStart(interp, ap, varg);
03875 agent = Ch_VaArg(interp, ap, MCAgent_t);
03876 name = Ch_VaArg(interp, ap, char*);
03877 size = Ch_VaArg(interp, ap, int);
03878 data = Ch_VaArg(interp, ap, void*);
03879
03880 progress = agent->datastate->task_progress;
03881
03882 interp_var_data = interpreter_variable_data_New();
03883 interp_var_data->name = strdup(name);
03884 interp_var_data->size = size;
03885 interp_var_data->data_type = CH_VOIDPTRTYPE;
03886 interp_var_data->data = malloc(size);
03887 memcpy(interp_var_data->data, data, size);
03888
03889 agent_variable_list_Add(
03890 agent->datastate->tasks[progress]->agent_variable_list,
03891 interp_var_data );
03892
03893 return 0;
03894 }
03895
03896
03897 EXPORTCH int
03898 MC_SearchForService_chdl(void *varg)
03899 {
03900 ChInterp_t interp;
03901 ChVaList_t ap;
03902 int retval;
03903 MCAgency_t temp_attr;
03904 extern mc_platform_p g_mc_platform;
03905
03906
03907 const char* searchString;
03908 char*** agentNames;
03909 char*** serviceNames;
03910 int** agentIDs;
03911 int* numResults;
03912
03913 temp_attr = (MCAgency_t)malloc(sizeof(struct agency_s));
03914 CHECK_NULL(temp_attr, exit(-1));
03915 temp_attr->mc_platform = g_mc_platform;
03916
03917 Ch_VaStart(interp, ap, varg);
03918 searchString = Ch_VaArg(interp, ap, const char*);
03919 agentNames = Ch_VaArg(interp, ap, char***);
03920 serviceNames = Ch_VaArg(interp, ap, char***);
03921 agentIDs = Ch_VaArg(interp, ap, int**);
03922 numResults = Ch_VaArg(interp, ap, int*);
03923
03924 retval = MC_SearchForService(
03925 temp_attr,
03926 searchString,
03927 agentNames,
03928 serviceNames,
03929 agentIDs,
03930 numResults
03931 );
03932 Ch_VaEnd(interp, ap);
03933 free(temp_attr);
03934 return retval;
03935 }
03936
03937
03938 EXPORTCH int
03939 MC_SemaphorePost_chdl(void *varg)
03940 {
03941 MCAgency_t temp_attr;
03942 extern mc_platform_p g_mc_platform;
03943
03944 ChInterp_t interp;
03945 ChVaList_t ap;
03946 int id;
03947 int retval;
03948
03949 temp_attr = (MCAgency_t)malloc(sizeof(struct agency_s));
03950 CHECK_NULL(temp_attr, exit(-1));
03951 temp_attr->mc_platform = g_mc_platform;
03952
03953 Ch_VaStart(interp, ap, varg);
03954 id = Ch_VaArg(interp, ap, int );
03955 retval = MC_SemaphorePost(temp_attr, id);
03956 Ch_VaEnd(interp, ap);
03957 free(temp_attr);
03958 return retval;
03959 }
03960
03961
03962 EXPORTCH int
03963 MC_SemaphoreWait_chdl(void *varg)
03964 {
03965 MCAgency_t temp_attr;
03966 extern mc_platform_p g_mc_platform;
03967
03968 ChInterp_t interp;
03969 ChVaList_t ap;
03970 int id;
03971 int retval;
03972
03973 temp_attr = (MCAgency_t)malloc(sizeof(struct agency_s));
03974 CHECK_NULL(temp_attr, exit(-1));
03975 temp_attr->mc_platform = g_mc_platform;
03976
03977 Ch_VaStart(interp, ap, varg);
03978 id = Ch_VaArg(interp, ap, int );
03979 retval = MC_SemaphoreWait(temp_attr, id);
03980 Ch_VaEnd(interp, ap);
03981 free(temp_attr);
03982 return retval;
03983 }
03984
03985
03986 EXPORTCH int
03987 MC_SendAgentMigrationMessage_chdl(void *varg)
03988 {
03989 MCAgency_t temp_attr;
03990 extern mc_platform_p g_mc_platform;
03991 const char *message, *hostname;
03992 int port, retval;
03993 ChInterp_t interp;
03994 ChVaList_t ap;
03995
03996 temp_attr = (MCAgency_t)malloc(sizeof(struct agency_s));
03997 CHECK_NULL(temp_attr, exit(-1));
03998 temp_attr->mc_platform = g_mc_platform;
03999
04000 Ch_VaStart(interp, ap, varg);
04001 message = Ch_VaArg(interp, ap, char *);
04002 hostname = Ch_VaArg(interp, ap, char *);
04003 port = Ch_VaArg(interp, ap, int);
04004 retval = MC_SendAgentMigrationMessage(temp_attr, message, hostname, port);
04005 Ch_VaEnd(interp, ap);
04006 free(temp_attr);
04007 return retval;
04008 }
04009
04010
04011 EXPORTCH int
04012 MC_SendAgentMigrationMessageFile_chdl(void *varg)
04013 {
04014 MCAgency_t temp_attr;
04015 char *filename, *hostname;
04016 int port, retval;
04017 ChInterp_t interp;
04018 ChVaList_t ap;
04019
04020 temp_attr = NULL;
04021
04022 Ch_VaStart(interp, ap, varg);
04023 filename = Ch_VaArg(interp, ap, char *);
04024 hostname = Ch_VaArg(interp, ap, char *);
04025 port = Ch_VaArg(interp, ap, int);
04026 retval = MC_SendAgentMigrationMessageFile(temp_attr, filename, hostname, port);
04027 Ch_VaEnd(interp, ap);
04028 return retval;
04029 }
04030
04031 EXPORTCH int
04032 MC_SendSteerCommand_chdl(void *varg)
04033 {
04034 MCAgency_t temp_attr;
04035 int retval;
04036 enum MC_SteerCommand_e command;
04037 extern mc_platform_p g_mc_platform;
04038 ChInterp_t interp;
04039 ChVaList_t ap;
04040
04041 temp_attr = (MCAgency_t)malloc(sizeof(struct agency_s));
04042 CHECK_NULL(temp_attr, exit(-1));
04043 temp_attr->mc_platform = g_mc_platform;
04044
04045 Ch_VaStart(interp, ap, varg);
04046 command = Ch_VaArg(interp, ap, enum MC_SteerCommand_e );
04047 retval = MC_SendSteerCommand(temp_attr, command);
04048 Ch_VaEnd(interp, ap);
04049 free(temp_attr);
04050 return retval;
04051 }
04052
04053
04054 EXPORTCH int
04055 MC_SetAgentStatus_chdl(void *varg)
04056 {
04057 MCAgent_t agent;
04058 int status;
04059 int ret;
04060 ChInterp_t interp;
04061 ChVaList_t ap;
04062
04063 Ch_VaStart(interp, ap, varg);
04064 agent = Ch_VaArg(interp, ap, MCAgent_t);
04065 status = Ch_VaArg(interp, ap, int);
04066 ret = MC_SetAgentStatus(agent, (enum MC_AgentStatus_e) status);
04067 Ch_VaEnd(interp, ap);
04068 return ret;
04069 }
04070
04071
04072 EXPORTCH int
04073 MC_SetDefaultAgentStatus_chdl(void *varg)
04074 {
04075 MCAgency_t temp_attr;
04076 extern mc_platform_p g_mc_platform;
04077 int status;
04078 int ret;
04079 ChInterp_t interp;
04080 ChVaList_t ap;
04081
04082 temp_attr = (MCAgency_t)malloc(sizeof(struct agency_s));
04083 CHECK_NULL(temp_attr, exit(1););
04084 temp_attr->mc_platform = g_mc_platform;
04085
04086 Ch_VaStart(interp, ap, varg);
04087 status = Ch_VaArg(interp, ap, int);
04088 ret = (int)MC_SetDefaultAgentStatus(temp_attr, (enum MC_AgentStatus_e)status);
04089 Ch_VaEnd(interp, ap);
04090 free(temp_attr);
04091 return ret;
04092 }
04093
04094
04095 EXPORTCH int
04096 MC_SyncDelete_chdl(void *varg)
04097 {
04098 MCAgency_t temp_attr;
04099 extern mc_platform_p g_mc_platform;
04100 int retval;
04101 ChInterp_t interp;
04102 ChVaList_t ap;
04103 int id;
04104
04105 temp_attr = (MCAgency_t)malloc(sizeof(struct agency_s));
04106 CHECK_NULL(temp_attr, exit(-1));
04107 temp_attr->mc_platform = g_mc_platform;
04108
04109 Ch_VaStart(interp, ap, varg);
04110 id = Ch_VaArg(interp, ap, int);
04111 retval = MC_SyncDelete(temp_attr, id);
04112 Ch_VaEnd(interp, ap);
04113 free(temp_attr);
04114 return retval;
04115 }
04116
04117
04118 EXPORTCH int
04119 MC_SyncInit_chdl(void *varg)
04120 {
04121 MCAgency_t temp_attr;
04122 extern mc_platform_p g_mc_platform;
04123 int retval;
04124 ChInterp_t interp;
04125 ChVaList_t ap;
04126 int id;
04127
04128 temp_attr = (MCAgency_t)malloc(sizeof(struct agency_s));
04129 CHECK_NULL(temp_attr, exit(-1));
04130 temp_attr->mc_platform = g_mc_platform;
04131
04132 Ch_VaStart(interp, ap, varg);
04133 id = Ch_VaArg(interp, ap, int);
04134
04135 retval = MC_SyncInit(temp_attr, id);
04136 Ch_VaEnd(interp, ap);
04137 free(temp_attr);
04138 return retval;
04139 }
04140
04141
04142 EXPORTCH int
04143 MC_TerminateAgent_chdl(void *varg)
04144 {
04145 ChInterp_t interp;
04146 ChVaList_t ap;
04147 const char* agentName;
04148 MCAgent_t agent;
04149 int retval;
04150
04151 Ch_VaStart(interp, ap, varg);
04152 agentName = Ch_VaArg(interp, ap, const char*);
04153 agent = MC_FindAgentByName(NULL, agentName);
04154 if (agent == NULL) {
04155 return MC_ERR_NOT_FOUND;
04156 }
04157 retval = MC_TerminateAgent(agent);
04158 Ch_VaEnd(interp, ap);
04159 return retval;
04160 }
04161
04162
04163 EXPORTCH int
04164 MC_TerminateAgentWG_chdl(void *varg)
04165 {
04166 ChInterp_t interp;
04167 ChVaList_t ap;
04168 const char* agentName;
04169 MCAgent_t calling_agent;
04170 MCAgent_t agent;
04171 int retval;
04172
04173 Ch_VaStart(interp, ap, varg);
04174 calling_agent = Ch_VaArg(interp, ap, MCAgent_t);
04175 agentName = Ch_VaArg(interp, ap, const char*);
04176 agent = MC_FindAgentByName(NULL, agentName);
04177 if (agent == NULL) {
04178 return MC_ERR_NOT_FOUND;
04179 }
04180 retval = MC_TerminateAgentWG(calling_agent, agent);
04181 Ch_VaEnd(interp, ap);
04182 return retval;
04183 }