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