pike.git / src / threads.c

version» Context lines:

pike.git/src/threads.c:1:   #include "global.h" - RCSID("$Id: threads.c,v 1.183 2002/09/14 02:50:50 mast Exp $"); + RCSID("$Id: threads.c,v 1.184 2002/09/14 02:58:33 mast Exp $");      PMOD_EXPORT int num_threads = 1;   PMOD_EXPORT int threads_disabled = 0;      #ifdef _REENTRANT   #include "threads.h"   #include "array.h"   #include "mapping.h"   #include "object.h"   #include "pike_macros.h"
pike.git/src/threads.c:190:   PMOD_EXPORT MUTEX_T interpreter_lock;   MUTEX_T thread_table_lock, interleave_lock;   struct program *mutex_key = 0;   PMOD_EXPORT struct program *thread_id_prog = 0;   struct program *thread_local_prog = 0;   #ifdef POSIX_THREADS   pthread_attr_t pattr;   pthread_attr_t small_pattr;   #endif   PMOD_EXPORT ptrdiff_t thread_storage_offset; + #ifdef USE_CLOCK_FOR_SLICES + PMOD_EXPORT clock_t thread_start_clock = 0; + #endif      struct thread_starter   {    struct object *id;    struct array *args;   #ifdef HAVE_BROKEN_LINUX_THREAD_EUID    int euid, egid;   #endif /* HAVE_BROKEN_LINUX_THREAD_EUID */   };   
pike.git/src/threads.c:611:   {    return num_pike_threads;   }      static void check_threads(struct callback *cb, void *arg, void * arg2)   {   #ifndef HAVE_NO_YIELD    /* If we have no yield we can't cut calls here since it's possible    * that a thread switch will take place only occasionally in the    * window below. */ - #ifdef HAVE_GETHRTIME -  static long long last_; -  if( gethrtime()-last_ < 50000000 ) /* 0.05s slice */ -  return; -  last_ = gethrtime(); - #else +     static int div_;    if(div_++ & 255)    return; -  + #ifdef HAVE_GETHRTIME +  { +  static hrtime_t last_ = 0; +  hrtime_t now = gethrtime(); +  if( now-last_ < 50000000 ) /* 0.05s slice */ +  return; +  last_ = now; +  } + #elif defined (USE_CLOCK_FOR_SLICES) +  if (clock() - thread_start_clock < (clock_t) (CLOCKS_PER_SEC / 20)) +  return;   #endif   #endif      #ifdef DEBUG    if(thread_for_id(th_self()) != Pike_interpreter.thread_id) {    debug_list_all_threads();    Pike_fatal("thread_for_id() (or Pike_interpreter.thread_id) failed! %p != %p\n",thread_for_id(th_self()),Pike_interpreter.thread_id) ;    }       if(Pike_interpreter.backlink != OBJ2THREAD(Pike_interpreter.thread_id))    Pike_fatal("Hashlink is wrong!\n");   #endif       THREADS_ALLOW();    /* Allow other threads to run */    th_yield();    THREADS_DISALLOW();    -  + #ifdef USE_CLOCK_FOR_SLICES +  /* Must set the base time for the slice here since clock() returns +  * thread local time. */ +  thread_start_clock = clock(); + #endif +     DO_IF_DEBUG(    if(thread_for_id(th_self()) != Pike_interpreter.thread_id) {    debug_list_all_threads();    Pike_fatal("thread_for_id() (or Pike_interpreter.thread_id) failed! %p != %p\n",thread_for_id(th_self()),Pike_interpreter.thread_id) ;    } )   }      TH_RETURN_TYPE new_thread_func(void * data)   {    struct thread_starter arg = *(struct thread_starter *)data;