Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
solving the pthread problem. Henri, give it a try on your Mac. I'd really like to...
authoralegrand <alegrand@48e7efb5-ca39-0410-a469-dd3cf9ba447f>
Tue, 20 Sep 2005 12:37:41 +0000 (12:37 +0000)
committeralegrand <alegrand@48e7efb5-ca39-0410-a469-dd3cf9ba447f>
Tue, 20 Sep 2005 12:37:41 +0000 (12:37 +0000)
git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/simgrid/simgrid/trunk@1726 48e7efb5-ca39-0410-a469-dd3cf9ba447f

src/msg/m_process.c
src/xbt/context.c

index 342d507..ddbb302 100644 (file)
@@ -50,7 +50,9 @@ static void MSG_process_cleanup(void *arg)
   xbt_fifo_remove(msg_global->process_to_run, arg);
   xbt_fifo_remove(((m_process_t) arg)->simdata->host->simdata->process_list, arg);
   free(((m_process_t) arg)->name);
+  ((m_process_t) arg)->name = NULL;
   free(((m_process_t) arg)->simdata);
+  ((m_process_t) arg)->simdata = NULL;
   free(arg);
 }
 
index a88d8ef..2091bb7 100644 (file)
@@ -111,34 +111,53 @@ static void *__context_wrapper(void *c)
   int i;
 
 #ifdef USE_PTHREADS
-  DEBUG0("**** Lock ****");
+  DEBUG2("**[%p:%p]** Lock ****",context,(void*)pthread_self());
   pthread_mutex_lock(&(context->mutex));
-  DEBUG0("**** Releasing the prisonner ****");
+  DEBUG2("**[%p:%p]** Releasing the prisonner ****",context,(void*)pthread_self());
   pthread_cond_signal(&(context->cond));
-  DEBUG0("**** Going to Jail ****");
+  DEBUG2("**[%p:%p]** Going to Jail ****",context,(void*)pthread_self());
   pthread_cond_wait(&(context->cond), &(context->mutex));
-  DEBUG0("**** Unlocking ****");
+  DEBUG2("**[%p:%p]** Unlocking ****",context,(void*)pthread_self());
   pthread_mutex_unlock(&(context->mutex));
 #endif
 
   if(context->startup_func)
     context->startup_func(context->startup_arg);
 
-   DEBUG0("Calling the main function");
+  DEBUG0("Calling the main function");
   (context->code) (context->argc,context->argv);
 
+  DEBUG0("Freeing arguments");
   for(i=0;i<context->argc; i++) 
     if(context->argv[i]) free(context->argv[i]);
   if(context->argv) free(context->argv);
 
-  if(context->cleanup_func)
+  if(context->cleanup_func) {
+    DEBUG0("Calling cleanup function");
     context->cleanup_func(context->cleanup_arg);
+  }
 
+  DEBUG0("Putting context in the to_destroy set");
   xbt_swag_remove(context, context_living);
   xbt_swag_insert(context, context_to_destroy);
+  DEBUG0("Context put in the to_destroy set");
 
+  DEBUG0("Yielding");
+#ifdef USE_PTHREADS
+  DEBUG0("**** Locking ****");
+  pthread_mutex_lock(&(context->mutex));
+  DEBUG0("**** Updating current_context ****");
+  current_context = context;
+  DEBUG0("**** Releasing the prisonner ****");
+  pthread_cond_signal(&(context->cond));  
+  DEBUG0("**** Unlocking ****");
+  pthread_mutex_unlock(&(context->mutex));
+  DEBUG0("**** Exiting ****");
+  pthread_exit(0);
+#else
   __xbt_context_yield(context);
-  xbt_assert0(0,"You're cannot be here!");
+#endif
+  xbt_assert0(0,"You can't be here!");
   return NULL;
 }
 
@@ -199,14 +218,15 @@ void xbt_context_start(xbt_context_t context)
 {
 #ifdef USE_PTHREADS
   /* Launch the thread */
-  DEBUG0("**** Locking ****");
+  DEBUG1("**[%p]** Locking ****",context);
   pthread_mutex_lock(&(context->mutex));
-  DEBUG0("**** Pthread create ****");
+  DEBUG1("**[%p]** Pthread create ****",context);
   xbt_assert0(!pthread_create(context->thread, NULL, __context_wrapper, context),
              "Unable to create a thread.");
-  DEBUG0("**** Going to jail ****");
+  DEBUG2("**[%p]** Pthread created : %p ****",context,(void*)(*(context->thread)));
+  DEBUG1("**[%p]** Going to jail ****",context);
   pthread_cond_wait(&(context->cond), &(context->mutex));
-  DEBUG0("**** Unlocking ****");
+  DEBUG1("**[%p]** Unlocking ****",context);
   pthread_mutex_unlock(&(context->mutex));  
 #else
   makecontext (&(context->uc), (void (*) (void)) __context_wrapper,
@@ -286,6 +306,7 @@ void xbt_context_yield(void)
  */
 void xbt_context_schedule(xbt_context_t context)
 {
+  DEBUG1("Scheduling %p",context);
   xbt_assert0((current_context==init_context),
              "You are not supposed to run this function here!");
   __xbt_context_yield(context);