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 "int mc_AgentAttachFile(void* agent, const char* name, const char* filepath);",
00746 (ChFuncdl_t)MC_AgentAttachFile_chdl
00747 );
00748 Ch_DeclareFunc(
00749 *interp,
00750 "int mc_AgentListFiles(void* agent, int task_num, char*** names, int* num_files);",
00751 (ChFuncdl_t)MC_AgentListFiles_chdl
00752 );
00753 Ch_DeclareFunc(
00754 *interp,
00755 "int mc_AgentRetrieveFile(void* agent, int task_num, const char* name, const char* save_path);",
00756 (ChFuncdl_t)MC_AgentRetrieveFile_chdl
00757 );
00758 Ch_DeclareFunc(
00759 *interp,
00760 "const void* mc_AgentVariableRetrieve(void* agent, const char* var_name, int task_num);",
00761 (ChFuncdl_t)MC_AgentVariableRetrieve_chdl
00762 );
00763 Ch_DeclareFunc(
00764 *interp,
00765 "int mc_AgentVariableSave(void* agent, const char* var_name);",
00766 (ChFuncdl_t)MC_AgentVariableSave_chdl
00767 );
00768 Ch_DeclareFunc(
00769 *interp,
00770 "int mc_Barrier(int id);",
00771 (ChFuncdl_t)MC_Barrier_chdl
00772 );
00773 Ch_DeclareFunc(
00774 *interp,
00775 "int mc_BarrierDelete(int id);",
00776 (ChFuncdl_t)MC_BarrierDelete_chdl
00777 );
00778 Ch_DeclareFunc(
00779 *interp,
00780 "int mc_BarrierInit(int id, int num_procs);",
00781 (ChFuncdl_t)MC_BarrierInit_chdl
00782 );
00783 Ch_DeclareFunc(
00784 *interp,
00785 "int mc_CallAgentFunc(char* agentName, const char* funcName, void* returnVal, ...);",
00786 (ChFuncdl_t)MC_CallAgentFunc_chdl
00787 );
00788 Ch_DeclareFunc(
00789 *interp,
00790 "MCAgent_t mc_ComposeAgent(const char* name, *home, *owner, *code, *return_var_name, *server, int persistent);",
00791 (ChFuncdl_t)MC_ComposeAgent_chdl
00792 );
00793 Ch_DeclareFunc(
00794 *interp,
00795 "MCAgent_t mc_ComposeAgentS(const char* name, *home, *owner, *code, *return_var_name, *server, *workgroup_code, int persistent);",
00796 (ChFuncdl_t)MC_ComposeAgentWithWorkgroup_chdl
00797 );
00798 Ch_DeclareFunc(
00799 *interp,
00800 "MCAgent_t mc_ComposeAgentWithWorkgroup(const char* name, *home, *owner, *code, *return_var_name, *server, *workgroup_code, int persistent);",
00801 (ChFuncdl_t)MC_ComposeAgentWithWorkgroup_chdl
00802 );
00803 Ch_DeclareFunc(
00804 *interp,
00805 "MCAgent_t mc_ComposeAgentFromFile(const char* name, *home, *owner, *filename, *return_var_name, *server, int persistent);",
00806 (ChFuncdl_t)MC_ComposeAgentFromFile_chdl
00807 );
00808 Ch_DeclareFunc(
00809 *interp,
00810 "MCAgent_t mc_ComposeAgentFromFileWithWorkgroup(const char* name, *home, *owner, *filename, *return_var_name, *server, *workgroup_code, int persistent);",
00811 (ChFuncdl_t)MC_ComposeAgentFromFileWithWorkgroup_chdl
00812 );
00813 Ch_DeclareFunc(
00814 *interp,
00815 "int mc_CondBroadcast(int id);",
00816 (ChFuncdl_t)MC_CondBroadcast_chdl
00817 );
00818 Ch_DeclareFunc(
00819 *interp,
00820 "int mc_CondSignal(int id);",
00821 (ChFuncdl_t)MC_CondSignal_chdl
00822 );
00823 Ch_DeclareFunc(
00824 *interp,
00825 "int mc_CondReset(int id);",
00826 (ChFuncdl_t)MC_CondReset_chdl
00827 );
00828 Ch_DeclareFunc(
00829 *interp,
00830 "int mc_CondWait(int id);",
00831 (ChFuncdl_t)MC_CondWait_chdl
00832 );
00833 Ch_DeclareFunc(
00834 *interp,
00835 "int mc_DeleteAgent(const char* agentName);",
00836 (ChFuncdl_t)MC_DeleteAgent_chdl
00837 );
00838 Ch_DeclareFunc(
00839 *interp,
00840 "int mc_DeleteAgentWG(MCAgent_t calling_agent, const char* agentName);",
00841 (ChFuncdl_t)MC_DeleteAgentWG_chdl
00842 );
00843 Ch_DeclareFunc(
00844 *interp,
00845 "int mc_DeregisterService(int agentID, char* serviceName);",
00846 (ChFuncdl_t)MC_DeregisterService_chdl
00847 );
00848 Ch_DeclareFunc(
00849 *interp,
00850 "int mc_DestroyServiceSearchResult( char** agentName, char** serviceName, int* agentID, int numResult);",
00851 (ChFuncdl_t)MC_DestroyServiceSearchResult_chdl
00852 );
00853 Ch_DeclareFunc(
00854 *interp,
00855 "int mc_End(void);",
00856 (ChFuncdl_t)MC_End_chdl
00857 );
00858 Ch_DeclareFunc(
00859 *interp,
00860 "void *mc_FindAgentByID(int id);",
00861 (ChFuncdl_t)MC_FindAgentByID_chdl
00862 );
00863
00864 Ch_DeclareFunc(
00865 *interp,
00866 "void *mc_FindAgentByName(const char *name);",
00867 (ChFuncdl_t)MC_FindAgentByName_chdl
00868 );
00869
00870
00871
00872
00873
00874
00875
00876
00877
00878 Ch_DeclareFunc(
00879 *interp,
00880 "int MC_GetAgentID(void* agent);",
00881 (ChFuncdl_t)MC_GetAgentStatus_chdl
00882 );
00883 Ch_DeclareFunc(
00884 *interp,
00885 "char* MC_GetAgentName(void* agent);",
00886 (ChFuncdl_t)MC_GetAgentStatus_chdl
00887 );
00888 Ch_DeclareFunc(
00889 *interp,
00890 "int mc_GetAgentStatus(void* agent);",
00891 (ChFuncdl_t)MC_GetAgentStatus_chdl
00892 );
00893 Ch_DeclareFunc(
00894 *interp,
00895 "char *mc_GetAgentXMLString(void* agent);",
00896 (ChFuncdl_t)MC_GetAgentXMLString_chdl
00897 );
00898
00899 #ifndef _WIN32
00900 Ch_DeclareFunc(
00901 *interp,
00902 "int mc_gettimeofday(void* tv);",
00903 (ChFuncdl_t)MC_GetTimeOfDay_chdl
00904 );
00905 #endif
00906
00907 Ch_DeclareFunc(
00908 *interp,
00909 "int mc_HaltAgency(void);",
00910 (ChFuncdl_t)MC_HaltAgency_chdl
00911 );
00912 Ch_DeclareFunc(
00913 *interp,
00914 "int mc_MigrateAgent(void* agent, const char* hostname, int port);",
00915 (ChFuncdl_t)MC_MigrateAgent_chdl
00916 );
00917 Ch_DeclareFunc(
00918 *interp,
00919 "int mc_MutexLock(int id);",
00920 (ChFuncdl_t)MC_MutexLock_chdl
00921 );
00922 Ch_DeclareFunc(
00923 *interp,
00924 "int mc_MutexUnlock(int id);",
00925 (ChFuncdl_t)MC_MutexUnlock_chdl
00926 );
00927 Ch_DeclareFunc(
00928 *interp,
00929 "int mc_PrintAgentCode(void* agent);",
00930 (ChFuncdl_t)MC_PrintAgentCode_chdl
00931 );
00932 Ch_DeclareFunc(
00933 *interp,
00934 "int mc_ResumeAgency(void);",
00935 (ChFuncdl_t)MC_ResumeAgency_chdl
00936 );
00937 Ch_DeclareFunc(
00938 *interp,
00939 "int mc_SearchForService(const char* searchString, char*** agentNames, char*** serviceNames, int** agentIDs, int* numResults);",
00940 (ChFuncdl_t)MC_SearchForService_chdl
00941 );
00942 Ch_DeclareFunc(
00943 *interp,
00944 "int mc_SendSteerCommand(enum MC_SteerCommand_e command);",
00945 (ChFuncdl_t)MC_SendSteerCommand_chdl
00946 );
00947 Ch_DeclareFunc(
00948 *interp,
00949 "int mc_RegisterService(MCAgent_t agent, char **serviceNames, int numServices);",
00950 (ChFuncdl_t)MC_RegisterService_chdl
00951 );
00952 Ch_DeclareFunc(
00953 *interp,
00954 "void *mc_RetrieveAgent(void);",
00955 (ChFuncdl_t)MC_RetrieveAgent_chdl
00956 );
00957 Ch_DeclareFunc(
00958 *interp,
00959 "char *mc_RetrieveAgentCode(void* agent);",
00960 (ChFuncdl_t)MC_RetrieveAgentCode_chdl
00961 );
00962 Ch_DeclareFunc(
00963 *interp,
00964 "int mc_SaveData(MCAgent_t agent, char* name, int size, void* data);",
00965 (ChFuncdl_t)MC_SaveData_chdl
00966 );
00967 Ch_DeclareFunc(
00968 *interp,
00969 "int mc_SemaphoreWait(int id);",
00970 (ChFuncdl_t)MC_SemaphoreWait_chdl
00971 );
00972 Ch_DeclareFunc(
00973 *interp,
00974 "int mc_SemaphorePost(int id);",
00975 (ChFuncdl_t)MC_SemaphorePost_chdl
00976 );
00977 Ch_DeclareFunc(
00978 *interp,
00979 "int mc_SendAgentMigrationMessage(char *message, char *hostname, int port);",
00980 (ChFuncdl_t)MC_SendAgentMigrationMessage_chdl
00981 );
00982 Ch_DeclareFunc(
00983 *interp,
00984 "int mc_SendAgentMigrationMessageFile(char *filename, char *hostname, int port);",
00985 (ChFuncdl_t)MC_SendAgentMigrationMessageFile_chdl
00986 );
00987 Ch_DeclareFunc(
00988 *interp,
00989 "int mc_SetAgentStatus(void* agent, int status);",
00990 (ChFuncdl_t)MC_SetAgentStatus_chdl
00991 );
00992 Ch_DeclareFunc(
00993 *interp,
00994 "int mc_SetDefaultAgentStatus(int status);",
00995 (ChFuncdl_t)MC_SetDefaultAgentStatus_chdl
00996 );
00997 Ch_DeclareFunc(
00998 *interp,
00999 "int mc_SyncDelete(int id);",
01000 (ChFuncdl_t)MC_SyncDelete_chdl
01001 );
01002 Ch_DeclareFunc(
01003 *interp,
01004 "int mc_SyncInit(int id);",
01005 (ChFuncdl_t)MC_SyncInit_chdl
01006 );
01007 Ch_DeclareFunc(
01008 *interp,
01009 "int mc_TerminateAgent(const char* agentName);",
01010 (ChFuncdl_t)MC_TerminateAgent_chdl
01011 );
01012 Ch_DeclareFunc(
01013 *interp,
01014 "int mc_TerminateAgentWG(void* callingAgent, const char* agentName);",
01015 (ChFuncdl_t)MC_TerminateAgentWG_chdl
01016 );
01017 Ch_DeclareFunc(
01018 *interp,
01019 "int mc_GetAgentID(void* agent);",
01020 (ChFuncdl_t)MC_GetAgentID_chdl
01021 );
01022 Ch_DeclareFunc(
01023 *interp,
01024 "char *mc_GetAgentName(void* agent);",
01025 (ChFuncdl_t)MC_GetAgentName_chdl
01026 );
01027
01028 return NULL;
01029 }
01030
01031 #ifndef _WIN32
01032 void*
01033 agent_RunChScriptThread(void * ChAgent)
01034 #else
01035 DWORD WINAPI
01036 agent_RunChScriptThread(void* ChAgent)
01037 #endif
01038 {
01039 #ifndef _WIN32
01040 int fd;
01041 #endif
01042 MCAgent_t agent;
01043 mc_platform_p mc_platform;
01044 int i,n;
01045 FILE *TEMP_FILE;
01046 char *temp_store_file;
01047 char *ChShellArg[2];
01048 void *result;
01049 int progress;
01050 int callbackErrCode;
01051 interpreter_variable_data_t* temp_interp_data;
01052 int persistent = 0;
01053
01054
01055 agent = (MCAgent_t)ChAgent;
01056 progress = agent->datastate->task_progress;
01057 mc_platform = agent->mc_platform;
01058
01059 setbuf(stdout, NULL);
01060 setbuf(stderr, NULL);
01061
01062 if(ChAgent == NULL)
01063 {
01064 printf("ERROR, AGENT NULL \n");
01065 #ifndef _WIN32
01066 return NULL;
01067 #else
01068 return 0;
01069 #endif
01070 }
01071
01072
01073 agent->agent_interp = (ChInterp_t *)interpreter_queue_CreateRetrieve(mc_platform->interpreter_queue,
01074 agent->mc_platform->interp_options );
01075 if(agent->agent_interp == NULL) {
01076
01077 WARN("Could not initialize another Ch interperter. Please make more copies of the chmt*.dl file.\n");
01078 return NULL;
01079 }
01080
01081
01082
01083 Ch_SetVar(*agent->agent_interp, "mc_agent_id",
01084 CH_INTTYPE, (int)agent->id);
01085
01086 Ch_SetVar(*agent->agent_interp, "mc_agent_name",
01087 CH_CHARPTRTYPE, agent->name);
01088
01089 Ch_SetVar(*agent->agent_interp, "mc_current_agent",
01090 CH_VOIDPTRTYPE, (void*)((size_t)agent));
01091
01092 Ch_SetVar(*agent->agent_interp, "mc_host_name",
01093 CH_CHARPTRTYPE, agent->mc_platform->hostname);
01094
01095 Ch_SetVar(*agent->agent_interp, "mc_host_port",
01096 CH_INTTYPE, (int)agent->mc_platform->port);
01097
01098 Ch_SetVar(*agent->agent_interp, "mc_task_progress",
01099 CH_INTTYPE, (int)agent->datastate->task_progress);
01100
01101 Ch_SetVar(*agent->agent_interp, "mc_num_tasks",
01102 CH_INTTYPE, (int)agent->datastate->number_of_tasks);
01103
01104 Ch_SetVar(*agent->agent_interp, "mc_agent_address",
01105 CH_CHARPTRTYPE, agent->agent_address);
01106
01107
01108
01109
01110
01111
01112
01113
01114
01115
01116 if(strlen(agent->datastate->agent_code) < 5)
01117 {
01118 MUTEX_LOCK(agent->run_lock);
01119 if(Ch_AppendRunScript(
01120 *((MCAgent_t)ChAgent)->agent_interp,
01121 ((MCAgent_t)ChAgent)->datastate->agent_code))
01122 {
01123
01124 printf("CH Failure \n");
01125 printf("***************************************************\nCode was:\n%s\n\n", agent->datastate->agent_code);
01126
01127 }
01128 if(Ch_CallFuncByName(*((MCAgent_t)ChAgent)->agent_interp, "main", NULL))
01129 {
01130 printf("CH2 failure \n");
01131 exit(EXIT_FAILURE);
01132 }
01133 MUTEX_UNLOCK(agent->run_lock);
01134 }
01135 else
01136 {
01137
01138
01139 if(mc_platform->agency->agentInitCallback) {
01140 callbackErrCode = (mc_platform->agency->agentInitCallback)(
01141 *agent->agent_interp,
01142 (struct agent_s*)agent,
01143 mc_platform->agency->agentInitUserData );
01144 if(callbackErrCode) {
01145
01146 ((MCAgent_t) ChAgent)->agent_status = MC_AGENT_NEUTRAL;
01147 #ifndef _WIN32
01148 pthread_exit(ChAgent);
01149 #else
01150 return 0;
01151 #endif
01152 }
01153 }
01154
01155 #ifndef _WIN32
01156
01157 temp_store_file = (char *)malloc(sizeof(char)*30);
01158
01159 strcpy(temp_store_file, "agentchscriptXXXXXX");
01160 fd = mkstemp(temp_store_file);
01161 if (fd == -1) {
01162 fprintf(stderr, "Could not create temporary file:%s. %s:%d\n",
01163 temp_store_file,
01164 __FILE__,
01165 __LINE__ );
01166 exit(EXIT_FAILURE);
01167 }
01168 close(fd);
01169 #else
01170 temp_store_file = _tempnam(".", "agentchscript");
01171 #endif
01172 TEMP_FILE = fopen(temp_store_file, "w");
01173
01174
01175 n = fwrite(
01176 (void *)agent->datastate->agent_code,
01177 sizeof(char),
01178 strlen(agent->datastate->agent_code),
01179 TEMP_FILE);
01180
01181 fclose(TEMP_FILE);
01182
01183
01184 ChShellArg[0] = temp_store_file;
01185 ChShellArg[1] = NULL;
01186 MUTEX_LOCK(agent->run_lock);
01187 if(Ch_RunScript(*agent->agent_interp, ChShellArg) < 0) {
01188 fprintf(stderr, "Ch_RunScript error. %s:%d\n", __FILE__, __LINE__);
01189 } else {
01190
01191 fflush(stdout);
01192 }
01193
01194
01195
01196
01197
01198
01199
01200
01201 remove(temp_store_file);
01202 #ifndef _WIN32
01203 free(temp_store_file);
01204 #endif
01205 MUTEX_UNLOCK(agent->run_lock);
01206 }
01207
01208
01209 if(
01210 agent->datastate->tasks[progress]->var_name != NULL &&
01211 strcmp(agent->datastate->tasks[progress]->var_name, "no-return")
01212 )
01213 {
01214 result = interpreter_variable_data_InitializeFromAgent(agent);
01215
01216 interpreter_variable_data_Destroy(
01217 agent->datastate->tasks[progress]->agent_return_data
01218 );
01219
01220 agent->datastate->tasks[progress]->agent_return_data =
01221 (interpreter_variable_data_t*)result;
01222 } else {
01223 interpreter_variable_data_Destroy(
01224 agent->datastate->tasks[progress]->agent_return_data );
01225 agent->datastate->tasks[progress]->agent_return_data = NULL;
01226 }
01227
01228
01229
01230 while (
01231 (
01232 temp_interp_data =
01233 agent_variable_list_Pop(agent->datastate->tasks[progress]->agent_variable_list)
01234 )
01235 )
01236 {
01237 interpreter_variable_data_Destroy(temp_interp_data);
01238 }
01239 for(i = 0; i < agent->datastate->tasks[progress]->num_saved_variables; i++) {
01240
01241
01242
01243
01244 agent_variable_list_Add(
01245 agent->datastate->tasks[progress]->agent_variable_list,
01246 interpreter_variable_data_Initialize(
01247 agent,
01248 agent->datastate->tasks[progress]->saved_variables[i] )
01249 );
01250 }
01251
01252
01253 agent->datastate->task_progress += agent->datastate->progress_modifier;
01254
01255 if (agent->datastate->persistent ||
01256 agent->datastate->tasks[progress]->persistent ) {
01257 persistent = 1;
01258
01259
01260
01261
01262
01263
01264
01265
01266
01267
01268
01269 ((MCAgent_t) ChAgent)->agent_status = MC_AGENT_NEUTRAL;
01270 } else {
01271 if ((((MCAgent_t)ChAgent)->agent_interp) != NULL) {
01272
01273 Ch_Reset(*agent->agent_interp);
01274 interpreter_queue_Add(mc_platform->interpreter_queue, (struct AP_GENERIC_s*)agent->agent_interp);
01275 }
01276
01277
01278 if (
01279 (agent->datastate->task_progress ==
01280 (agent->datastate->number_of_tasks-1))
01281 )
01282 {
01283
01284 ((MCAgent_t) ChAgent)->agent_status = MC_WAIT_FINISHED;
01285
01286
01287 for(i = 0;
01288 i < agent->datastate->number_of_tasks;
01289 i++)
01290 {
01291 if (agent->datastate->tasks[i]->agent_return_data != NULL) {
01292 ((MCAgent_t) ChAgent)->agent_status = MC_WAIT_MESSGSEND;
01293 }
01294 }
01295 }
01296 else {
01297 ((MCAgent_t) ChAgent)->agent_status = MC_WAIT_MESSGSEND;
01298 }
01299 }
01300
01301
01302 agent->datastate->task_progress++;
01303
01304 if (
01305 (agent->datastate->task_progress >= agent->datastate->number_of_tasks)
01306 )
01307 {
01308 agent->agent_type = MC_RETURN_AGENT;
01309 }
01310
01311 SIGNAL(
01312 mc_platform->MC_signal_cond,
01313 mc_platform->MC_signal_lock,
01314 mc_platform->MC_signal = MC_EXEC_AGENT;
01315 );
01316
01317 MUTEX_LOCK( mc_platform->MC_signal_lock);
01318 MUTEX_UNLOCK( mc_platform->MC_signal_lock );
01319 MUTEX_LOCK(mc_platform->ams->runflag_lock);
01320 mc_platform->ams->run = 1;
01321 COND_SIGNAL(mc_platform->ams->runflag_cond);
01322 MUTEX_UNLOCK(mc_platform->ams->runflag_lock);
01323
01324 if(persistent)
01325 {
01326
01327
01328 MUTEX_LOCK(agent->agent_status_lock);
01329 while(agent->agent_status == MC_AGENT_NEUTRAL) {
01330 COND_WAIT(agent->agent_status_cond, agent->agent_status_lock);
01331 }
01332 MUTEX_UNLOCK(agent->agent_status_lock);
01333 }
01334 #ifndef _WIN32
01335 pthread_exit(ChAgent);
01336 #else
01337 return 0;
01338 #endif
01339 }