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 #ifndef _WIN32
00033 #include <unistd.h>
00034 #include <sys/socket.h>
00035 #include <netdb.h>
00036 #include <netinet/in.h>
00037 #include <arpa/inet.h>
00038 #endif
00039 #include "include/acc.h"
00040 #include "include/mc_platform.h"
00041
00042 #define DEFAULT_HOSTNAME_LENGTH 200
00043 mc_platform_p
00044 mc_platform_Initialize(MCAgency_t agency)
00045 {
00046 int i;
00047 #ifdef _WIN32
00048 WORD wVersionRequested = MAKEWORD(1,1);
00049 int nret;
00050 #endif
00051 struct hostent* localhost;
00052 char hostname[DEFAULT_HOSTNAME_LENGTH];
00053 mc_platform_p mc_platform;
00054
00055
00056 mc_platform = (mc_platform_p)malloc(sizeof(mc_platform_t));
00057 CHECK_NULL(mc_platform, agency->last_error = MC_ERR_MEMORY; return NULL);
00058
00059
00060 mc_platform->err = 0;
00061 #ifdef MC_SECURITY
00062 mc_platform->enable_security = agency->enable_security;
00063 #endif
00064 mc_platform->default_agentstatus = agency->default_agentstatus;
00065
00066 for(i = 0; i < MC_THREAD_ALL; i++) {
00067 mc_platform->stack_size[i] = agency->stack_size[i];
00068 }
00069
00070
00071 #ifdef _WIN32
00072 nret = WSAStartup(wVersionRequested, &(mc_platform->wsaData));
00073 if (nret != 0) {
00074 printf("\nWSAStartup Error %d. %s:%d\n", nret, __FILE__,__LINE__);
00075 exit(0);
00076 }
00077 if (mc_platform->wsaData.wVersion != wVersionRequested) {
00078 printf("\nWrong Winsock Version %s:%d\n", __FILE__,__LINE__);
00079 exit(0);
00080 }
00081 #endif
00082
00083 gethostname(hostname, DEFAULT_HOSTNAME_LENGTH);
00084 if (strlen(hostname) < 1) {
00085 strcpy(hostname, "localhost");
00086 }
00087 localhost = gethostbyname(hostname);
00088 if(localhost == NULL) {
00089 #ifdef _WIN32
00090 printf("Fatal Error: %d %s:%d\n", WSAGetLastError(), __FILE__, __LINE__);
00091 #else
00092 fprintf(stderr, "Fatal Error %s:%d\n", __FILE__, __LINE__);
00093 #endif
00094 exit(0);
00095 }
00096
00097 mc_platform->hostname = (char*)malloc(sizeof(char)*DEFAULT_HOSTNAME_LENGTH);
00098 CHECK_NULL(mc_platform->hostname,
00099 agency->last_error = MC_ERR_MEMORY;return NULL);
00100 strcpy(mc_platform->hostname, inet_ntoa( *(struct in_addr*)localhost->h_addr) );
00101 mc_platform->hostname = realloc(
00102 mc_platform->hostname,
00103 sizeof(char) * (strlen(mc_platform->hostname)+1)
00104 );
00105 CHECK_NULL(mc_platform->hostname,
00106 agency->last_error = MC_ERR_MEMORY;return NULL);
00107
00108 mc_platform->port = agency->portno;
00109
00110 mc_platform->interp_options = NULL;
00111
00112 #ifdef MC_SECURITY
00113 if (agency->enable_security) {
00114 mc_platform->asm_message_queue = message_queue_New();
00115 mc_platform->asm_queue = asm_queue_New();
00116 }
00117 #endif
00118 mc_platform->message_queue = message_queue_New();
00119 mc_platform->agent_queue = agent_queue_New();
00120 mc_platform->connection_queue = connection_queue_New();
00121
00122 mc_platform->syncList = syncListInit();
00123 mc_platform->barrier_queue = barrier_queue_New();
00124
00125
00126 mc_platform->MC_signal_cond = (COND_T*)malloc(sizeof(COND_T));
00127 mc_platform->MC_sync_cond = (COND_T*)malloc(sizeof(COND_T));
00128 mc_platform->MC_signal_lock = (MUTEX_T*)malloc(sizeof(MUTEX_T));
00129 mc_platform->MC_sync_lock = (MUTEX_T*)malloc(sizeof(MUTEX_T));
00130 mc_platform->MC_steer_lock = (MUTEX_T*)malloc(sizeof(MUTEX_T));
00131 mc_platform->MC_steer_cond = (COND_T*)malloc(sizeof(COND_T));
00132
00133
00134 CHECK_NULL( mc_platform->MC_signal_cond,
00135 agency->last_error = MC_ERR_MEMORY;return NULL );
00136 CHECK_NULL( mc_platform->MC_sync_cond ,
00137 agency->last_error = MC_ERR_MEMORY;return NULL );
00138 CHECK_NULL( mc_platform->MC_signal_lock,
00139 agency->last_error = MC_ERR_MEMORY;return NULL );
00140 CHECK_NULL( mc_platform->MC_sync_lock ,
00141 agency->last_error = MC_ERR_MEMORY;return NULL );
00142 CHECK_NULL( mc_platform->MC_steer_lock ,
00143 agency->last_error = MC_ERR_MEMORY;return NULL );
00144 CHECK_NULL( mc_platform->MC_steer_cond ,
00145 agency->last_error = MC_ERR_MEMORY;return NULL );
00146
00147
00148 COND_INIT ( mc_platform->MC_signal_cond );
00149 COND_INIT ( mc_platform->MC_sync_cond );
00150 MUTEX_INIT( mc_platform->MC_signal_lock );
00151 MUTEX_INIT( mc_platform->MC_sync_lock );
00152 MUTEX_INIT( mc_platform->MC_steer_lock );
00153 COND_INIT ( mc_platform->MC_steer_cond );
00154
00155
00156 mc_platform->quit = 0;
00157 mc_platform->quit_lock = (MUTEX_T*)malloc(sizeof(MUTEX_T));
00158 MUTEX_INIT(mc_platform->quit_lock);
00159
00160
00161 mc_platform->MC_signal = MC_NO_SIGNAL;
00162
00163
00164 mc_platform->giant = 1;
00165 mc_platform->giant_lock = (MUTEX_T*)malloc(sizeof(MUTEX_T));
00166 CHECK_NULL(mc_platform->giant_lock,
00167 agency->last_error = MC_ERR_MEMORY;return NULL );
00168 mc_platform->giant_cond = (COND_T*)malloc(sizeof(COND_T));
00169 CHECK_NULL(mc_platform->giant_cond,
00170 agency->last_error = MC_ERR_MEMORY;return NULL );
00171
00172 MUTEX_INIT( mc_platform->giant_lock );
00173 COND_INIT ( mc_platform->giant_cond );
00174
00175
00176 mc_platform->df = df_Initialize(mc_platform);
00177 mc_platform->ams = ams_Initialize(mc_platform);
00178 mc_platform->acc = acc_Initialize(mc_platform);
00179 mc_platform->cmd_prompt = cmd_prompt_Initialize(mc_platform);
00180 #ifdef MC_SECURITY
00181 if (agency->enable_security) {
00182 mc_platform->security_manager = asm_Initialize(mc_platform);
00183 }
00184 #endif
00185 if (GET_THREAD_MODE(agency->threads, MC_THREAD_DF)) {
00186 df_Start(mc_platform);
00187 MUTEX_LOCK(mc_platform->df->waiting_lock);
00188
00189 while(mc_platform->df->waiting == 0) {
00190 COND_WAIT(mc_platform->df->waiting_cond, mc_platform->df->waiting_lock);
00191 }
00192 MUTEX_UNLOCK(mc_platform->df->waiting_lock);
00193 }
00194 if (GET_THREAD_MODE(agency->threads, MC_THREAD_AMS)) {
00195 ams_Start(mc_platform);
00196 MUTEX_LOCK(mc_platform->ams->waiting_lock);
00197
00198 while(mc_platform->ams->waiting == 0) {
00199 COND_WAIT(mc_platform->ams->waiting_cond, mc_platform->ams->waiting_lock);
00200 }
00201 MUTEX_UNLOCK(mc_platform->ams->waiting_lock);
00202 }
00203 if (GET_THREAD_MODE(agency->threads, MC_THREAD_ACC)) {
00204 acc_Start(mc_platform);
00205 MUTEX_LOCK(mc_platform->acc->waiting_lock);
00206
00207 while(mc_platform->acc->waiting == 0) {
00208 COND_WAIT(mc_platform->acc->waiting_cond, mc_platform->acc->waiting_lock);
00209 }
00210 MUTEX_UNLOCK(mc_platform->acc->waiting_lock);
00211 }
00212 if (GET_THREAD_MODE(agency->threads, MC_THREAD_CP))
00213 cmd_prompt_Start(mc_platform);
00214 #ifdef MC_SECURITY
00215 if (agency->enable_security) {
00216 asm_Start(mc_platform);
00217 MUTEX_LOCK(mc_platform->security_manager->waiting_lock);
00218
00219 while(mc_platform->security_manager->waiting == 0) {
00220 COND_WAIT(
00221 mc_platform->security_manager->waiting_cond,
00222 mc_platform->security_manager->waiting_lock);
00223 }
00224 MUTEX_UNLOCK(mc_platform->security_manager->waiting_lock);
00225 }
00226 #endif
00227
00228 return mc_platform;
00229 }
00230
00231 int
00232 mc_platform_Destroy(mc_platform_p platform)
00233 {
00234 #ifdef MC_SECURITY
00235 if (platform->enable_security) {
00236 message_queue_Destroy(platform->asm_message_queue);
00237 }
00238 #endif
00239 message_queue_Destroy(platform->message_queue);
00240
00241 agent_queue_Destroy(platform->agent_queue);
00242
00243 connection_queue_Destroy(platform->connection_queue);
00244
00245 #ifdef MC_SECURITY
00246 asm_queue_Destroy(platform->asm_queue);
00247 #endif
00248
00249 df_Destroy(platform->df);
00250
00251 ams_Destroy(platform->ams);
00252
00253 #ifdef MC_SECURITY
00254 asm_Destroy(platform->security_manager);
00255 #endif
00256
00257 acc_Destroy(platform->acc);
00258
00259 cmd_prompt_Destroy(platform->cmd_prompt);
00260
00261
00262 barrier_queue_Destroy(platform->barrier_queue);
00263
00264 COND_DESTROY(platform->MC_signal_cond);
00265 free(platform->MC_signal_cond);
00266 COND_DESTROY(platform->MC_sync_cond);
00267 free(platform->MC_sync_cond);
00268 MUTEX_DESTROY(platform->MC_signal_lock);
00269 free(platform->MC_signal_lock);
00270 MUTEX_DESTROY(platform->MC_sync_lock);
00271 free(platform->MC_sync_lock);
00272
00273 MUTEX_DESTROY(platform->MC_steer_lock);
00274 free(platform->MC_steer_lock);
00275 COND_DESTROY(platform->MC_steer_cond);
00276 free(platform->MC_steer_cond);
00277
00278 MUTEX_DESTROY(platform->giant_lock);
00279 free(platform->giant_lock);
00280 COND_DESTROY(platform->giant_cond);
00281 free(platform->giant_cond);
00282
00283 MUTEX_DESTROY(platform->quit_lock);
00284
00285
00286 if (platform->interp_options != NULL) {
00287 if (platform->interp_options->chhome != NULL) {
00288 free(platform->interp_options->chhome);
00289 }
00290 free(platform->interp_options);
00291 }
00292
00293 free(platform);
00294 return MC_SUCCESS;
00295 }
00296
00297
00298