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@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
42int ptw32_processInitialized = PTW32_FALSE;
43ptw32_thread_t * ptw32_threadReuseTop = PTW32_THREAD_REUSE_EMPTY;
44ptw32_thread_t * ptw32_threadReuseBottom = PTW32_THREAD_REUSE_EMPTY;
45pthread_key_t ptw32_selfThreadKey = NULL;
46pthread_key_t ptw32_cleanupKey = NULL;
47pthread_cond_t ptw32_cond_list_head = NULL;
48pthread_cond_t ptw32_cond_list_tail = NULL;
49
50int ptw32_concurrency = 0;
51
52/* What features have been auto-detected */
53int ptw32_features = 0;
54
55/*
56 * Global [process wide] thread sequence Number
57 */
58unsigned __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 */
65DWORD (*ptw32_register_cancelation) (PAPCFUNC, HANDLE, DWORD) = NULL;
66
67/*
68 * Global lock for managing pthread_t struct reuse.
69 */
70ptw32_mcs_lock_t ptw32_thread_reuse_lock = 0;
71
72/*
73 * Global lock for testing internal state of statically declared mutexes.
74 */
75ptw32_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 */
81ptw32_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 */
87ptw32_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 */
93ptw32_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 */
100ptw32_mcs_lock_t ptw32_cond_list_lock = 0;
101
102#if defined(_UWIN)
103/*
104 * Keep a count of the number of threads.
105 */
106int pthread_count = 0;
107#endif
108