/home/dko/projects/mobilec/trunk/src/mc_platform.c

Go to the documentation of this file.
00001 /*[
00002  * Copyright (c) 2007 Integration Engineering Laboratory
00003                       University of California, Davis
00004  *
00005  * Permission to use, copy, and distribute this software and its
00006  * documentation for any purpose with or without fee is hereby granted,
00007  * provided that the above copyright notice appear in all copies and
00008  * that both that copyright notice and this permission notice appear
00009  * in supporting documentation.
00010  *
00011  * Permission to modify the software is granted, but not the right to
00012  * distribute the complete modified source code.  Modifications are to
00013  * be distributed as patches to the released version.  Permission to
00014  * distribute binaries produced by compiling modified sources is granted,
00015  * provided you
00016  *   1. distribute the corresponding source modifications from the
00017  *    released version in the form of a patch file along with the binaries,
00018  *   2. add special version identification to distinguish your version
00019  *    in addition to the base release version number,
00020  *   3. provide your name and address as the primary contact for the
00021  *    support of your modified version, and
00022  *   4. retain our contact information in regard to use of the base
00023  *    software.
00024  * Permission to distribute the released version of the source code along
00025  * with corresponding source modifications in the form of a patch file is
00026  * granted with same provisions 2 through 4 for binary distributions.
00027  *
00028  * This software is provided "as is" without express or implied warranty
00029  * to the extent permitted by applicable law.
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 /* WinSock variables */
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   /* Allocate Memory */
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   /* Initialize members */
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   /* WINDOWS ONLY: Initialize WinSock */
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 /* _WIN32 */
00082  
00083   gethostname(hostname, DEFAULT_HOSTNAME_LENGTH);
00084   if (strlen(hostname) < 1) {
00085           strcpy(hostname, "localhost");
00086   }
00087   localhost = gethostbyname(hostname); /* FIXME */
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   /* Allocate sync variables */
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   /* Check memory */
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   /* Init sync variables */
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   /* Initialize quit flag */
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   /* Initialize MC_signal flag */
00161   mc_platform->MC_signal = MC_NO_SIGNAL;
00162 
00163   /* Allocate and init giant lock */
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   /* Initialize Agency Modules */
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     /* Wait for the thread to fully initialize before continuing */
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     /* Wait for the thread to fully initialize before continuing */
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     /* Wait for the thread to fully initialize before continuing */
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     /* Wait for the thread to fully initialize before continuing */
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   /* FIXME: Destroy syncList and barrierList here */
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   /* Free up the interp options */
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 

Generated on Mon Jun 23 16:01:10 2008 for Mobile-C by  doxygen 1.5.4