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 
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 
35 #if (defined (USE_ITHREADS) || defined (USE_5005THREADS)) && defined(MPK_ON)
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 {						\
103 	/*ConsolePrintf("In COND_INIT\n");	*/\
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 {						\
113 	/*ConsolePrintf("In COND_SIGNAL\n");	*/\
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 {						\
121 	/*ConsolePrintf("In COND_BROADCAST\n");	*/\
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 {						\
133 	/*ConsolePrintf("In COND_WAIT\n");	*/\
134     } STMT_END
135 
136 
137 #define COND_DESTROY(c) \
138     STMT_START {						\
139 	/*ConsolePrintf("In COND_DESTROY\n");	*/\
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 
182