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
00245 agent->orphan = 0;
00246 agent->agent_script_ready = 1;
00247 agent->agent_pipe_ready_to_read = 0;
00248 agent->agent_ready_to_send = 0;
00249 agent->agent_pipe_active = 0;
00250
00251
00252 agent->agent_thread = NULL;
00253 agent->agent_thread_id = 0;
00254
00255
00256 agent->mailbox = agent_mailbox_New();
00257
00258
00259 agent->datastate = agent_datastate_New();
00260 agent->datastate->xml_agent_root = message->xml_payload;
00261 agent->datastate->xml_root = message->xml_root;
00262 message->agent_xml_flag = 1;
00263
00264 if (agent->datastate->xml_agent_root != NULL) {
00265 switch(message->message_type) {
00266 case MOBILE_AGENT:
00267 agent->agent_type = MC_REMOTE_AGENT;
00268 if( (err_code = agent_xml_parse(agent))) {
00269 fprintf(stderr, "error code %d. %s:%d\n",
00270 err_code, __FILE__, __LINE__ );
00271 agent_Destroy(agent);
00272 return NULL;
00273 }
00274 if (mc_platform->default_agentstatus != -1) {
00275 agent->agent_status = mc_platform->default_agentstatus;
00276 }
00277 break;
00278 case RETURN_MSG:
00279 agent->agent_type = MC_RETURN_AGENT;
00280 if( (err_code = agent_xml_parse(agent))) {
00281 fprintf(stderr, "error code %d. %s:%d\n",
00282 err_code, __FILE__, __LINE__ );
00283 agent_Destroy(agent);
00284 return NULL;
00285 }
00286 break;
00287 default:
00288 fprintf(stderr, "Invalid agent type: %d %s:%d\n",
00289 agent->agent_type, __FILE__, __LINE__ );
00290 }
00291 } else {
00292 mc_platform->err = MC_ERR_PARSE;
00293
00294 MUTEX_DESTROY(agent->lock);
00295 free(agent->lock);
00296 MUTEX_DESTROY(agent->run_lock);
00297 free(agent->run_lock);
00298
00299 free(agent);
00300 return NULL;
00301 }
00302
00303
00304
00305
00306
00307
00308
00309
00310
00311
00312
00313
00314 agent->agent_status = MC_WAIT_CH;
00315
00316 agent->mc_platform = mc_platform;
00317
00318
00319 return agent;
00320 }
00321
00322 int
00323 agent_Destroy(agent_p agent)
00324 {
00325 if (agent == NULL) {
00326 return MC_SUCCESS;
00327 }
00328 MUTEX_LOCK(agent->lock);
00329 if (agent->name != NULL) {
00330 free(agent->name);
00331 }
00332 if (agent->owner != NULL) {
00333 free(agent->owner);
00334 }
00335 if (agent->home != NULL) {
00336 free(agent->home);
00337 }
00338
00339 MUTEX_DESTROY(agent->lock);
00340 if (agent->agent_status == MC_AGENT_NEUTRAL) {
00341 if ((agent->agent_interp) != NULL) {
00342 Ch_End(agent->agent_interp);
00343 }
00344 }
00345 free(agent->lock);
00346 agent_datastate_Destroy(agent->datastate);
00347 free(agent->agent_thread);
00348 free(agent->run_lock);
00349 agent_mailbox_Destroy(agent->mailbox);
00350
00351 free(agent);
00352 agent = NULL;
00353 return MC_SUCCESS;
00354 }
00355
00356 extern void
00357 agent_RunChScript(agent_p agent, mc_platform_p mc_platform)
00358 {
00359 #ifndef _WIN32
00360 pthread_attr_t attr;
00361 pthread_attr_init(&attr);
00362 if(mc_platform->stack_size[MC_THREAD_AGENT] != -1) {
00363 pthread_attr_setstacksize
00364 (
00365 &attr,
00366 mc_platform->stack_size[MC_THREAD_AGENT]
00367 );
00368 }
00369 pthread_attr_setdetachstate
00370 (
00371 &attr,
00372 PTHREAD_CREATE_DETACHED
00373 );
00374 #else
00375 int stack_size;
00376 if (mc_platform->stack_size[MC_THREAD_AGENT] < 1) {
00377 stack_size = mc_platform->stack_size[MC_THREAD_AGENT]+1;
00378 } else {
00379 stack_size = mc_platform->stack_size[MC_THREAD_AGENT];
00380 }
00381 #endif
00382 if(agent->agent_thread == NULL)
00383 {
00384 agent->agent_thread = (THREAD_T *)malloc(sizeof(THREAD_T));
00385 }
00386
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_MutexLock(int id);",
00742 (ChFuncdl_t)MC_MutexLock_chdl
00743 );
00744 Ch_DeclareFunc(
00745 agent->agent_interp,
00746 "int mc_MutexUnlock(int id);",
00747 (ChFuncdl_t)MC_MutexUnlock_chdl
00748 );
00749 Ch_DeclareFunc(
00750 agent->agent_interp,
00751 "int mc_PrintAgentCode(void* agent);",
00752 (ChFuncdl_t)MC_PrintAgentCode_chdl
00753 );
00754 Ch_DeclareFunc(
00755 agent->agent_interp,
00756 "int mc_ResumeAgency(void);",
00757 (ChFuncdl_t)MC_ResumeAgency_chdl
00758 );
00759 Ch_DeclareFunc(
00760 agent->agent_interp,
00761 "int mc_SearchForService(const char* searchString, char*** agentNames, char*** serviceNames, int** agentIDs, int* numResults);",
00762 (ChFuncdl_t)MC_SearchForService_chdl
00763 );
00764 Ch_DeclareFunc(
00765 agent->agent_interp,
00766 "int mc_SendSteerCommand(enum MC_SteerCommand_e command);",
00767 (ChFuncdl_t)MC_SendSteerCommand_chdl
00768 );
00769 Ch_DeclareFunc(
00770 agent->agent_interp,
00771 "int mc_RegisterService(MCAgent_t agent, char **serviceNames, int numServices);",
00772 (ChFuncdl_t)MC_RegisterService_chdl
00773 );
00774 Ch_DeclareFunc(
00775 agent->agent_interp,
00776 "void *mc_RetrieveAgent(void);",
00777 (ChFuncdl_t)MC_RetrieveAgent_chdl
00778 );
00779 Ch_DeclareFunc(
00780 agent->agent_interp,
00781 "char *mc_RetrieveAgentCode(void* agent);",
00782 (ChFuncdl_t)MC_RetrieveAgentCode_chdl
00783 );
00784 Ch_DeclareFunc(
00785 agent->agent_interp,
00786 "int mc_SaveData(MCAgent_t agent, char* name, int size, void* data);",
00787 (ChFuncdl_t)MC_SaveData_chdl
00788 );
00789 Ch_DeclareFunc(
00790 agent->agent_interp,
00791 "int mc_SemaphoreWait(int id);",
00792 (ChFuncdl_t)MC_SemaphoreWait_chdl
00793 );
00794 Ch_DeclareFunc(
00795 agent->agent_interp,
00796 "int mc_SemaphorePost(int id);",
00797 (ChFuncdl_t)MC_SemaphorePost_chdl
00798 );
00799 Ch_DeclareFunc(
00800 agent->agent_interp,
00801 "int mc_SendAgentMigrationMessage(char *message, char *hostname, int port);",
00802 (ChFuncdl_t)MC_SendAgentMigrationMessage_chdl
00803 );
00804 Ch_DeclareFunc(
00805 agent->agent_interp,
00806 "int mc_SendAgentMigrationMessageFile(char *filename, char *hostname, int port);",
00807 (ChFuncdl_t)MC_SendAgentMigrationMessageFile_chdl
00808 );
00809 Ch_DeclareFunc(
00810 agent->agent_interp,
00811 "int mc_SetAgentStatus(void* agent, int status);",
00812 (ChFuncdl_t)MC_SetAgentStatus_chdl
00813 );
00814 Ch_DeclareFunc(
00815 agent->agent_interp,
00816 "int mc_SetDefaultAgentStatus(int status);",
00817 (ChFuncdl_t)MC_SetDefaultAgentStatus_chdl
00818 );
00819 Ch_DeclareFunc(
00820 agent->agent_interp,
00821 "int mc_SyncDelete(int id);",
00822 (ChFuncdl_t)MC_SyncDelete_chdl
00823 );
00824 Ch_DeclareFunc(
00825 agent->agent_interp,
00826 "int mc_SyncInit(int id);",
00827 (ChFuncdl_t)MC_SyncInit_chdl
00828 );
00829 Ch_DeclareFunc(
00830 agent->agent_interp,
00831 "int mc_TerminateAgent(void* agent);",
00832 (ChFuncdl_t)MC_TerminateAgent_chdl
00833 );
00834 Ch_DeclareFunc(
00835 agent->agent_interp,
00836 "int mc_GetAgentID(void* agent);",
00837 (ChFuncdl_t)MC_GetAgentID_chdl
00838 );
00839 Ch_DeclareFunc(
00840 agent->agent_interp,
00841 "char *mc_GetAgentName(void* agent);",
00842 (ChFuncdl_t)MC_GetAgentName_chdl
00843 );
00844
00845
00846
00847
00848
00849
00850
00851
00852 if(strlen(agent->datastate->agent_code) < 51)
00853 {
00854 if(Ch_AppendRunScript(
00855 ((MCAgent_t)ChAgent)->agent_interp,
00856 ((MCAgent_t)ChAgent)->datastate->agent_code))
00857 {
00858 printf("CH Failure \n");
00859 exit(EXIT_FAILURE);
00860 }
00861 if(Ch_CallFuncByName(((MCAgent_t)ChAgent)->agent_interp, "main", NULL))
00862 {
00863 printf("CH2 failure \n");
00864 exit(EXIT_FAILURE);
00865 }
00866 }
00867 else
00868 {
00869
00870 #ifndef _WIN32
00871
00872 temp_store_file = (char *)malloc(sizeof(char)*30);
00873
00874 strcpy(temp_store_file, "agentchscriptXXXXXX");
00875 fd = mkstemp(temp_store_file);
00876 if (fd == -1) {
00877 fprintf(stderr, "Could not create temporary file:%s. %s:%d\n",
00878 temp_store_file,
00879 __FILE__,
00880 __LINE__ );
00881 exit(EXIT_FAILURE);
00882 }
00883 close(fd);
00884 #else
00885 temp_store_file = _tempnam(".", "agentchscript");
00886 #endif
00887 TEMP_FILE = fopen(temp_store_file, "w");
00888
00889
00890 n = fwrite(
00891 (void *)agent->datastate->agent_code,
00892 sizeof(char),
00893 strlen(agent->datastate->agent_code),
00894 TEMP_FILE);
00895
00896 fclose(TEMP_FILE);
00897
00898
00899 ChShellArg[0] = temp_store_file;
00900 ChShellArg[1] = NULL;
00901 MUTEX_LOCK(agent->run_lock);
00902 Ch_RunScript(agent->agent_interp, ChShellArg);
00903 MUTEX_UNLOCK(agent->run_lock);
00904
00905
00906
00907
00908
00909
00910
00911
00912 remove(temp_store_file);
00913 #ifndef _WIN32
00914 free(temp_store_file);
00915 #endif
00916 }
00917
00918
00919 if(strcmp(agent->datastate->tasks[progress]->var_name, "no-return"))
00920 {
00921 result = interpreter_variable_data_InitializeFromAgent(agent);
00922
00923 interpreter_variable_data_Destroy(
00924 agent->datastate->tasks[progress]->agent_return_data
00925 );
00926
00927 agent->datastate->tasks[progress]->agent_return_data =
00928 result;
00929 } else {
00930 interpreter_variable_data_Destroy(
00931 agent->datastate->tasks[progress]->agent_return_data );
00932 agent->datastate->tasks[progress]->agent_return_data = NULL;
00933 }
00934
00935
00936
00937 for(i = 0; i < agent->datastate->tasks[progress]->num_saved_variables; i++) {
00938 agent_variable_list_Add(
00939 agent->datastate->tasks[progress]->agent_variable_list,
00940 interpreter_variable_data_Initialize(
00941 agent,
00942 agent->datastate->tasks[progress]->saved_variables[i] )
00943 );
00944 }
00945
00946 if (agent->datastate->persistent ||
00947 agent->datastate->tasks[progress]->persistent ) {
00948
00949
00950
00951
00952
00953
00954
00955
00956
00957
00958
00959 ((MCAgent_t) ChAgent)->agent_status = MC_AGENT_NEUTRAL;
00960 } else {
00961 if ((((MCAgent_t)ChAgent)->agent_interp) != NULL) {
00962 Ch_End(((MCAgent_t)ChAgent)->agent_interp);
00963 }
00964
00965
00966 if (
00967 (agent->datastate->task_progress ==
00968 (agent->datastate->number_of_tasks-1))
00969 )
00970 {
00971
00972 ((MCAgent_t) ChAgent)->agent_status = MC_WAIT_FINISHED;
00973
00974
00975 for(i = 0;
00976 i < agent->datastate->number_of_tasks;
00977 i++)
00978 {
00979 if (agent->datastate->tasks[i]->agent_return_data != NULL) {
00980 ((MCAgent_t) ChAgent)->agent_status = MC_WAIT_MESSGSEND;
00981 }
00982 }
00983 }
00984 else {
00985 ((MCAgent_t) ChAgent)->agent_status = MC_WAIT_MESSGSEND;
00986 }
00987 }
00988
00989
00990 agent->datastate->
00991 tasks[agent->datastate->task_progress]->task_completed = 1;
00992 agent->datastate->task_progress++;
00993
00994 if (
00995 (agent->datastate->task_progress >= agent->datastate->number_of_tasks)
00996 )
00997 {
00998 agent->agent_type = MC_RETURN_AGENT;
00999 }
01000
01001 SIGNAL(
01002 mc_platform->MC_signal_cond,
01003 mc_platform->MC_signal_lock,
01004 mc_platform->MC_signal = MC_EXEC_AGENT;
01005 );
01006
01007 MUTEX_LOCK( mc_platform->MC_signal_lock);
01008 MUTEX_UNLOCK( mc_platform->MC_signal_lock );
01009 MUTEX_LOCK(mc_platform->ams->runflag_lock);
01010 mc_platform->ams->run = 1;
01011 COND_SIGNAL(mc_platform->ams->runflag_cond);
01012 MUTEX_UNLOCK(mc_platform->ams->runflag_lock);
01013
01014 #ifndef _WIN32
01015 pthread_exit(ChAgent);
01016 #else
01017 return 0;
01018 #endif
01019 }