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, int persistent);",
00699 (ChFuncdl_t)MC_ComposeAgent_chdl
00700 );
00701 Ch_DeclareFunc(
00702 *interp,
00703 "MCAgent_t mc_ComposeAgentS(const char* name, *home, *owner, *code, *return_var_name, *server, *workgroup_code, int persistent);",
00704 (ChFuncdl_t)MC_ComposeAgentS_chdl
00705 );
00706 Ch_DeclareFunc(
00707 *interp,
00708 "int mc_CondBroadcast(int id);",
00709 (ChFuncdl_t)MC_CondBroadcast_chdl
00710 );
00711 Ch_DeclareFunc(
00712 *interp,
00713 "int mc_CondSignal(int id);",
00714 (ChFuncdl_t)MC_CondSignal_chdl
00715 );
00716 Ch_DeclareFunc(
00717 *interp,
00718 "int mc_CondReset(int id);",
00719 (ChFuncdl_t)MC_CondReset_chdl
00720 );
00721 Ch_DeclareFunc(
00722 *interp,
00723 "int mc_CondWait(int id);",
00724 (ChFuncdl_t)MC_CondWait_chdl
00725 );
00726 Ch_DeclareFunc(
00727 *interp,
00728 "int mc_DeleteAgent(const char* agentName);",
00729 (ChFuncdl_t)MC_DeleteAgent_chdl
00730 );
00731 Ch_DeclareFunc(
00732 *interp,
00733 "int mc_DeleteAgentWG(MCAgent_t calling_agent, const char* agentName);",
00734 (ChFuncdl_t)MC_DeleteAgentWG_chdl
00735 );
00736 Ch_DeclareFunc(
00737 *interp,
00738 "int mc_DeregisterService(int agentID, char* serviceName);",
00739 (ChFuncdl_t)MC_DeregisterService_chdl
00740 );
00741 Ch_DeclareFunc(
00742 *interp,
00743 "int mc_DestroyServiceSearchResult( char** agentName, char** serviceName, int* agentID, int numResult);",
00744 (ChFuncdl_t)MC_DestroyServiceSearchResult_chdl
00745 );
00746 Ch_DeclareFunc(
00747 *interp,
00748 "int mc_End(void);",
00749 (ChFuncdl_t)MC_End_chdl
00750 );
00751 Ch_DeclareFunc(
00752 *interp,
00753 "void *mc_FindAgentByID(int id);",
00754 (ChFuncdl_t)MC_FindAgentByID_chdl
00755 );
00756
00757 Ch_DeclareFunc(
00758 *interp,
00759 "void *mc_FindAgentByName(const char *name);",
00760 (ChFuncdl_t)MC_FindAgentByName_chdl
00761 );
00762
00763
00764
00765
00766
00767
00768
00769
00770
00771 Ch_DeclareFunc(
00772 *interp,
00773 "int MC_GetAgentID(void* agent);",
00774 (ChFuncdl_t)MC_GetAgentStatus_chdl
00775 );
00776 Ch_DeclareFunc(
00777 *interp,
00778 "char* MC_GetAgentName(void* agent);",
00779 (ChFuncdl_t)MC_GetAgentStatus_chdl
00780 );
00781 Ch_DeclareFunc(
00782 *interp,
00783 "int mc_GetAgentStatus(void* agent);",
00784 (ChFuncdl_t)MC_GetAgentStatus_chdl
00785 );
00786 Ch_DeclareFunc(
00787 *interp,
00788 "char *mc_GetAgentXMLString(void* agent);",
00789 (ChFuncdl_t)MC_GetAgentXMLString_chdl
00790 );
00791
00792 #ifndef _WIN32
00793 Ch_DeclareFunc(
00794 *interp,
00795 "int mc_gettimeofday(void* tv);",
00796 (ChFuncdl_t)MC_GetTimeOfDay_chdl
00797 );
00798 #endif
00799
00800 Ch_DeclareFunc(
00801 *interp,
00802 "int mc_HaltAgency(void);",
00803 (ChFuncdl_t)MC_HaltAgency_chdl
00804 );
00805 Ch_DeclareFunc(
00806 *interp,
00807 "int mc_MigrateAgent(void* agent, const char* hostname, int port);",
00808 (ChFuncdl_t)MC_MigrateAgent_chdl
00809 );
00810 Ch_DeclareFunc(
00811 *interp,
00812 "int mc_MutexLock(int id);",
00813 (ChFuncdl_t)MC_MutexLock_chdl
00814 );
00815 Ch_DeclareFunc(
00816 *interp,
00817 "int mc_MutexUnlock(int id);",
00818 (ChFuncdl_t)MC_MutexUnlock_chdl
00819 );
00820 Ch_DeclareFunc(
00821 *interp,
00822 "int mc_PrintAgentCode(void* agent);",
00823 (ChFuncdl_t)MC_PrintAgentCode_chdl
00824 );
00825 Ch_DeclareFunc(
00826 *interp,
00827 "int mc_ResumeAgency(void);",
00828 (ChFuncdl_t)MC_ResumeAgency_chdl
00829 );
00830 Ch_DeclareFunc(
00831 *interp,
00832 "int mc_SearchForService(const char* searchString, char*** agentNames, char*** serviceNames, int** agentIDs, int* numResults);",
00833 (ChFuncdl_t)MC_SearchForService_chdl
00834 );
00835 Ch_DeclareFunc(
00836 *interp,
00837 "int mc_SendSteerCommand(enum MC_SteerCommand_e command);",
00838 (ChFuncdl_t)MC_SendSteerCommand_chdl
00839 );
00840 Ch_DeclareFunc(
00841 *interp,
00842 "int mc_RegisterService(MCAgent_t agent, char **serviceNames, int numServices);",
00843 (ChFuncdl_t)MC_RegisterService_chdl
00844 );
00845 Ch_DeclareFunc(
00846 *interp,
00847 "void *mc_RetrieveAgent(void);",
00848 (ChFuncdl_t)MC_RetrieveAgent_chdl
00849 );
00850 Ch_DeclareFunc(
00851 *interp,
00852 "char *mc_RetrieveAgentCode(void* agent);",
00853 (ChFuncdl_t)MC_RetrieveAgentCode_chdl
00854 );
00855 Ch_DeclareFunc(
00856 *interp,
00857 "int mc_SaveData(MCAgent_t agent, char* name, int size, void* data);",
00858 (ChFuncdl_t)MC_SaveData_chdl
00859 );
00860 Ch_DeclareFunc(
00861 *interp,
00862 "int mc_SemaphoreWait(int id);",
00863 (ChFuncdl_t)MC_SemaphoreWait_chdl
00864 );
00865 Ch_DeclareFunc(
00866 *interp,
00867 "int mc_SemaphorePost(int id);",
00868 (ChFuncdl_t)MC_SemaphorePost_chdl
00869 );
00870 Ch_DeclareFunc(
00871 *interp,
00872 "int mc_SendAgentMigrationMessage(char *message, char *hostname, int port);",
00873 (ChFuncdl_t)MC_SendAgentMigrationMessage_chdl
00874 );
00875 Ch_DeclareFunc(
00876 *interp,
00877 "int mc_SendAgentMigrationMessageFile(char *filename, char *hostname, int port);",
00878 (ChFuncdl_t)MC_SendAgentMigrationMessageFile_chdl
00879 );
00880 Ch_DeclareFunc(
00881 *interp,
00882 "int mc_SetAgentStatus(void* agent, int status);",
00883 (ChFuncdl_t)MC_SetAgentStatus_chdl
00884 );
00885 Ch_DeclareFunc(
00886 *interp,
00887 "int mc_SetDefaultAgentStatus(int status);",
00888 (ChFuncdl_t)MC_SetDefaultAgentStatus_chdl
00889 );
00890 Ch_DeclareFunc(
00891 *interp,
00892 "int mc_SyncDelete(int id);",
00893 (ChFuncdl_t)MC_SyncDelete_chdl
00894 );
00895 Ch_DeclareFunc(
00896 *interp,
00897 "int mc_SyncInit(int id);",
00898 (ChFuncdl_t)MC_SyncInit_chdl
00899 );
00900 Ch_DeclareFunc(
00901 *interp,
00902 "int mc_TerminateAgent(const char* agentName);",
00903 (ChFuncdl_t)MC_TerminateAgent_chdl
00904 );
00905 Ch_DeclareFunc(
00906 *interp,
00907 "int mc_TerminateAgentWG(void* callingAgent, const char* agentName);",
00908 (ChFuncdl_t)MC_TerminateAgentWG_chdl
00909 );
00910 Ch_DeclareFunc(
00911 *interp,
00912 "int mc_GetAgentID(void* agent);",
00913 (ChFuncdl_t)MC_GetAgentID_chdl
00914 );
00915 Ch_DeclareFunc(
00916 *interp,
00917 "char *mc_GetAgentName(void* agent);",
00918 (ChFuncdl_t)MC_GetAgentName_chdl
00919 );
00920
00921 return;
00922 }
00923
00924 #ifndef _WIN32
00925 void*
00926 agent_RunChScriptThread(void * ChAgent)
00927 #else
00928 DWORD WINAPI
00929 agent_RunChScriptThread(void* ChAgent)
00930 #endif
00931 {
00932 #ifndef _WIN32
00933 int fd;
00934 #endif
00935 MCAgent_t agent;
00936 mc_platform_p mc_platform;
00937 int i,n;
00938 FILE *TEMP_FILE;
00939 char *temp_store_file;
00940 char *ChShellArg[2];
00941 void *result;
00942 int progress;
00943 char *tmp_buf;
00944 interpreter_variable_data_t* temp_interp_data;
00945
00946
00947 agent = (MCAgent_t)ChAgent;
00948 progress = agent->datastate->task_progress;
00949 mc_platform = agent->mc_platform;
00950
00951
00952 if(ChAgent == NULL)
00953 {
00954 printf("ERROR, AGENT NULL \n");
00955 #ifndef _WIN32
00956 return NULL;
00957 #else
00958 return 0;
00959 #endif
00960 }
00961
00962
00963 agent->agent_interp = interpreter_queue_CreateRetrieve(mc_platform->interpreter_queue,
00964 agent->mc_platform->interp_options );
00965
00966
00967
00968 Ch_SetVar(*agent->agent_interp, "mc_agent_id",
00969 CH_INTTYPE, (int)agent->id);
00970
00971 Ch_SetVar(*agent->agent_interp, "mc_agent_name",
00972 CH_CHARPTRTYPE, agent->name);
00973
00974 Ch_SetVar(*agent->agent_interp, "mc_current_agent",
00975 CH_VOIDPTRTYPE, (void*)((size_t)agent));
00976
00977 Ch_SetVar(*agent->agent_interp, "mc_host_name",
00978 CH_CHARPTRTYPE, agent->mc_platform->hostname);
00979
00980 Ch_SetVar(*agent->agent_interp, "mc_host_port",
00981 CH_INTTYPE, (int)agent->mc_platform->port);
00982
00983 Ch_SetVar(*agent->agent_interp, "mc_task_progress",
00984 CH_INTTYPE, (int)agent->datastate->task_progress);
00985
00986 Ch_SetVar(*agent->agent_interp, "mc_num_tasks",
00987 CH_INTTYPE, (int)agent->datastate->number_of_tasks);
00988
00989 Ch_SetVar(*agent->agent_interp, "mc_agent_address",
00990 CH_CHARPTRTYPE, agent->agent_address);
00991
00992
00993
00994
00995
00996
00997
00998
00999
01000
01001 if(strlen(agent->datastate->agent_code) < 5)
01002 {
01003 MUTEX_LOCK(agent->run_lock);
01004 if(Ch_AppendRunScript(
01005 *((MCAgent_t)ChAgent)->agent_interp,
01006 ((MCAgent_t)ChAgent)->datastate->agent_code))
01007 {
01008
01009 printf("CH Failure \n");
01010 printf("***************************************************\nCode was:\n%s\n\n", agent->datastate->agent_code);
01011
01012 }
01013 if(Ch_CallFuncByName(*((MCAgent_t)ChAgent)->agent_interp, "main", NULL))
01014 {
01015 printf("CH2 failure \n");
01016 exit(EXIT_FAILURE);
01017 }
01018 MUTEX_UNLOCK(agent->run_lock);
01019 }
01020 else
01021 {
01022
01023 #ifndef _WIN32
01024
01025 temp_store_file = (char *)malloc(sizeof(char)*30);
01026
01027 strcpy(temp_store_file, "agentchscriptXXXXXX");
01028 fd = mkstemp(temp_store_file);
01029 if (fd == -1) {
01030 fprintf(stderr, "Could not create temporary file:%s. %s:%d\n",
01031 temp_store_file,
01032 __FILE__,
01033 __LINE__ );
01034 exit(EXIT_FAILURE);
01035 }
01036 close(fd);
01037 #else
01038 temp_store_file = _tempnam(".", "agentchscript");
01039 #endif
01040 TEMP_FILE = fopen(temp_store_file, "w");
01041
01042
01043 n = fwrite(
01044 (void *)agent->datastate->agent_code,
01045 sizeof(char),
01046 strlen(agent->datastate->agent_code),
01047 TEMP_FILE);
01048
01049 fclose(TEMP_FILE);
01050
01051
01052 ChShellArg[0] = temp_store_file;
01053 ChShellArg[1] = NULL;
01054 MUTEX_LOCK(agent->run_lock);
01055 if(Ch_RunScript(*agent->agent_interp, ChShellArg) < 0) {
01056 fprintf(stderr, "Ch_RunScript error. %s:%d\n", __FILE__, __LINE__);
01057 }
01058
01059
01060
01061
01062
01063
01064
01065
01066 remove(temp_store_file);
01067 #ifndef _WIN32
01068 free(temp_store_file);
01069 #endif
01070 MUTEX_UNLOCK(agent->run_lock);
01071 }
01072
01073
01074 if(strcmp(agent->datastate->tasks[progress]->var_name, "no-return"))
01075 {
01076 result = interpreter_variable_data_InitializeFromAgent(agent);
01077
01078 interpreter_variable_data_Destroy(
01079 agent->datastate->tasks[progress]->agent_return_data
01080 );
01081
01082 agent->datastate->tasks[progress]->agent_return_data =
01083 result;
01084 } else {
01085 interpreter_variable_data_Destroy(
01086 agent->datastate->tasks[progress]->agent_return_data );
01087 agent->datastate->tasks[progress]->agent_return_data = NULL;
01088 }
01089
01090
01091
01092 while (
01093 temp_interp_data = agent_variable_list_Pop(
01094 agent->datastate->tasks[progress]->agent_variable_list )
01095 ) {
01096 interpreter_variable_data_Destroy(temp_interp_data);
01097 }
01098 for(i = 0; i < agent->datastate->tasks[progress]->num_saved_variables; i++) {
01099
01100
01101
01102
01103 agent_variable_list_Add(
01104 agent->datastate->tasks[progress]->agent_variable_list,
01105 interpreter_variable_data_Initialize(
01106 agent,
01107 agent->datastate->tasks[progress]->saved_variables[i] )
01108 );
01109 }
01110
01111
01112 agent->datastate->task_progress += agent->datastate->progress_modifier;
01113
01114 if (agent->datastate->persistent ||
01115 agent->datastate->tasks[progress]->persistent ) {
01116
01117
01118
01119
01120
01121
01122
01123
01124
01125
01126
01127 ((MCAgent_t) ChAgent)->agent_status = MC_AGENT_NEUTRAL;
01128 } else {
01129 if ((((MCAgent_t)ChAgent)->agent_interp) != NULL) {
01130
01131 Ch_Reset(*agent->agent_interp);
01132 interpreter_queue_Add(mc_platform->interpreter_queue, agent->agent_interp);
01133 }
01134
01135
01136 if (
01137 (agent->datastate->task_progress ==
01138 (agent->datastate->number_of_tasks-1))
01139 )
01140 {
01141
01142 ((MCAgent_t) ChAgent)->agent_status = MC_WAIT_FINISHED;
01143
01144
01145 for(i = 0;
01146 i < agent->datastate->number_of_tasks;
01147 i++)
01148 {
01149 if (agent->datastate->tasks[i]->agent_return_data != NULL) {
01150 ((MCAgent_t) ChAgent)->agent_status = MC_WAIT_MESSGSEND;
01151 }
01152 }
01153 }
01154 else {
01155 ((MCAgent_t) ChAgent)->agent_status = MC_WAIT_MESSGSEND;
01156 }
01157 }
01158
01159
01160 agent->datastate->task_progress++;
01161
01162 if (
01163 (agent->datastate->task_progress >= agent->datastate->number_of_tasks)
01164 )
01165 {
01166 agent->agent_type = MC_RETURN_AGENT;
01167 }
01168
01169 SIGNAL(
01170 mc_platform->MC_signal_cond,
01171 mc_platform->MC_signal_lock,
01172 mc_platform->MC_signal = MC_EXEC_AGENT;
01173 );
01174
01175 MUTEX_LOCK( mc_platform->MC_signal_lock);
01176 MUTEX_UNLOCK( mc_platform->MC_signal_lock );
01177 MUTEX_LOCK(mc_platform->ams->runflag_lock);
01178 mc_platform->ams->run = 1;
01179 COND_SIGNAL(mc_platform->ams->runflag_cond);
01180 MUTEX_UNLOCK(mc_platform->ams->runflag_lock);
01181
01182 #ifndef _WIN32
01183 pthread_exit(ChAgent);
01184 #else
01185 return 0;
01186 #endif
01187 }