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
00080 #ifdef _WIN32
00081 nret = WSAStartup(wVersionRequested, &(mc_platform->wsaData));
00082 if (nret != 0) {
00083 printf("\nWSAStartup Error %d. %s:%d\n", nret, __FILE__,__LINE__);
00084 exit(0);
00085 }
00086 if (mc_platform->wsaData.wVersion != wVersionRequested) {
00087 printf("\nWrong Winsock Version %s:%d\n", __FILE__,__LINE__);
00088 exit(0);
00089 }
00090 #endif
00091
00092 gethostname(hostname, DEFAULT_HOSTNAME_LENGTH);
00093 if (strlen(hostname) < 1) {
00094 strcpy(hostname, "localhost");
00095 }
00096 localhost = gethostbyname(hostname);
00097 if(localhost == NULL) {
00098 #ifdef _WIN32
00099 printf("Fatal Error: %d %s:%d\n", WSAGetLastError(), __FILE__, __LINE__);
00100 #else
00101 fprintf(stderr, "Fatal Error %s:%d\n", __FILE__, __LINE__);
00102 #endif
00103 exit(0);
00104 }
00105 mc_platform->hostname = (char*)malloc(sizeof(char)*DEFAULT_HOSTNAME_LENGTH);
00106 CHECK_NULL(mc_platform->hostname, agency->last_error = MC_ERR_MEMORY;return NULL);
00107
00108 if(localhost->h_name)
00109 strcpy(mc_platform->hostname, localhost->h_name);
00110 else
00111
00112 strcpy(mc_platform->hostname, inet_ntoa( *(struct in_addr*)localhost->h_addr) );
00113
00114 mc_platform->hostname = (char*)realloc( mc_platform->hostname, sizeof(char) * (strlen(mc_platform->hostname)+1));
00115 CHECK_NULL(mc_platform->hostname, agency->last_error = MC_ERR_MEMORY;return NULL);
00116 mc_platform->port = agency->portno;
00117 mc_platform->interp_options = ch_options;
00118
00119 mc_platform->message_queue = message_queue_New();
00120 mc_platform->agent_queue = agent_queue_New();
00121 mc_platform->connection_queue = connection_queue_New();
00122
00123 mc_platform->syncList = syncListInit();
00124 mc_platform->barrier_queue = barrier_queue_New();
00125
00126 mc_platform->interpreter_queue = interpreter_queue_New();
00127 mc_platform->initInterps = agency->initInterps;
00128
00129
00130
00131 for(i = 0; i < mc_platform->initInterps; i++) {
00132 interp = (ChInterp_t*)malloc(sizeof(ChInterp_t));
00133 if( mc_platform->interp_options == NULL ) {
00134 if(Ch_Initialize(interp, NULL)) {
00135 printf("CH INIT ERROR \n");
00136 exit(EXIT_FAILURE);
00137 }
00138 }
00139 else {
00140 if(Ch_Initialize(interp, mc_platform->interp_options)) {
00141 printf("CH INIT ERROR \n");
00142 exit(EXIT_FAILURE);
00143 }
00144 }
00145
00146
00147 agent_ChScriptInitVar(interp);
00148
00149 interpreter_queue_Add(
00150 mc_platform->interpreter_queue,
00151 (struct AP_GENERIC_s*)interp );
00152 }
00153
00154
00155 mc_platform->MC_signal_cond = (COND_T*)malloc(sizeof(COND_T));
00156 mc_platform->MC_sync_cond = (COND_T*)malloc(sizeof(COND_T));
00157 mc_platform->MC_signal_lock = (MUTEX_T*)malloc(sizeof(MUTEX_T));
00158 mc_platform->MC_sync_lock = (MUTEX_T*)malloc(sizeof(MUTEX_T));
00159 mc_platform->MC_steer_lock = (MUTEX_T*)malloc(sizeof(MUTEX_T));
00160 mc_platform->MC_steer_cond = (COND_T*)malloc(sizeof(COND_T));
00161
00162
00163 CHECK_NULL( mc_platform->MC_signal_cond,
00164 agency->last_error = MC_ERR_MEMORY;return NULL );
00165 CHECK_NULL( mc_platform->MC_sync_cond ,
00166 agency->last_error = MC_ERR_MEMORY;return NULL );
00167 CHECK_NULL( mc_platform->MC_signal_lock,
00168 agency->last_error = MC_ERR_MEMORY;return NULL );
00169 CHECK_NULL( mc_platform->MC_sync_lock ,
00170 agency->last_error = MC_ERR_MEMORY;return NULL );
00171 CHECK_NULL( mc_platform->MC_steer_lock ,
00172 agency->last_error = MC_ERR_MEMORY;return NULL );
00173 CHECK_NULL( mc_platform->MC_steer_cond ,
00174 agency->last_error = MC_ERR_MEMORY;return NULL );
00175
00176
00177 COND_INIT ( mc_platform->MC_signal_cond );
00178 COND_INIT ( mc_platform->MC_sync_cond );
00179 MUTEX_INIT( mc_platform->MC_signal_lock );
00180 MUTEX_INIT( mc_platform->MC_sync_lock );
00181 MUTEX_INIT( mc_platform->MC_steer_lock );
00182 COND_INIT ( mc_platform->MC_steer_cond );
00183
00184
00185 mc_platform->quit = 0;
00186 mc_platform->quit_lock = (MUTEX_T*)malloc(sizeof(MUTEX_T));
00187 MUTEX_INIT(mc_platform->quit_lock);
00188 mc_platform->quit_cond = (COND_T*)malloc(sizeof(COND_T));
00189 COND_INIT(mc_platform->quit_cond);
00190
00191
00192 mc_platform->MC_signal = MC_NO_SIGNAL;
00193
00194
00195 mc_platform->giant = 1;
00196 mc_platform->giant_lock = (MUTEX_T*)malloc(sizeof(MUTEX_T));
00197 CHECK_NULL(mc_platform->giant_lock,
00198 agency->last_error = MC_ERR_MEMORY;return NULL );
00199 mc_platform->giant_cond = (COND_T*)malloc(sizeof(COND_T));
00200 CHECK_NULL(mc_platform->giant_cond,
00201 agency->last_error = MC_ERR_MEMORY;return NULL );
00202
00203 MUTEX_INIT( mc_platform->giant_lock );
00204 COND_INIT ( mc_platform->giant_cond );
00205
00206
00207 mc_platform->df = df_Initialize(mc_platform);
00208 mc_platform->ams = ams_Initialize(mc_platform);
00209 mc_platform->acc = acc_Initialize(mc_platform);
00210 mc_platform->cmd_prompt = cmd_prompt_Initialize(mc_platform);
00211 if (GET_THREAD_MODE(agency->threads, MC_THREAD_DF)) {
00212 df_Start(mc_platform);
00213 MUTEX_LOCK(mc_platform->df->waiting_lock);
00214
00215 while(mc_platform->df->waiting == 0) {
00216 COND_WAIT(mc_platform->df->waiting_cond, mc_platform->df->waiting_lock);
00217 }
00218 MUTEX_UNLOCK(mc_platform->df->waiting_lock);
00219 }
00220 if (GET_THREAD_MODE(agency->threads, MC_THREAD_AMS)) {
00221 ams_Start(mc_platform);
00222 MUTEX_LOCK(mc_platform->ams->waiting_lock);
00223
00224 while(mc_platform->ams->waiting == 0) {
00225 COND_WAIT(mc_platform->ams->waiting_cond, mc_platform->ams->waiting_lock);
00226 }
00227 MUTEX_UNLOCK(mc_platform->ams->waiting_lock);
00228 }
00229 if (GET_THREAD_MODE(agency->threads, MC_THREAD_ACC)) {
00230 acc_Start(mc_platform);
00231 MUTEX_LOCK(mc_platform->acc->waiting_lock);
00232
00233 while(mc_platform->acc->waiting == 0) {
00234 COND_WAIT(mc_platform->acc->waiting_cond, mc_platform->acc->waiting_lock);
00235 }
00236 MUTEX_UNLOCK(mc_platform->acc->waiting_lock);
00237 }
00238 if (GET_THREAD_MODE(agency->threads, MC_THREAD_CP))
00239 cmd_prompt_Start(mc_platform);
00240 return mc_platform;
00241 }
00242
00243 int
00244 mc_platform_Destroy(mc_platform_p platform)
00245 {
00246
00247 #ifdef _WIN32
00248 closesocket(platform->sockfd);
00249 #else
00250 if(close(platform->sockfd) <0 ) {
00251 SOCKET_ERROR();
00252 }
00253 #endif
00254
00255 message_queue_Destroy(platform->message_queue);
00256
00257 agent_queue_Destroy(platform->agent_queue);
00258
00259 connection_queue_Destroy(platform->connection_queue);
00260
00261 df_Destroy(platform->df);
00262
00263 ams_Destroy(platform->ams);
00264
00265 acc_Destroy(platform->acc);
00266
00267 cmd_prompt_Destroy(platform->cmd_prompt);
00268
00269
00270 barrier_queue_Destroy(platform->barrier_queue);
00271
00272 interpreter_queue_Destroy(platform->interpreter_queue);
00273
00274 COND_DESTROY(platform->MC_signal_cond);
00275 free(platform->MC_signal_cond);
00276 COND_DESTROY(platform->MC_sync_cond);
00277 free(platform->MC_sync_cond);
00278 MUTEX_DESTROY(platform->MC_signal_lock);
00279 free(platform->MC_signal_lock);
00280 MUTEX_DESTROY(platform->MC_sync_lock);
00281 free(platform->MC_sync_lock);
00282
00283 MUTEX_DESTROY(platform->MC_steer_lock);
00284 free(platform->MC_steer_lock);
00285 COND_DESTROY(platform->MC_steer_cond);
00286 free(platform->MC_steer_cond);
00287
00288 MUTEX_DESTROY(platform->giant_lock);
00289 free(platform->giant_lock);
00290 COND_DESTROY(platform->giant_cond);
00291 free(platform->giant_cond);
00292
00293 MUTEX_DESTROY(platform->quit_lock);
00294
00295
00296 if (platform->interp_options != NULL) {
00297 if (platform->interp_options->chhome != NULL) {
00298 free(platform->interp_options->chhome);
00299 }
00300 free(platform->interp_options);
00301 }
00302
00303 free(platform);
00304 return MC_SUCCESS;
00305 }
00306
00307
00308