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