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