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