extra code in pp_concat, Take 2
[p5sagit/p5-mst-13.2.git] / NetWare / nw5thread.h
CommitLineData
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
28typedef 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
33typedef struct nw_cond { long waiters; unsigned int sem; } perl_cond;
34
3db8f154 35#if defined (USE_ITHREADS) && defined(MPK_ON)
2986a63f 36#ifdef __cplusplus
37extern "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
55typedef 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
89typedef 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))
158extern __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