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
00035 #ifndef _WIN32
00036 #include <unistd.h>
00037 #endif
00038
00039 #include <embedch.h>
00040
00041 #include "include/libmc.h"
00042 #include "include/agent.h"
00043 #include "include/mc_platform.h"
00044 #include "include/message.h"
00045 #include "include/agent_lib.h"
00046 #include "include/interpreter_variable_data.h"
00047 #include "include/xml_parser.h"
00048
00049 int agent_AddPersistentVariable(agent_p agent, int task_num, const char* var_name)
00050 {
00051 int i;
00052 int size;
00053 int data_type_size;
00054 int progress;
00055 interpreter_variable_data_t *agent_variable_data;
00056 agent_variable_data = (interpreter_variable_data_t*)malloc(sizeof(interpreter_variable_data_t));
00057 agent_variable_data->name = strdup(var_name);
00058
00059
00060 agent_variable_data->data_type = Ch_DataType(
00061 agent->agent_interp,
00062 var_name );
00063
00064 if (agent_variable_data->data_type == CH_UNDEFINETYPE) {
00065 free(agent_variable_data);
00066 fprintf(stderr, "Warning: agent %s attempted saving of invalid variable, %s. %s:%d\n",
00067 agent->name, var_name, __FILE__, __LINE__);
00068 return MC_ERR;
00069 }
00070
00071 agent_variable_data->array_dim = Ch_ArrayDim(
00072 agent->agent_interp,
00073 var_name );
00074
00075 agent_variable_data->array_extent = (int*)malloc(
00076 sizeof(int) * agent_variable_data->array_dim );
00077 for (i=0; i<agent_variable_data->array_dim; i++) {
00078 agent_variable_data->array_extent[i] =
00079 Ch_ArrayExtent(
00080 agent->agent_interp,
00081 var_name,
00082 i );
00083 }
00084
00085 size = 1;
00086 for (i=0; i < agent_variable_data->array_dim; i++) {
00087 size *= agent_variable_data->array_extent[i];
00088 }
00089
00090
00091 CH_DATATYPE_SIZE(agent_variable_data->data_type, data_type_size);
00092
00093 agent_variable_data->data = (void*)malloc(size * data_type_size);
00094 CHECK_NULL(agent_variable_data->data, exit(0));
00095
00096
00097 progress = agent->datastate->task_progress;
00098 i = 0;
00099
00100 if (agent_variable_data->array_dim == 0) {
00101 memcpy(
00102 agent_variable_data->data,
00103 (void*)Ch_GlobalSymbolAddrByName(
00104 agent->agent_interp,
00105 var_name),
00106 size*data_type_size
00107 );
00108
00109 } else {
00110 memcpy(
00111 agent_variable_data->data,
00112 (void*)Ch_GlobalSymbolAddrByName(
00113 agent->agent_interp,
00114 var_name),
00115 size*data_type_size
00116 );
00117 }
00118 agent_variable_data->size = size*data_type_size;
00119
00120
00121 agent_variable_list_Remove(
00122 agent->datastate->tasks[task_num]->agent_variable_list,
00123 var_name);
00124 agent_variable_list_Add(
00125 agent->datastate->tasks[task_num]->agent_variable_list,
00126 agent_variable_data);
00127 return 0;
00128 }
00129
00130 agent_p
00131 agent_Copy(const agent_p agent)
00132 {
00133 agent_p cp_agent;
00134 cp_agent = (agent_p)malloc(sizeof(agent_t));
00135
00136 MUTEX_LOCK(agent->lock);
00137
00138 cp_agent->id = agent->id;
00139
00140 cp_agent->name = (char*)malloc
00141 (
00142 sizeof(char) *
00143 (strlen(agent->name) + 1)
00144 );
00145 strcpy(cp_agent->name, agent->name);
00146
00147
00148 cp_agent->arrival_time = agent->arrival_time;
00149
00150 cp_agent->owner = (char*)malloc
00151 (
00152 sizeof(char) *
00153 (strlen(agent->owner) + 1)
00154 );
00155 strcpy(cp_agent->owner, agent->owner);
00156
00157 cp_agent->home = (char*)malloc
00158 (
00159 sizeof(char) *
00160 (strlen(agent->home) + 1)
00161 );
00162 strcpy(cp_agent->home, agent->home);
00163
00164 cp_agent->home_port = agent->home_port;
00165
00166 cp_agent->datastate = agent_datastate_Copy(agent->datastate);
00167
00168 cp_agent->orphan = 1;
00169
00170 cp_agent->agent_type = agent->agent_type;
00171
00172 cp_agent->agent_status = agent->agent_status;
00173
00174 cp_agent->return_data = agent->return_data;
00175
00176 cp_agent->agent_interp = NULL;
00177
00178 cp_agent->agent_thread = NULL;
00179
00180 cp_agent->run_lock = (MUTEX_T*)malloc(sizeof(MUTEX_T));
00181 MUTEX_INIT(cp_agent->run_lock);
00182
00183 cp_agent->agent_persistent = agent->agent_persistent;
00184
00185
00186 cp_agent->lock = (MUTEX_T*)malloc(sizeof(MUTEX_T));
00187 MUTEX_INIT(cp_agent->lock);
00188
00189 return cp_agent;
00190 }
00191
00192 agent_p
00193 agent_New(void)
00194 {
00195 agent_p agent;
00196 agent = (agent_p)malloc(sizeof(agent_t));
00197 if(agent==NULL) {
00198 fprintf(stderr, "Memory error at %s:%d\n",
00199 __FILE__, __LINE__);
00200 return NULL;
00201 }
00202
00203 memset(agent, 0, sizeof(agent_t));
00204
00205
00206 MUTEX_NEW(agent->run_lock);
00207 MUTEX_INIT(agent->run_lock);
00208
00209 MUTEX_NEW(agent->lock);
00210 MUTEX_INIT(agent->lock);
00211
00212 return agent;
00213 }
00214
00215 agent_p
00216 agent_Initialize(
00217 struct mc_platform_s *mc_platform,
00218 message_p message,
00219 int id)
00220 {
00221 agent_p agent;
00222 int err_code;
00223
00224
00225 agent = (MCAgent_t)malloc(sizeof(agent_t));
00226 memset(agent, 0, sizeof(agent_t));
00227
00228
00229 agent->lock = (MUTEX_T*)malloc(sizeof(MUTEX_T));
00230 MUTEX_INIT(agent->lock);
00231
00232
00233 agent->run_lock = (MUTEX_T*)malloc(sizeof(MUTEX_T));
00234 MUTEX_INIT(agent->run_lock);
00235
00236
00237 agent->id = id;
00238 #ifndef _WIN32
00239 agent->arrival_time = time(NULL);
00240 #else
00241 GetSystemTime( &(agent->arrival_time) );
00242 #endif
00243
00244 agent->home = NULL;
00245 agent->sender = NULL;
00246
00247
00248 agent->orphan = 0;
00249 agent->agent_script_ready = 1;
00250 agent->agent_pipe_ready_to_read = 0;
00251 agent->agent_ready_to_send = 0;
00252 agent->agent_pipe_active = 0;
00253
00254
00255 agent->agent_thread = NULL;
00256 agent->agent_thread_id = 0;
00257
00258
00259 agent->mailbox = agent_mailbox_New();
00260
00261
00262 agent->datastate = agent_datastate_New();
00263 agent->datastate->xml_agent_root = message->xml_payload;
00264 agent->datastate->xml_root = message->xml_root;
00265 message->agent_xml_flag = 1;
00266
00267 if (agent->datastate->xml_agent_root != NULL) {
00268 switch(message->message_type) {
00269 case MOBILE_AGENT:
00270 agent->agent_type = MC_REMOTE_AGENT;
00271 if( (err_code = agent_xml_parse(agent))) {
00272 fprintf(stderr, "error code %d. %s:%d\n",
00273 err_code, __FILE__, __LINE__ );
00274 agent_Destroy(agent);
00275 return NULL;
00276 }
00277 if (mc_platform->default_agentstatus != -1) {
00278 agent->agent_status = mc_platform->default_agentstatus;
00279 }
00280 break;
00281 case RETURN_MSG:
00282 agent->agent_type = MC_RETURN_AGENT;
00283 if( (err_code = agent_xml_parse(agent))) {
00284 fprintf(stderr, "error code %d. %s:%d\n",
00285 err_code, __FILE__, __LINE__ );
00286 agent_Destroy(agent);
00287 return NULL;
00288 }
00289 break;
00290 default:
00291 fprintf(stderr, "Invalid agent type: %d %s:%d\n",
00292 agent->agent_type, __FILE__, __LINE__ );
00293 }
00294 } else {
00295 mc_platform->err = MC_ERR_PARSE;
00296
00297 MUTEX_DESTROY(agent->lock);
00298 free(agent->lock);
00299 MUTEX_DESTROY(agent->run_lock);
00300 free(agent->run_lock);
00301
00302 free(agent);
00303 return NULL;
00304 }
00305
00306
00307
00308
00309
00310
00311
00312
00313
00314
00315
00316
00317 agent->agent_status = MC_WAIT_CH;
00318
00319 agent->mc_platform = mc_platform;
00320
00321
00322 return agent;
00323 }
00324
00325 int
00326 agent_Destroy(agent_p agent)
00327 {
00328 if (agent == NULL) {
00329 return MC_SUCCESS;
00330 }
00331 MUTEX_LOCK(agent->lock);
00332 if (agent->name != NULL) {
00333 free(agent->name);
00334 }
00335 if (agent->owner != NULL) {
00336 free(agent->owner);
00337 }
00338 if (agent->home != NULL) {
00339 free(agent->home);
00340 }
00341 if (agent->sender != NULL) {
00342 free(agent->sender);
00343 }
00344
00345 MUTEX_DESTROY(agent->lock);
00346 if (agent->agent_status == MC_AGENT_NEUTRAL) {
00347 if ((agent->agent_interp) != NULL) {
00348 Ch_End(agent->agent_interp);
00349 }
00350 }
00351 free(agent->lock);
00352 agent_datastate_Destroy(agent->datastate);
00353 free(agent->agent_thread);
00354 free(agent->run_lock);
00355 agent_mailbox_Destroy(agent->mailbox);
00356
00357 free(agent);
00358 agent = NULL;
00359 return MC_SUCCESS;
00360 }
00361
00362 extern void
00363 agent_RunChScript(agent_p agent, mc_platform_p mc_platform)
00364 {
00365 #ifndef _WIN32
00366 pthread_attr_t attr;
00367 pthread_attr_init(&attr);
00368 if(mc_platform->stack_size[MC_THREAD_AGENT] != -1) {
00369 pthread_attr_setstacksize
00370 (
00371 &attr,
00372 mc_platform->stack_size[MC_THREAD_AGENT]
00373 );
00374 }
00375 pthread_attr_setdetachstate
00376 (
00377 &attr,
00378 PTHREAD_CREATE_DETACHED
00379 );
00380 #else
00381 int stack_size;
00382 if (mc_platform->stack_size[MC_THREAD_AGENT] < 1) {
00383 stack_size = mc_platform->stack_size[MC_THREAD_AGENT]+1;
00384 } else {
00385 stack_size = mc_platform->stack_size[MC_THREAD_AGENT];
00386 }
00387 #endif
00388 if(agent->agent_thread == NULL)
00389 {
00390 agent->agent_thread = (THREAD_T *)malloc(sizeof(THREAD_T));
00391 }
00392
00393 agent->agent_status = MC_AGENT_ACTIVE;
00394 agent->mc_platform = mc_platform;
00395
00396 THREAD_CREATE(agent->agent_thread,
00397 agent_RunChScriptThread,
00398 agent );
00399
00400 return;
00401 }
00402
00403 #ifndef _WIN32
00404 void*
00405 agent_RunChScriptThread(void * ChAgent)
00406 #else
00407 DWORD WINAPI
00408 agent_RunChScriptThread(void* ChAgent)
00409 #endif
00410 {
00411 #ifndef _WIN32
00412 int fd;
00413 #endif
00414 MCAgent_t agent;
00415 mc_platform_p mc_platform;
00416 int i,n;
00417 FILE *TEMP_FILE;
00418 char *temp_store_file;
00419 char *ChShellArg[2];
00420 void *result;
00421 int progress;
00422 char *tmp_buf;
00423
00424
00425 agent = (MCAgent_t)ChAgent;
00426 progress = agent->datastate->task_progress;
00427 mc_platform = agent->mc_platform;
00428
00429
00430 if(ChAgent == NULL)
00431 {
00432 printf("ERROR, AGENT NULL \n");
00433 #ifndef _WIN32
00434 return NULL;
00435 #else
00436 return 0;
00437 #endif
00438 }
00439
00440
00441 if( ((MCAgent_t)ChAgent)->mc_platform->interp_options == NULL ) {
00442
00443 if(Ch_Initialize(&(((MCAgent_t)ChAgent)->agent_interp),
00444 NULL))
00445 {
00446 printf("CH INIT ERROR \n");
00447 exit(EXIT_FAILURE);
00448 }
00449 } else {
00450 if(Ch_Initialize(&(((MCAgent_t)ChAgent)->agent_interp),
00451 ((MCAgent_t)ChAgent)->mc_platform->interp_options))
00452 {
00453 printf("CH INIT ERROR \n");
00454 exit(EXIT_FAILURE);
00455 }
00456 }
00457
00458
00459 tmp_buf = malloc(sizeof(char) * 200);
00460 tmp_buf[0] = '\0';
00461 sprintf(tmp_buf, "int mc_agent_id=%d;", (int)agent->id);
00462 Ch_DeclareVar(
00463 agent->agent_interp,
00464 tmp_buf
00465 );
00466
00467 tmp_buf[0] = '\0';
00468 sprintf(tmp_buf,
00469 "char mc_agent_name[]=\"%s\";",
00470 agent->name
00471 );
00472 Ch_DeclareVar(
00473 agent->agent_interp,
00474 tmp_buf
00475 );
00476
00477 tmp_buf[0] = '\0';
00478 sprintf(tmp_buf, "void* mc_current_agent = (void*)%d;", (int)agent);
00479 Ch_DeclareVar(
00480 agent->agent_interp,
00481 tmp_buf
00482 );
00483
00484 tmp_buf[0] = '\0';
00485 sprintf(tmp_buf, "char mc_host_name[] = \"%s\";",
00486 agent->mc_platform->hostname );
00487 Ch_DeclareVar(
00488 agent->agent_interp,
00489 tmp_buf
00490 );
00491
00492 tmp_buf[0] = '\0';
00493 sprintf(tmp_buf, "int mc_host_port = %d;\n",
00494 agent->mc_platform->port );
00495 Ch_DeclareVar(
00496 agent->agent_interp,
00497 tmp_buf
00498 );
00499
00500 tmp_buf[0] = '\0';
00501 sprintf(tmp_buf, "int mc_task_progress = %d;\n",
00502 agent->datastate->task_progress);
00503 Ch_DeclareVar(
00504 agent->agent_interp,
00505 tmp_buf
00506 );
00507
00508 tmp_buf[0] = '\0';
00509 sprintf(tmp_buf, "int mc_num_tasks = %d;\n",
00510 agent->datastate->number_of_tasks );
00511 Ch_DeclareVar(
00512 agent->agent_interp,
00513 tmp_buf
00514 );
00515
00516
00517 tmp_buf[0] = '\0';
00518 sprintf(tmp_buf, "enum error_code_e {MC_SUCCESS = 0, MC_ERR, MC_ERR_CONNECT, MC_ERR_PARSE, MC_ERR_EMPTY, MC_ERR_INVALID, MC_ERR_INVALID_ARGS, MC_ERR_NOT_FOUND, MC_ERR_MEMORY, MC_ERR_SEND, MC_WARN_DUPLICATE };" );
00519 Ch_DeclareVar(
00520 agent->agent_interp,
00521 tmp_buf
00522 );
00523
00524 tmp_buf[0] = '\0';
00525 sprintf(tmp_buf, "enum MC_SteerCommand_e {MC_RUN = 0, MC_SUSPEND, MC_RESTART, MC_STOP};" );
00526 Ch_DeclareVar(
00527 agent->agent_interp,
00528 tmp_buf
00529 );
00530
00531 tmp_buf[0] = '\0';
00532 sprintf(tmp_buf, "enum mc_AgentStatus_e { MC_WAIT_CH, MC_WAIT_MESSGSEND, MC_AGENT_ACTIVE, MC_AGENT_NEUTRAL, MC_AGENT_SUSPENDED, MC_WAIT_FINISHED};");
00533 Ch_DeclareVar(
00534 agent->agent_interp,
00535 tmp_buf
00536 );
00537
00538 free(tmp_buf);
00539
00540 Ch_DeclareVar(
00541 agent->agent_interp,
00542 "void* MCAgent_t;"
00543 );
00544 Ch_DeclareTypedef(
00545 agent->agent_interp,
00546 "MCAgent_t"
00547 );
00548
00549
00550 Ch_DeclareFunc(
00551 agent->agent_interp,
00552 "int mc_AclDestroy(void* acl_message);",
00553 (ChFuncdl_t)MC_AclDestroy_chdl
00554 );
00555 Ch_DeclareFunc(
00556 agent->agent_interp,
00557 "void* mc_AclNew(void);",
00558 (ChFuncdl_t)MC_AclNew_chdl
00559 );
00560 Ch_DeclareFunc(
00561 agent->agent_interp,
00562 "void* mc_AclPost(void* agent, void* acl_message);",
00563 (ChFuncdl_t)MC_AclPost_chdl
00564 );
00565 Ch_DeclareFunc(
00566 agent->agent_interp,
00567 "void* mc_AclRetrieve(void* agent);",
00568 (ChFuncdl_t)MC_AclRetrieve_chdl
00569 );
00570 Ch_DeclareFunc(
00571 agent->agent_interp,
00572 "void* mc_AclReply(void* acl_message);",
00573 (ChFuncdl_t)MC_AclReply_chdl
00574 );
00575 Ch_DeclareFunc(
00576 agent->agent_interp,
00577 "int mc_AclSend(void* acl_message);",
00578 (ChFuncdl_t)MC_AclSend_chdl
00579 );
00580 Ch_DeclareFunc(
00581 agent->agent_interp,
00582 "void* mc_AclWaitRetrieve(void* agent);",
00583 (ChFuncdl_t)MC_AclWaitRetrieve_chdl
00584 );
00585
00586 Ch_DeclareFunc(
00587 agent->agent_interp,
00588 "int mc_AclSetPerformative(void* acl_message, int performative);",
00589 (ChFuncdl_t)MC_AclSetPerformative_chdl
00590 );
00591 Ch_DeclareFunc(
00592 agent->agent_interp,
00593 "int mc_AclSetSender(void* acl_message, char* name, char* address);",
00594 (ChFuncdl_t)MC_AclSetSender_chdl
00595 );
00596 Ch_DeclareFunc(
00597 agent->agent_interp,
00598 "int mc_AclAddReceiver(void* acl_message, char* name, char* address);",
00599 (ChFuncdl_t)MC_AclAddReceiver_chdl
00600 );
00601 Ch_DeclareFunc(
00602 agent->agent_interp,
00603 "int mc_AclAddReplyTo(void* acl_message, char* name, char* address);",
00604 (ChFuncdl_t)MC_AclAddReplyTo_chdl
00605 );
00606 Ch_DeclareFunc(
00607 agent->agent_interp,
00608 "int mc_AclSetContent(void* acl_message, char* content);",
00609 (ChFuncdl_t)MC_AclSetContent_chdl
00610 );
00611
00612 Ch_DeclareFunc(
00613 agent->agent_interp,
00614 "int mc_AddAgent(void* agent);",
00615 (ChFuncdl_t)MC_AddAgent_chdl
00616 );
00617 Ch_DeclareFunc(
00618 agent->agent_interp,
00619 "const void* mc_AgentVariableRetrieve(void* agent, const char* var_name, int task_num);",
00620 (ChFuncdl_t)MC_AgentVariableRetrieve_chdl
00621 );
00622 Ch_DeclareFunc(
00623 agent->agent_interp,
00624 "int mc_AgentVariableSave(void* agent, const char* var_name);",
00625 (ChFuncdl_t)MC_AgentVariableSave_chdl
00626 );
00627 Ch_DeclareFunc(
00628 agent->agent_interp,
00629 "int mc_Barrier(int id);",
00630 (ChFuncdl_t)MC_Barrier_chdl
00631 );
00632 Ch_DeclareFunc(
00633 agent->agent_interp,
00634 "int mc_BarrierDelete(int id);",
00635 (ChFuncdl_t)MC_BarrierDelete_chdl
00636 );
00637 Ch_DeclareFunc(
00638 agent->agent_interp,
00639 "int mc_BarrierInit(int id, int num_procs);",
00640 (ChFuncdl_t)MC_BarrierInit_chdl
00641 );
00642 Ch_DeclareFunc(
00643 agent->agent_interp,
00644 "int mc_CallAgentFunc(MCAgent_t agent, const char* funcName, void* returnVal, ...);",
00645 (ChFuncdl_t)MC_CallAgentFunc_chdl
00646 );
00647 Ch_DeclareFunc(
00648 agent->agent_interp,
00649 "MCAgent_t mc_ComposeAgent(const char* name, *home, *owner, *code, *return_var_name, *server, int persistent);",
00650 (ChFuncdl_t)MC_ComposeAgent_chdl
00651 );
00652 Ch_DeclareFunc(
00653 agent->agent_interp,
00654 "int mc_CondBroadcast(int id);",
00655 (ChFuncdl_t)MC_CondBroadcast_chdl
00656 );
00657 Ch_DeclareFunc(
00658 agent->agent_interp,
00659 "int mc_CondSignal(int id);",
00660 (ChFuncdl_t)MC_CondSignal_chdl
00661 );
00662 Ch_DeclareFunc(
00663 agent->agent_interp,
00664 "int mc_CondReset(int id);",
00665 (ChFuncdl_t)MC_CondReset_chdl
00666 );
00667 Ch_DeclareFunc(
00668 agent->agent_interp,
00669 "int mc_CondWait(int id);",
00670 (ChFuncdl_t)MC_CondWait_chdl
00671 );
00672 Ch_DeclareFunc(
00673 agent->agent_interp,
00674 "int mc_DeleteAgent(MCAgent_t agent);",
00675 (ChFuncdl_t)MC_DeleteAgent_chdl
00676 );
00677 Ch_DeclareFunc(
00678 agent->agent_interp,
00679 "int mc_DeregisterService(int agentID, char* serviceName);",
00680 (ChFuncdl_t)MC_DeregisterService_chdl
00681 );
00682 Ch_DeclareFunc(
00683 agent->agent_interp,
00684 "int mc_DestroyServiceSearchResult( char** agentName, char** serviceName, int* agentID, int numResult);",
00685 (ChFuncdl_t)MC_DestroyServiceSearchResult_chdl
00686 );
00687 Ch_DeclareFunc(
00688 agent->agent_interp,
00689 "int mc_End(void);",
00690 (ChFuncdl_t)MC_End_chdl
00691 );
00692 Ch_DeclareFunc(
00693 agent->agent_interp,
00694 "void *mc_FindAgentByID(int id);",
00695 (ChFuncdl_t)MC_FindAgentByID_chdl
00696 );
00697 Ch_DeclareFunc(
00698 agent->agent_interp,
00699 "void *mc_FindAgentByName(const char *name);",
00700 (ChFuncdl_t)MC_FindAgentByName_chdl
00701 );
00702
00703
00704
00705
00706
00707
00708
00709
00710
00711 Ch_DeclareFunc(
00712 agent->agent_interp,
00713 "int MC_GetAgentID(void* agent);",
00714 (ChFuncdl_t)MC_GetAgentStatus_chdl
00715 );
00716 Ch_DeclareFunc(
00717 agent->agent_interp,
00718 "char* MC_GetAgentName(void* agent);",
00719 (ChFuncdl_t)MC_GetAgentStatus_chdl
00720 );
00721 Ch_DeclareFunc(
00722 agent->agent_interp,
00723 "int mc_GetAgentStatus(void* agent);",
00724 (ChFuncdl_t)MC_GetAgentStatus_chdl
00725 );
00726 Ch_DeclareFunc(
00727 agent->agent_interp,
00728 "char *mc_GetAgentXMLString(void* agent);",
00729 (ChFuncdl_t)MC_GetAgentXMLString_chdl
00730 );
00731
00732 #ifndef _WIN32
00733 Ch_DeclareFunc(
00734 agent->agent_interp,
00735 "int mc_gettimeofday(void* tv);",
00736 (ChFuncdl_t)MC_GetTimeOfDay_chdl
00737 );
00738 #endif
00739
00740 Ch_DeclareFunc(
00741 agent->agent_interp,
00742 "int mc_HaltAgency(void);",
00743 (ChFuncdl_t)MC_HaltAgency_chdl
00744 );
00745 Ch_DeclareFunc(
00746 agent->agent_interp,
00747 "int mc_MutexLock(int id);",
00748 (ChFuncdl_t)MC_MutexLock_chdl
00749 );
00750 Ch_DeclareFunc(
00751 agent->agent_interp,
00752 "int mc_MutexUnlock(int id);",
00753 (ChFuncdl_t)MC_MutexUnlock_chdl
00754 );
00755 Ch_DeclareFunc(
00756 agent->agent_interp,
00757 "int mc_PrintAgentCode(void* agent);",
00758 (ChFuncdl_t)MC_PrintAgentCode_chdl
00759 );
00760 Ch_DeclareFunc(
00761 agent->agent_interp,
00762 "int mc_ResumeAgency(void);",
00763 (ChFuncdl_t)MC_ResumeAgency_chdl
00764 );
00765 Ch_DeclareFunc(
00766 agent->agent_interp,
00767 "int mc_SearchForService(const char* searchString, char*** agentNames, char*** serviceNames, int** agentIDs, int* numResults);",
00768 (ChFuncdl_t)MC_SearchForService_chdl
00769 );
00770 Ch_DeclareFunc(
00771 agent->agent_interp,
00772 "int mc_SendSteerCommand(enum MC_SteerCommand_e command);",
00773 (ChFuncdl_t)MC_SendSteerCommand_chdl
00774 );
00775 Ch_DeclareFunc(
00776 agent->agent_interp,
00777 "int mc_RegisterService(MCAgent_t agent, char **serviceNames, int numServices);",
00778 (ChFuncdl_t)MC_RegisterService_chdl
00779 );
00780 Ch_DeclareFunc(
00781 agent->agent_interp,
00782 "void *mc_RetrieveAgent(void);",
00783 (ChFuncdl_t)MC_RetrieveAgent_chdl
00784 );
00785 Ch_DeclareFunc(
00786 agent->agent_interp,
00787 "char *mc_RetrieveAgentCode(void* agent);",
00788 (ChFuncdl_t)MC_RetrieveAgentCode_chdl
00789 );
00790 Ch_DeclareFunc(
00791 agent->agent_interp,
00792 "int mc_SaveData(MCAgent_t agent, char* name, int size, void* data);",
00793 (ChFuncdl_t)MC_SaveData_chdl
00794 );
00795 Ch_DeclareFunc(
00796 agent->agent_interp,
00797 "int mc_SemaphoreWait(int id);",
00798 (ChFuncdl_t)MC_SemaphoreWait_chdl
00799 );
00800 Ch_DeclareFunc(
00801 agent->agent_interp,
00802 "int mc_SemaphorePost(int id);",
00803 (ChFuncdl_t)MC_SemaphorePost_chdl
00804 );
00805 Ch_DeclareFunc(
00806 agent->agent_interp,
00807 "int mc_SendAgentMigrationMessage(char *message, char *hostname, int port);",
00808 (ChFuncdl_t)MC_SendAgentMigrationMessage_chdl
00809 );
00810 Ch_DeclareFunc(
00811 agent->agent_interp,
00812 "int mc_SendAgentMigrationMessageFile(char *filename, char *hostname, int port);",
00813 (ChFuncdl_t)MC_SendAgentMigrationMessageFile_chdl
00814 );
00815 Ch_DeclareFunc(
00816 agent->agent_interp,
00817 "int mc_SetAgentStatus(void* agent, int status);",
00818 (ChFuncdl_t)MC_SetAgentStatus_chdl
00819 );
00820 Ch_DeclareFunc(
00821 agent->agent_interp,
00822 "int mc_SetDefaultAgentStatus(int status);",
00823 (ChFuncdl_t)MC_SetDefaultAgentStatus_chdl
00824 );
00825 Ch_DeclareFunc(
00826 agent->agent_interp,
00827 "int mc_SyncDelete(int id);",
00828 (ChFuncdl_t)MC_SyncDelete_chdl
00829 );
00830 Ch_DeclareFunc(
00831 agent->agent_interp,
00832 "int mc_SyncInit(int id);",
00833 (ChFuncdl_t)MC_SyncInit_chdl
00834 );
00835 Ch_DeclareFunc(
00836 agent->agent_interp,
00837 "int mc_TerminateAgent(void* agent);",
00838 (ChFuncdl_t)MC_TerminateAgent_chdl
00839 );
00840 Ch_DeclareFunc(
00841 agent->agent_interp,
00842 "int mc_GetAgentID(void* agent);",
00843 (ChFuncdl_t)MC_GetAgentID_chdl
00844 );
00845 Ch_DeclareFunc(
00846 agent->agent_interp,
00847 "char *mc_GetAgentName(void* agent);",
00848 (ChFuncdl_t)MC_GetAgentName_chdl
00849 );
00850
00851
00852
00853
00854
00855
00856
00857
00858 if(strlen(agent->datastate->agent_code) < 51)
00859 {
00860 if(Ch_AppendRunScript(
00861 ((MCAgent_t)ChAgent)->agent_interp,
00862 ((MCAgent_t)ChAgent)->datastate->agent_code))
00863 {
00864 printf("CH Failure \n");
00865 exit(EXIT_FAILURE);
00866 }
00867 if(Ch_CallFuncByName(((MCAgent_t)ChAgent)->agent_interp, "main", NULL))
00868 {
00869 printf("CH2 failure \n");
00870 exit(EXIT_FAILURE);
00871 }
00872 }
00873 else
00874 {
00875
00876 #ifndef _WIN32
00877
00878 temp_store_file = (char *)malloc(sizeof(char)*30);
00879
00880 strcpy(temp_store_file, "agentchscriptXXXXXX");
00881 fd = mkstemp(temp_store_file);
00882 if (fd == -1) {
00883 fprintf(stderr, "Could not create temporary file:%s. %s:%d\n",
00884 temp_store_file,
00885 __FILE__,
00886 __LINE__ );
00887 exit(EXIT_FAILURE);
00888 }
00889 close(fd);
00890 #else
00891 temp_store_file = _tempnam(".", "agentchscript");
00892 #endif
00893 TEMP_FILE = fopen(temp_store_file, "w");
00894
00895
00896 n = fwrite(
00897 (void *)agent->datastate->agent_code,
00898 sizeof(char),
00899 strlen(agent->datastate->agent_code),
00900 TEMP_FILE);
00901
00902 fclose(TEMP_FILE);
00903
00904
00905 ChShellArg[0] = temp_store_file;
00906 ChShellArg[1] = NULL;
00907 MUTEX_LOCK(agent->run_lock);
00908 Ch_RunScript(agent->agent_interp, ChShellArg);
00909 MUTEX_UNLOCK(agent->run_lock);
00910
00911
00912
00913
00914
00915
00916
00917
00918 remove(temp_store_file);
00919 #ifndef _WIN32
00920 free(temp_store_file);
00921 #endif
00922 }
00923
00924
00925 if(strcmp(agent->datastate->tasks[progress]->var_name, "no-return"))
00926 {
00927 result = interpreter_variable_data_InitializeFromAgent(agent);
00928
00929 interpreter_variable_data_Destroy(
00930 agent->datastate->tasks[progress]->agent_return_data
00931 );
00932
00933 agent->datastate->tasks[progress]->agent_return_data =
00934 result;
00935 } else {
00936 interpreter_variable_data_Destroy(
00937 agent->datastate->tasks[progress]->agent_return_data );
00938 agent->datastate->tasks[progress]->agent_return_data = NULL;
00939 }
00940
00941
00942
00943 for(i = 0; i < agent->datastate->tasks[progress]->num_saved_variables; i++) {
00944 agent_variable_list_Add(
00945 agent->datastate->tasks[progress]->agent_variable_list,
00946 interpreter_variable_data_Initialize(
00947 agent,
00948 agent->datastate->tasks[progress]->saved_variables[i] )
00949 );
00950 }
00951
00952 if (agent->datastate->persistent ||
00953 agent->datastate->tasks[progress]->persistent ) {
00954
00955
00956
00957
00958
00959
00960
00961
00962
00963
00964
00965 ((MCAgent_t) ChAgent)->agent_status = MC_AGENT_NEUTRAL;
00966 } else {
00967 if ((((MCAgent_t)ChAgent)->agent_interp) != NULL) {
00968 Ch_End(((MCAgent_t)ChAgent)->agent_interp);
00969 }
00970
00971
00972 if (
00973 (agent->datastate->task_progress ==
00974 (agent->datastate->number_of_tasks-1))
00975 )
00976 {
00977
00978 ((MCAgent_t) ChAgent)->agent_status = MC_WAIT_FINISHED;
00979
00980
00981 for(i = 0;
00982 i < agent->datastate->number_of_tasks;
00983 i++)
00984 {
00985 if (agent->datastate->tasks[i]->agent_return_data != NULL) {
00986 ((MCAgent_t) ChAgent)->agent_status = MC_WAIT_MESSGSEND;
00987 }
00988 }
00989 }
00990 else {
00991 ((MCAgent_t) ChAgent)->agent_status = MC_WAIT_MESSGSEND;
00992 }
00993 }
00994
00995
00996 agent->datastate->
00997 tasks[agent->datastate->task_progress]->task_completed = 1;
00998 agent->datastate->task_progress++;
00999
01000 if (
01001 (agent->datastate->task_progress >= agent->datastate->number_of_tasks)
01002 )
01003 {
01004 agent->agent_type = MC_RETURN_AGENT;
01005 }
01006
01007 SIGNAL(
01008 mc_platform->MC_signal_cond,
01009 mc_platform->MC_signal_lock,
01010 mc_platform->MC_signal = MC_EXEC_AGENT;
01011 );
01012
01013 MUTEX_LOCK( mc_platform->MC_signal_lock);
01014 MUTEX_UNLOCK( mc_platform->MC_signal_lock );
01015 MUTEX_LOCK(mc_platform->ams->runflag_lock);
01016 mc_platform->ams->run = 1;
01017 COND_SIGNAL(mc_platform->ams->runflag_cond);
01018 MUTEX_UNLOCK(mc_platform->ams->runflag_lock);
01019
01020 #ifndef _WIN32
01021 pthread_exit(ChAgent);
01022 #else
01023 return 0;
01024 #endif
01025 }