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