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
00191 cp_agent->mailbox = agent_mailbox_New();
00192
00193 return cp_agent;
00194 }
00195
00196 agent_p
00197 agent_New(void)
00198 {
00199 agent_p agent;
00200 agent = (agent_p)malloc(sizeof(agent_t));
00201 if(agent==NULL) {
00202 fprintf(stderr, "Memory error at %s:%d\n",
00203 __FILE__, __LINE__);
00204 return NULL;
00205 }
00206
00207 memset(agent, 0, sizeof(agent_t));
00208
00209
00210 MUTEX_NEW(agent->run_lock);
00211 MUTEX_INIT(agent->run_lock);
00212
00213 MUTEX_NEW(agent->lock);
00214 MUTEX_INIT(agent->lock);
00215
00216 return agent;
00217 }
00218
00219 agent_p
00220 agent_NewBinary( struct mc_platform_s *mc_platform)
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 = rand();
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 agent->binary = 1;
00255
00256
00257 agent->agent_thread_id = 0;
00258
00259
00260 agent->mailbox = agent_mailbox_New();
00261
00262
00263
00264
00265
00266
00267
00268
00269
00270
00271
00272
00273 agent->agent_status = MC_AGENT_ACTIVE;
00274
00275 agent->mc_platform = mc_platform;
00276
00277 agent->agent_address = (char*)malloc(sizeof(char) *
00278 (strlen(agent->mc_platform->hostname) + 12 + 10)
00279 );
00280 if (agent->agent_address == NULL) {
00281 fprintf(stderr, "Memory error. %s:%d\n", __FILE__, __LINE__);
00282 exit(-1);
00283 }
00284 sprintf(agent->agent_address,
00285 "http://%s:%d/acc",
00286 agent->mc_platform->hostname,
00287 agent->mc_platform->port
00288 );
00289
00290 return agent;
00291 }
00292 agent_p
00293 agent_Initialize(
00294 struct mc_platform_s *mc_platform,
00295 message_p message,
00296 int id)
00297 {
00298 agent_p agent;
00299 int err_code;
00300
00301
00302 agent = (MCAgent_t)malloc(sizeof(agent_t));
00303 memset(agent, 0, sizeof(agent_t));
00304
00305
00306 agent->lock = (MUTEX_T*)malloc(sizeof(MUTEX_T));
00307 MUTEX_INIT(agent->lock);
00308
00309
00310 agent->run_lock = (MUTEX_T*)malloc(sizeof(MUTEX_T));
00311 MUTEX_INIT(agent->run_lock);
00312
00313
00314 agent->id = id;
00315 #ifndef _WIN32
00316 agent->arrival_time = time(NULL);
00317 #else
00318 GetSystemTime( &(agent->arrival_time) );
00319 #endif
00320
00321 agent->home = NULL;
00322 agent->sender = NULL;
00323
00324
00325 agent->orphan = 0;
00326 agent->agent_script_ready = 1;
00327 agent->agent_pipe_ready_to_read = 0;
00328 agent->agent_ready_to_send = 0;
00329 agent->agent_pipe_active = 0;
00330
00331
00332 agent->agent_thread_id = 0;
00333
00334
00335 agent->mailbox = agent_mailbox_New();
00336
00337
00338 agent->datastate = agent_datastate_New();
00339 agent->datastate->xml_agent_root = message->xml_payload;
00340 agent->datastate->xml_root = message->xml_root;
00341 message->agent_xml_flag = 1;
00342
00343 if (agent->datastate->xml_agent_root != NULL) {
00344 switch(message->message_type) {
00345 case MOBILE_AGENT:
00346 agent->agent_type = MC_REMOTE_AGENT;
00347 if( (err_code = agent_xml_parse(agent))) {
00348 fprintf(stderr, "error code %d. %s:%d\n",
00349 err_code, __FILE__, __LINE__ );
00350 agent_Destroy(agent);
00351 return NULL;
00352 }
00353 if (mc_platform->default_agentstatus != -1) {
00354 agent->agent_status = mc_platform->default_agentstatus;
00355 }
00356 break;
00357 case RETURN_MSG:
00358 agent->agent_type = MC_RETURN_AGENT;
00359 if( (err_code = agent_xml_parse(agent))) {
00360 fprintf(stderr, "error code %d. %s:%d\n",
00361 err_code, __FILE__, __LINE__ );
00362 agent_Destroy(agent);
00363 return NULL;
00364 }
00365 break;
00366 default:
00367 fprintf(stderr, "Invalid agent type: %d %s:%d\n",
00368 agent->agent_type, __FILE__, __LINE__ );
00369 }
00370 } else {
00371 mc_platform->err = MC_ERR_PARSE;
00372
00373 MUTEX_DESTROY(agent->lock);
00374 free(agent->lock);
00375 MUTEX_DESTROY(agent->run_lock);
00376 free(agent->run_lock);
00377
00378 free(agent);
00379 return NULL;
00380 }
00381
00382
00383
00384
00385
00386
00387
00388
00389
00390
00391
00392
00393 agent->agent_status = MC_WAIT_CH;
00394
00395 agent->mc_platform = mc_platform;
00396
00397 agent->agent_address = (char*)malloc(sizeof(char) *
00398 (strlen(agent->mc_platform->hostname) + 12 + 10)
00399 );
00400 if (agent->agent_address == NULL) {
00401 fprintf(stderr, "Memory error. %s:%d\n", __FILE__, __LINE__);
00402 exit(-1);
00403 }
00404 sprintf(agent->agent_address,
00405 "http://%s:%d/acc",
00406 agent->mc_platform->hostname,
00407 agent->mc_platform->port
00408 );
00409
00410 return agent;
00411 }
00412
00413 int
00414 agent_Destroy(agent_p agent)
00415 {
00416 if (agent == NULL) {
00417 return MC_SUCCESS;
00418 }
00419 MUTEX_LOCK(agent->lock);
00420 if (agent->name != NULL) {
00421 free(agent->name);
00422 }
00423 if (agent->owner != NULL) {
00424 free(agent->owner);
00425 }
00426 if (agent->home != NULL) {
00427 free(agent->home);
00428 }
00429 if (agent->sender != NULL) {
00430 free(agent->sender);
00431 }
00432 if (agent->wg_code != NULL) {
00433 free(agent->wg_code);
00434 }
00435
00436 MUTEX_DESTROY(agent->lock);
00437 if (agent->agent_status == MC_AGENT_NEUTRAL) {
00438 if ((agent->agent_interp) != NULL) {
00439 Ch_Reset(*agent->agent_interp);
00440 interpreter_queue_Add(agent->mc_platform->interpreter_queue, agent->agent_interp);
00441 }
00442 }
00443 free(agent->lock);
00444 agent_datastate_Destroy(agent->datastate);
00445 free(agent->run_lock);
00446 agent_mailbox_Destroy(agent->mailbox);
00447
00448 free(agent);
00449 agent = NULL;
00450 return MC_SUCCESS;
00451 }
00452
00453 extern void
00454 agent_RunChScript(agent_p agent, mc_platform_p mc_platform)
00455 {
00456 #ifndef _WIN32
00457 pthread_attr_t attr;
00458 pthread_attr_init(&attr);
00459 if(mc_platform->stack_size[MC_THREAD_AGENT] != -1) {
00460 pthread_attr_setstacksize
00461 (
00462 &attr,
00463 mc_platform->stack_size[MC_THREAD_AGENT]
00464 );
00465 }
00466 pthread_attr_setdetachstate
00467 (
00468 &attr,
00469 PTHREAD_CREATE_DETACHED
00470 );
00471 #else
00472 int stack_size;
00473 if (mc_platform->stack_size[MC_THREAD_AGENT] < 1) {
00474 stack_size = mc_platform->stack_size[MC_THREAD_AGENT]+1;
00475 } else {
00476 stack_size = mc_platform->stack_size[MC_THREAD_AGENT];
00477 }
00478 #endif
00479 agent->agent_status = MC_AGENT_ACTIVE;
00480 agent->mc_platform = mc_platform;
00481
00482 THREAD_CREATE(&agent->agent_thread,
00483 agent_RunChScriptThread,
00484 agent );
00485
00486 return;
00487 }
00488
00489
00490
00491 void *
00492 agent_ChScriptInitVar(ChInterp_t* interp)
00493 {
00494 char *tmp_buf;
00495
00496
00497 tmp_buf = malloc(sizeof(char) * 200);
00498 tmp_buf[0] = '\0';
00499 sprintf(tmp_buf, "int mc_agent_id = -1;");
00500 Ch_DeclareVar(
00501 *interp,
00502 tmp_buf
00503 );
00504
00505 tmp_buf[0] = '\0';
00506
00507 sprintf(tmp_buf, "char* mc_agent_name = NULL;");
00508 Ch_DeclareVar(
00509 *interp,
00510 tmp_buf
00511 );
00512
00513 tmp_buf[0] = '\0';
00514 sprintf(tmp_buf, "void* mc_current_agent = NULL;");
00515 Ch_DeclareVar(
00516 *interp,
00517 tmp_buf
00518 );
00519
00520 tmp_buf[0] = '\0';
00521
00522 sprintf(tmp_buf, "char* mc_host_name = NULL;");
00523 Ch_DeclareVar(
00524 *interp,
00525 tmp_buf
00526 );
00527
00528 tmp_buf[0] = '\0';
00529 sprintf(tmp_buf, "int mc_host_port = -1;\n");
00530 Ch_DeclareVar(
00531 *interp,
00532 tmp_buf
00533 );
00534
00535 tmp_buf[0] = '\0';
00536 sprintf(tmp_buf, "int mc_task_progress = -1;\n");
00537 Ch_DeclareVar(
00538 *interp,
00539 tmp_buf
00540 );
00541
00542 tmp_buf[0] = '\0';
00543 sprintf(tmp_buf, "int mc_num_tasks = -1;\n");
00544 Ch_DeclareVar(
00545 *interp,
00546 tmp_buf
00547 );
00548
00549
00550 tmp_buf[0] = '\0';
00551 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 };" );
00552 Ch_DeclareVar(
00553 *interp,
00554 tmp_buf
00555 );
00556
00557 Ch_DeclareVar(
00558 *interp,
00559 "char* mc_agent_address;"
00560 );
00561
00562
00563 tmp_buf[0] = '\0';
00564 sprintf(tmp_buf, "enum MC_SteerCommand_e {MC_RUN = 0, MC_SUSPEND, MC_RESTART, MC_STOP};" );
00565 Ch_DeclareVar(
00566 *interp,
00567 tmp_buf
00568 );
00569
00570 tmp_buf[0] = '\0';
00571 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};");
00572 Ch_DeclareVar(
00573 *interp,
00574 tmp_buf
00575 );
00576
00577 free(tmp_buf);
00578
00579 Ch_DeclareVar(
00580 *interp,
00581 "void* MCAgent_t;"
00582 );
00583 Ch_DeclareTypedef(
00584 *interp,
00585 "MCAgent_t"
00586 );
00587
00588
00589 Ch_DeclareFunc(
00590 *interp,
00591 "int mc_AclDestroy(void* acl_message);",
00592 (ChFuncdl_t)MC_AclDestroy_chdl
00593 );
00594 Ch_DeclareFunc(
00595 *interp,
00596 "void* mc_AclNew(void);",
00597 (ChFuncdl_t)MC_AclNew_chdl
00598 );
00599 Ch_DeclareFunc(
00600 *interp,
00601 "int mc_AclPost(void* agent, void* acl_message);",
00602 (ChFuncdl_t)MC_AclPost_chdl
00603 );
00604 Ch_DeclareFunc(
00605 *interp,
00606 "void* mc_AclRetrieve(void* agent);",
00607 (ChFuncdl_t)MC_AclRetrieve_chdl
00608 );
00609 Ch_DeclareFunc(
00610 *interp,
00611 "void* mc_AclReply(void* acl_message);",
00612 (ChFuncdl_t)MC_AclReply_chdl
00613 );
00614 Ch_DeclareFunc(
00615 *interp,
00616 "int mc_AclSend(void* acl_message);",
00617 (ChFuncdl_t)MC_AclSend_chdl
00618 );
00619 Ch_DeclareFunc(
00620 *interp,
00621 "void* mc_AclWaitRetrieve(void* agent);",
00622 (ChFuncdl_t)MC_AclWaitRetrieve_chdl
00623 );
00624
00625 Ch_DeclareFunc(
00626 *interp,
00627 "int mc_AclSetProtocol(void* acl_message, int protocol);",
00628 (ChFuncdl_t)MC_AclSetProtocol_chdl
00629 );
00630 Ch_DeclareFunc(
00631 *interp,
00632 "int mc_AclSetConversationID(void* acl_message, char* id);",
00633 (ChFuncdl_t)MC_AclSetConversationID_chdl
00634 );
00635 Ch_DeclareFunc(
00636 *interp,
00637 "int mc_AclSetPerformative(void* acl_message, int performative);",
00638 (ChFuncdl_t)MC_AclSetPerformative_chdl
00639 );
00640 Ch_DeclareFunc(
00641 *interp,
00642 "int mc_AclSetSender(void* acl_message, char* name, char* address);",
00643 (ChFuncdl_t)MC_AclSetSender_chdl
00644 );
00645 Ch_DeclareFunc(
00646 *interp,
00647 "int mc_AclAddReceiver(void* acl_message, char* name, char* address);",
00648 (ChFuncdl_t)MC_AclAddReceiver_chdl
00649 );
00650 Ch_DeclareFunc(
00651 *interp,
00652 "int mc_AclAddReplyTo(void* acl_message, char* name, char* address);",
00653 (ChFuncdl_t)MC_AclAddReplyTo_chdl
00654 );
00655 Ch_DeclareFunc(
00656 *interp,
00657 "int mc_AclSetContent(void* acl_message, char* content);",
00658 (ChFuncdl_t)MC_AclSetContent_chdl
00659 );
00660
00661 Ch_DeclareFunc(
00662 *interp,
00663 "int mc_AddAgent(void* agent);",
00664 (ChFuncdl_t)MC_AddAgent_chdl
00665 );
00666 Ch_DeclareFunc(
00667 *interp,
00668 "const void* mc_AgentVariableRetrieve(void* agent, const char* var_name, int task_num);",
00669 (ChFuncdl_t)MC_AgentVariableRetrieve_chdl
00670 );
00671 Ch_DeclareFunc(
00672 *interp,
00673 "int mc_AgentVariableSave(void* agent, const char* var_name);",
00674 (ChFuncdl_t)MC_AgentVariableSave_chdl
00675 );
00676 Ch_DeclareFunc(
00677 *interp,
00678 "int mc_Barrier(int id);",
00679 (ChFuncdl_t)MC_Barrier_chdl
00680 );
00681 Ch_DeclareFunc(
00682 *interp,
00683 "int mc_BarrierDelete(int id);",
00684 (ChFuncdl_t)MC_BarrierDelete_chdl
00685 );
00686 Ch_DeclareFunc(
00687 *interp,
00688 "int mc_BarrierInit(int id, int num_procs);",
00689 (ChFuncdl_t)MC_BarrierInit_chdl
00690 );
00691 Ch_DeclareFunc(
00692 *interp,
00693 "int mc_CallAgentFunc(char* agentName, const char* funcName, void* returnVal, ...);",
00694 (ChFuncdl_t)MC_CallAgentFunc_chdl
00695 );
00696 Ch_DeclareFunc(
00697 *interp,
00698 "MCAgent_t mc_ComposeAgent(const char* name, *home, *owner, *code, *return_var_name, *server, *workgroup_code, int persistent);",
00699 (ChFuncdl_t)MC_ComposeAgent_chdl
00700 );
00701 Ch_DeclareFunc(
00702 *interp,
00703 "int mc_CondBroadcast(int id);",
00704 (ChFuncdl_t)MC_CondBroadcast_chdl
00705 );
00706 Ch_DeclareFunc(
00707 *interp,
00708 "int mc_CondSignal(int id);",
00709 (ChFuncdl_t)MC_CondSignal_chdl
00710 );
00711 Ch_DeclareFunc(
00712 *interp,
00713 "int mc_CondReset(int id);",
00714 (ChFuncdl_t)MC_CondReset_chdl
00715 );
00716 Ch_DeclareFunc(
00717 *interp,
00718 "int mc_CondWait(int id);",
00719 (ChFuncdl_t)MC_CondWait_chdl
00720 );
00721 Ch_DeclareFunc(
00722 *interp,
00723 "int mc_DeleteAgent(const char* agentName);",
00724 (ChFuncdl_t)MC_DeleteAgent_chdl
00725 );
00726 Ch_DeclareFunc(
00727 *interp,
00728 "int mc_DeleteAgentWG(MCAgent_t calling_agent, const char* agentName);",
00729 (ChFuncdl_t)MC_DeleteAgentWG_chdl
00730 );
00731 Ch_DeclareFunc(
00732 *interp,
00733 "int mc_DeregisterService(int agentID, char* serviceName);",
00734 (ChFuncdl_t)MC_DeregisterService_chdl
00735 );
00736 Ch_DeclareFunc(
00737 *interp,
00738 "int mc_DestroyServiceSearchResult( char** agentName, char** serviceName, int* agentID, int numResult);",
00739 (ChFuncdl_t)MC_DestroyServiceSearchResult_chdl
00740 );
00741 Ch_DeclareFunc(
00742 *interp,
00743 "int mc_End(void);",
00744 (ChFuncdl_t)MC_End_chdl
00745 );
00746 Ch_DeclareFunc(
00747 *interp,
00748 "void *mc_FindAgentByID(int id);",
00749 (ChFuncdl_t)MC_FindAgentByID_chdl
00750 );
00751
00752 Ch_DeclareFunc(
00753 *interp,
00754 "void *mc_FindAgentByName(const char *name);",
00755 (ChFuncdl_t)MC_FindAgentByName_chdl
00756 );
00757
00758
00759
00760
00761
00762
00763
00764
00765
00766 Ch_DeclareFunc(
00767 *interp,
00768 "int MC_GetAgentID(void* agent);",
00769 (ChFuncdl_t)MC_GetAgentStatus_chdl
00770 );
00771 Ch_DeclareFunc(
00772 *interp,
00773 "char* MC_GetAgentName(void* agent);",
00774 (ChFuncdl_t)MC_GetAgentStatus_chdl
00775 );
00776 Ch_DeclareFunc(
00777 *interp,
00778 "int mc_GetAgentStatus(void* agent);",
00779 (ChFuncdl_t)MC_GetAgentStatus_chdl
00780 );
00781 Ch_DeclareFunc(
00782 *interp,
00783 "char *mc_GetAgentXMLString(void* agent);",
00784 (ChFuncdl_t)MC_GetAgentXMLString_chdl
00785 );
00786
00787 #ifndef _WIN32
00788 Ch_DeclareFunc(
00789 *interp,
00790 "int mc_gettimeofday(void* tv);",
00791 (ChFuncdl_t)MC_GetTimeOfDay_chdl
00792 );
00793 #endif
00794
00795 Ch_DeclareFunc(
00796 *interp,
00797 "int mc_HaltAgency(void);",
00798 (ChFuncdl_t)MC_HaltAgency_chdl
00799 );
00800 Ch_DeclareFunc(
00801 *interp,
00802 "int mc_MigrateAgent(void* agent, const char* hostname, int port);",
00803 (ChFuncdl_t)MC_MigrateAgent_chdl
00804 );
00805 Ch_DeclareFunc(
00806 *interp,
00807 "int mc_MutexLock(int id);",
00808 (ChFuncdl_t)MC_MutexLock_chdl
00809 );
00810 Ch_DeclareFunc(
00811 *interp,
00812 "int mc_MutexUnlock(int id);",
00813 (ChFuncdl_t)MC_MutexUnlock_chdl
00814 );
00815 Ch_DeclareFunc(
00816 *interp,
00817 "int mc_PrintAgentCode(void* agent);",
00818 (ChFuncdl_t)MC_PrintAgentCode_chdl
00819 );
00820 Ch_DeclareFunc(
00821 *interp,
00822 "int mc_ResumeAgency(void);",
00823 (ChFuncdl_t)MC_ResumeAgency_chdl
00824 );
00825 Ch_DeclareFunc(
00826 *interp,
00827 "int mc_SearchForService(const char* searchString, char*** agentNames, char*** serviceNames, int** agentIDs, int* numResults);",
00828 (ChFuncdl_t)MC_SearchForService_chdl
00829 );
00830 Ch_DeclareFunc(
00831 *interp,
00832 "int mc_SendSteerCommand(enum MC_SteerCommand_e command);",
00833 (ChFuncdl_t)MC_SendSteerCommand_chdl
00834 );
00835 Ch_DeclareFunc(
00836 *interp,
00837 "int mc_RegisterService(MCAgent_t agent, char **serviceNames, int numServices);",
00838 (ChFuncdl_t)MC_RegisterService_chdl
00839 );
00840 Ch_DeclareFunc(
00841 *interp,
00842 "void *mc_RetrieveAgent(void);",
00843 (ChFuncdl_t)MC_RetrieveAgent_chdl
00844 );
00845 Ch_DeclareFunc(
00846 *interp,
00847 "char *mc_RetrieveAgentCode(void* agent);",
00848 (ChFuncdl_t)MC_RetrieveAgentCode_chdl
00849 );
00850 Ch_DeclareFunc(
00851 *interp,
00852 "int mc_SaveData(MCAgent_t agent, char* name, int size, void* data);",
00853 (ChFuncdl_t)MC_SaveData_chdl
00854 );
00855 Ch_DeclareFunc(
00856 *interp,
00857 "int mc_SemaphoreWait(int id);",
00858 (ChFuncdl_t)MC_SemaphoreWait_chdl
00859 );
00860 Ch_DeclareFunc(
00861 *interp,
00862 "int mc_SemaphorePost(int id);",
00863 (ChFuncdl_t)MC_SemaphorePost_chdl
00864 );
00865 Ch_DeclareFunc(
00866 *interp,
00867 "int mc_SendAgentMigrationMessage(char *message, char *hostname, int port);",
00868 (ChFuncdl_t)MC_SendAgentMigrationMessage_chdl
00869 );
00870 Ch_DeclareFunc(
00871 *interp,
00872 "int mc_SendAgentMigrationMessageFile(char *filename, char *hostname, int port);",
00873 (ChFuncdl_t)MC_SendAgentMigrationMessageFile_chdl
00874 );
00875 Ch_DeclareFunc(
00876 *interp,
00877 "int mc_SetAgentStatus(void* agent, int status);",
00878 (ChFuncdl_t)MC_SetAgentStatus_chdl
00879 );
00880 Ch_DeclareFunc(
00881 *interp,
00882 "int mc_SetDefaultAgentStatus(int status);",
00883 (ChFuncdl_t)MC_SetDefaultAgentStatus_chdl
00884 );
00885 Ch_DeclareFunc(
00886 *interp,
00887 "int mc_SyncDelete(int id);",
00888 (ChFuncdl_t)MC_SyncDelete_chdl
00889 );
00890 Ch_DeclareFunc(
00891 *interp,
00892 "int mc_SyncInit(int id);",
00893 (ChFuncdl_t)MC_SyncInit_chdl
00894 );
00895 Ch_DeclareFunc(
00896 *interp,
00897 "int mc_TerminateAgent(const char* agentName);",
00898 (ChFuncdl_t)MC_TerminateAgent_chdl
00899 );
00900 Ch_DeclareFunc(
00901 *interp,
00902 "int mc_TerminateAgentWG(void* callingAgent, const char* agentName);",
00903 (ChFuncdl_t)MC_TerminateAgentWG_chdl
00904 );
00905 Ch_DeclareFunc(
00906 *interp,
00907 "int mc_GetAgentID(void* agent);",
00908 (ChFuncdl_t)MC_GetAgentID_chdl
00909 );
00910 Ch_DeclareFunc(
00911 *interp,
00912 "char *mc_GetAgentName(void* agent);",
00913 (ChFuncdl_t)MC_GetAgentName_chdl
00914 );
00915
00916 return;
00917 }
00918
00919 #ifndef _WIN32
00920 void*
00921 agent_RunChScriptThread(void * ChAgent)
00922 #else
00923 DWORD WINAPI
00924 agent_RunChScriptThread(void* ChAgent)
00925 #endif
00926 {
00927 #ifndef _WIN32
00928 int fd;
00929 #endif
00930 MCAgent_t agent;
00931 mc_platform_p mc_platform;
00932 int i,n;
00933 FILE *TEMP_FILE;
00934 char *temp_store_file;
00935 char *ChShellArg[2];
00936 void *result;
00937 int progress;
00938 char *tmp_buf;
00939 interpreter_variable_data_t* temp_interp_data;
00940
00941
00942 agent = (MCAgent_t)ChAgent;
00943 progress = agent->datastate->task_progress;
00944 mc_platform = agent->mc_platform;
00945
00946
00947 if(ChAgent == NULL)
00948 {
00949 printf("ERROR, AGENT NULL \n");
00950 #ifndef _WIN32
00951 return NULL;
00952 #else
00953 return 0;
00954 #endif
00955 }
00956
00957
00958 agent->agent_interp = interpreter_queue_CreateRetrieve(mc_platform->interpreter_queue,
00959 agent->mc_platform->interp_options );
00960
00961
00962
00963 Ch_SetVar(*agent->agent_interp, "mc_agent_id",
00964 CH_INTTYPE, (int)agent->id);
00965
00966 Ch_SetVar(*agent->agent_interp, "mc_agent_name",
00967 CH_CHARPTRTYPE, agent->name);
00968
00969 Ch_SetVar(*agent->agent_interp, "mc_current_agent",
00970 CH_VOIDPTRTYPE, (void*)((size_t)agent));
00971
00972 Ch_SetVar(*agent->agent_interp, "mc_host_name",
00973 CH_CHARPTRTYPE, agent->mc_platform->hostname);
00974
00975 Ch_SetVar(*agent->agent_interp, "mc_host_port",
00976 CH_INTTYPE, (int)agent->mc_platform->port);
00977
00978 Ch_SetVar(*agent->agent_interp, "mc_task_progress",
00979 CH_INTTYPE, (int)agent->datastate->task_progress);
00980
00981 Ch_SetVar(*agent->agent_interp, "mc_num_tasks",
00982 CH_INTTYPE, (int)agent->datastate->number_of_tasks);
00983
00984 Ch_SetVar(*agent->agent_interp, "mc_agent_address",
00985 CH_CHARPTRTYPE, agent->agent_address);
00986
00987
00988
00989
00990
00991
00992
00993
00994
00995
00996 if(strlen(agent->datastate->agent_code) < 5)
00997 {
00998 MUTEX_LOCK(agent->run_lock);
00999 if(Ch_AppendRunScript(
01000 *((MCAgent_t)ChAgent)->agent_interp,
01001 ((MCAgent_t)ChAgent)->datastate->agent_code))
01002 {
01003
01004 printf("CH Failure \n");
01005 printf("***************************************************\nCode was:\n%s\n\n", agent->datastate->agent_code);
01006
01007 }
01008 if(Ch_CallFuncByName(*((MCAgent_t)ChAgent)->agent_interp, "main", NULL))
01009 {
01010 printf("CH2 failure \n");
01011 exit(EXIT_FAILURE);
01012 }
01013 MUTEX_UNLOCK(agent->run_lock);
01014 }
01015 else
01016 {
01017
01018 #ifndef _WIN32
01019
01020 temp_store_file = (char *)malloc(sizeof(char)*30);
01021
01022 strcpy(temp_store_file, "agentchscriptXXXXXX");
01023 fd = mkstemp(temp_store_file);
01024 if (fd == -1) {
01025 fprintf(stderr, "Could not create temporary file:%s. %s:%d\n",
01026 temp_store_file,
01027 __FILE__,
01028 __LINE__ );
01029 exit(EXIT_FAILURE);
01030 }
01031 close(fd);
01032 #else
01033 temp_store_file = _tempnam(".", "agentchscript");
01034 #endif
01035 TEMP_FILE = fopen(temp_store_file, "w");
01036
01037
01038 n = fwrite(
01039 (void *)agent->datastate->agent_code,
01040 sizeof(char),
01041 strlen(agent->datastate->agent_code),
01042 TEMP_FILE);
01043
01044 fclose(TEMP_FILE);
01045
01046
01047 ChShellArg[0] = temp_store_file;
01048 ChShellArg[1] = NULL;
01049 MUTEX_LOCK(agent->run_lock);
01050 if(Ch_RunScript(*agent->agent_interp, ChShellArg) < 0) {
01051 fprintf(stderr, "Ch_RunScript error. %s:%d\n", __FILE__, __LINE__);
01052 }
01053
01054
01055
01056
01057
01058
01059
01060
01061 remove(temp_store_file);
01062 #ifndef _WIN32
01063 free(temp_store_file);
01064 #endif
01065 MUTEX_UNLOCK(agent->run_lock);
01066 }
01067
01068
01069 if(strcmp(agent->datastate->tasks[progress]->var_name, "no-return"))
01070 {
01071 result = interpreter_variable_data_InitializeFromAgent(agent);
01072
01073 interpreter_variable_data_Destroy(
01074 agent->datastate->tasks[progress]->agent_return_data
01075 );
01076
01077 agent->datastate->tasks[progress]->agent_return_data =
01078 result;
01079 } else {
01080 interpreter_variable_data_Destroy(
01081 agent->datastate->tasks[progress]->agent_return_data );
01082 agent->datastate->tasks[progress]->agent_return_data = NULL;
01083 }
01084
01085
01086
01087 while (
01088 temp_interp_data = agent_variable_list_Pop(
01089 agent->datastate->tasks[progress]->agent_variable_list )
01090 ) {
01091 interpreter_variable_data_Destroy(temp_interp_data);
01092 }
01093 for(i = 0; i < agent->datastate->tasks[progress]->num_saved_variables; i++) {
01094
01095
01096
01097
01098 agent_variable_list_Add(
01099 agent->datastate->tasks[progress]->agent_variable_list,
01100 interpreter_variable_data_Initialize(
01101 agent,
01102 agent->datastate->tasks[progress]->saved_variables[i] )
01103 );
01104 }
01105
01106
01107 agent->datastate->task_progress += agent->datastate->progress_modifier;
01108
01109 if (agent->datastate->persistent ||
01110 agent->datastate->tasks[progress]->persistent ) {
01111
01112
01113
01114
01115
01116
01117
01118
01119
01120
01121
01122 ((MCAgent_t) ChAgent)->agent_status = MC_AGENT_NEUTRAL;
01123 } else {
01124 if ((((MCAgent_t)ChAgent)->agent_interp) != NULL) {
01125
01126 Ch_Reset(*agent->agent_interp);
01127 interpreter_queue_Add(mc_platform->interpreter_queue, agent->agent_interp);
01128 }
01129
01130
01131 if (
01132 (agent->datastate->task_progress ==
01133 (agent->datastate->number_of_tasks-1))
01134 )
01135 {
01136
01137 ((MCAgent_t) ChAgent)->agent_status = MC_WAIT_FINISHED;
01138
01139
01140 for(i = 0;
01141 i < agent->datastate->number_of_tasks;
01142 i++)
01143 {
01144 if (agent->datastate->tasks[i]->agent_return_data != NULL) {
01145 ((MCAgent_t) ChAgent)->agent_status = MC_WAIT_MESSGSEND;
01146 }
01147 }
01148 }
01149 else {
01150 ((MCAgent_t) ChAgent)->agent_status = MC_WAIT_MESSGSEND;
01151 }
01152 }
01153
01154
01155 agent->datastate->task_progress++;
01156
01157 if (
01158 (agent->datastate->task_progress >= agent->datastate->number_of_tasks)
01159 )
01160 {
01161 agent->agent_type = MC_RETURN_AGENT;
01162 }
01163
01164 SIGNAL(
01165 mc_platform->MC_signal_cond,
01166 mc_platform->MC_signal_lock,
01167 mc_platform->MC_signal = MC_EXEC_AGENT;
01168 );
01169
01170 MUTEX_LOCK( mc_platform->MC_signal_lock);
01171 MUTEX_UNLOCK( mc_platform->MC_signal_lock );
01172 MUTEX_LOCK(mc_platform->ams->runflag_lock);
01173 mc_platform->ams->run = 1;
01174 COND_SIGNAL(mc_platform->ams->runflag_cond);
01175 MUTEX_UNLOCK(mc_platform->ams->runflag_lock);
01176
01177 #ifndef _WIN32
01178 pthread_exit(ChAgent);
01179 #else
01180 return 0;
01181 #endif
01182 }