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