Home | History | Annotate | Download | only in pthreads-win32
      1 /*
      2  * global.c
      3  *
      4  * Description:
      5  * This translation unit instantiates data associated with the implementation
      6  * as a whole.
      7  *
      8  * --------------------------------------------------------------------------
      9  *
     10  *      Pthreads-win32 - POSIX Threads Library for Win32
     11  *      Copyright(C) 1998 John E. Bossom
     12  *      Copyright(C) 1999,2005 Pthreads-win32 contributors
     13  *
     14  *      Contact Email: rpj (at) callisto.canberra.edu.au
     15  *
     16  *      The current list of contributors is contained
     17  *      in the file CONTRIBUTORS included with the source
     18  *      code distribution. The list can also be seen at the
     19  *      following World Wide Web location:
     20  *      http://sources.redhat.com/pthreads-win32/contributors.html
     21  *
     22  *      This library is free software; you can redistribute it and/or
     23  *      modify it under the terms of the GNU Lesser General Public
     24  *      License as published by the Free Software Foundation; either
     25  *      version 2 of the License, or (at your option) any later version.
     26  *
     27  *      This library is distributed in the hope that it will be useful,
     28  *      but WITHOUT ANY WARRANTY; without even the implied warranty of
     29  *      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     30  *      Lesser General Public License for more details.
     31  *
     32  *      You should have received a copy of the GNU Lesser General Public
     33  *      License along with this library in the file COPYING.LIB;
     34  *      if not, write to the Free Software Foundation, Inc.,
     35  *      59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
     36  */
     37 
     38 #include "pthread.h"
     39 #include "implement.h"
     40 
     41 
     42 int ptw32_processInitialized = PTW32_FALSE;
     43 ptw32_thread_t * ptw32_threadReuseTop = PTW32_THREAD_REUSE_EMPTY;
     44 ptw32_thread_t * ptw32_threadReuseBottom = PTW32_THREAD_REUSE_EMPTY;
     45 pthread_key_t ptw32_selfThreadKey = NULL;
     46 pthread_key_t ptw32_cleanupKey = NULL;
     47 pthread_cond_t ptw32_cond_list_head = NULL;
     48 pthread_cond_t ptw32_cond_list_tail = NULL;
     49 
     50 int ptw32_concurrency = 0;
     51 
     52 /* What features have been auto-detected */
     53 int ptw32_features = 0;
     54 
     55 /*
     56  * Global [process wide] thread sequence Number
     57  */
     58 unsigned __int64 ptw32_threadSeqNumber = 0;
     59 
     60 /*
     61  * Function pointer to QueueUserAPCEx if it exists, otherwise
     62  * it will be set at runtime to a substitute routine which cannot unblock
     63  * blocked threads.
     64  */
     65 DWORD (*ptw32_register_cancelation) (PAPCFUNC, HANDLE, DWORD) = NULL;
     66 
     67 /*
     68  * Global lock for managing pthread_t struct reuse.
     69  */
     70 ptw32_mcs_lock_t ptw32_thread_reuse_lock = 0;
     71 
     72 /*
     73  * Global lock for testing internal state of statically declared mutexes.
     74  */
     75 ptw32_mcs_lock_t ptw32_mutex_test_init_lock = 0;
     76 
     77 /*
     78  * Global lock for testing internal state of PTHREAD_COND_INITIALIZER
     79  * created condition variables.
     80  */
     81 ptw32_mcs_lock_t ptw32_cond_test_init_lock = 0;
     82 
     83 /*
     84  * Global lock for testing internal state of PTHREAD_RWLOCK_INITIALIZER
     85  * created read/write locks.
     86  */
     87 ptw32_mcs_lock_t ptw32_rwlock_test_init_lock = 0;
     88 
     89 /*
     90  * Global lock for testing internal state of PTHREAD_SPINLOCK_INITIALIZER
     91  * created spin locks.
     92  */
     93 ptw32_mcs_lock_t ptw32_spinlock_test_init_lock = 0;
     94 
     95 /*
     96  * Global lock for condition variable linked list. The list exists
     97  * to wake up CVs when a WM_TIMECHANGE message arrives. See
     98  * w32_TimeChangeHandler.c.
     99  */
    100 ptw32_mcs_lock_t ptw32_cond_list_lock = 0;
    101 
    102 #if defined(_UWIN)
    103 /*
    104  * Keep a count of the number of threads.
    105  */
    106 int pthread_count = 0;
    107 #endif
    108