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 #ifndef _WIN32
00035 #include "config.h"
00036 #else
00037 #include "winconfig.h"
00038 #endif
00039
00040 #ifndef _WIN32
00041 #include <unistd.h>
00042 #include <sys/socket.h>
00043 #include <netdb.h>
00044 #include <netinet/in.h>
00045 #include <arpa/inet.h>
00046 #endif
00047 #include "include/acc.h"
00048 #include "include/agent.h"
00049 #include "include/mc_platform.h"
00050 #include "include/macros.h"
00051
00052 #define DEFAULT_HOSTNAME_LENGTH 200
00053 mc_platform_p
00054 mc_platform_Initialize(MCAgency_t agency, ChOptions_t* ch_options)
00055 {
00056 int i;
00057 #ifdef _WIN32
00058 WORD wVersionRequested = MAKEWORD(1,1);
00059 int nret;
00060 #endif
00061 struct hostent* localhost;
00062 char hostname[DEFAULT_HOSTNAME_LENGTH];
00063
00064 mc_platform_p mc_platform;
00065 ChInterp_t* interp;
00066
00067
00068 mc_platform = (mc_platform_p)malloc(sizeof(mc_platform_t));
00069 CHECK_NULL(mc_platform, agency->last_error = MC_ERR_MEMORY; return NULL);
00070
00071
00072 mc_platform->err = 0;
00073 mc_platform->default_agentstatus = agency->default_agentstatus;
00074
00075 for(i = 0; i < MC_THREAD_ALL; i++) {
00076 mc_platform->stack_size[i] = agency->stack_size[i];
00077 }
00078
00079 mc_platform->bluetooth = agency->bluetooth;
00080 mc_platform->agency = agency;
00081
00082
00083 #ifdef _WIN32
00084 nret = WSAStartup(wVersionRequested, &(mc_platform->wsaData));
00085 if (nret != 0) {
00086 printf("\nWSAStartup Error %d. %s:%d\n", nret, __FILE__,__LINE__);
00087 exit(0);
00088 }
00089 if (mc_platform->wsaData.wVersion != wVersionRequested) {
00090 printf("\nWrong Winsock Version %s:%d\n", __FILE__,__LINE__);
00091 exit(0);
00092 }
00093 #endif
00094
00095 gethostname(hostname, DEFAULT_HOSTNAME_LENGTH);
00096 if (strlen(hostname) < 1) {
00097 strcpy(hostname, "localhost");
00098 }
00099 localhost = gethostbyname(hostname);
00100 if(localhost == NULL) {
00101 #ifdef _WIN32
00102 printf("Fatal Error: %d %s:%d\n", WSAGetLastError(), __FILE__, __LINE__);
00103 #else
00104 fprintf(stderr, "Fatal Error %s:%d\n", __FILE__, __LINE__);
00105 #endif
00106
00107 }
00108 mc_platform->hostname = (char*)malloc(sizeof(char)*DEFAULT_HOSTNAME_LENGTH);
00109 CHECK_NULL(mc_platform->hostname, agency->last_error = MC_ERR_MEMORY;return NULL);
00110
00111 if(localhost == NULL)
00112 strcpy(mc_platform->hostname, "127.0.0.1");
00113 else if(localhost->h_name)
00114 strcpy(mc_platform->hostname, localhost->h_name);
00115 else
00116
00117 strcpy(mc_platform->hostname, inet_ntoa( *(struct in_addr*)localhost->h_addr) );
00118
00119 mc_platform->hostname = (char*)realloc( mc_platform->hostname, sizeof(char) * (strlen(mc_platform->hostname)+1));
00120 CHECK_NULL(mc_platform->hostname, agency->last_error = MC_ERR_MEMORY;return NULL);
00121 mc_platform->port = agency->portno;
00122 mc_platform->interp_options = ch_options;
00123
00124 mc_platform->message_queue = ListInitialize();
00125 mc_platform->agent_queue = ListInitialize();
00126 mc_platform->connection_queue = ListInitialize();
00127
00128 mc_platform->syncList = ListInitialize();
00129 mc_platform->barrier_queue = ListInitialize();
00130
00131 mc_platform->interpreter_queue = ListInitialize();
00132 mc_platform->initInterps = agency->initInterps;
00133
00134 mc_platform->agent_processing = 0;
00135
00136
00137 for(i = 0; i < mc_platform->initInterps; i++) {
00138 interp = (ChInterp_t*)malloc(sizeof(ChInterp_t));
00139 if( mc_platform->interp_options == NULL ) {
00140 if(Ch_Initialize(interp, NULL)) {
00141 printf("CH INIT ERROR \n");
00142 exit(EXIT_FAILURE);
00143 }
00144 }
00145 else {
00146 if(Ch_Initialize(interp, mc_platform->interp_options)) {
00147 printf("CH INIT ERROR \n");
00148 exit(EXIT_FAILURE);
00149 }
00150 }
00151
00152
00153 agent_ChScriptInitVar(interp);
00154
00155 ListWRLock(mc_platform->interpreter_queue);
00156 ListAdd(mc_platform->interpreter_queue, (void*)interp);
00157 ListWRUnlock(mc_platform->interpreter_queue);
00158 }
00159
00160
00161 mc_platform->MC_signal_cond = (COND_T*)malloc(sizeof(COND_T));
00162 mc_platform->MC_sync_cond = (COND_T*)malloc(sizeof(COND_T));
00163 mc_platform->MC_signal_lock = (MUTEX_T*)malloc(sizeof(MUTEX_T));
00164 mc_platform->MC_sync_lock = (MUTEX_T*)malloc(sizeof(MUTEX_T));
00165 mc_platform->MC_steer_lock = (MUTEX_T*)malloc(sizeof(MUTEX_T));
00166 mc_platform->MC_steer_cond = (COND_T*)malloc(sizeof(COND_T));
00167
00168
00169 CHECK_NULL( mc_platform->MC_signal_cond,
00170 agency->last_error = MC_ERR_MEMORY;return NULL );
00171 CHECK_NULL( mc_platform->MC_sync_cond ,
00172 agency->last_error = MC_ERR_MEMORY;return NULL );
00173 CHECK_NULL( mc_platform->MC_signal_lock,
00174 agency->last_error = MC_ERR_MEMORY;return NULL );
00175 CHECK_NULL( mc_platform->MC_sync_lock ,
00176 agency->last_error = MC_ERR_MEMORY;return NULL );
00177 CHECK_NULL( mc_platform->MC_steer_lock ,
00178 agency->last_error = MC_ERR_MEMORY;return NULL );
00179 CHECK_NULL( mc_platform->MC_steer_cond ,
00180 agency->last_error = MC_ERR_MEMORY;return NULL );
00181
00182
00183 COND_INIT ( mc_platform->MC_signal_cond );
00184 COND_INIT ( mc_platform->MC_sync_cond );
00185 MUTEX_INIT( mc_platform->MC_signal_lock );
00186 MUTEX_INIT( mc_platform->MC_sync_lock );
00187 MUTEX_INIT( mc_platform->MC_steer_lock );
00188 COND_INIT ( mc_platform->MC_steer_cond );
00189
00190
00191 mc_platform->quit = 0;
00192 mc_platform->quit_lock = (MUTEX_T*)malloc(sizeof(MUTEX_T));
00193 MUTEX_INIT(mc_platform->quit_lock);
00194 mc_platform->quit_cond = (COND_T*)malloc(sizeof(COND_T));
00195 COND_INIT(mc_platform->quit_cond);
00196
00197
00198 mc_platform->MC_signal = MC_NO_SIGNAL;
00199
00200
00201 mc_platform->giant = 1;
00202 mc_platform->giant_lock = (MUTEX_T*)malloc(sizeof(MUTEX_T));
00203 CHECK_NULL(mc_platform->giant_lock,
00204 agency->last_error = MC_ERR_MEMORY;return NULL );
00205 mc_platform->giant_cond = (COND_T*)malloc(sizeof(COND_T));
00206 CHECK_NULL(mc_platform->giant_cond,
00207 agency->last_error = MC_ERR_MEMORY;return NULL );
00208
00209 MUTEX_INIT( mc_platform->giant_lock );
00210 COND_INIT ( mc_platform->giant_cond );
00211
00212
00213 mc_platform->df = df_Initialize(mc_platform);
00214 mc_platform->ams = ams_Initialize(mc_platform);
00215 mc_platform->acc = acc_Initialize(mc_platform);
00216 mc_platform->cmd_prompt = cmd_prompt_Initialize(mc_platform);
00217 if (GET_THREAD_MODE(agency->threads, MC_THREAD_DF)) {
00218 df_Start(mc_platform);
00219 MUTEX_LOCK(mc_platform->df->waiting_lock);
00220
00221 while(mc_platform->df->waiting == 0) {
00222 COND_WAIT(mc_platform->df->waiting_cond, mc_platform->df->waiting_lock);
00223 }
00224 MUTEX_UNLOCK(mc_platform->df->waiting_lock);
00225 }
00226 if (GET_THREAD_MODE(agency->threads, MC_THREAD_AMS)) {
00227 ams_Start(mc_platform);
00228 MUTEX_LOCK(mc_platform->ams->waiting_lock);
00229
00230 while(mc_platform->ams->waiting == 0) {
00231 COND_WAIT(mc_platform->ams->waiting_cond, mc_platform->ams->waiting_lock);
00232 }
00233 MUTEX_UNLOCK(mc_platform->ams->waiting_lock);
00234 }
00235 if (GET_THREAD_MODE(agency->threads, MC_THREAD_ACC)) {
00236 acc_Start(mc_platform);
00237 MUTEX_LOCK(mc_platform->acc->waiting_lock);
00238
00239 while(mc_platform->acc->waiting == 0) {
00240 COND_WAIT(mc_platform->acc->waiting_cond, mc_platform->acc->waiting_lock);
00241 }
00242 MUTEX_UNLOCK(mc_platform->acc->waiting_lock);
00243 }
00244 if (GET_THREAD_MODE(agency->threads, MC_THREAD_CP))
00245 cmd_prompt_Start(mc_platform);
00246 return mc_platform;
00247 }
00248
00249 int
00250 mc_platform_Destroy(mc_platform_p platform)
00251 {
00252 #if 0
00253
00254
00255 #ifdef _WIN32
00256 closesocket(platform->sockfd);
00257 #else
00258 if(close(platform->sockfd) <0 ) {
00259 SOCKET_ERROR();
00260 }
00261 #endif
00262 #endif
00263 ChInterp_t* interp;
00264
00265 ListWRLock(platform->message_queue);
00266 ListClearCB(platform->message_queue, (ListElemDestroyFunc_t)message_Destroy);
00267 ListWRUnlock(platform->message_queue);
00268 ListTerminate(platform->message_queue);
00269
00270 ListWRLock(platform->agent_queue);
00271 ListClearCB(platform->agent_queue, (ListElemDestroyFunc_t)agent_Destroy);
00272 ListWRUnlock(platform->agent_queue);
00273 ListTerminate(platform->agent_queue);
00274
00275 ListWRLock(platform->connection_queue);
00276 ListClearCB(platform->connection_queue, (ListElemDestroyFunc_t)connection_Destroy);
00277 ListWRUnlock(platform->connection_queue);
00278 ListTerminate(platform->connection_queue);
00279
00280 df_Destroy(platform->df);
00281
00282 ams_Destroy(platform->ams);
00283
00284 acc_Destroy(platform->acc);
00285
00286 cmd_prompt_Destroy(platform->cmd_prompt);
00287
00288
00289 ListWRLock(platform->syncList);
00290 ListClearCB(platform->syncList, (ListElemDestroyFunc_t)syncListNodeDestroy);
00291 ListWRUnlock(platform->syncList);
00292 ListTerminate(platform->syncList);
00293
00294 ListWRLock(platform->barrier_queue);
00295 ListClearCB(platform->barrier_queue, (ListElemDestroyFunc_t)barrier_node_Destroy);
00296 ListWRUnlock(platform->barrier_queue);
00297 ListTerminate(platform->barrier_queue);
00298
00299 free(platform->hostname);
00300
00301
00302 ListWRLock(platform->interpreter_queue);
00303 while((interp = (ChInterp_t*)ListPop(platform->interpreter_queue))) {
00304 Ch_End(*interp);
00305 free(interp);
00306 }
00307 ListWRUnlock(platform->interpreter_queue);
00308 ListTerminate(platform->interpreter_queue);
00309
00310 COND_DESTROY(platform->MC_signal_cond);
00311 free(platform->MC_signal_cond);
00312 COND_DESTROY(platform->MC_sync_cond);
00313 free(platform->MC_sync_cond);
00314 MUTEX_DESTROY(platform->MC_signal_lock);
00315 free(platform->MC_signal_lock);
00316 MUTEX_DESTROY(platform->MC_sync_lock);
00317 free(platform->MC_sync_lock);
00318
00319 MUTEX_DESTROY(platform->MC_steer_lock);
00320 free(platform->MC_steer_lock);
00321 COND_DESTROY(platform->MC_steer_cond);
00322 free(platform->MC_steer_cond);
00323
00324 MUTEX_DESTROY(platform->quit_lock);
00325 free(platform->quit_lock);
00326 COND_DESTROY(platform->quit_cond);
00327 free(platform->quit_cond);
00328
00329 MUTEX_DESTROY(platform->giant_lock);
00330 free(platform->giant_lock);
00331 COND_DESTROY(platform->giant_cond);
00332 free(platform->giant_cond);
00333
00334
00335 if (platform->interp_options != NULL) {
00336 if (platform->interp_options->chhome != NULL) {
00337 free(platform->interp_options->chhome);
00338 }
00339 free(platform->interp_options);
00340 }
00341
00342 free(platform);
00343 return MC_SUCCESS;
00344 }
00345
00346 ChInterp_t* interpreter_queue_CreateRetrieve( list_t *queue , ChOptions_t* interp_options) {
00347
00348
00349 ChInterp_t* interp;
00350 ListWRLock(queue);
00351 interp = (ChInterp_t*) ListPop(queue);
00352 if (interp == NULL) {
00353 interp = (ChInterp_t*)malloc(sizeof(ChInterp_t));
00354 if( Ch_Initialize(interp, interp_options) != CH_OK) {
00355
00356 interp = NULL;
00357 } else {
00358
00359 agent_ChScriptInitVar(interp);
00360 }
00361 }
00362 ListWRUnlock(queue);
00363 return interp;
00364 }
00365
00366 list_t* mc_platform_GetQueue(mc_platform_p platform, enum MC_QueueIndex_e index)
00367 {
00368 switch(index) {
00369 case MC_QUEUE_MESSAGE:
00370 return platform->message_queue;
00371 case MC_QUEUE_AGENT:
00372 return platform->agent_queue;
00373 case MC_QUEUE_CONNECTION:
00374 return platform->connection_queue;
00375 case MC_QUEUE_SYNC:
00376 return platform->syncList;
00377 case MC_QUEUE_BARRIER:
00378 return platform->barrier_queue;
00379 default:
00380 return NULL;
00381 }
00382 }