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->giant = 1;
00162 mc_platform->giant_lock = (MUTEX_T*)malloc(sizeof(MUTEX_T));
00163 CHECK_NULL(mc_platform->giant_lock,
00164 agency->last_error = MC_ERR_MEMORY;return NULL );
00165 mc_platform->giant_cond = (COND_T*)malloc(sizeof(COND_T));
00166 CHECK_NULL(mc_platform->giant_cond,
00167 agency->last_error = MC_ERR_MEMORY;return NULL );
00168
00169 MUTEX_INIT( mc_platform->giant_lock );
00170 COND_INIT ( mc_platform->giant_cond );
00171
00172
00173 mc_platform->df = df_Initialize(mc_platform);
00174 mc_platform->ams = ams_Initialize(mc_platform);
00175 mc_platform->acc = acc_Initialize(mc_platform);
00176 mc_platform->cmd_prompt = cmd_prompt_Initialize(mc_platform);
00177 #ifdef MC_SECURITY
00178 if (agency->enable_security) {
00179 mc_platform->security_manager = asm_Initialize(mc_platform);
00180 }
00181 #endif
00182 if (GET_THREAD_MODE(agency->threads, MC_THREAD_DF)) {
00183 df_Start(mc_platform);
00184 MUTEX_LOCK(mc_platform->df->waiting_lock);
00185
00186 while(mc_platform->df->waiting == 0) {
00187 COND_WAIT(mc_platform->df->waiting_cond, mc_platform->df->waiting_lock);
00188 }
00189 MUTEX_UNLOCK(mc_platform->df->waiting_lock);
00190 }
00191 if (GET_THREAD_MODE(agency->threads, MC_THREAD_AMS)) {
00192 ams_Start(mc_platform);
00193 MUTEX_LOCK(mc_platform->ams->waiting_lock);
00194
00195 while(mc_platform->ams->waiting == 0) {
00196 COND_WAIT(mc_platform->ams->waiting_cond, mc_platform->ams->waiting_lock);
00197 }
00198 MUTEX_UNLOCK(mc_platform->ams->waiting_lock);
00199 }
00200 if (GET_THREAD_MODE(agency->threads, MC_THREAD_ACC)) {
00201 acc_Start(mc_platform);
00202 MUTEX_LOCK(mc_platform->acc->waiting_lock);
00203
00204 while(mc_platform->acc->waiting == 0) {
00205 COND_WAIT(mc_platform->acc->waiting_cond, mc_platform->acc->waiting_lock);
00206 }
00207 MUTEX_UNLOCK(mc_platform->acc->waiting_lock);
00208 }
00209 if (GET_THREAD_MODE(agency->threads, MC_THREAD_CP))
00210 cmd_prompt_Start(mc_platform);
00211 #ifdef MC_SECURITY
00212 if (agency->enable_security) {
00213 asm_Start(mc_platform);
00214 MUTEX_LOCK(mc_platform->security_manager->waiting_lock);
00215
00216 while(mc_platform->security_manager->waiting == 0) {
00217 COND_WAIT(
00218 mc_platform->security_manager->waiting_cond,
00219 mc_platform->security_manager->waiting_lock);
00220 }
00221 MUTEX_UNLOCK(mc_platform->security_manager->waiting_lock);
00222 }
00223 #endif
00224
00225 return mc_platform;
00226 }
00227
00228 int
00229 mc_platform_Destroy(mc_platform_p platform)
00230 {
00231 #ifdef MC_SECURITY
00232 if (platform->enable_security) {
00233 message_queue_Destroy(platform->asm_message_queue);
00234 }
00235 #endif
00236 message_queue_Destroy(platform->message_queue);
00237
00238 agent_queue_Destroy(platform->agent_queue);
00239
00240 connection_queue_Destroy(platform->connection_queue);
00241
00242 #ifdef MC_SECURITY
00243 asm_queue_Destroy(platform->asm_queue);
00244 #endif
00245
00246 df_Destroy(platform->df);
00247
00248 ams_Destroy(platform->ams);
00249
00250 #ifdef MC_SECURITY
00251 asm_Destroy(platform->security_manager);
00252 #endif
00253
00254 acc_Destroy(platform->acc);
00255
00256 cmd_prompt_Destroy(platform->cmd_prompt);
00257
00258
00259 barrier_queue_Destroy(platform->barrier_queue);
00260
00261 COND_DESTROY(platform->MC_signal_cond);
00262 free(platform->MC_signal_cond);
00263 COND_DESTROY(platform->MC_sync_cond);
00264 free(platform->MC_sync_cond);
00265 MUTEX_DESTROY(platform->MC_signal_lock);
00266 free(platform->MC_signal_lock);
00267 MUTEX_DESTROY(platform->MC_sync_lock);
00268 free(platform->MC_sync_lock);
00269
00270 MUTEX_DESTROY(platform->MC_steer_lock);
00271 free(platform->MC_steer_lock);
00272 COND_DESTROY(platform->MC_steer_cond);
00273 free(platform->MC_steer_cond);
00274
00275 MUTEX_DESTROY(platform->giant_lock);
00276 free(platform->giant_lock);
00277 COND_DESTROY(platform->giant_cond);
00278 free(platform->giant_cond);
00279
00280 MUTEX_DESTROY(platform->quit_lock);
00281
00282
00283 if (platform->interp_options != NULL) {
00284 if (platform->interp_options->chhome != NULL) {
00285 free(platform->interp_options->chhome);
00286 }
00287 free(platform->interp_options);
00288 }
00289
00290 free(platform);
00291 return MC_SUCCESS;
00292 }
00293
00294
00295