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