Commit | Line | Data |
2986a63f |
1 | |
2 | /* |
3 | * Copyright © 2001 Novell, Inc. All Rights Reserved. |
4 | * |
5 | * You may distribute under the terms of either the GNU General Public |
6 | * License or the Artistic License, as specified in the README file. |
7 | * |
8 | */ |
9 | |
10 | /* |
11 | * FILENAME : nw5thread.h |
12 | * DESCRIPTION : Thread related functions. |
13 | * Author : SGP |
14 | * Date : January 2001. |
15 | * |
16 | */ |
17 | |
18 | |
19 | |
20 | #ifndef _NW5THREAD_H |
21 | #define _NW5THREAD_H |
22 | |
23 | |
24 | #include <nwthread.h> |
25 | |
26 | #include "netware.h" |
27 | |
28 | typedef long perl_key; |
29 | |
fa03377f |
30 | // The line below is just a definition to avoid compilation error. |
31 | // It is not being used anywhere. |
32 | // Ananth, 3 Sept 2001 |
33 | typedef struct nw_cond { long waiters; unsigned int sem; } perl_cond; |
34 | |
3db8f154 |
35 | #if defined (USE_ITHREADS) && defined(MPK_ON) |
2986a63f |
36 | #ifdef __cplusplus |
37 | extern "C" |
38 | { |
39 | #endif |
40 | #include <mpktypes.h> |
41 | #include <mpkapis.h> |
42 | #define kSUCCESS (0) |
43 | #define ERROR_INVALID_MUTEX (0x1010) |
44 | |
45 | #ifdef __cplusplus |
46 | } |
47 | #endif |
48 | #undef WORD |
49 | //On NetWare, since the NLM will be resident, only once the MUTEX_INIT gets called and |
50 | //this will be freed when the script terminates. But when a new script is executed, |
51 | //then MUTEX_LOCK will fail since it is already freed. Even if this problem is fixed |
52 | //by not freeing the mutex when script terminates but when the NLM unloads, there will |
53 | //still be problems when multiple scripts are running simultaneously in a multi-processor |
54 | //machine - sgp |
55 | typedef MUTEX perl_mutex; |
56 | # define MUTEX_INIT(m) \ |
57 | STMT_START { \ |
58 | /*if ((*(m) = kMutexAlloc("NetWarePerlMutex")) == NULL) */\ |
59 | /*Perl_croak_nocontext("panic: MUTEX_ALLOC"); */\ |
60 | /*ConsolePrintf("Mutex Init %d\n",*(m)); */\ |
61 | } STMT_END |
62 | |
63 | # define MUTEX_LOCK(m) \ |
64 | STMT_START { \ |
65 | /*ConsolePrintf("Mutex lock %d\n",*(m)); */\ |
66 | /*if (kMutexLock(*(m)) == ERROR_INVALID_MUTEX) */\ |
67 | /*Perl_croak_nocontext("panic: MUTEX_LOCK"); */\ |
68 | } STMT_END |
69 | |
70 | # define MUTEX_UNLOCK(m) \ |
71 | STMT_START { \ |
72 | /*ConsolePrintf("Mutex unlock %d\n",*(m)); */\ |
73 | /*if (kMutexUnlock(*(m)) != kSUCCESS) \ |
74 | Perl_croak_nocontext("panic: MUTEX_UNLOCK"); */\ |
75 | } STMT_END |
76 | |
77 | # define MUTEX_DESTROY(m) \ |
78 | STMT_START { \ |
79 | /*ConsolePrintf("Mutex Destroy %d\n",*(m)); */\ |
80 | /*if (kMutexWaitCount(*(m)) == 0 ) */\ |
81 | /*{ */\ |
82 | /*PERL_SET_INTERP(NULL); *//*newly added CHKSGP???*/ \ |
83 | /*if (kMutexFree(*(m)) != kSUCCESS) */ \ |
84 | /*Perl_croak_nocontext("panic: MUTEX_FREE"); */\ |
85 | /*} */\ |
86 | } STMT_END |
87 | |
88 | #else |
89 | typedef unsigned long perl_mutex; |
90 | # define MUTEX_INIT(m) |
91 | # define MUTEX_LOCK(m) |
92 | # define MUTEX_UNLOCK(m) |
93 | # define MUTEX_DESTROY(m) |
94 | #endif |
95 | |
96 | /* These macros assume that the mutex associated with the condition |
97 | * will always be held before COND_{SIGNAL,BROADCAST,WAIT,DESTROY}, |
98 | * so there's no separate mutex protecting access to (c)->waiters |
99 | */ |
100 | //For now let us just see when this happens -sgp. |
101 | #define COND_INIT(c) \ |
102 | STMT_START { \ |
4d76e4b4 |
103 | /*ConsolePrintf("In COND_INIT\n"); */\ |
2986a63f |
104 | } STMT_END |
105 | |
106 | /* (c)->waiters = 0; \ |
107 | (c)->sem = OpenLocalSemaphore (0); \ |
108 | if ((c)->sem == NULL) \ |
109 | Perl_croak_nocontext("panic: COND_INIT (%ld)",errno); \*/ |
110 | |
111 | #define COND_SIGNAL(c) \ |
112 | STMT_START { \ |
4d76e4b4 |
113 | /*ConsolePrintf("In COND_SIGNAL\n"); */\ |
2986a63f |
114 | } STMT_END |
115 | /*if ((c)->waiters > 0 && \ |
116 | SignalLocalSemaphore((c)->sem) != 0) \ |
117 | Perl_croak_nocontext("panic: COND_SIGNAL (%ld)",errno); \*/ |
118 | |
119 | #define COND_BROADCAST(c) \ |
120 | STMT_START { \ |
4d76e4b4 |
121 | /*ConsolePrintf("In COND_BROADCAST\n"); */\ |
2986a63f |
122 | } STMT_END |
123 | |
124 | /*if ((c)->waiters > 0 ) { \ |
125 | int count; \ |
126 | for(count=0; count<(c)->waiters; count++) { \ |
127 | if(SignalLocalSemaphore((c)->sem) != 0) \ |
128 | Perl_croak_nocontext("panic: COND_BROADCAST (%ld)",GetLastError());\ |
129 | } \ |
130 | } \*/ |
131 | #define COND_WAIT(c, m) \ |
132 | STMT_START { \ |
4d76e4b4 |
133 | /*ConsolePrintf("In COND_WAIT\n"); */\ |
2986a63f |
134 | } STMT_END |
135 | |
136 | |
137 | #define COND_DESTROY(c) \ |
138 | STMT_START { \ |
4d76e4b4 |
139 | /*ConsolePrintf("In COND_DESTROY\n"); */\ |
2986a63f |
140 | } STMT_END |
141 | |
142 | /* (c)->waiters = 0; \ |
143 | if (CloseLocalSemaphore((c)->sem) != 0) \ |
144 | Perl_croak_nocontext("panic: COND_DESTROY (%ld)",errno); \*/ |
145 | |
146 | #if 0 |
147 | #define DETACH(t) \ |
148 | STMT_START { \ |
149 | if (CloseHandle((t)->self) == 0) { \ |
150 | MUTEX_UNLOCK(&(t)->mutex); \ |
151 | Perl_croak_nocontext("panic: DETACH"); \ |
152 | } \ |
153 | } STMT_END |
154 | #endif //#if 0 |
155 | |
156 | //Following has to be defined CHKSGP |
157 | #if defined(PERLDLL) && defined(USE_DECLSPEC_THREAD) && (!defined(__BORLANDC__) || defined(_DLL)) |
158 | extern __declspec(thread) void *PL_current_context; |
159 | #define PERL_SET_CONTEXT(t) (PL_current_context = t) |
160 | #define PERL_GET_CONTEXT PL_current_context |
161 | #else |
162 | #define PERL_GET_CONTEXT Perl_get_context() |
163 | #define PERL_SET_CONTEXT(t) Perl_set_context(t) |
164 | #endif |
165 | |
166 | //Check the following, will be used in Thread extension - CHKSGP |
167 | #define THREAD_RET_TYPE unsigned __stdcall |
168 | #define THREAD_RET_CAST(p) ((unsigned)(p)) |
169 | |
170 | #define INIT_THREADS NOOP |
171 | |
172 | //Ideally this should have been PL_thr_key = fnInitializeThreadCtx(); |
173 | //See the comment at the end of file nw5thread.c as to why PL_thr_key is not assigned - sgp |
174 | #define ALLOC_THREAD_KEY \ |
175 | STMT_START { \ |
176 | fnInitializeThreadCtx(); \ |
177 | } STMT_END |
178 | |
179 | |
180 | #endif /* _NW5THREAD_H */ |
181 | |