/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   /* Allocate and init giant lock */
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   /* Initialize Agency Modules */
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     /* Wait for the thread to fully initialize before continuing */
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     /* Wait for the thread to fully initialize before continuing */
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     /* Wait for the thread to fully initialize before continuing */
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     /* Wait for the thread to fully initialize before continuing */
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   /* FIXME: Destroy syncList and barrierList here */
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   /* Free up the interp options */
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 

Generated on Fri May 16 14:49:54 2008 for Mobile-C by  doxygen 1.5.4