177
173
#define _MD_EARLY_INIT _MD_EarlyInit
178
174
#define _MD_FINAL_INIT _PR_UnixInit
180
#elif defined(_PR_GLOBAL_THREADS_ONLY)
182
#include "prthread.h"
184
#include <ucontext.h>
187
** Iinitialization Related definitions
190
NSPR_API(void) _MD_EarlyInit(void);
192
#define _MD_EARLY_INIT _MD_EarlyInit
193
#define _MD_FINAL_INIT _PR_UnixInit
195
#define _MD_GET_SP(threadp) threadp->md.sp
198
** Clean-up the thread machine dependent data structure
200
#define _MD_INIT_THREAD _MD_InitializeThread
201
#define _MD_INIT_ATTACHED_THREAD _MD_InitializeThread
203
NSPR_API(PRStatus) _MD_CreateThread(PRThread *thread,
204
void (*start)(void *),
205
PRThreadPriority priority,
209
#define _MD_CREATE_THREAD _MD_CreateThread
211
#define _PR_CONTEXT_TYPE ucontext_t
213
#define CONTEXT(_thread) (&(_thread)->md.context)
219
extern struct PRLock *_pr_schedLock;
222
** Thread Local Storage
225
#define THREAD_KEY_T thread_key_t
227
extern struct PRThread *_pr_attached_thread_tls();
228
extern struct PRThread *_pr_current_thread_tls();
229
extern struct _PRCPU *_pr_current_cpu_tls();
230
extern struct PRThread *_pr_last_thread_tls();
232
extern THREAD_KEY_T threadid_key;
233
extern THREAD_KEY_T cpuid_key;
234
extern THREAD_KEY_T last_thread_key;
236
#define _MD_GET_ATTACHED_THREAD() _pr_attached_thread_tls()
237
#define _MD_CURRENT_THREAD() _pr_current_thread_tls()
238
#define _MD_CURRENT_CPU() _pr_current_cpu_tls()
239
#define _MD_LAST_THREAD() _pr_last_thread_tls()
241
#define _MD_SET_CURRENT_THREAD(newval) \
243
thr_setspecific(threadid_key, (void *)newval); \
246
#define _MD_SET_CURRENT_CPU(newval) \
248
thr_setspecific(cpuid_key, (void *)newval); \
251
#define _MD_SET_LAST_THREAD(newval) \
253
thr_setspecific(last_thread_key, (void *)newval); \
256
#define _MD_CLEAN_THREAD(_thread) _MD_cleanup_thread(_thread)
257
extern void _MD_exit_thread(PRThread *thread);
258
#define _MD_EXIT_THREAD(thread) _MD_exit_thread(thread)
260
#define _MD_SUSPEND_THREAD(thread) _MD_Suspend(thread)
261
#define _MD_RESUME_THREAD(thread) thr_continue((thread)->md.handle)
263
/* XXXX Needs to be defined - Prashant */
264
#define _MD_SUSPEND_CPU(cpu)
265
#define _MD_RESUME_CPU(cpu)
267
extern void _MD_Begin_SuspendAll(void);
268
extern void _MD_End_SuspendAll(void);
269
extern void _MD_End_ResumeAll(void);
270
#define _MD_BEGIN_SUSPEND_ALL() _MD_Begin_SuspendAll()
271
#define _MD_BEGIN_RESUME_ALL()
272
#define _MD_END_SUSPEND_ALL() _MD_End_SuspendAll()
273
#define _MD_END_RESUME_ALL() _MD_End_ResumeAll()
275
#define _MD_INIT_LOCKS()
276
#define _MD_NEW_LOCK(md_lockp) (mutex_init(&((md_lockp)->lock),USYNC_THREAD,NULL) ? PR_FAILURE : PR_SUCCESS)
277
#define _MD_FREE_LOCK(md_lockp) mutex_destroy(&((md_lockp)->lock))
278
#define _MD_UNLOCK(md_lockp) mutex_unlock(&((md_lockp)->lock))
279
#define _MD_TEST_AND_LOCK(md_lockp) mutex_trylock(&((md_lockp)->lock))
281
NSPR_API(void) _MD_lock(struct _MDLock *md_lock);
283
#ifndef PROFILE_LOCKS
284
#define _MD_LOCK(md_lockp) _MD_lock(md_lockp)
286
#define _MD_LOCK(md_lockp) \
288
int rv = _MD_TEST_AND_LOCK(md_lockp); \
290
(md_lockp)->hitcount++; \
292
(md_lockp)->misscount++; \
293
_MD_lock(md_lockp); \
298
#define _PR_LOCK_HEAP() if (_pr_heapLock) _MD_LOCK(&_pr_heapLock->md)
299
#define _PR_UNLOCK_HEAP() if (_pr_heapLock) _MD_UNLOCK(&_pr_heapLock->md)
301
#define _MD_ATTACH_THREAD(threadp)
304
#define THR_KEYCREATE thr_keycreate
305
#define THR_SELF thr_self
306
#define _MD_NEW_CV(condp) cond_init(&((condp)->cv), USYNC_THREAD, 0)
307
#define COND_WAIT(condp, mutexp) cond_wait(condp, mutexp)
308
#define COND_TIMEDWAIT(condp, mutexp, tspec) \
309
cond_timedwait(condp, mutexp, tspec)
310
#define _MD_NOTIFY_CV(condp, lockp) cond_signal(&((condp)->cv))
311
#define _MD_NOTIFYALL_CV(condp,unused) cond_broadcast(&((condp)->cv))
312
#define _MD_FREE_CV(condp) cond_destroy(&((condp)->cv))
313
#define _MD_YIELD() thr_yield()
316
* Because clock_gettime() on Solaris/x86 2.4 always generates a
317
* segmentation fault, we use an emulated version _pr_solx86_clock_gettime(),
318
* which is implemented using gettimeofday().
320
#if defined(i386) && defined(SOLARIS2_4)
321
extern int _pr_solx86_clock_gettime(clockid_t clock_id, struct timespec *tp);
322
#define GETTIME(tt) _pr_solx86_clock_gettime(CLOCK_REALTIME, (tt))
324
#define GETTIME(tt) clock_gettime(CLOCK_REALTIME, (tt))
325
#endif /* i386 && SOLARIS2_4 */
327
#define MUTEX_T mutex_t
328
#define COND_T cond_t
330
#define _MD_NEW_SEM(md_semp,_val) sema_init(&((md_semp)->sem),_val,USYNC_THREAD,NULL)
331
#define _MD_DESTROY_SEM(md_semp) sema_destroy(&((md_semp)->sem))
332
#define _MD_WAIT_SEM(md_semp) sema_wait(&((md_semp)->sem))
333
#define _MD_POST_SEM(md_semp) sema_post(&((md_semp)->sem))
335
#define _MD_SAVE_ERRNO(_thread)
336
#define _MD_RESTORE_ERRNO(_thread)
337
#define _MD_INIT_RUNNING_CPU(cpu) _MD_unix_init_running_cpu(cpu)
339
extern struct _MDLock _pr_ioq_lock;
340
#define _MD_IOQ_LOCK() _MD_LOCK(&_pr_ioq_lock)
341
#define _MD_IOQ_UNLOCK() _MD_UNLOCK(&_pr_ioq_lock)
343
extern PRStatus _MD_wait(struct PRThread *, PRIntervalTime timeout);
344
#define _MD_WAIT _MD_wait
346
extern PRStatus _MD_WakeupWaiter(struct PRThread *);
347
#define _MD_WAKEUP_WAITER _MD_WakeupWaiter
349
NSPR_API(void) _MD_InitIO(void);
350
#define _MD_INIT_IO _MD_InitIO
352
#define _MD_INIT_CONTEXT(_thread, _sp, _main, status) \
356
#define _MD_SWITCH_CONTEXT(_thread)
357
#define _MD_RESTORE_CONTEXT(_newThread)
371
struct _MDSemaphore {
376
_PR_CONTEXT_TYPE context;
379
uint_t sp; /* stack pointer */
380
uint_t threadID; /* ptr to solaris-internal thread id structures */
381
struct _MDSemaphore waiter_sem;
384
struct _MDThreadStack {
393
* md-specific cpu structure field, common to all Unix platforms
395
#define _PR_MD_MAX_OSFD FD_SETSIZE
399
PRUint32 ioq_timeout;
400
PRInt32 ioq_max_osfd;
401
PRInt32 ioq_osfd_cnt;
403
fd_set fd_read_set, fd_write_set, fd_exception_set;
404
PRInt16 fd_read_cnt[_PR_MD_MAX_OSFD],fd_write_cnt[_PR_MD_MAX_OSFD],
405
fd_exception_cnt[_PR_MD_MAX_OSFD];
407
struct pollfd *ioq_pollfds;
408
int ioq_pollfds_size;
409
#endif /* _PR_USE_POLL */
412
#define _PR_IOQ(_cpu) ((_cpu)->md.md_unix.ioQ)
413
#define _PR_ADD_TO_IOQ(_pq, _cpu) PR_APPEND_LINK(&_pq.links, &_PR_IOQ(_cpu))
414
#define _PR_FD_READ_SET(_cpu) ((_cpu)->md.md_unix.fd_read_set)
415
#define _PR_FD_READ_CNT(_cpu) ((_cpu)->md.md_unix.fd_read_cnt)
416
#define _PR_FD_WRITE_SET(_cpu) ((_cpu)->md.md_unix.fd_write_set)
417
#define _PR_FD_WRITE_CNT(_cpu) ((_cpu)->md.md_unix.fd_write_cnt)
418
#define _PR_FD_EXCEPTION_SET(_cpu) ((_cpu)->md.md_unix.fd_exception_set)
419
#define _PR_FD_EXCEPTION_CNT(_cpu) ((_cpu)->md.md_unix.fd_exception_cnt)
420
#define _PR_IOQ_TIMEOUT(_cpu) ((_cpu)->md.md_unix.ioq_timeout)
421
#define _PR_IOQ_MAX_OSFD(_cpu) ((_cpu)->md.md_unix.ioq_max_osfd)
422
#define _PR_IOQ_OSFD_CNT(_cpu) ((_cpu)->md.md_unix.ioq_osfd_cnt)
423
#define _PR_IOQ_POLLFDS(_cpu) ((_cpu)->md.md_unix.ioq_pollfds)
424
#define _PR_IOQ_POLLFDS_SIZE(_cpu) ((_cpu)->md.md_unix.ioq_pollfds_size)
426
#define _PR_IOQ_MIN_POLLFDS_SIZE(_cpu) 32
430
struct _MDCPU_Unix md_unix;
433
/* The following defines the unwrapped versions of select() and poll(). */
434
extern int _select(int nfds, fd_set *readfds, fd_set *writefds,
435
fd_set *exceptfds, struct timeval *timeout);
436
#define _MD_SELECT _select
439
#define _MD_POLL _poll
440
extern int _poll(struct pollfd *fds, unsigned long nfds, int timeout);
445
** Missing function prototypes
447
extern int gethostname (char *name, int namelen);
451
#else /* _PR_GLOBAL_THREADS_ONLY */
454
* LOCAL_THREADS_ONLY implementation on Solaris
176
#else /* _PR_PTHREADS */
179
* _PR_LOCAL_THREADS_ONLY implementation on Solaris
457
182
#include "prthread.h"