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->mc_platform = mc_platform_Initialize(ret, options->ch_options);
01628
01629
01630 #ifdef NEW_SECURITY
01631 if (options->priv_key_filename != NULL) {
01632 ret->priv_key_filename = strdup(options->priv_key_filename);
01633 } else {
01634 ret->priv_key_filename = strdup("rsa_priv");
01635 }
01636 if (options->known_host_filename != NULL) {
01637 ret->known_host_filename = strdup(options->known_host_filename);
01638 } else {
01639 ret->known_host_filename = strdup("known_host");
01640 }
01641
01642 memset(buf,'\0', 4);
01643
01644 if( (f = fopen(ret->priv_key_filename, "r") ) == NULL) {
01645 fprintf(stderr, "rsa_priv_en file not found \n");
01646 fprintf(stderr, "Aborting... at %s:%d\n", __FILE__, __LINE__);
01647 exit(0);
01648 }
01649
01650 fread (buf, 1, 4, f);
01651
01652 if(buf[0]=='N' && buf[1] == ' ' && buf[2]=='=' && buf[3]==' '){
01653 fread(privkey, 1210, 1, f);
01654 fclose(f);
01655 }
01656 else{
01657 fclose(f);
01658
01659 if(options->passphrase[0] == '\0'){
01660 printf("Please enter the passphrase to decrypt private key ");
01661 scanf("%s", options->passphrase);
01662 }
01663
01664 if( read_encrypted_file(ret->priv_key_filename, privkey, options->passphrase) == -1){
01665 printf("Unable to read private key: passphase is wrong or file not exist\n");
01666 printf("Press any key to exit \n");
01667 getchar();
01668 exit(0);
01669 }
01670 }
01671
01672 if (privkey == NULL){
01673 printf("Note: private key is Null \n");
01674 printf("please verify the private key file or generate it again. \n");
01675 printf("Exiting Mobile-C Agency ... \n");
01676 getchar();
01677 exit(0);
01678 }
01679 memset(ret -> mc_platform -> private_key, '\0', 1210);
01680 strcpy(ret -> mc_platform -> private_key, privkey);
01681
01682 #endif
01683
01684
01685 g_mc_platform = ret->mc_platform;
01686
01687 if (options_malloc)
01688 free(options);
01689
01690 ret->mc_platform->agency = ret;
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
01711 options->initInterps = 4;
01712 return 0;
01713 }
01714
01715 EXPORTMC int
01716 MC_LoadAgentFromFile(MCAgency_t attr, const char* filename)
01717 {
01718 struct stat filestat;
01719 char *buf;
01720 FILE *fp;
01721 message_p message;
01722 extern mc_platform_p g_mc_platform;
01723 buf = NULL;
01724 filestat.st_size = 0;
01725 stat(filename, &filestat);
01726 if (filestat.st_size != 0 ) {
01727 buf = (char*)malloc( sizeof(char) * (filestat.st_size+1) );
01728 memset(buf, 0, filestat.st_size+1);
01729 } else {
01730 fprintf(stderr, "Error: File %s not found.\n", filename);
01731 return 1;
01732 }
01733
01734 fp = fopen(filename, "r");
01735 fread((void*)buf, filestat.st_size, 1, fp);
01736 fclose(fp);
01737
01738 message = message_New();
01739 if (
01740 message_InitializeFromString (
01741 attr->mc_platform,
01742 message,
01743 buf,
01744 "",
01745 5050,
01746 "ams"
01747 )
01748 )
01749 {
01750 message_Destroy(message);
01751 }
01752 free(message->to_address);
01753 message->to_address = NULL;
01754 message->xml_root = mxmlLoadString(
01755 NULL,
01756 buf,
01757 NULL );
01758 if (message->xml_root == NULL) {
01759 fprintf(stderr, "Error loading agent. %s:%d\n", __FILE__, __LINE__);
01760 message_Destroy(message);
01761 return 1;
01762 }
01763 message->xml_payload = mxmlFindElement(
01764 message->xml_root,
01765 message->xml_root,
01766 "MOBILE_AGENT",
01767 NULL,
01768 NULL,
01769 MXML_DESCEND );
01770 if(message->xml_payload == NULL) {
01771 fprintf(stderr, "Error loading agent: <MOBILE_AGENT> tag not found. %s:%d\n",
01772 __FILE__, __LINE__ );
01773 message_Destroy(message);
01774 return 1;
01775 }
01776
01777 message_queue_Add
01778 (
01779 attr->mc_platform->message_queue,
01780 message
01781 );
01782 return 0;
01783 }
01784
01785 EXPORTMC int
01786 MC_MigrateAgent(MCAgent_t agent, const char* hostname, int port)
01787 {
01788
01789
01790 int progress;
01791 progress = agent->datastate->task_progress;
01792
01793
01794 agent->datastate->progress_modifier = -1;
01795
01796
01797 free(agent->datastate->tasks[progress]->server_name);
01798 agent->datastate->tasks[progress]->server_name = (char*)malloc(
01799 sizeof(char)*(strlen(hostname) + 10) );
01800 sprintf(agent->datastate->tasks[progress]->server_name, "%s:%d",
01801 hostname, port);
01802
01803
01804 return 0;
01805 }
01806
01807 EXPORTMC int
01808 MC_MutexLock(MCAgency_t attr, int id)
01809 {
01810 syncListNode_t *syncnode;
01811 syncnode = syncListFind(id, attr->mc_platform->syncList);
01812 if (syncnode == NULL) {
01813 return 1;
01814 }
01815 MUTEX_LOCK(syncnode->lock);
01816 return 0;
01817 }
01818
01819 EXPORTMC int
01820 MC_MutexUnlock(MCAgency_t attr, int id)
01821 {
01822 syncListNode_t *syncnode;
01823 syncnode = syncListFind(id, attr->mc_platform->syncList);
01824 if (syncnode == NULL) {
01825 return 1;
01826 }
01827 MUTEX_UNLOCK(syncnode->lock);
01828 return 0;
01829 }
01830
01831 EXPORTMC int
01832 MC_PrintAgentCode(MCAgent_t agent)
01833 {
01834 int progress;
01835 MUTEX_LOCK(agent->lock);
01836 progress = agent->datastate->task_progress;
01837
01838 if (progress >= agent->datastate->number_of_tasks) {
01839 progress = agent->datastate->number_of_tasks - 1;
01840 }
01841 printf("%s\n",
01842 agent->datastate->agent_code);
01843 MUTEX_UNLOCK(agent->lock);
01844 return 0;
01845 }
01846
01847 EXPORTMC int
01848 MC_RegisterService(
01849 MCAgency_t agency,
01850 MCAgent_t agent,
01851 int agentID,
01852 const char *agentName,
01853 char **serviceNames,
01854 int numServices)
01855 {
01856 df_request_list_node_t *req_node;
01857 df_node_t *new_node;
01858 int i;
01859
01860
01861 if (agent == NULL && agentName == NULL) {
01862 return MC_ERR_INVALID_ARGS;
01863 }
01864
01865 req_node = df_request_list_node_New();
01866 req_node->command = (char*)malloc(sizeof(char)*9);
01867 strcpy((char*)req_node->command, "register");
01868
01869 new_node = (df_node_t*)malloc(sizeof(df_node_t));
01870 CHECK_NULL(new_node, return MC_ERR_MEMORY);
01871
01872
01873 new_node->lock = (MUTEX_T*)malloc(sizeof(MUTEX_T));
01874 CHECK_NULL(new_node->lock, return MC_ERR_MEMORY);
01875 MUTEX_INIT(new_node->lock);
01876
01877
01878 if (agent==NULL) {
01879 new_node->agent_id = agentID;
01880 } else {
01881 new_node->agent_id = agent->id;
01882 }
01883
01884
01885 if (agent==NULL) {
01886 new_node->agent_name =
01887 (char*)malloc(sizeof(char)*(strlen(agentName)+1));
01888 CHECK_NULL(new_node->agent_name, return MC_ERR_MEMORY;);
01889 strcpy(new_node->agent_name, agentName);
01890 } else {
01891 new_node->agent_name =
01892 (char*)malloc(
01893 sizeof(char) *
01894 (strlen(agent->name)+1)
01895 );
01896 CHECK_NULL(new_node->agent_name, return MC_ERR_MEMORY;);
01897 strcpy(new_node->agent_name, agent->name);
01898 }
01899
01900
01901 new_node->service_names = (char**)malloc(
01902 sizeof(char*) * numServices
01903 );
01904 CHECK_NULL(new_node->service_names, return MC_ERR_MEMORY;);
01905 for (i = 0; i < numServices; i++) {
01906 new_node->service_names[i] = (char*) malloc(
01907 sizeof(char) * (strlen(serviceNames[i]) + 1)
01908 );
01909 CHECK_NULL(new_node->service_names[i], return MC_ERR_MEMORY;);
01910 strcpy(
01911 new_node->service_names[i],
01912 serviceNames[i]
01913 );
01914 }
01915 new_node->num_services = numServices;
01916
01917 req_node->data = (void*)new_node;
01918 req_node->data_size = (sizeof(new_node));
01919
01920 return df_AddRequest(
01921 agency->mc_platform->df,
01922 req_node
01923 );
01924 }
01925
01926 EXPORTMC int
01927 MC_ResumeAgency(MCAgency_t attr)
01928 {
01929 MUTEX_LOCK(attr->mc_platform->giant_lock);
01930 attr->mc_platform->giant = 1;
01931 MUTEX_UNLOCK(attr->mc_platform->giant_lock);
01932 return 0;
01933 }
01934
01935 EXPORTMC MCAgent_t
01936 MC_RetrieveAgent(MCAgency_t attr)
01937
01938
01939
01940 {
01941 int i;
01942 MCAgent_t agent=NULL;
01943 MUTEX_LOCK(attr->mc_platform->agent_queue->lock);
01944 for (i = 0; i < attr->mc_platform->agent_queue->size; i++) {
01945 agent = (MCAgent_t)ListSearch(
01946 attr->mc_platform->agent_queue->list, i);
01947 if (agent->agent_status == MC_AGENT_NEUTRAL) {
01948 break;
01949 }
01950 }
01951 if (agent == NULL) {
01952 MUTEX_UNLOCK(attr->mc_platform->agent_queue->lock);
01953 return NULL;
01954 }
01955 if (agent->agent_status != MC_AGENT_NEUTRAL) {
01956 MUTEX_UNLOCK(attr->mc_platform->agent_queue->lock);
01957 return NULL;
01958 }
01959 MUTEX_UNLOCK(attr->mc_platform->agent_queue->lock);
01960 return agent;
01961 }
01962
01963 EXPORTMC char *
01964 MC_RetrieveAgentCode(MCAgent_t agent)
01965 {
01966 char *buf;
01967 int len, progress;
01968 MUTEX_LOCK(agent->lock);
01969 progress = agent->datastate->task_progress;
01970 len = strlen(
01971 agent->datastate->agent_code);
01972 buf = (char*)malloc( (len+1)*sizeof(char));
01973 strcpy(buf,
01974 agent->datastate->agent_code);
01975 MUTEX_UNLOCK(agent->lock);
01976 return buf;
01977 }
01978
01979 EXPORTMC int
01980 MC_ResetSignal(MCAgency_t attr)
01981 {
01982 MUTEX_LOCK(attr->mc_platform->giant_lock);
01983 attr->mc_platform->giant = 1;
01984 attr->mc_platform->MC_signal = MC_NO_SIGNAL;
01985 COND_SIGNAL(attr->mc_platform->giant_cond);
01986 MUTEX_UNLOCK(attr->mc_platform->giant_lock);
01987 return 0;
01988 }
01989
01990 EXPORTMC int
01991 MC_SearchForService(
01992
01993 MCAgency_t attr,
01994 const char *searchString,
01995
01996 char*** agentNames,
01997 char*** serviceNames,
01998 int** agentIDs,
01999 int* numResults)
02000 {
02001 df_request_search_p search;
02002 df_search_results_p results;
02003 df_request_list_node_p request;
02004 search = df_request_search_New();
02005 CHECK_NULL(search, return MC_ERR_MEMORY;);
02006 results = (df_search_results_p)malloc(sizeof(df_search_results_t));
02007 CHECK_NULL(results, return MC_ERR_MEMORY;);
02008 request = df_request_list_node_New();
02009 CHECK_NULL(request, return MC_ERR_MEMORY;);
02010
02011
02012 search->search_results = results;
02013 search->search_string = (char*)searchString;
02014
02015 request->data = (void*)search;
02016 request->command = (char*)malloc(sizeof(char) * 7);
02017 strcpy((char*)request->command, "search");
02018 request->data_size = sizeof(df_request_search_t);
02019
02020 COND_SLEEP_ACTION(
02021 search->cond,
02022 search->lock,
02023
02024 df_AddRequest(attr->mc_platform->df, request);
02025 );
02026
02027 *agentNames = search->search_results->agent_names;
02028 *serviceNames = search->search_results->service_names;
02029 *agentIDs = search->search_results->agent_ids;
02030 *numResults = search->search_results->num_results;
02031
02032
02033 free((void*)request->command);
02034 df_request_list_node_Destroy(request);
02035 df_request_search_Destroy(search);
02036
02037 return MC_SUCCESS;
02038 }
02039
02040 EXPORTMC int
02041 MC_SemaphorePost(MCAgency_t attr, int id)
02042 {
02043 syncListNode_t *syncnode;
02044 syncnode = syncListFind(id, attr->mc_platform->syncList);
02045 if (syncnode == NULL) {
02046 return 1;
02047 }
02048 SEMAPHORE_POST(syncnode->sem);
02049 return 0;
02050 }
02051
02052 EXPORTMC int
02053 MC_SemaphoreWait(MCAgency_t attr, int id)
02054 {
02055 syncListNode_t *syncnode;
02056 syncnode = syncListFind(id, attr->mc_platform->syncList);
02057 if (syncnode == NULL) {
02058 return 1;
02059 }
02060 SEMAPHORE_WAIT(syncnode->sem);
02061 return 0;
02062 }
02063
02064 EXPORTMC int
02065 MC_SendCh(MCAgency_t attr,
02066 const char *filename,
02067 const char *remotehost,
02068 int port)
02069 {
02070 printf("Sorry, not implemented yet.\n");
02071 return -1;
02072 }
02073
02074 EXPORTMC int
02075 MC_SendAgent(MCAgency_t attr,
02076 const char *string)
02077 {
02078 message_p message;
02079 MCAgent_t agent;
02080 extern mc_platform_p g_mc_platform;
02081 mc_platform_p platform;
02082
02083 if (attr == NULL) {
02084 platform = g_mc_platform;
02085 } else {
02086 platform = attr->mc_platform;
02087 }
02088
02089 message = message_New();
02090 if(
02091 message_InitializeFromString
02092 (
02093 attr->mc_platform,
02094 message,
02095 string,
02096 NULL,
02097 0,
02098 "ams"
02099 )
02100 )
02101 {
02102 message_Destroy(message);
02103 return MC_ERR;
02104 } else {
02105
02106
02107 agent = agent_Initialize( platform, message, rand() );
02108 if (agent == NULL) {
02109 fprintf(stderr, "Error initializing agent. %s:%d", __FILE__, __LINE__);
02110 }
02111 agent->agent_status = MC_WAIT_MESSGSEND;
02112 agent_queue_Add( platform->agent_queue, agent);
02113
02114 MUTEX_LOCK(platform->ams->runflag_lock);
02115 platform->ams->run = 1;
02116 COND_BROADCAST(platform->ams->runflag_cond);
02117 MUTEX_UNLOCK(platform->ams->runflag_lock);
02118 }
02119 return 0;
02120 }
02121
02122 EXPORTMC int
02123 MC_SendAgentFile(MCAgency_t attr,
02124 const char *filename)
02125 {
02126 struct stat filestat;
02127 char *buf;
02128 FILE *fp;
02129 int ret;
02130 message_p message;
02131 agent_t *agent;
02132 extern mc_platform_p g_mc_platform;
02133 mc_platform_p platform;
02134 buf = NULL;
02135 filestat.st_size = 0;
02136 stat(filename, &filestat);
02137 if (filestat.st_size != 0 ) {
02138 buf = (char*)malloc( sizeof(char) * (filestat.st_size+1) );
02139 memset(buf, 0, filestat.st_size+1);
02140 } else {
02141 fprintf(stderr, "Error: File %s not found.\n", filename);
02142 return 1;
02143 }
02144
02145 if (attr == NULL) {
02146 platform = g_mc_platform;
02147 } else {
02148 platform = attr->mc_platform;
02149 }
02150
02151 fp = fopen(filename, "r");
02152 fread((void*)buf, filestat.st_size, 1, fp);
02153 fclose(fp);
02154
02155 message = message_New();
02156 if(
02157 message_InitializeFromString
02158 (
02159 platform,
02160 message,
02161 buf,
02162 NULL,
02163 0,
02164 "ams"
02165 )
02166 )
02167 {
02168 message_Destroy(message);
02169 } else {
02170
02171
02172 agent = agent_Initialize( platform, message, rand() );
02173 if (agent == NULL) {
02174 fprintf(stderr, "Error initializing agent. %s:%d", __FILE__, __LINE__);
02175 }
02176 agent->agent_status = MC_WAIT_MESSGSEND;
02177 agent_queue_Add( platform->agent_queue, agent);
02178
02179 MUTEX_LOCK(platform->ams->runflag_lock);
02180 platform->ams->run = 1;
02181 COND_BROADCAST(platform->ams->runflag_cond);
02182 MUTEX_UNLOCK(platform->ams->runflag_lock);
02183 }
02184 free(buf);
02185 return ret;
02186 }
02187
02188 EXPORTMC int
02189 MC_SendAgentMigrationMessage(MCAgency_t attr,
02190 const char *string,
02191 const char *hostname,
02192 int port)
02193 {
02194
02195 message_p message;
02196 printf("\nThe function MC_SendAgentMigrationMessage() is deprecated.\n\
02197 Please use MC_SendAgent() instead.\n");
02198 message = message_New();
02199 if(
02200 message_InitializeFromString
02201 (
02202 attr->mc_platform,
02203 message,
02204 string,
02205 hostname,
02206 port,
02207 "ams"
02208 )
02209 )
02210 {
02211 message_Destroy(message);
02212 return MC_ERR;
02213 } else {
02214 return message_queue_Add
02215 (
02216 attr->mc_platform->message_queue,
02217 message
02218 );
02219 }
02220 }
02221
02222 EXPORTMC int
02223 MC_SendAgentMigrationMessageFile(MCAgency_t attr,
02224 const char *filename,
02225 const char *hostname,
02226 int port)
02227 {
02228 struct stat filestat;
02229 char *buf;
02230 FILE *fp;
02231 int ret;
02232 message_p message;
02233 agent_t *agent;
02234 extern mc_platform_p g_mc_platform;
02235 mc_platform_p platform;
02236 printf("\nThe function MC_SendAgentMigrationMessage() is deprecated.\n\
02237 Please use MC_SendAgentFile() instead.");
02238 buf = NULL;
02239 filestat.st_size = 0;
02240 stat(filename, &filestat);
02241 if (filestat.st_size != 0 ) {
02242 buf = (char*)malloc( sizeof(char) * (filestat.st_size+1) );
02243 memset(buf, 0, filestat.st_size+1);
02244 } else {
02245 fprintf(stderr, "Error: File %s not found.\n", filename);
02246 return 1;
02247 }
02248
02249 if (attr == NULL) {
02250 platform = g_mc_platform;
02251 } else {
02252 platform = attr->mc_platform;
02253 }
02254
02255 fp = fopen(filename, "r");
02256 fread((void*)buf, filestat.st_size, 1, fp);
02257 fclose(fp);
02258
02259 message = message_New();
02260 if(
02261 message_InitializeFromString
02262 (
02263 platform,
02264 message,
02265 buf,
02266 hostname,
02267 port,
02268 "ams"
02269 )
02270 )
02271 {
02272 message_Destroy(message);
02273 } else {
02274
02275
02276 agent = agent_Initialize( platform, message, rand() );
02277 if (agent == NULL) {
02278 fprintf(stderr, "Error initializing agent. %s:%d", __FILE__, __LINE__);
02279 }
02280 agent->agent_status = MC_WAIT_MESSGSEND;
02281 agent_queue_Add( platform->agent_queue, agent);
02282
02283 MUTEX_LOCK(platform->ams->runflag_lock);
02284 platform->ams->run = 1;
02285 COND_BROADCAST(platform->ams->runflag_cond);
02286 MUTEX_UNLOCK(platform->ams->runflag_lock);
02287 }
02288 free(buf);
02289 return ret;
02290 }
02291
02292 EXPORTMC int
02293 MC_SendSteerCommand(MCAgency_t attr, enum MC_SteerCommand_e cmd)
02294 {
02295 MUTEX_LOCK(attr->mc_platform->MC_steer_lock);
02296 attr->mc_platform->MC_steer_command = cmd;
02297 COND_BROADCAST(attr->mc_platform->MC_steer_cond);
02298 MUTEX_UNLOCK(attr->mc_platform->MC_steer_lock);
02299 return 0;
02300 }
02301
02302 EXPORTMC int
02303 MC_SetAgentStatus(MCAgent_t agent, enum MC_AgentStatus_e status)
02304 {
02305 MUTEX_LOCK(agent->lock);
02306 agent->agent_status = status;
02307 if (!agent->orphan) {
02308 MUTEX_LOCK(agent->mc_platform->ams->runflag_lock);
02309 agent->mc_platform->ams->run = 1;
02310 COND_SIGNAL(agent->mc_platform->ams->runflag_cond);
02311 MUTEX_UNLOCK(agent->mc_platform->ams->runflag_lock);
02312 }
02313 MUTEX_UNLOCK(agent->lock);
02314 return 0;
02315 }
02316
02317 EXPORTMC int
02318 MC_SetDefaultAgentStatus(
02319 MCAgency_t agency,
02320 enum MC_AgentStatus_e status
02321 )
02322 {
02323 agency->mc_platform->default_agentstatus = status;
02324 return 0;
02325 }
02326
02327 EXPORTMC int
02328 MC_SetThreadOn(MCAgencyOptions_t *options, enum MC_ThreadIndex_e index)
02329 {
02330 SET_THREAD_ON(options->threads, index);
02331 return 0;
02332 }
02333
02334 EXPORTMC int
02335 MC_SetThreadsAllOn(MCAgencyOptions_t* options)
02336 {
02337 int i;
02338 for(i = 0; i < MC_THREAD_ALL; i++) {
02339 SET_THREAD_ON(options->threads, i);
02340 }
02341 return 0;
02342 }
02343
02344 EXPORTMC int
02345 MC_SetThreadOff(MCAgencyOptions_t *options, enum MC_ThreadIndex_e index)
02346 {
02347 SET_THREAD_OFF(options->threads, index);
02348 return 0;
02349 }
02350
02351 EXPORTMC int
02352 MC_SetThreadsAllOff(MCAgencyOptions_t* options)
02353 {
02354 int i;
02355 for(i = 0; i < MC_THREAD_ALL; i++) {
02356 SET_THREAD_OFF(options->threads, i);
02357 }
02358 return 0;
02359 }
02360
02361 EXPORTMC int
02362 MC_Steer(
02363 MCAgency_t attr,
02364 int (*funcptr)(void* data),
02365 void *arg
02366 )
02367 {
02368 MUTEX_LOCK(attr->mc_platform->MC_steer_lock);
02369 do {
02370 attr->mc_platform->MC_steer_command = MC_RUN;
02371 MUTEX_UNLOCK(attr->mc_platform->MC_steer_lock);
02372 (*funcptr)(arg);
02373 } while
02374 (
02375 attr->mc_platform->MC_steer_command == MC_RESTART
02376 );
02377 return 0;
02378 }
02379
02380 EXPORTMC enum MC_SteerCommand_e
02381 MC_SteerControl(void)
02382 {
02383 extern mc_platform_p g_mc_platform;
02384
02385 MUTEX_LOCK(g_mc_platform->MC_steer_lock);
02386 while (g_mc_platform->MC_steer_command == MC_SUSPEND) {
02387 COND_WAIT(
02388 g_mc_platform->MC_steer_cond,
02389 g_mc_platform->MC_steer_lock
02390 );
02391 }
02392 MUTEX_UNLOCK(g_mc_platform->MC_steer_lock);
02393 return g_mc_platform->MC_steer_command;
02394 }
02395
02396 EXPORTMC int
02397 MC_SyncDelete(MCAgency_t attr, int id)
02398 {
02399 syncListNode_t *sync_node;
02400
02401 MUTEX_LOCK(attr->mc_platform->syncList->giant_lock);
02402
02403
02404 sync_node = syncListFind(id, attr->mc_platform->syncList);
02405 if (sync_node == NULL) {
02406 MUTEX_UNLOCK(attr->mc_platform->syncList->giant_lock);
02407 return MC_ERR_NOT_FOUND;
02408 }
02409 MUTEX_LOCK(sync_node->lock);
02410
02411
02412 if (syncListRemove(id, attr->mc_platform->syncList) == NULL) {
02413 fprintf(stderr, "Fatal error. %s:%d\n",
02414 __FILE__,
02415 __LINE__ );
02416 exit(0);
02417 }
02418
02419
02420 MUTEX_UNLOCK(sync_node->lock);
02421 MUTEX_UNLOCK(attr->mc_platform->syncList->giant_lock);
02422
02423 return syncListNodeDestroy(sync_node);
02424 }
02425
02426 EXPORTMC int
02427 MC_SyncInit(MCAgency_t attr, int id)
02428 {
02429 syncListNode_t *node;
02430 node = syncListNodeNew();
02431 MUTEX_LOCK(attr->mc_platform->syncList->giant_lock);
02432 if (id == 0) {
02433 id = rand();
02434 }
02435 while (
02436 syncListFind(id, attr->mc_platform->syncList) != NULL
02437 )
02438 {
02439 id = rand();
02440 }
02441
02442 node->id = id;
02443 syncListAddNode(
02444 node,
02445 attr->mc_platform->syncList
02446 );
02447 MUTEX_UNLOCK(attr->mc_platform->syncList->giant_lock);
02448 return id;
02449 }
02450
02451 EXPORTMC int
02452 MC_TerminateAgent(MCAgent_t agent)
02453 {
02454 int status=0;
02455 if(agent->agent_interp != NULL) {
02456 status = Ch_Abort (*agent->agent_interp);
02457 }
02458 return status;
02459 }
02460
02461 EXPORTMC int
02462 MC_TerminateAgentWG(MCAgent_t calling_agent, MCAgent_t agent)
02463 {
02464 int status=0;
02465
02466 if (agent->wg_code != NULL) {
02467 if (calling_agent->wg_code == NULL) {
02468 return MC_ERR_INVALID_ARGS;
02469 } else if (strcmp(calling_agent->wg_code, agent->wg_code)) {
02470 return MC_ERR_INVALID_ARGS;
02471 }
02472 }
02473 if(agent->agent_interp != NULL) {
02474 status = Ch_Abort (*agent->agent_interp);
02475 }
02476 return status;
02477 }
02478
02479 EXPORTMC int
02480 MC_MainLoop(MCAgency_t attr)
02481 {
02482 MUTEX_LOCK( attr->mc_platform->quit_lock );
02483 while( attr->mc_platform->quit != 1 ) {
02484 COND_WAIT( attr->mc_platform->quit_cond, attr->mc_platform->quit_lock );
02485 }
02486 MUTEX_UNLOCK( attr->mc_platform->quit_lock );
02487 return 0;
02488 }
02489
02490 EXPORTMC int
02491 MC_WaitAgent(MCAgency_t attr)
02492 {
02493 int size;
02494 MUTEX_LOCK(attr->mc_platform->agent_queue->lock);
02495 while(1) {
02496 size = attr->mc_platform->agent_queue->size;
02497 COND_WAIT(
02498 attr->mc_platform->agent_queue->cond,
02499 attr->mc_platform->agent_queue->lock
02500 );
02501 if (size < attr->mc_platform->agent_queue->size) {
02502 MUTEX_UNLOCK(attr->mc_platform->agent_queue->lock);
02503 break;
02504 }
02505 }
02506 MUTEX_UNLOCK(attr->mc_platform->agent_queue->lock);
02507 return 0;
02508 }
02509
02510 EXPORTMC MCAgent_t
02511 MC_WaitRetrieveAgent(MCAgency_t attr)
02512 {
02513 int index;
02514 MCAgent_t agent;
02515 MC_WaitSignal(attr, MC_RECV_AGENT);
02516 MUTEX_LOCK(attr->mc_platform->agent_queue->lock);
02517 index = attr->mc_platform->agent_queue->size-1;
02518 agent = (MCAgent_t)ListSearch(
02519 attr->mc_platform->agent_queue->list, index);
02520 MUTEX_UNLOCK(attr->mc_platform->agent_queue->lock);
02521 return agent;
02522 }
02523
02524
02525
02526
02527
02528 EXPORTMC int
02529 MC_WaitSignal(MCAgency_t attr, int signals)
02530 {
02531 MUTEX_LOCK(attr->mc_platform->MC_signal_lock);
02532 while(! (signals & attr->mc_platform->MC_signal)) {
02533 COND_WAIT(
02534 attr->mc_platform->MC_signal_cond,
02535 attr->mc_platform->MC_signal_lock
02536 );
02537 }
02538 MUTEX_UNLOCK(attr->mc_platform->MC_signal_lock);
02539 MUTEX_LOCK(attr->mc_platform->giant_lock);
02540 attr->mc_platform->giant = 0;
02541 MUTEX_UNLOCK(attr->mc_platform->giant_lock);
02542 return 0;
02543 }
02544
02545
02546
02547
02548
02549
02550 EXPORTMC int MC_AclDestroy_chdl(void* varg)
02551 {
02552 int retval;
02553 fipa_acl_message_t* acl_message;
02554 ChInterp_t interp;
02555 ChVaList_t ap;
02556
02557 Ch_VaStart(interp, ap, varg);
02558 acl_message = Ch_VaArg(interp, ap, fipa_acl_message_t*);
02559 retval = MC_AclDestroy(acl_message);
02560 Ch_VaEnd(interp, ap);
02561 return retval;
02562 }
02563
02564
02565 EXPORTMC void* MC_AclNew_chdl(void* varg)
02566 {
02567 void* retval;
02568 retval = (void*)MC_AclNew();
02569 return retval;
02570 }
02571
02572
02573 EXPORTMC int MC_AclPost_chdl(void* varg)
02574 {
02575 int retval;
02576 agent_p agent;
02577 fipa_acl_message_t* acl_message;
02578 ChInterp_t interp;
02579 ChVaList_t ap;
02580
02581 Ch_VaStart(interp, ap, varg);
02582 agent = Ch_VaArg(interp, ap, agent_p);
02583 acl_message = Ch_VaArg(interp, ap, fipa_acl_message_t*);
02584 retval = MC_AclPost(agent, acl_message);
02585 Ch_VaEnd(interp, ap);
02586 return retval;
02587 }
02588
02589
02590 EXPORTCH void*
02591 MC_AclReply_chdl(void* varg)
02592 {
02593 void* retval;
02594 fipa_acl_message_t* acl_message;
02595 ChInterp_t interp;
02596 ChVaList_t ap;
02597
02598 Ch_VaStart(interp, ap, varg);
02599 acl_message = Ch_VaArg(interp, ap, fipa_acl_message_t*);
02600 retval = (void*)MC_AclReply(acl_message);
02601 Ch_VaEnd(interp, ap);
02602 return retval;
02603 }
02604
02605
02606 EXPORTCH void*
02607 MC_AclRetrieve_chdl(void* varg)
02608 {
02609 void* retval;
02610 MCAgent_t agent;
02611 ChInterp_t interp;
02612 ChVaList_t ap;
02613
02614 Ch_VaStart(interp, ap, varg);
02615 agent = Ch_VaArg(interp, ap, MCAgent_t);
02616 retval = MC_AclRetrieve(agent);
02617 Ch_VaEnd(interp, ap);
02618 return retval;
02619 }
02620
02621
02622 EXPORTCH int
02623 MC_AclSend_chdl(void* varg)
02624 {
02625 int retval;
02626 fipa_acl_message_t* acl_message;
02627 MCAgency_t temp_attr;
02628 extern mc_platform_p g_mc_platform;
02629
02630 ChInterp_t interp;
02631 ChVaList_t ap;
02632
02633 temp_attr = (MCAgency_t)malloc(sizeof(struct agency_s));
02634 CHECK_NULL(temp_attr, exit(-1));
02635 temp_attr->mc_platform = g_mc_platform;
02636
02637 Ch_VaStart(interp, ap, varg);
02638 acl_message = (fipa_acl_message_t*) Ch_VaArg(interp, ap, void*);
02639 retval = MC_AclSend(temp_attr, acl_message);
02640 Ch_VaEnd(interp, ap);
02641 free(temp_attr);
02642 return retval;
02643 }
02644
02645
02646 EXPORTCH void*
02647 MC_AclWaitRetrieve_chdl(void *varg)
02648 {
02649 void* retval;
02650 MCAgent_t agent;
02651 ChInterp_t interp;
02652 ChVaList_t ap;
02653
02654 Ch_VaStart(interp, ap, varg);
02655 agent = Ch_VaArg(interp, ap, MCAgent_t);
02656 retval = MC_AclWaitRetrieve(agent);
02657 Ch_VaEnd(interp, ap);
02658 return retval;
02659 }
02660
02661
02662
02663
02664 EXPORTCH int
02665 MC_AclGetProtocol_chdl(void* varg)
02666 {
02667 ChInterp_t interp;
02668 ChVaList_t ap;
02669 struct fipa_acl_message_s* acl;
02670 int retval;
02671
02672 Ch_VaStart(interp, ap, varg);
02673 acl = Ch_VaArg(interp, ap, struct fipa_acl_message_s*);
02674 retval = MC_AclGetProtocol(acl);
02675 Ch_VaEnd(interp, ap);
02676 return retval;
02677 }
02678
02679 EXPORTCH char*
02680 MC_AclGetConversationID_chdl(void* varg)
02681 {
02682 ChInterp_t interp;
02683 ChVaList_t ap;
02684 struct fipa_acl_message_s* acl;
02685 char* retval;
02686
02687 Ch_VaStart(interp, ap, varg);
02688 acl = Ch_VaArg(interp, ap, struct fipa_acl_message_s*);
02689 retval = MC_AclGetConversationID(acl);
02690 Ch_VaEnd(interp, ap);
02691 return retval;
02692 }
02693
02694 EXPORTCH int
02695 MC_AclGetPerformative_chdl(void* varg)
02696 {
02697 ChInterp_t interp;
02698 ChVaList_t ap;
02699 struct fipa_acl_message_s* acl;
02700 int retval;
02701
02702 Ch_VaStart(interp, ap, varg);
02703 acl = Ch_VaArg(interp, ap, struct fipa_acl_message_s*);
02704 retval = MC_AclGetPerformative(acl);
02705 Ch_VaEnd(interp, ap);
02706 return retval;
02707 }
02708
02709 EXPORTCH int
02710 MC_AclGetSender_chdl(void* varg)
02711 {
02712 ChInterp_t interp;
02713 ChVaList_t ap;
02714 struct fipa_acl_message_s* acl;
02715 char** name;
02716 char** address;
02717 int retval;
02718
02719 Ch_VaStart(interp, ap, varg);
02720 acl = Ch_VaArg(interp, ap, struct fipa_acl_message_s*);
02721 name = Ch_VaArg(interp, ap, char**);
02722 address = Ch_VaArg(interp, ap, char**);
02723 retval = MC_AclGetSender(acl, name, address);
02724 Ch_VaEnd(interp, ap);
02725 return retval;
02726 }
02727
02728 EXPORTCH char*
02729 MC_AclGetContent_chdl(void* varg)
02730 {
02731 ChInterp_t interp;
02732 ChVaList_t ap;
02733 struct fipa_acl_message_s* acl;
02734 char* retval;
02735
02736 Ch_VaStart(interp, ap, varg);
02737 acl = Ch_VaArg(interp, ap, struct fipa_acl_message_s*);
02738 retval = (char*)MC_AclGetContent(acl);
02739 Ch_VaEnd(interp, ap);
02740 return retval;
02741 }
02742
02743 EXPORTCH int
02744 MC_AclSetProtocol_chdl(void* varg)
02745 {
02746 ChInterp_t interp;
02747 ChVaList_t ap;
02748 struct fipa_acl_message_s* acl;
02749 enum fipa_protocol_e protocol;
02750 int retval;
02751
02752 Ch_VaStart(interp, ap, varg);
02753 acl = Ch_VaArg(interp, ap, struct fipa_acl_message_s*);
02754 protocol = Ch_VaArg(interp, ap, enum fipa_protocol_e);
02755 retval = MC_AclSetProtocol(acl, protocol);
02756 Ch_VaEnd(interp, ap);
02757 return retval;
02758 }
02759
02760
02761 EXPORTCH int
02762 MC_AclSetConversationID_chdl(void* varg)
02763 {
02764 ChInterp_t interp;
02765 ChVaList_t ap;
02766 struct fipa_acl_message_s* acl;
02767 char* id;
02768 int retval;
02769
02770 Ch_VaStart(interp, ap, varg);
02771 acl = Ch_VaArg(interp, ap, struct fipa_acl_message_s*);
02772 id = Ch_VaArg(interp, ap, char*);
02773 retval = MC_AclSetConversationID(acl, id);
02774 Ch_VaEnd(interp, ap);
02775 return retval;
02776 }
02777
02778
02779 EXPORTCH int
02780 MC_AclSetPerformative_chdl(void* varg)
02781 {
02782 ChInterp_t interp;
02783 ChVaList_t ap;
02784 struct fipa_acl_message_s* acl;
02785 enum fipa_performative_e performative;
02786 int retval;
02787
02788 Ch_VaStart(interp, ap, varg);
02789 acl = Ch_VaArg(interp, ap, struct fipa_acl_message_s*);
02790 performative = Ch_VaArg(interp, ap, enum fipa_performative_e);
02791 retval = MC_AclSetPerformative(acl, performative);
02792 Ch_VaEnd(interp, ap);
02793 return retval;
02794 }
02795
02796
02797 EXPORTCH int
02798 MC_AclSetSender_chdl(void* varg)
02799 {
02800 ChInterp_t interp;
02801 ChVaList_t ap;
02802 struct fipa_acl_message_s* acl;
02803 char* name;
02804 char* address;
02805 int retval;
02806
02807 Ch_VaStart(interp, ap, varg);
02808 acl = Ch_VaArg(interp, ap, struct fipa_acl_message_s*);
02809 name = Ch_VaArg(interp, ap, char*);
02810 address = Ch_VaArg(interp, ap, char*);
02811 retval = MC_AclSetSender(acl, name, address);
02812 Ch_VaEnd(interp, ap);
02813 return retval;
02814 }
02815
02816
02817 EXPORTCH int
02818 MC_AclAddReceiver_chdl(void* varg)
02819 {
02820 ChInterp_t interp;
02821 ChVaList_t ap;
02822 struct fipa_acl_message_s* acl;
02823 char* name;
02824 char* address;
02825 int retval;
02826
02827 Ch_VaStart(interp, ap, varg);
02828 acl = Ch_VaArg(interp, ap, struct fipa_acl_message_s*);
02829 name = Ch_VaArg(interp, ap, char*);
02830 address = Ch_VaArg(interp, ap, char*);
02831 retval = MC_AclAddReceiver(acl, name, address);
02832 Ch_VaEnd(interp, ap);
02833 return retval;
02834 }
02835
02836
02837 EXPORTCH int
02838 MC_AclAddReplyTo_chdl(void* varg)
02839 {
02840 ChInterp_t interp;
02841 ChVaList_t ap;
02842 struct fipa_acl_message_s* acl;
02843 char* name;
02844 char* address;
02845 int retval;
02846
02847 Ch_VaStart(interp, ap, varg);
02848 acl = Ch_VaArg(interp, ap, struct fipa_acl_message_s*);
02849 name = Ch_VaArg(interp, ap, char*);
02850 address = Ch_VaArg(interp, ap, char*);
02851 retval = MC_AclAddReplyTo(acl, name, address);
02852 Ch_VaEnd(interp, ap);
02853 return retval;
02854 }
02855
02856
02857 EXPORTCH int
02858 MC_AclSetContent_chdl(void* varg)
02859 {
02860 ChInterp_t interp;
02861 ChVaList_t ap;
02862 struct fipa_acl_message_s* acl;
02863 char* content;
02864 int retval;
02865
02866 Ch_VaStart(interp, ap, varg);
02867 acl = Ch_VaArg(interp, ap, struct fipa_acl_message_s*);
02868 content = Ch_VaArg(interp, ap, char*);
02869 retval = MC_AclSetContent(acl, content);
02870 Ch_VaEnd(interp, ap);
02871 return retval;
02872 }
02873
02874
02875
02876
02877 EXPORTCH int
02878 MC_AddAgent_chdl(void *varg)
02879 {
02880 int retval;
02881 MCAgent_t agent;
02882 MCAgency_t temp_attr;
02883 extern mc_platform_p g_mc_platform;
02884
02885 ChInterp_t interp;
02886 ChVaList_t ap;
02887
02888 temp_attr = (MCAgency_t)malloc(sizeof(struct agency_s));
02889 CHECK_NULL(temp_attr, exit(-1));
02890 temp_attr->mc_platform = g_mc_platform;
02891
02892 Ch_VaStart(interp, ap, varg);
02893 agent = (MCAgent_t) Ch_VaArg(interp, ap, void*);
02894 retval = MC_AddAgent(temp_attr, agent);
02895 Ch_VaEnd(interp, ap);
02896 free(temp_attr);
02897 return retval;
02898 }
02899
02900
02901 EXPORTCH int
02902 MC_AgentAddTask_chdl(void *varg)
02903 {
02904 int retval;
02905
02906
02907 MCAgent_t agent;
02908 const char* code;
02909 const char* return_var_name;
02910 const char* server;
02911 int persistent;
02912
02913 ChInterp_t interp;
02914 ChVaList_t ap;
02915
02916 Ch_VaStart(interp, ap, varg);
02917
02918 agent = Ch_VaArg(interp, ap, MCAgent_t);
02919 code = Ch_VaArg(interp, ap, const char*);
02920 return_var_name = Ch_VaArg(interp, ap, const char*);
02921 server = Ch_VaArg(interp, ap, const char*);
02922 persistent = Ch_VaArg(interp, ap, int);
02923
02924 retval= MC_AgentAddTask(
02925 agent,
02926 code,
02927 return_var_name,
02928 server,
02929 persistent);
02930 Ch_VaEnd(interp, ap);
02931 return retval;
02932 }
02933
02934
02935 EXPORTCH const void*
02936 MC_AgentVariableRetrieve_chdl(void* varg)
02937 {
02938 const void* retval;
02939 MCAgent_t agent;
02940 const char* var_name;
02941 int task_num;
02942
02943 ChInterp_t interp;
02944 ChVaList_t ap;
02945
02946 Ch_VaStart(interp, ap, varg);
02947
02948 agent = Ch_VaArg(interp, ap, MCAgent_t);
02949 var_name = Ch_VaArg(interp, ap, const char* );
02950 task_num = Ch_VaArg(interp, ap, int);
02951
02952 retval = MC_AgentVariableRetrieve(agent, var_name, task_num);
02953
02954 Ch_VaEnd(interp, ap);
02955 return retval;
02956 }
02957
02958
02959 EXPORTCH int
02960 MC_AgentVariableSave_chdl(void *varg)
02961 {
02962 int retval;
02963 MCAgent_t agent;
02964 const char* var_name;
02965
02966 ChInterp_t interp;
02967 ChVaList_t ap;
02968
02969 Ch_VaStart(interp, ap, varg);
02970
02971 agent = Ch_VaArg(interp, ap, MCAgent_t);
02972 var_name = Ch_VaArg(interp, ap, const char*);
02973
02974 retval = MC_AgentVariableSave(agent, var_name);
02975
02976 Ch_VaEnd(interp, ap);
02977 return retval;
02978 }
02979
02980
02981 EXPORTCH int
02982 MC_CallAgentFunc_chdl(void *varg)
02983 {
02984 int retval;
02985
02986 MCAgent_t agent;
02987 const char* funcName;
02988 void* returnVal;
02989 ChVaList_t args;
02990
02991 ChInterp_t interp;
02992 ChVaList_t ap;
02993
02994 Ch_VaStart(interp, ap, varg);
02995
02996 agent = Ch_VaArg(interp, ap, MCAgent_t);
02997 funcName = Ch_VaArg(interp, ap, const char*);
02998 returnVal = Ch_VaArg(interp, ap, void*);
02999 args = Ch_VaArg(interp, ap, void*);
03000
03001 retval = MC_CallAgentFuncVar(
03002 agent,
03003 funcName,
03004 returnVal,
03005 args);
03006 Ch_VaEnd(interp, ap);
03007 return retval;
03008 }
03009
03010
03011 EXPORTCH int
03012 MC_Barrier_chdl(void *varg)
03013 {
03014 MCAgency_t temp_attr;
03015 extern mc_platform_p g_mc_platform;
03016 int retval;
03017 ChInterp_t interp;
03018 ChVaList_t ap;
03019 int id;
03020
03021 temp_attr = (MCAgency_t)malloc(sizeof(struct agency_s));
03022 CHECK_NULL(temp_attr, exit(-1));
03023 temp_attr->mc_platform = g_mc_platform;
03024
03025 Ch_VaStart(interp, ap, varg);
03026 id = Ch_VaArg(interp, ap, int);
03027 retval = MC_Barrier(temp_attr, id);
03028 Ch_VaEnd(interp, ap);
03029 free(temp_attr);
03030 return retval;
03031 }
03032
03033
03034 EXPORTCH int
03035 MC_BarrierDelete_chdl(void *varg)
03036 {
03037 MCAgency_t temp_attr;
03038 extern mc_platform_p g_mc_platform;
03039 int retval;
03040 ChInterp_t interp;
03041 ChVaList_t ap;
03042 int id;
03043
03044 temp_attr = (MCAgency_t)malloc(sizeof(struct agency_s));
03045 CHECK_NULL(temp_attr, exit(-1));
03046 temp_attr->mc_platform = g_mc_platform;
03047
03048 Ch_VaStart(interp, ap, varg);
03049 id = Ch_VaArg(interp, ap, int);
03050 retval = MC_BarrierDelete(temp_attr, id);
03051 Ch_VaEnd(interp, ap);
03052 free(temp_attr);
03053 return retval;
03054 }
03055
03056
03057 EXPORTCH int
03058 MC_BarrierInit_chdl(void *varg)
03059 {
03060 MCAgency_t temp_attr;
03061 extern mc_platform_p g_mc_platform;
03062 int retval;
03063 ChInterp_t interp;
03064 ChVaList_t ap;
03065 int id;
03066 int num_procs;
03067
03068 temp_attr = (MCAgency_t)malloc(sizeof(struct agency_s));
03069 CHECK_NULL(temp_attr, exit(-1));
03070 temp_attr->mc_platform = g_mc_platform;
03071
03072 Ch_VaStart(interp, ap, varg);
03073 id = Ch_VaArg(interp, ap, int);
03074 num_procs = Ch_VaArg(interp, ap, int);
03075 retval = MC_BarrierInit(temp_attr, id, num_procs);
03076 Ch_VaEnd(interp, ap);
03077 free(temp_attr);
03078 return retval;
03079 }
03080
03081
03082 EXPORTCH int
03083 MC_CondBroadcast_chdl(void *varg)
03084 {
03085 MCAgency_t temp_attr;
03086 extern mc_platform_p g_mc_platform;
03087 int retval;
03088 ChInterp_t interp;
03089 ChVaList_t ap;
03090 int id;
03091
03092 temp_attr = (MCAgency_t)malloc(sizeof(struct agency_s));
03093 CHECK_NULL(temp_attr, exit(-1));
03094 temp_attr->mc_platform = g_mc_platform;
03095
03096 Ch_VaStart(interp, ap, varg);
03097 id = Ch_VaArg(interp, ap, int);
03098 retval = MC_CondBroadcast(temp_attr, id);
03099 Ch_VaEnd(interp, ap);
03100 free(temp_attr);
03101 return retval;
03102 }
03103
03104
03105 EXPORTCH MCAgent_t
03106 MC_ComposeAgent_chdl(void *varg)
03107 {
03108 MCAgent_t retval;
03109
03110
03111 const char* name;
03112 const char* home;
03113 const char* owner;
03114 const char* code;
03115 const char* return_var_name;
03116 const char* server;
03117 int persistent;
03118
03119 ChInterp_t interp;
03120 ChVaList_t ap;
03121
03122 Ch_VaStart(interp, ap, varg);
03123
03124 name = Ch_VaArg(interp, ap, const char*);
03125 home = Ch_VaArg(interp, ap, const char*);
03126 owner = Ch_VaArg(interp, ap, const char*);
03127 code = Ch_VaArg(interp, ap, const char*);
03128 return_var_name = Ch_VaArg(interp, ap, const char*);
03129 server = Ch_VaArg(interp, ap, const char*);
03130 persistent = Ch_VaArg(interp, ap, int);
03131
03132 retval= MC_ComposeAgentS(
03133 name,
03134 home,
03135 owner,
03136 code,
03137 return_var_name,
03138 server,
03139 persistent,
03140 NULL);
03141 Ch_VaEnd(interp, ap);
03142 return retval;
03143 }
03144
03145
03146 EXPORTCH MCAgent_t
03147 MC_ComposeAgentWithWorkgroup_chdl(void *varg)
03148 {
03149 MCAgent_t retval;
03150
03151
03152 const char* name;
03153 const char* home;
03154 const char* owner;
03155 const char* code;
03156 const char* return_var_name;
03157 const char* server;
03158 const char* workgroup_code;
03159 int persistent;
03160
03161 ChInterp_t interp;
03162 ChVaList_t ap;
03163
03164 Ch_VaStart(interp, ap, varg);
03165
03166 name = Ch_VaArg(interp, ap, const char*);
03167 home = Ch_VaArg(interp, ap, const char*);
03168 owner = Ch_VaArg(interp, ap, const char*);
03169 code = Ch_VaArg(interp, ap, const char*);
03170 return_var_name = Ch_VaArg(interp, ap, const char*);
03171 server = Ch_VaArg(interp, ap, const char*);
03172 persistent = Ch_VaArg(interp, ap, int);
03173 workgroup_code = Ch_VaArg(interp, ap, const char*);
03174
03175 retval= MC_ComposeAgentS(
03176 name,
03177 home,
03178 owner,
03179 code,
03180 return_var_name,
03181 server,
03182 persistent,
03183 workgroup_code);
03184 Ch_VaEnd(interp, ap);
03185 return retval;
03186 }
03187
03188
03189 EXPORTCH MCAgent_t
03190 MC_ComposeAgentFromFile_chdl(void *varg)
03191 {
03192 MCAgent_t retval;
03193
03194
03195 const char* name;
03196 const char* home;
03197 const char* owner;
03198 const char* filename;
03199 const char* return_var_name;
03200 const char* server;
03201 int persistent;
03202
03203 ChInterp_t interp;
03204 ChVaList_t ap;
03205
03206 Ch_VaStart(interp, ap, varg);
03207
03208 name = Ch_VaArg(interp, ap, const char*);
03209 home = Ch_VaArg(interp, ap, const char*);
03210 owner = Ch_VaArg(interp, ap, const char*);
03211 filename = Ch_VaArg(interp, ap, const char*);
03212 return_var_name = Ch_VaArg(interp, ap, const char*);
03213 server = Ch_VaArg(interp, ap, const char*);
03214 persistent = Ch_VaArg(interp, ap, int);
03215
03216 retval= MC_ComposeAgentFromFileWithWorkgroup(
03217 name,
03218 home,
03219 owner,
03220 filename,
03221 return_var_name,
03222 server,
03223 persistent,
03224 NULL);
03225 Ch_VaEnd(interp, ap);
03226 return retval;
03227 }
03228
03229
03230 EXPORTCH MCAgent_t
03231 MC_ComposeAgentFromFileWithWorkgroup_chdl(void *varg)
03232 {
03233 MCAgent_t retval;
03234
03235
03236 const char* name;
03237 const char* home;
03238 const char* owner;
03239 const char* filename;
03240 const char* return_var_name;
03241 const char* server;
03242 const char* workgroup;
03243 int persistent;
03244
03245 ChInterp_t interp;
03246 ChVaList_t ap;
03247
03248 Ch_VaStart(interp, ap, varg);
03249
03250 name = Ch_VaArg(interp, ap, const char*);
03251 home = Ch_VaArg(interp, ap, const char*);
03252 owner = Ch_VaArg(interp, ap, const char*);
03253 filename = Ch_VaArg(interp, ap, const char*);
03254 return_var_name = Ch_VaArg(interp, ap, const char*);
03255 server = Ch_VaArg(interp, ap, const char*);
03256 workgroup = Ch_VaArg(interp, ap, const char*);
03257 persistent = Ch_VaArg(interp, ap, int);
03258
03259 retval= MC_ComposeAgentFromFileWithWorkgroup(
03260 name,
03261 home,
03262 owner,
03263 filename,
03264 return_var_name,
03265 server,
03266 persistent,
03267 workgroup);
03268 Ch_VaEnd(interp, ap);
03269 return retval;
03270 }
03271
03272
03273 EXPORTCH int
03274 MC_CondSignal_chdl(void *varg)
03275 {
03276 MCAgency_t temp_attr;
03277 extern mc_platform_p g_mc_platform;
03278 int retval;
03279 ChInterp_t interp;
03280 ChVaList_t ap;
03281 int id;
03282
03283 temp_attr = (MCAgency_t)malloc(sizeof(struct agency_s));
03284 CHECK_NULL(temp_attr, exit(-1));
03285 temp_attr->mc_platform = g_mc_platform;
03286
03287 Ch_VaStart(interp, ap, varg);
03288 id = Ch_VaArg(interp, ap, int);
03289 retval = MC_CondSignal(temp_attr, id);
03290 Ch_VaEnd(interp, ap);
03291 free(temp_attr);
03292 return retval;
03293 }
03294
03295
03296 EXPORTCH int
03297 MC_CondReset_chdl(void *varg)
03298 {
03299 MCAgency_t temp_attr;
03300 extern mc_platform_p g_mc_platform;
03301 int retval;
03302 ChInterp_t interp;
03303 ChVaList_t ap;
03304 int id;
03305
03306 temp_attr = (MCAgency_t)malloc(sizeof(struct agency_s));
03307 CHECK_NULL(temp_attr, exit(-1));
03308 temp_attr->mc_platform = g_mc_platform;
03309
03310 Ch_VaStart(interp, ap, varg);
03311 id = Ch_VaArg(interp, ap, int);
03312 retval = MC_CondReset(temp_attr, id);
03313 Ch_VaEnd(interp, ap);
03314 free(temp_attr);
03315 return retval;
03316 }
03317
03318
03319 EXPORTCH int
03320 MC_CondWait_chdl(void *varg)
03321 {
03322 MCAgency_t temp_attr;
03323 extern mc_platform_p g_mc_platform;
03324 int retval;
03325 ChInterp_t interp;
03326 ChVaList_t ap;
03327 int id;
03328
03329 temp_attr = (MCAgency_t)malloc(sizeof(struct agency_s));
03330 CHECK_NULL(temp_attr, exit(-1));
03331 temp_attr->mc_platform = g_mc_platform;
03332
03333 Ch_VaStart(interp, ap, varg);
03334 id = Ch_VaArg(interp, ap, int);
03335 retval = MC_CondWait(temp_attr, id);
03336 Ch_VaEnd(interp, ap);
03337 free(temp_attr);
03338 return retval;
03339 }
03340
03341 EXPORTCH int
03342 MC_DeleteAgent_chdl(void *varg)
03343 {
03344 ChInterp_t interp;
03345 ChVaList_t ap;
03346 MCAgent_t agent;
03347 const char* agentName;
03348 int retval;
03349
03350 Ch_VaStart(interp, ap, varg);
03351 agentName = Ch_VaArg(interp, ap, const char*);
03352 agent = MC_FindAgentByName(NULL, agentName);
03353 if (agent == NULL) {
03354 return MC_ERR_NOT_FOUND;
03355 }
03356 retval = MC_DeleteAgent(agent);
03357 Ch_VaEnd(interp, ap);
03358 return retval;
03359 }
03360
03361 EXPORTCH int
03362 MC_DeleteAgentWG_chdl(void *varg)
03363 {
03364 ChInterp_t interp;
03365 ChVaList_t ap;
03366 const char* agentName;
03367 MCAgent_t calling_agent;
03368 MCAgent_t agent;
03369 int retval;
03370
03371 Ch_VaStart(interp, ap, varg);
03372 calling_agent = Ch_VaArg(interp, ap, MCAgent_t);
03373 agentName = Ch_VaArg(interp, ap, const char*);
03374 agent = MC_FindAgentByName(NULL, agentName);
03375 if (agent == NULL) {
03376 return MC_ERR_NOT_FOUND;
03377 }
03378 retval = MC_DeleteAgentWG(calling_agent, agent);
03379 Ch_VaEnd(interp, ap);
03380 return retval;
03381 }
03382
03383 EXPORTCH int
03384 MC_DestroyServiceSearchResult_chdl(void* varg)
03385 {
03386 ChInterp_t interp;
03387 ChVaList_t ap;
03388 char** agentName;
03389 char** serviceName;
03390 int* agentID;
03391 int numResult;
03392 int retval;
03393
03394 Ch_VaStart(interp, ap, varg);
03395 agentName = Ch_VaArg(interp, ap, char**);
03396 serviceName = Ch_VaArg(interp, ap, char**);
03397 agentID = Ch_VaArg(interp, ap, int*);
03398 numResult = Ch_VaArg(interp, ap, int);
03399
03400 retval = MC_DestroyServiceSearchResult(
03401 agentName,
03402 serviceName,
03403 agentID,
03404 numResult );
03405 Ch_VaEnd(interp, ap);
03406 return retval;
03407 }
03408
03409
03410 EXPORTCH int
03411 MC_DeregisterService_chdl(void *varg)
03412 {
03413 ChInterp_t interp;
03414 ChVaList_t ap;
03415 MCAgency_t temp_attr;
03416 extern mc_platform_p g_mc_platform;
03417 int agentID;
03418 char *serviceName;
03419 int retval;
03420
03421 temp_attr = (MCAgency_t)malloc(sizeof(struct agency_s));
03422 CHECK_NULL(temp_attr, exit(-1));
03423 temp_attr->mc_platform = g_mc_platform;
03424
03425 Ch_VaStart(interp, ap, varg);
03426 agentID = Ch_VaArg(interp, ap, int);
03427 serviceName = (char*)Ch_VaArg(interp, ap, const char*);
03428 retval = MC_DeregisterService(
03429 temp_attr,
03430 agentID,
03431 serviceName );
03432 Ch_VaEnd(interp, ap);
03433 free(temp_attr);
03434 return retval;
03435 }
03436
03437 EXPORTCH int
03438 MC_End_chdl(void *varg)
03439 {
03440 MCAgency_t temp_attr;
03441 extern mc_platform_p g_mc_platform;
03442 int retval;
03443
03444 temp_attr = (MCAgency_t)malloc(sizeof(struct agency_s));
03445 CHECK_NULL(temp_attr, exit(-1));
03446 temp_attr->mc_platform = g_mc_platform;
03447
03448 retval = MC_End(temp_attr);
03449
03450 return retval;
03451 }
03452
03453
03454 EXPORTCH MCAgent_t
03455 MC_FindAgentByID_chdl(void *varg)
03456 {
03457 MCAgency_t temp_attr;
03458 extern mc_platform_p g_mc_platform;
03459 MCAgent_t retval;
03460 ChInterp_t interp;
03461 ChVaList_t ap;
03462 int id;
03463
03464 temp_attr = (MCAgency_t)malloc(sizeof(struct agency_s));
03465 CHECK_NULL(temp_attr, exit(-1));
03466 temp_attr->mc_platform = g_mc_platform;
03467
03468 Ch_VaStart(interp, ap, varg);
03469 id = Ch_VaArg(interp, ap, int);
03470 retval = MC_FindAgentByID(temp_attr, id);
03471 Ch_VaEnd(interp, ap);
03472 free(temp_attr);
03473 return retval;
03474 }
03475
03476
03477 EXPORTCH MCAgent_t
03478 MC_FindAgentByName_chdl(void *varg)
03479 {
03480 MCAgency_t temp_attr;
03481 extern mc_platform_p g_mc_platform;
03482 MCAgent_t retval;
03483 ChInterp_t interp;
03484 ChVaList_t ap;
03485 const char *name;
03486
03487 temp_attr = (MCAgency_t)malloc(sizeof(struct agency_s));
03488 CHECK_NULL(temp_attr, exit(-1));
03489 temp_attr->mc_platform = g_mc_platform;
03490
03491 Ch_VaStart(interp, ap, varg);
03492 name = Ch_VaArg(interp, ap, const char *);
03493 retval = MC_FindAgentByName(temp_attr, name);
03494 Ch_VaEnd(interp, ap);
03495 free(temp_attr);
03496 return retval;
03497 }
03498
03499
03500 #ifndef _WIN32
03501 EXPORTCH time_t
03502 #else
03503 EXPORTCH SYSTEMTIME
03504 #endif
03505 MC_GetAgentArrivalTime_chdl(void *varg)
03506 {
03507 MCAgent_t agent;
03508 ChInterp_t interp;
03509 ChVaList_t ap;
03510 #ifndef _WIN32
03511 time_t arrival_time;
03512 #else
03513 SYSTEMTIME arrival_time;
03514 #endif
03515
03516 Ch_VaStart(interp, ap, varg);
03517 agent = Ch_VaArg(interp, ap, MCAgent_t);
03518 arrival_time = MC_GetAgentArrivalTime(agent);
03519 Ch_VaEnd(interp, ap);
03520 return arrival_time;
03521 }
03522
03523
03524 EXPORTCH int
03525 MC_GetAgentID_chdl(void *varg)
03526 {
03527 MCAgent_t agent;
03528 ChInterp_t interp;
03529 ChVaList_t ap;
03530 int id;
03531
03532 Ch_VaStart(interp, ap, varg);
03533 agent = Ch_VaArg(interp, ap, MCAgent_t);
03534 id = MC_GetAgentID(agent);
03535 Ch_VaEnd(interp, ap);
03536 return id;
03537 }
03538
03539
03540 EXPORTCH char*
03541 MC_GetAgentName_chdl(void *varg)
03542 {
03543 MCAgent_t agent;
03544 ChInterp_t interp;
03545 ChVaList_t ap;
03546 char* name;
03547
03548 Ch_VaStart(interp, ap, varg);
03549 agent = Ch_VaArg(interp, ap, MCAgent_t);
03550 name = MC_GetAgentName(agent);
03551 Ch_VaEnd(interp, ap);
03552 return name;
03553 }
03554
03555
03556 EXPORTCH int
03557 MC_GetAgentNumTasks_chdl(void *varg)
03558 {
03559 MCAgent_t agent;
03560 ChInterp_t interp;
03561 ChVaList_t ap;
03562 int num_tasks;
03563
03564 Ch_VaStart(interp, ap, varg);
03565 agent = Ch_VaArg(interp, ap, MCAgent_t);
03566 num_tasks = MC_GetAgentNumTasks(agent);
03567 Ch_VaEnd(interp, ap);
03568 return num_tasks;
03569 }
03570
03571
03572 EXPORTCH int
03573 MC_GetAgentStatus_chdl(void *varg)
03574 {
03575 MCAgent_t agent;
03576 int status;
03577 ChInterp_t interp;
03578 ChVaList_t ap;
03579
03580 Ch_VaStart(interp, ap, varg);
03581 agent = Ch_VaArg(interp, ap, MCAgent_t);
03582 status = MC_GetAgentStatus(agent);
03583 Ch_VaEnd(interp, ap);
03584 return status;
03585 }
03586
03587
03588 EXPORTCH char *
03589 MC_GetAgentXMLString_chdl(void *varg)
03590 {
03591 ChInterp_t interp;
03592 ChVaList_t ap;
03593 MCAgent_t agent;
03594 char *retval;
03595
03596 Ch_VaStart(interp, ap, varg);
03597 agent = Ch_VaArg(interp, ap, MCAgent_t);
03598 retval = MC_GetAgentXMLString(agent);
03599 Ch_VaEnd(interp, ap);
03600 return retval;
03601 }
03602
03603 #ifndef _WIN32
03604 EXPORTCH int
03605 MC_GetTimeOfDay_chdl(void *varg)
03606 {
03607 ChInterp_t interp;
03608 ChVaList_t ap;
03609 struct timeval *tv;
03610 Ch_VaStart(interp, ap, varg);
03611 tv = Ch_VaArg(interp, ap, struct timeval*);
03612 gettimeofday(tv, NULL);
03613 Ch_VaEnd(interp, ap);
03614 return 0;
03615 }
03616 #endif
03617
03618
03619 EXPORTCH int
03620 MC_HaltAgency_chdl(void *varg)
03621 {
03622 MCAgency_t temp_attr;
03623 int retval;
03624 extern mc_platform_p g_mc_platform;
03625
03626 temp_attr = (MCAgency_t)malloc(sizeof(struct agency_s));
03627 CHECK_NULL(temp_attr, exit(-1));
03628 temp_attr->mc_platform = g_mc_platform;
03629
03630 retval = MC_HaltAgency(temp_attr);
03631
03632 free(temp_attr);
03633 return retval;
03634 }
03635
03636 EXPORTCH int
03637 MC_MigrateAgent_chdl(void *varg)
03638 {
03639 MCAgent_t agent;
03640 const char* hostname;
03641 int port;
03642 int retval;
03643 ChInterp_t interp;
03644 ChVaList_t ap;
03645
03646 Ch_VaStart(interp, ap, varg);
03647 agent = Ch_VaArg(interp, ap, MCAgent_t);
03648 hostname = Ch_VaArg(interp, ap, const char*);
03649 port = Ch_VaArg(interp, ap, int);
03650 retval = MC_MigrateAgent(agent, hostname, port);
03651 return retval;
03652 }
03653
03654
03655 EXPORTCH int
03656 MC_MutexLock_chdl(void *varg)
03657 {
03658 MCAgency_t temp_attr;
03659 extern mc_platform_p g_mc_platform;
03660
03661 ChInterp_t interp;
03662 ChVaList_t ap;
03663 int id;
03664 int retval;
03665
03666 temp_attr = (MCAgency_t)malloc(sizeof(struct agency_s));
03667 CHECK_NULL(temp_attr, exit(-1));
03668 temp_attr->mc_platform = g_mc_platform;
03669
03670 Ch_VaStart(interp, ap, varg);
03671 id = Ch_VaArg(interp, ap, int );
03672 retval = MC_MutexLock(temp_attr, id);
03673 Ch_VaEnd(interp, ap);
03674 free(temp_attr);
03675 return retval;
03676 }
03677
03678
03679 EXPORTCH int
03680 MC_MutexUnlock_chdl(void *varg)
03681 {
03682 MCAgency_t temp_attr;
03683 extern mc_platform_p g_mc_platform;
03684
03685 ChInterp_t interp;
03686 ChVaList_t ap;
03687 int id;
03688 int retval;
03689
03690 temp_attr = (MCAgency_t)malloc(sizeof(struct agency_s));
03691 CHECK_NULL(temp_attr, exit(-1));
03692 temp_attr->mc_platform = g_mc_platform;
03693
03694 Ch_VaStart(interp, ap, varg);
03695 id = Ch_VaArg(interp, ap, int );
03696 retval = MC_MutexUnlock(temp_attr, id);
03697 Ch_VaEnd(interp, ap);
03698 free(temp_attr);
03699 return retval;
03700 }
03701
03702
03703 EXPORTCH int
03704 MC_PrintAgentCode_chdl(void *varg)
03705 {
03706 ChInterp_t interp;
03707 ChVaList_t ap;
03708 MCAgent_t agent;
03709 int retval;
03710
03711 Ch_VaStart(interp, ap, varg);
03712 agent = Ch_VaArg(interp, ap, MCAgent_t);
03713 retval = MC_PrintAgentCode(agent);
03714 Ch_VaEnd(interp, ap);
03715 return retval;
03716 }
03717
03718
03719 EXPORTCH int
03720 MC_RegisterService_chdl(void *varg)
03721 {
03722 ChInterp_t interp;
03723 ChVaList_t ap;
03724 int retval;
03725 MCAgency_t temp_attr;
03726 extern mc_platform_p g_mc_platform;
03727
03728
03729 MCAgent_t agent;
03730 char **serviceNames;
03731 int numServices;
03732
03733 temp_attr = (MCAgency_t)malloc(sizeof(struct agency_s));
03734 CHECK_NULL(temp_attr, exit(-1));
03735 temp_attr->mc_platform = g_mc_platform;
03736
03737 Ch_VaStart(interp, ap, varg);
03738 agent = Ch_VaArg(interp, ap, MCAgent_t);
03739 serviceNames = Ch_VaArg(interp, ap, char **);
03740 numServices = Ch_VaArg(interp, ap, int);
03741
03742 retval = MC_RegisterService(
03743 temp_attr,
03744 agent,
03745 0,
03746 NULL,
03747 serviceNames,
03748 numServices
03749 );
03750 Ch_VaEnd(interp, ap);
03751 free(temp_attr);
03752 return retval;
03753 }
03754
03755
03756 EXPORTCH int
03757 MC_ResumeAgency_chdl(void *varg)
03758 {
03759 MCAgency_t temp_attr;
03760 int retval;
03761 extern mc_platform_p g_mc_platform;
03762
03763 temp_attr = (MCAgency_t)malloc(sizeof(struct agency_s));
03764 CHECK_NULL(temp_attr, exit(-1));
03765 temp_attr->mc_platform = g_mc_platform;
03766
03767 retval = MC_ResumeAgency(temp_attr);
03768
03769 free(temp_attr);
03770 return retval;
03771 }
03772
03773
03774 EXPORTCH MCAgent_t
03775 MC_RetrieveAgent_chdl(void *varg)
03776 {
03777 MCAgency_t temp_attr;
03778 extern mc_platform_p g_mc_platform;
03779 MCAgent_t agent;
03780
03781 temp_attr = (MCAgency_t)malloc(sizeof(struct agency_s));
03782 CHECK_NULL(temp_attr, exit(-1));
03783 temp_attr->mc_platform = g_mc_platform;
03784
03785 agent = MC_RetrieveAgent(temp_attr);
03786 free(temp_attr);
03787 return agent;
03788 }
03789
03790
03791 EXPORTCH char *
03792 MC_RetrieveAgentCode_chdl(void *varg)
03793 {
03794 ChInterp_t interp;
03795 ChVaList_t ap;
03796 MCAgent_t agent;
03797 char *retval;
03798
03799 Ch_VaStart(interp, ap, varg);
03800 agent = Ch_VaArg(interp, ap, MCAgent_t);
03801 retval = MC_RetrieveAgentCode(agent);
03802 Ch_VaEnd(interp, ap);
03803 return retval;
03804 }
03805
03806
03807 EXPORTCH int
03808 MC_SaveData_chdl(void* varg)
03809 {
03810 ChInterp_t interp;
03811 ChVaList_t ap;
03812 interpreter_variable_data_p interp_var_data;
03813 MCAgent_t agent;
03814 int progress;
03815 const char* name;
03816 int size;
03817 void* data;
03818
03819 Ch_VaStart(interp, ap, varg);
03820 agent = Ch_VaArg(interp, ap, MCAgent_t);
03821 name = Ch_VaArg(interp, ap, char*);
03822 size = Ch_VaArg(interp, ap, int);
03823 data = Ch_VaArg(interp, ap, void*);
03824
03825 progress = agent->datastate->task_progress;
03826
03827 interp_var_data = interpreter_variable_data_New();
03828 interp_var_data->name = strdup(name);
03829 interp_var_data->size = size;
03830 interp_var_data->data_type = CH_VOIDPTRTYPE;
03831 interp_var_data->data = malloc(size);
03832 memcpy(interp_var_data->data, data, size);
03833
03834 agent_variable_list_Add(
03835 agent->datastate->tasks[progress]->agent_variable_list,
03836 interp_var_data );
03837
03838 return 0;
03839 }
03840
03841
03842 EXPORTCH int
03843 MC_SearchForService_chdl(void *varg)
03844 {
03845 ChInterp_t interp;
03846 ChVaList_t ap;
03847 int retval;
03848 MCAgency_t temp_attr;
03849 extern mc_platform_p g_mc_platform;
03850
03851
03852 const char* searchString;
03853 char*** agentNames;
03854 char*** serviceNames;
03855 int** agentIDs;
03856 int* numResults;
03857
03858 temp_attr = (MCAgency_t)malloc(sizeof(struct agency_s));
03859 CHECK_NULL(temp_attr, exit(-1));
03860 temp_attr->mc_platform = g_mc_platform;
03861
03862 Ch_VaStart(interp, ap, varg);
03863 searchString = Ch_VaArg(interp, ap, const char*);
03864 agentNames = Ch_VaArg(interp, ap, char***);
03865 serviceNames = Ch_VaArg(interp, ap, char***);
03866 agentIDs = Ch_VaArg(interp, ap, int**);
03867 numResults = Ch_VaArg(interp, ap, int*);
03868
03869 retval = MC_SearchForService(
03870 temp_attr,
03871 searchString,
03872 agentNames,
03873 serviceNames,
03874 agentIDs,
03875 numResults
03876 );
03877 Ch_VaEnd(interp, ap);
03878 free(temp_attr);
03879 return retval;
03880 }
03881
03882
03883 EXPORTCH int
03884 MC_SemaphorePost_chdl(void *varg)
03885 {
03886 MCAgency_t temp_attr;
03887 extern mc_platform_p g_mc_platform;
03888
03889 ChInterp_t interp;
03890 ChVaList_t ap;
03891 int id;
03892 int retval;
03893
03894 temp_attr = (MCAgency_t)malloc(sizeof(struct agency_s));
03895 CHECK_NULL(temp_attr, exit(-1));
03896 temp_attr->mc_platform = g_mc_platform;
03897
03898 Ch_VaStart(interp, ap, varg);
03899 id = Ch_VaArg(interp, ap, int );
03900 retval = MC_SemaphorePost(temp_attr, id);
03901 Ch_VaEnd(interp, ap);
03902 free(temp_attr);
03903 return retval;
03904 }
03905
03906
03907 EXPORTCH int
03908 MC_SemaphoreWait_chdl(void *varg)
03909 {
03910 MCAgency_t temp_attr;
03911 extern mc_platform_p g_mc_platform;
03912
03913 ChInterp_t interp;
03914 ChVaList_t ap;
03915 int id;
03916 int retval;
03917
03918 temp_attr = (MCAgency_t)malloc(sizeof(struct agency_s));
03919 CHECK_NULL(temp_attr, exit(-1));
03920 temp_attr->mc_platform = g_mc_platform;
03921
03922 Ch_VaStart(interp, ap, varg);
03923 id = Ch_VaArg(interp, ap, int );
03924 retval = MC_SemaphoreWait(temp_attr, id);
03925 Ch_VaEnd(interp, ap);
03926 free(temp_attr);
03927 return retval;
03928 }
03929
03930
03931 EXPORTCH int
03932 MC_SendAgentMigrationMessage_chdl(void *varg)
03933 {
03934 MCAgency_t temp_attr;
03935 extern mc_platform_p g_mc_platform;
03936 const char *message, *hostname;
03937 int port, retval;
03938 ChInterp_t interp;
03939 ChVaList_t ap;
03940
03941 temp_attr = (MCAgency_t)malloc(sizeof(struct agency_s));
03942 CHECK_NULL(temp_attr, exit(-1));
03943 temp_attr->mc_platform = g_mc_platform;
03944
03945 Ch_VaStart(interp, ap, varg);
03946 message = Ch_VaArg(interp, ap, char *);
03947 hostname = Ch_VaArg(interp, ap, char *);
03948 port = Ch_VaArg(interp, ap, int);
03949 retval = MC_SendAgentMigrationMessage(temp_attr, message, hostname, port);
03950 Ch_VaEnd(interp, ap);
03951 free(temp_attr);
03952 return retval;
03953 }
03954
03955
03956 EXPORTCH int
03957 MC_SendAgentMigrationMessageFile_chdl(void *varg)
03958 {
03959 MCAgency_t temp_attr;
03960 char *filename, *hostname;
03961 int port, retval;
03962 ChInterp_t interp;
03963 ChVaList_t ap;
03964
03965 temp_attr = NULL;
03966
03967 Ch_VaStart(interp, ap, varg);
03968 filename = Ch_VaArg(interp, ap, char *);
03969 hostname = Ch_VaArg(interp, ap, char *);
03970 port = Ch_VaArg(interp, ap, int);
03971 retval = MC_SendAgentMigrationMessageFile(temp_attr, filename, hostname, port);
03972 Ch_VaEnd(interp, ap);
03973 return retval;
03974 }
03975
03976 EXPORTCH int
03977 MC_SendSteerCommand_chdl(void *varg)
03978 {
03979 MCAgency_t temp_attr;
03980 int retval;
03981 enum MC_SteerCommand_e command;
03982 extern mc_platform_p g_mc_platform;
03983 ChInterp_t interp;
03984 ChVaList_t ap;
03985
03986 temp_attr = (MCAgency_t)malloc(sizeof(struct agency_s));
03987 CHECK_NULL(temp_attr, exit(-1));
03988 temp_attr->mc_platform = g_mc_platform;
03989
03990 Ch_VaStart(interp, ap, varg);
03991 command = Ch_VaArg(interp, ap, enum MC_SteerCommand_e );
03992 retval = MC_SendSteerCommand(temp_attr, command);
03993 Ch_VaEnd(interp, ap);
03994 free(temp_attr);
03995 return retval;
03996 }
03997
03998
03999 EXPORTCH int
04000 MC_SetAgentStatus_chdl(void *varg)
04001 {
04002 MCAgent_t agent;
04003 int status;
04004 int ret;
04005 ChInterp_t interp;
04006 ChVaList_t ap;
04007
04008 Ch_VaStart(interp, ap, varg);
04009 agent = Ch_VaArg(interp, ap, MCAgent_t);
04010 status = Ch_VaArg(interp, ap, int);
04011 ret = MC_SetAgentStatus(agent, (enum MC_AgentStatus_e) status);
04012 Ch_VaEnd(interp, ap);
04013 return ret;
04014 }
04015
04016
04017 EXPORTCH int
04018 MC_SetDefaultAgentStatus_chdl(void *varg)
04019 {
04020 MCAgency_t temp_attr;
04021 extern mc_platform_p g_mc_platform;
04022 int status;
04023 int ret;
04024 ChInterp_t interp;
04025 ChVaList_t ap;
04026
04027 temp_attr = (MCAgency_t)malloc(sizeof(struct agency_s));
04028 CHECK_NULL(temp_attr, exit(1););
04029 temp_attr->mc_platform = g_mc_platform;
04030
04031 Ch_VaStart(interp, ap, varg);
04032 status = Ch_VaArg(interp, ap, int);
04033 ret = (int)MC_SetDefaultAgentStatus(temp_attr, (enum MC_AgentStatus_e)status);
04034 Ch_VaEnd(interp, ap);
04035 free(temp_attr);
04036 return ret;
04037 }
04038
04039
04040 EXPORTCH int
04041 MC_SyncDelete_chdl(void *varg)
04042 {
04043 MCAgency_t temp_attr;
04044 extern mc_platform_p g_mc_platform;
04045 int retval;
04046 ChInterp_t interp;
04047 ChVaList_t ap;
04048 int id;
04049
04050 temp_attr = (MCAgency_t)malloc(sizeof(struct agency_s));
04051 CHECK_NULL(temp_attr, exit(-1));
04052 temp_attr->mc_platform = g_mc_platform;
04053
04054 Ch_VaStart(interp, ap, varg);
04055 id = Ch_VaArg(interp, ap, int);
04056 retval = MC_SyncDelete(temp_attr, id);
04057 Ch_VaEnd(interp, ap);
04058 free(temp_attr);
04059 return retval;
04060 }
04061
04062
04063 EXPORTCH int
04064 MC_SyncInit_chdl(void *varg)
04065 {
04066 MCAgency_t temp_attr;
04067 extern mc_platform_p g_mc_platform;
04068 int retval;
04069 ChInterp_t interp;
04070 ChVaList_t ap;
04071 int id;
04072
04073 temp_attr = (MCAgency_t)malloc(sizeof(struct agency_s));
04074 CHECK_NULL(temp_attr, exit(-1));
04075 temp_attr->mc_platform = g_mc_platform;
04076
04077 Ch_VaStart(interp, ap, varg);
04078 id = Ch_VaArg(interp, ap, int);
04079
04080 retval = MC_SyncInit(temp_attr, id);
04081 Ch_VaEnd(interp, ap);
04082 free(temp_attr);
04083 return retval;
04084 }
04085
04086
04087 EXPORTCH int
04088 MC_TerminateAgent_chdl(void *varg)
04089 {
04090 ChInterp_t interp;
04091 ChVaList_t ap;
04092 const char* agentName;
04093 MCAgent_t agent;
04094 int retval;
04095
04096 Ch_VaStart(interp, ap, varg);
04097 agentName = Ch_VaArg(interp, ap, const char*);
04098 agent = MC_FindAgentByName(NULL, agentName);
04099 if (agent == NULL) {
04100 return MC_ERR_NOT_FOUND;
04101 }
04102 retval = MC_TerminateAgent(agent);
04103 Ch_VaEnd(interp, ap);
04104 return retval;
04105 }
04106
04107
04108 EXPORTCH int
04109 MC_TerminateAgentWG_chdl(void *varg)
04110 {
04111 ChInterp_t interp;
04112 ChVaList_t ap;
04113 const char* agentName;
04114 MCAgent_t calling_agent;
04115 MCAgent_t agent;
04116 int retval;
04117
04118 Ch_VaStart(interp, ap, varg);
04119 calling_agent = Ch_VaArg(interp, ap, MCAgent_t);
04120 agentName = Ch_VaArg(interp, ap, const char*);
04121 agent = MC_FindAgentByName(NULL, agentName);
04122 if (agent == NULL) {
04123 return MC_ERR_NOT_FOUND;
04124 }
04125 retval = MC_TerminateAgentWG(calling_agent, agent);
04126 Ch_VaEnd(interp, ap);
04127 return retval;
04128 }