Index: third_party/nspr/mozilla/nsprpub/pr/include/private/primpl.h |
diff --git a/third_party/nspr/mozilla/nsprpub/pr/include/private/primpl.h b/third_party/nspr/mozilla/nsprpub/pr/include/private/primpl.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..a742711fc174515652b3c88c0b5405595db54e19 |
--- /dev/null |
+++ b/third_party/nspr/mozilla/nsprpub/pr/include/private/primpl.h |
@@ -0,0 +1,2149 @@ |
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ |
+/* ***** BEGIN LICENSE BLOCK ***** |
+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1 |
+ * |
+ * The contents of this file are subject to the Mozilla Public License Version |
+ * 1.1 (the "License"); you may not use this file except in compliance with |
+ * the License. You may obtain a copy of the License at |
+ * http://www.mozilla.org/MPL/ |
+ * |
+ * Software distributed under the License is distributed on an "AS IS" basis, |
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License |
+ * for the specific language governing rights and limitations under the |
+ * License. |
+ * |
+ * The Original Code is the Netscape Portable Runtime (NSPR). |
+ * |
+ * The Initial Developer of the Original Code is |
+ * Netscape Communications Corporation. |
+ * Portions created by the Initial Developer are Copyright (C) 1998-2000 |
+ * the Initial Developer. All Rights Reserved. |
+ * |
+ * Contributor(s): |
+ * |
+ * Alternatively, the contents of this file may be used under the terms of |
+ * either the GNU General Public License Version 2 or later (the "GPL"), or |
+ * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), |
+ * in which case the provisions of the GPL or the LGPL are applicable instead |
+ * of those above. If you wish to allow use of your version of this file only |
+ * under the terms of either the GPL or the LGPL, and not to allow others to |
+ * use your version of this file under the terms of the MPL, indicate your |
+ * decision by deleting the provisions above and replace them with the notice |
+ * and other provisions required by the GPL or the LGPL. If you do not delete |
+ * the provisions above, a recipient may use your version of this file under |
+ * the terms of any one of the MPL, the GPL or the LGPL. |
+ * |
+ * ***** END LICENSE BLOCK ***** */ |
+ |
+#ifndef primpl_h___ |
+#define primpl_h___ |
+ |
+/* |
+ * HP-UX 10.10's pthread.h (DCE threads) includes dce/cma.h, which |
+ * has: |
+ * #define sigaction _sigaction_sys |
+ * This macro causes chaos if signal.h gets included before pthread.h. |
+ * To be safe, we include pthread.h first. |
+ */ |
+ |
+#if defined(_PR_PTHREADS) |
+#include <pthread.h> |
+#endif |
+ |
+#if defined(_PR_BTHREADS) |
+#include <kernel/OS.h> |
+#endif |
+ |
+#ifdef WINNT |
+/* Need to force service-pack 3 extensions to be defined by |
+** setting _WIN32_WINNT to NT 4.0 for winsock.h, winbase.h, winnt.h. |
+*/ |
+#ifndef _WIN32_WINNT |
+ #define _WIN32_WINNT 0x0400 |
+#elif (_WIN32_WINNT < 0x0400) |
+ #undef _WIN32_WINNT |
+ #define _WIN32_WINNT 0x0400 |
+#endif /* _WIN32_WINNT */ |
+#endif /* WINNT */ |
+ |
+#include "nspr.h" |
+#include "prpriv.h" |
+ |
+typedef struct PRSegment PRSegment; |
+ |
+#ifdef XP_MAC |
+#include "prosdep.h" |
+#include "probslet.h" |
+#else |
+#include "md/prosdep.h" |
+#include "obsolete/probslet.h" |
+#endif /* XP_MAC */ |
+ |
+#ifdef _PR_HAVE_POSIX_SEMAPHORES |
+#include <semaphore.h> |
+#elif defined(_PR_HAVE_SYSV_SEMAPHORES) |
+#include <sys/sem.h> |
+#endif |
+ |
+/************************************************************************* |
+***** A Word about Model Dependent Function Naming Convention *********** |
+*************************************************************************/ |
+ |
+/* |
+NSPR 2.0 must implement its function across a range of platforms |
+including: MAC, Windows/16, Windows/95, Windows/NT, and several |
+variants of Unix. Each implementation shares common code as well |
+as having platform dependent portions. This standard describes how |
+the model dependent portions are to be implemented. |
+ |
+In header file pr/include/primpl.h, each publicly declared |
+platform dependent function is declared as: |
+ |
+NSPR_API void _PR_MD_FUNCTION( long arg1, long arg2 ); |
+#define _PR_MD_FUNCTION _MD_FUNCTION |
+ |
+In header file pr/include/md/<platform>/_<platform>.h, |
+each #define'd macro is redefined as one of: |
+ |
+#define _MD_FUNCTION <blanks> |
+#define _MD_FUNCTION <expanded macro> |
+#define _MD_FUNCTION <osFunction> |
+#define _MD_FUNCTION <_MD_Function> |
+ |
+Where: |
+ |
+<blanks> is no definition at all. In this case, the function is not implemented |
+and is never called for this platform. |
+For example: |
+#define _MD_INIT_CPUS() |
+ |
+<expanded macro> is a C language macro expansion. |
+For example: |
+#define _MD_CLEAN_THREAD(_thread) \ |
+ PR_BEGIN_MACRO \ |
+ PR_DestroyCondVar(_thread->md.asyncIOCVar); \ |
+ PR_DestroyLock(_thread->md.asyncIOLock); \ |
+ PR_END_MACRO |
+ |
+<osFunction> is some function implemented by the host operating system. |
+For example: |
+#define _MD_EXIT exit |
+ |
+<_MD_function> is the name of a function implemented for this platform in |
+pr/src/md/<platform>/<soruce>.c file. |
+For example: |
+#define _MD_GETFILEINFO _MD_GetFileInfo |
+ |
+In <source>.c, the implementation is: |
+PR_IMPLEMENT(PRInt32) _MD_GetFileInfo(const char *fn, PRFileInfo *info); |
+*/ |
+ |
+PR_BEGIN_EXTERN_C |
+ |
+typedef struct _MDLock _MDLock; |
+typedef struct _MDCVar _MDCVar; |
+typedef struct _MDSegment _MDSegment; |
+typedef struct _MDThread _MDThread; |
+typedef struct _MDThreadStack _MDThreadStack; |
+typedef struct _MDSemaphore _MDSemaphore; |
+typedef struct _MDDir _MDDir; |
+#ifdef MOZ_UNICODE |
+typedef struct _MDDirUTF16 _MDDirUTF16; |
+#endif /* MOZ_UNICODE */ |
+typedef struct _MDFileDesc _MDFileDesc; |
+typedef struct _MDProcess _MDProcess; |
+typedef struct _MDFileMap _MDFileMap; |
+ |
+#if defined(_PR_PTHREADS) |
+ |
+/* |
+** The following definitions are unique to implementing NSPR using pthreads. |
+** Since pthreads defines most of the thread and thread synchronization |
+** stuff, this is a pretty small set. |
+*/ |
+ |
+#define PT_CV_NOTIFIED_LENGTH 6 |
+typedef struct _PT_Notified _PT_Notified; |
+struct _PT_Notified |
+{ |
+ PRIntn length; /* # of used entries in this structure */ |
+ struct |
+ { |
+ PRCondVar *cv; /* the condition variable notified */ |
+ PRIntn times; /* and the number of times notified */ |
+ } cv[PT_CV_NOTIFIED_LENGTH]; |
+ _PT_Notified *link; /* link to another of these | NULL */ |
+}; |
+ |
+/* |
+ * bits defined for pthreads 'state' field |
+ */ |
+#define PT_THREAD_DETACHED 0x01 /* thread can't be joined */ |
+#define PT_THREAD_GLOBAL 0x02 /* a global thread (unlikely) */ |
+#define PT_THREAD_SYSTEM 0x04 /* system (not user) thread */ |
+#define PT_THREAD_PRIMORD 0x08 /* this is the primordial thread */ |
+#define PT_THREAD_ABORTED 0x10 /* thread has been interrupted */ |
+#define PT_THREAD_GCABLE 0x20 /* thread is garbage collectible */ |
+#define PT_THREAD_SUSPENDED 0x40 /* thread has been suspended */ |
+#define PT_THREAD_FOREIGN 0x80 /* thread is not one of ours */ |
+#define PT_THREAD_BOUND 0x100 /* a bound-global thread */ |
+ |
+#define _PT_THREAD_INTERRUPTED(thr) \ |
+ (!(thr->interrupt_blocked) && (thr->state & PT_THREAD_ABORTED)) |
+#define _PT_THREAD_BLOCK_INTERRUPT(thr) \ |
+ (thr->interrupt_blocked = 1) |
+#define _PT_THREAD_UNBLOCK_INTERRUPT(thr) \ |
+ (thr->interrupt_blocked = 0) |
+ |
+#ifdef GC_LEAK_DETECTOR |
+/* All threads are GCable. */ |
+#define _PT_IS_GCABLE_THREAD(thr) 1 |
+#else |
+#define _PT_IS_GCABLE_THREAD(thr) ((thr)->state & PT_THREAD_GCABLE) |
+#endif /* GC_LEAK_DETECTOR */ |
+ |
+/* |
+** Possible values for thread's suspend field |
+** Note that the first two can be the same as they are really mutually exclusive, |
+** i.e. both cannot be happening at the same time. We have two symbolic names |
+** just as a mnemonic. |
+**/ |
+#define PT_THREAD_RESUMED 0x80 /* thread has been resumed */ |
+#define PT_THREAD_SETGCABLE 0x100 /* set the GCAble flag */ |
+ |
+#if defined(DEBUG) |
+ |
+typedef struct PTDebug |
+{ |
+ PRTime timeStarted; |
+ PRUintn locks_created, locks_destroyed; |
+ PRUintn locks_acquired, locks_released; |
+ PRUintn cvars_created, cvars_destroyed; |
+ PRUintn cvars_notified, delayed_cv_deletes; |
+} PTDebug; |
+ |
+#endif /* defined(DEBUG) */ |
+ |
+NSPR_API(void) PT_FPrintStats(PRFileDesc *fd, const char *msg); |
+ |
+#else /* defined(_PR_PTHREADS) */ |
+ |
+NSPR_API(void) PT_FPrintStats(PRFileDesc *fd, const char *msg); |
+ |
+/* |
+** This section is contains those parts needed to implement NSPR on |
+** platforms in general. One would assume that the pthreads implementation |
+** included lots of the same types, at least conceptually. |
+*/ |
+ |
+/* |
+ * Local threads only. No multiple CPU support and hence all the |
+ * following routines are no-op. |
+ */ |
+#ifdef _PR_LOCAL_THREADS_ONLY |
+ |
+#define _PR_MD_SUSPEND_THREAD(thread) |
+#define _PR_MD_RESUME_THREAD(thread) |
+#define _PR_MD_SUSPEND_CPU(cpu) |
+#define _PR_MD_RESUME_CPU(cpu) |
+#define _PR_MD_BEGIN_SUSPEND_ALL() |
+#define _PR_MD_END_SUSPEND_ALL() |
+#define _PR_MD_BEGIN_RESUME_ALL() |
+#define _PR_MD_END_RESUME_ALL() |
+#define _PR_MD_INIT_ATTACHED_THREAD(thread) PR_FAILURE |
+ |
+#endif |
+ |
+typedef struct _PRCPUQueue _PRCPUQueue; |
+typedef struct _PRCPU _PRCPU; |
+typedef struct _MDCPU _MDCPU; |
+ |
+struct _PRCPUQueue { |
+ _MDLock runQLock; /* lock for the run + wait queues */ |
+ _MDLock sleepQLock; /* lock for the run + wait queues */ |
+ _MDLock miscQLock; /* lock for the run + wait queues */ |
+ |
+ PRCList runQ[PR_PRIORITY_LAST + 1]; /* run queue for this CPU */ |
+ PRUint32 runQReadyMask; |
+ PRCList sleepQ; |
+ PRIntervalTime sleepQmax; |
+ PRCList pauseQ; |
+ PRCList suspendQ; |
+ PRCList waitingToJoinQ; |
+ |
+ PRUintn numCPUs; /* number of CPUs using this Q */ |
+}; |
+ |
+struct _PRCPU { |
+ PRCList links; /* link list of CPUs */ |
+ PRUint32 id; /* id for this CPU */ |
+ |
+ union { |
+ PRInt32 bits; |
+ PRUint8 missed[4]; |
+ } u; |
+ PRIntn where; /* index into u.missed */ |
+ PRPackedBool paused; /* cpu is paused */ |
+ PRPackedBool exit; /* cpu should exit */ |
+ |
+ PRThread *thread; /* native thread for this CPUThread */ |
+ PRThread *idle_thread; /* user-level idle thread for this CPUThread */ |
+ |
+ PRIntervalTime last_clock; /* the last time we went into |
+ * _PR_ClockInterrupt() on this CPU |
+ */ |
+ |
+ _PRCPUQueue *queue; |
+ |
+ _MDCPU md; |
+}; |
+ |
+typedef struct _PRInterruptTable { |
+ const char *name; |
+ PRUintn missed_bit; |
+ void (*handler)(void); |
+} _PRInterruptTable; |
+ |
+#define _PR_CPU_PTR(_qp) \ |
+ ((_PRCPU*) ((char*) (_qp) - offsetof(_PRCPU,links))) |
+ |
+#if !defined(IRIX) && !defined(WIN32) && !defined(XP_OS2) \ |
+ && !(defined(SOLARIS) && defined(_PR_GLOBAL_THREADS_ONLY)) |
+#define _MD_GET_ATTACHED_THREAD() (_PR_MD_CURRENT_THREAD()) |
+#endif |
+ |
+#ifdef _PR_LOCAL_THREADS_ONLY |
+ |
+NSPR_API(struct _PRCPU *) _pr_currentCPU; |
+NSPR_API(PRThread *) _pr_currentThread; |
+NSPR_API(PRThread *) _pr_lastThread; |
+NSPR_API(PRInt32) _pr_intsOff; |
+ |
+#define _MD_CURRENT_CPU() (_pr_currentCPU) |
+#define _MD_SET_CURRENT_CPU(_cpu) (_pr_currentCPU = (_cpu)) |
+#define _MD_CURRENT_THREAD() (_pr_currentThread) |
+#define _MD_SET_CURRENT_THREAD(_thread) (_pr_currentThread = (_thread)) |
+#define _MD_LAST_THREAD() (_pr_lastThread) |
+#define _MD_SET_LAST_THREAD(t) (_pr_lastThread = t) |
+ |
+#ifndef XP_MAC |
+#define _MD_GET_INTSOFF() (_pr_intsOff) |
+#define _MD_SET_INTSOFF(_val) (_pr_intsOff = _val) |
+#endif |
+ |
+ |
+/* The unbalanced curly braces in these two macros are intentional */ |
+#define _PR_LOCK_HEAP() { PRIntn _is; if (_pr_currentCPU) _PR_INTSOFF(_is); |
+#define _PR_UNLOCK_HEAP() if (_pr_currentCPU) _PR_INTSON(_is); } |
+ |
+#endif /* _PR_LOCAL_THREADS_ONLY */ |
+ |
+extern PRInt32 _native_threads_only; |
+ |
+#if defined(_PR_GLOBAL_THREADS_ONLY) |
+ |
+#define _MD_GET_INTSOFF() 0 |
+#define _MD_SET_INTSOFF(_val) |
+#define _PR_INTSOFF(_is) |
+#define _PR_FAST_INTSON(_is) |
+#define _PR_INTSON(_is) |
+#define _PR_THREAD_LOCK(_thread) |
+#define _PR_THREAD_UNLOCK(_thread) |
+#define _PR_RUNQ_LOCK(cpu) |
+#define _PR_RUNQ_UNLOCK(cpu) |
+#define _PR_SLEEPQ_LOCK(thread) |
+#define _PR_SLEEPQ_UNLOCK(thread) |
+#define _PR_MISCQ_LOCK(thread) |
+#define _PR_MISCQ_UNLOCK(thread) |
+#define _PR_CPU_LIST_LOCK() |
+#define _PR_CPU_LIST_UNLOCK() |
+ |
+#define _PR_ADD_RUNQ(_thread, _cpu, _pri) |
+#define _PR_DEL_RUNQ(_thread) |
+#define _PR_ADD_SLEEPQ(_thread, _timeout) |
+#define _PR_DEL_SLEEPQ(_thread, _propogate) |
+#define _PR_ADD_JOINQ(_thread, _cpu) |
+#define _PR_DEL_JOINQ(_thread) |
+#define _PR_ADD_SUSPENDQ(_thread, _cpu) |
+#define _PR_DEL_SUSPENDQ(_thread) |
+ |
+#define _PR_THREAD_SWITCH_CPU(_thread, _newCPU) |
+ |
+#define _PR_IS_NATIVE_THREAD(thread) 1 |
+#define _PR_IS_NATIVE_THREAD_SUPPORTED() 1 |
+ |
+#else |
+ |
+#ifdef XP_MAC |
+ |
+#define _PR_INTSOFF(_is) _MD_INTSOFF(_is) |
+ |
+#else /* XP_MAC */ |
+ |
+#define _PR_INTSOFF(_is) \ |
+ PR_BEGIN_MACRO \ |
+ (_is) = _PR_MD_GET_INTSOFF(); \ |
+ _PR_MD_SET_INTSOFF(1); \ |
+ PR_END_MACRO |
+ |
+#endif /* XP_MAC */ |
+ |
+#define _PR_FAST_INTSON(_is) \ |
+ PR_BEGIN_MACRO \ |
+ _PR_MD_SET_INTSOFF(_is); \ |
+ PR_END_MACRO |
+ |
+#define _PR_INTSON(_is) \ |
+ PR_BEGIN_MACRO \ |
+ if ((_is == 0) && (_PR_MD_CURRENT_CPU())->u.bits) \ |
+ _PR_IntsOn((_PR_MD_CURRENT_CPU())); \ |
+ _PR_MD_SET_INTSOFF(_is); \ |
+ PR_END_MACRO |
+ |
+#ifdef _PR_LOCAL_THREADS_ONLY |
+ |
+#define _PR_IS_NATIVE_THREAD(thread) 0 |
+#define _PR_THREAD_LOCK(_thread) |
+#define _PR_THREAD_UNLOCK(_thread) |
+#define _PR_RUNQ_LOCK(cpu) |
+#define _PR_RUNQ_UNLOCK(cpu) |
+#define _PR_SLEEPQ_LOCK(thread) |
+#define _PR_SLEEPQ_UNLOCK(thread) |
+#define _PR_MISCQ_LOCK(thread) |
+#define _PR_MISCQ_UNLOCK(thread) |
+#define _PR_CPU_LIST_LOCK() |
+#define _PR_CPU_LIST_UNLOCK() |
+ |
+#define _PR_ADD_RUNQ(_thread, _cpu, _pri) \ |
+ PR_BEGIN_MACRO \ |
+ PR_APPEND_LINK(&(_thread)->links, &_PR_RUNQ(_cpu)[_pri]); \ |
+ _PR_RUNQREADYMASK(_cpu) |= (1L << _pri); \ |
+ PR_END_MACRO |
+ |
+#define _PR_DEL_RUNQ(_thread) \ |
+ PR_BEGIN_MACRO \ |
+ _PRCPU *_cpu = _thread->cpu; \ |
+ PRInt32 _pri = _thread->priority; \ |
+ PR_REMOVE_LINK(&(_thread)->links); \ |
+ if (PR_CLIST_IS_EMPTY(&_PR_RUNQ(_cpu)[_pri])) \ |
+ _PR_RUNQREADYMASK(_cpu) &= ~(1L << _pri); \ |
+ PR_END_MACRO |
+ |
+#define _PR_ADD_SLEEPQ(_thread, _timeout) \ |
+ _PR_AddSleepQ(_thread, _timeout); |
+ |
+#define _PR_DEL_SLEEPQ(_thread, _propogate) \ |
+ _PR_DelSleepQ(_thread, _propogate); |
+ |
+#define _PR_ADD_JOINQ(_thread, _cpu) \ |
+ PR_APPEND_LINK(&(_thread)->links, &_PR_WAITINGTOJOINQ(_cpu)); |
+ |
+#define _PR_DEL_JOINQ(_thread) \ |
+ PR_REMOVE_LINK(&(_thread)->links); |
+ |
+#define _PR_ADD_SUSPENDQ(_thread, _cpu) \ |
+ PR_APPEND_LINK(&(_thread)->links, &_PR_SUSPENDQ(_cpu)); |
+ |
+#define _PR_DEL_SUSPENDQ(_thread) \ |
+ PR_REMOVE_LINK(&(_thread)->links); |
+ |
+#define _PR_THREAD_SWITCH_CPU(_thread, _newCPU) |
+ |
+#define _PR_IS_NATIVE_THREAD_SUPPORTED() 0 |
+ |
+#else /* _PR_LOCAL_THREADS_ONLY */ |
+ |
+/* These are for the "combined" thread model */ |
+ |
+#define _PR_THREAD_LOCK(_thread) \ |
+ _PR_MD_LOCK(&(_thread)->threadLock); |
+ |
+#define _PR_THREAD_UNLOCK(_thread) \ |
+ _PR_MD_UNLOCK(&(_thread)->threadLock); |
+ |
+#define _PR_RUNQ_LOCK(_cpu) \ |
+ PR_BEGIN_MACRO \ |
+ _PR_MD_LOCK(&(_cpu)->queue->runQLock );\ |
+ PR_END_MACRO |
+ |
+#define _PR_RUNQ_UNLOCK(_cpu) \ |
+ PR_BEGIN_MACRO \ |
+ _PR_MD_UNLOCK(&(_cpu)->queue->runQLock );\ |
+ PR_END_MACRO |
+ |
+#define _PR_SLEEPQ_LOCK(_cpu) \ |
+ _PR_MD_LOCK(&(_cpu)->queue->sleepQLock ); |
+ |
+#define _PR_SLEEPQ_UNLOCK(_cpu) \ |
+ _PR_MD_UNLOCK(&(_cpu)->queue->sleepQLock ); |
+ |
+#define _PR_MISCQ_LOCK(_cpu) \ |
+ _PR_MD_LOCK(&(_cpu)->queue->miscQLock ); |
+ |
+#define _PR_MISCQ_UNLOCK(_cpu) \ |
+ _PR_MD_UNLOCK(&(_cpu)->queue->miscQLock ); |
+ |
+#define _PR_CPU_LIST_LOCK() _PR_MD_LOCK(&_pr_cpuLock) |
+#define _PR_CPU_LIST_UNLOCK() _PR_MD_UNLOCK(&_pr_cpuLock) |
+ |
+#define QUEUE_RUN 0x1 |
+#define QUEUE_SLEEP 0x2 |
+#define QUEUE_JOIN 0x4 |
+#define QUEUE_SUSPEND 0x8 |
+#define QUEUE_LOCK 0x10 |
+ |
+#define _PR_ADD_RUNQ(_thread, _cpu, _pri) \ |
+ PR_BEGIN_MACRO \ |
+ PR_APPEND_LINK(&(_thread)->links, &_PR_RUNQ(_cpu)[_pri]); \ |
+ _PR_RUNQREADYMASK(_cpu) |= (1L << _pri); \ |
+ PR_ASSERT((_thread)->queueCount == 0); \ |
+ (_thread)->queueCount = QUEUE_RUN; \ |
+ PR_END_MACRO |
+ |
+#define _PR_DEL_RUNQ(_thread) \ |
+ PR_BEGIN_MACRO \ |
+ _PRCPU *_cpu = _thread->cpu; \ |
+ PRInt32 _pri = _thread->priority; \ |
+ PR_REMOVE_LINK(&(_thread)->links); \ |
+ if (PR_CLIST_IS_EMPTY(&_PR_RUNQ(_cpu)[_pri])) \ |
+ _PR_RUNQREADYMASK(_cpu) &= ~(1L << _pri); \ |
+ PR_ASSERT((_thread)->queueCount == QUEUE_RUN);\ |
+ (_thread)->queueCount = 0; \ |
+ PR_END_MACRO |
+ |
+#define _PR_ADD_SLEEPQ(_thread, _timeout) \ |
+ PR_ASSERT((_thread)->queueCount == 0); \ |
+ (_thread)->queueCount = QUEUE_SLEEP; \ |
+ _PR_AddSleepQ(_thread, _timeout); |
+ |
+#define _PR_DEL_SLEEPQ(_thread, _propogate) \ |
+ PR_ASSERT((_thread)->queueCount == QUEUE_SLEEP);\ |
+ (_thread)->queueCount = 0; \ |
+ _PR_DelSleepQ(_thread, _propogate); |
+ |
+#define _PR_ADD_JOINQ(_thread, _cpu) \ |
+ PR_ASSERT((_thread)->queueCount == 0); \ |
+ (_thread)->queueCount = QUEUE_JOIN; \ |
+ PR_APPEND_LINK(&(_thread)->links, &_PR_WAITINGTOJOINQ(_cpu)); |
+ |
+#define _PR_DEL_JOINQ(_thread) \ |
+ PR_ASSERT((_thread)->queueCount == QUEUE_JOIN);\ |
+ (_thread)->queueCount = 0; \ |
+ PR_REMOVE_LINK(&(_thread)->links); |
+ |
+#define _PR_ADD_SUSPENDQ(_thread, _cpu) \ |
+ PR_ASSERT((_thread)->queueCount == 0); \ |
+ (_thread)->queueCount = QUEUE_SUSPEND; \ |
+ PR_APPEND_LINK(&(_thread)->links, &_PR_SUSPENDQ(_cpu)); |
+ |
+#define _PR_DEL_SUSPENDQ(_thread) \ |
+ PR_ASSERT((_thread)->queueCount == QUEUE_SUSPEND);\ |
+ (_thread)->queueCount = 0; \ |
+ PR_REMOVE_LINK(&(_thread)->links); |
+ |
+#define _PR_THREAD_SWITCH_CPU(_thread, _newCPU) \ |
+ (_thread)->cpu = (_newCPU); |
+ |
+#define _PR_IS_NATIVE_THREAD(thread) (thread->flags & _PR_GLOBAL_SCOPE) |
+#define _PR_IS_NATIVE_THREAD_SUPPORTED() 1 |
+ |
+#endif /* _PR_LOCAL_THREADS_ONLY */ |
+ |
+#endif /* _PR_GLOBAL_THREADS_ONLY */ |
+ |
+#define _PR_SET_RESCHED_FLAG() _PR_MD_CURRENT_CPU()->u.missed[3] = 1 |
+#define _PR_CLEAR_RESCHED_FLAG() _PR_MD_CURRENT_CPU()->u.missed[3] = 0 |
+ |
+extern _PRInterruptTable _pr_interruptTable[]; |
+ |
+/* Bits for _pr_interruptState.u.missed[0,1] */ |
+#define _PR_MISSED_CLOCK 0x1 |
+#define _PR_MISSED_IO 0x2 |
+#define _PR_MISSED_CHILD 0x4 |
+ |
+extern void _PR_IntsOn(_PRCPU *cpu); |
+ |
+NSPR_API(void) _PR_WakeupCPU(void); |
+NSPR_API(void) _PR_PauseCPU(void); |
+ |
+/************************************************************************/ |
+ |
+#define _PR_LOCK_LOCK(_lock) \ |
+ _PR_MD_LOCK(&(_lock)->ilock); |
+#define _PR_LOCK_UNLOCK(_lock) \ |
+ _PR_MD_UNLOCK(&(_lock)->ilock); |
+ |
+extern void _PR_UnblockLockWaiter(PRLock *lock); |
+ |
+#define _PR_LOCK_PTR(_qp) \ |
+ ((PRLock*) ((char*) (_qp) - offsetof(PRLock,links))) |
+ |
+/************************************************************************/ |
+ |
+#define _PR_CVAR_LOCK(_cvar) \ |
+ _PR_MD_LOCK(&(_cvar)->ilock); |
+#define _PR_CVAR_UNLOCK(_cvar) \ |
+ _PR_MD_UNLOCK(&(_cvar)->ilock); |
+ |
+extern PRStatus _PR_WaitCondVar( |
+ PRThread *thread, PRCondVar *cvar, PRLock *lock, PRIntervalTime timeout); |
+extern PRUint32 _PR_CondVarToString(PRCondVar *cvar, char *buf, PRUint32 buflen); |
+ |
+NSPR_API(void) _PR_Notify(PRMonitor *mon, PRBool all, PRBool sticky); |
+ |
+/* PRThread.flags */ |
+#define _PR_SYSTEM 0x01 |
+#define _PR_INTERRUPT 0x02 |
+#define _PR_ATTACHED 0x04 /* created via PR_AttachThread */ |
+#define _PR_PRIMORDIAL 0x08 /* the thread that called PR_Init */ |
+#define _PR_ON_SLEEPQ 0x10 /* thread is on the sleepQ */ |
+#define _PR_ON_PAUSEQ 0x20 /* thread is on the pauseQ */ |
+#define _PR_SUSPENDING 0x40 /* thread wants to suspend */ |
+#define _PR_GLOBAL_SCOPE 0x80 /* thread is global scope */ |
+#define _PR_IDLE_THREAD 0x200 /* this is an idle thread */ |
+#define _PR_GCABLE_THREAD 0x400 /* this is a collectable thread */ |
+#define _PR_BOUND_THREAD 0x800 /* a bound thread */ |
+#define _PR_INTERRUPT_BLOCKED 0x1000 /* interrupts blocked */ |
+ |
+/* PRThread.state */ |
+#define _PR_UNBORN 0 |
+#define _PR_RUNNABLE 1 |
+#define _PR_RUNNING 2 |
+#define _PR_LOCK_WAIT 3 |
+#define _PR_COND_WAIT 4 |
+#define _PR_JOIN_WAIT 5 |
+#define _PR_IO_WAIT 6 |
+#define _PR_SUSPENDED 7 |
+#define _PR_DEAD_STATE 8 /* for debugging */ |
+ |
+/* PRThreadStack.flags */ |
+#define _PR_STACK_VM 0x1 /* using vm instead of malloc */ |
+#define _PR_STACK_MAPPED 0x2 /* vm is mapped */ |
+#define _PR_STACK_PRIMORDIAL 0x4 /* stack for primordial thread */ |
+ |
+/* |
+** If the default stcksize from the client is zero, we need to pick a machine |
+** dependent value. This is only for standard user threads. For custom threads, |
+** 0 has a special meaning. |
+** Adjust stackSize. Round up to a page boundary. |
+*/ |
+ |
+#ifndef _MD_MINIMUM_STACK_SIZE |
+#define _MD_MINIMUM_STACK_SIZE 0 |
+#endif |
+ |
+#if (!defined(HAVE_CUSTOM_USER_THREADS)) |
+#define _PR_ADJUST_STACKSIZE(stackSize) \ |
+ PR_BEGIN_MACRO \ |
+ if (stackSize == 0) \ |
+ stackSize = _MD_DEFAULT_STACK_SIZE; \ |
+ if (stackSize < _MD_MINIMUM_STACK_SIZE) \ |
+ stackSize = _MD_MINIMUM_STACK_SIZE; \ |
+ stackSize = (stackSize + (1 << _pr_pageShift) - 1) >> _pr_pageShift; \ |
+ stackSize <<= _pr_pageShift; \ |
+ PR_END_MACRO |
+#else |
+#define _PR_ADJUST_STACKSIZE(stackSize) |
+#endif |
+ |
+#ifdef GC_LEAK_DETECTOR |
+/* All threads are GCable. */ |
+#define _PR_IS_GCABLE_THREAD(thr) 1 |
+#else |
+#define _PR_IS_GCABLE_THREAD(thr) ((thr)->flags & _PR_GCABLE_THREAD) |
+#endif /* GC_LEAK_DETECTOR */ |
+ |
+#define _PR_PENDING_INTERRUPT(thr) \ |
+ (!((thr)->flags & _PR_INTERRUPT_BLOCKED) && ((thr)->flags & _PR_INTERRUPT)) |
+#define _PR_THREAD_BLOCK_INTERRUPT(thr) \ |
+ (thr->flags |= _PR_INTERRUPT_BLOCKED) |
+#define _PR_THREAD_UNBLOCK_INTERRUPT(thr) \ |
+ (thr->flags &= ~_PR_INTERRUPT_BLOCKED) |
+ |
+#define _PR_THREAD_PTR(_qp) \ |
+ ((PRThread*) ((char*) (_qp) - offsetof(PRThread,links))) |
+ |
+#define _PR_ACTIVE_THREAD_PTR(_qp) \ |
+ ((PRThread*) ((char*) (_qp) - offsetof(PRThread,active))) |
+ |
+#define _PR_THREAD_CONDQ_PTR(_qp) \ |
+ ((PRThread*) ((char*) (_qp) - offsetof(PRThread,waitQLinks))) |
+ |
+#define _PR_THREAD_MD_TO_PTR(_md) \ |
+ ((PRThread*) ((char*) (_md) - offsetof(PRThread,md))) |
+ |
+#define _PR_THREAD_STACK_TO_PTR(_stack) \ |
+ ((PRThread*) (_stack->thr)) |
+ |
+extern PRCList _pr_active_local_threadQ; |
+extern PRCList _pr_active_global_threadQ; |
+extern PRCList _pr_cpuQ; |
+extern _MDLock _pr_cpuLock; |
+extern PRInt32 _pr_md_idle_cpus; |
+ |
+#define _PR_ACTIVE_LOCAL_THREADQ() _pr_active_local_threadQ |
+#define _PR_ACTIVE_GLOBAL_THREADQ() _pr_active_global_threadQ |
+#define _PR_CPUQ() _pr_cpuQ |
+#define _PR_RUNQ(_cpu) ((_cpu)->queue->runQ) |
+#define _PR_RUNQREADYMASK(_cpu) ((_cpu)->queue->runQReadyMask) |
+#define _PR_SLEEPQ(_cpu) ((_cpu)->queue->sleepQ) |
+#define _PR_SLEEPQMAX(_cpu) ((_cpu)->queue->sleepQmax) |
+#define _PR_PAUSEQ(_cpu) ((_cpu)->queue->pauseQ) |
+#define _PR_SUSPENDQ(_cpu) ((_cpu)->queue->suspendQ) |
+#define _PR_WAITINGTOJOINQ(_cpu) ((_cpu)->queue->waitingToJoinQ) |
+ |
+extern PRUint32 _pr_recycleThreads; /* Flag for behavior on thread cleanup */ |
+extern PRLock *_pr_deadQLock; |
+extern PRUint32 _pr_numNativeDead; |
+extern PRUint32 _pr_numUserDead; |
+extern PRCList _pr_deadNativeQ; |
+extern PRCList _pr_deadUserQ; |
+#define _PR_DEADNATIVEQ _pr_deadNativeQ |
+#define _PR_DEADUSERQ _pr_deadUserQ |
+#define _PR_DEADQ_LOCK PR_Lock(_pr_deadQLock); |
+#define _PR_DEADQ_UNLOCK PR_Unlock(_pr_deadQLock); |
+#define _PR_INC_DEADNATIVE (_pr_numNativeDead++) |
+#define _PR_DEC_DEADNATIVE (_pr_numNativeDead--) |
+#define _PR_NUM_DEADNATIVE (_pr_numNativeDead) |
+#define _PR_INC_DEADUSER (_pr_numUserDead++) |
+#define _PR_DEC_DEADUSER (_pr_numUserDead--) |
+#define _PR_NUM_DEADUSER (_pr_numUserDead) |
+ |
+extern PRUint32 _pr_utid; |
+ |
+extern struct _PRCPU *_pr_primordialCPU; |
+ |
+extern PRLock *_pr_activeLock; /* lock for userActive and systemActive */ |
+extern PRInt32 _pr_userActive; /* number of active user threads */ |
+extern PRInt32 _pr_systemActive; /* number of active system threads */ |
+extern PRInt32 _pr_primordialExitCount; /* number of user threads left |
+ * before the primordial thread |
+ * can exit. */ |
+extern PRCondVar *_pr_primordialExitCVar; /* the condition variable for |
+ * notifying the primordial thread |
+ * when all other user threads |
+ * have terminated. */ |
+ |
+extern PRUintn _pr_maxPTDs; |
+ |
+extern PRLock *_pr_terminationCVLock; |
+ |
+/************************************************************************* |
+* Internal routines either called by PR itself or from machine-dependent * |
+* code. * |
+*************************************************************************/ |
+ |
+extern void _PR_ClockInterrupt(void); |
+ |
+extern void _PR_Schedule(void); |
+extern void _PR_SetThreadPriority( |
+ PRThread* thread, PRThreadPriority priority); |
+ |
+/*********************************************************************** |
+** FUNCTION: _PR_NewSegment() |
+** DESCRIPTION: |
+** Allocate a memory segment. The "size" value is rounded up to the |
+** native system page size and a page aligned portion of memory is |
+** returned. This memory is not part of the malloc heap. If "vaddr" is |
+** not NULL then PR tries to allocate the segment at the desired virtual |
+** address. |
+** INPUTS: size: size of the desired memory segment |
+** vaddr: address at which the newly aquired segment is to be |
+** mapped into memory. |
+** OUTPUTS: a memory segment is allocated, a PRSegment is allocated |
+** RETURN: pointer to PRSegment |
+***********************************************************************/ |
+extern PRSegment* _PR_NewSegment(PRUint32 size, void *vaddr); |
+ |
+/*********************************************************************** |
+** FUNCTION: _PR_DestroySegment() |
+** DESCRIPTION: |
+** The memory segment and the PRSegment are freed |
+** INPUTS: seg: pointer to PRSegment to be freed |
+** OUTPUTS: the the PRSegment and its associated memory segment are freed |
+** RETURN: void |
+***********************************************************************/ |
+extern void _PR_DestroySegment(PRSegment *seg); |
+ |
+extern PRThreadStack * _PR_NewStack(PRUint32 stackSize); |
+extern void _PR_FreeStack(PRThreadStack *stack); |
+extern PRBool _PR_NotifyThread (PRThread *thread, PRThread *me); |
+extern void _PR_NotifyLockedThread (PRThread *thread); |
+ |
+NSPR_API(void) _PR_AddSleepQ(PRThread *thread, PRIntervalTime timeout); |
+NSPR_API(void) _PR_DelSleepQ(PRThread *thread, PRBool propogate_time); |
+ |
+extern void _PR_AddThreadToRunQ(PRThread *me, PRThread *thread); |
+ |
+NSPR_API(PRThread*) _PR_CreateThread(PRThreadType type, |
+ void (*start)(void *arg), |
+ void *arg, |
+ PRThreadPriority priority, |
+ PRThreadScope scope, |
+ PRThreadState state, |
+ PRUint32 stackSize, |
+ PRUint32 flags); |
+ |
+extern void _PR_NativeDestroyThread(PRThread *thread); |
+extern void _PR_UserDestroyThread(PRThread *thread); |
+ |
+extern PRThread* _PRI_AttachThread( |
+ PRThreadType type, PRThreadPriority priority, |
+ PRThreadStack *stack, PRUint32 flags); |
+ |
+extern void _PRI_DetachThread(void); |
+ |
+ |
+#define _PR_IO_PENDING(_thread) ((_thread)->io_pending) |
+ |
+NSPR_API(void) _PR_MD_INIT_CPUS(); |
+#define _PR_MD_INIT_CPUS _MD_INIT_CPUS |
+ |
+NSPR_API(void) _PR_MD_WAKEUP_CPUS(); |
+#define _PR_MD_WAKEUP_CPUS _MD_WAKEUP_CPUS |
+ |
+/* Interrupts related */ |
+ |
+NSPR_API(void) _PR_MD_START_INTERRUPTS(void); |
+#define _PR_MD_START_INTERRUPTS _MD_START_INTERRUPTS |
+ |
+NSPR_API(void) _PR_MD_STOP_INTERRUPTS(void); |
+#define _PR_MD_STOP_INTERRUPTS _MD_STOP_INTERRUPTS |
+ |
+NSPR_API(void) _PR_MD_ENABLE_CLOCK_INTERRUPTS(void); |
+#define _PR_MD_ENABLE_CLOCK_INTERRUPTS _MD_ENABLE_CLOCK_INTERRUPTS |
+ |
+NSPR_API(void) _PR_MD_DISABLE_CLOCK_INTERRUPTS(void); |
+#define _PR_MD_DISABLE_CLOCK_INTERRUPTS _MD_DISABLE_CLOCK_INTERRUPTS |
+ |
+NSPR_API(void) _PR_MD_BLOCK_CLOCK_INTERRUPTS(void); |
+#define _PR_MD_BLOCK_CLOCK_INTERRUPTS _MD_BLOCK_CLOCK_INTERRUPTS |
+ |
+NSPR_API(void) _PR_MD_UNBLOCK_CLOCK_INTERRUPTS(void); |
+#define _PR_MD_UNBLOCK_CLOCK_INTERRUPTS _MD_UNBLOCK_CLOCK_INTERRUPTS |
+ |
+/* The _PR_MD_WAIT_LOCK and _PR_MD_WAKEUP_WAITER functions put to sleep and |
+ * awaken a thread which is waiting on a lock or cvar. |
+ */ |
+extern PRStatus _PR_MD_WAIT(PRThread *, PRIntervalTime timeout); |
+#define _PR_MD_WAIT _MD_WAIT |
+ |
+extern PRStatus _PR_MD_WAKEUP_WAITER(PRThread *); |
+#define _PR_MD_WAKEUP_WAITER _MD_WAKEUP_WAITER |
+ |
+#ifndef _PR_LOCAL_THREADS_ONLY /* not if only local threads supported */ |
+NSPR_API(void) _PR_MD_CLOCK_INTERRUPT(void); |
+#define _PR_MD_CLOCK_INTERRUPT _MD_CLOCK_INTERRUPT |
+#endif |
+ |
+/* Stack debugging */ |
+NSPR_API(void) _PR_MD_INIT_STACK(PRThreadStack *ts, PRIntn redzone); |
+#define _PR_MD_INIT_STACK _MD_INIT_STACK |
+ |
+NSPR_API(void) _PR_MD_CLEAR_STACK(PRThreadStack* ts); |
+#define _PR_MD_CLEAR_STACK _MD_CLEAR_STACK |
+ |
+/* CPU related */ |
+NSPR_API(PRInt32) _PR_MD_GET_INTSOFF(void); |
+#define _PR_MD_GET_INTSOFF _MD_GET_INTSOFF |
+ |
+NSPR_API(void) _PR_MD_SET_INTSOFF(PRInt32 _val); |
+#define _PR_MD_SET_INTSOFF _MD_SET_INTSOFF |
+ |
+NSPR_API(_PRCPU*) _PR_MD_CURRENT_CPU(void); |
+#define _PR_MD_CURRENT_CPU _MD_CURRENT_CPU |
+ |
+NSPR_API(void) _PR_MD_SET_CURRENT_CPU(_PRCPU *cpu); |
+#define _PR_MD_SET_CURRENT_CPU _MD_SET_CURRENT_CPU |
+ |
+NSPR_API(void) _PR_MD_INIT_RUNNING_CPU(_PRCPU *cpu); |
+#define _PR_MD_INIT_RUNNING_CPU _MD_INIT_RUNNING_CPU |
+ |
+/* |
+ * Returns the number of threads awoken or 0 if a timeout occurred; |
+ */ |
+extern PRInt32 _PR_MD_PAUSE_CPU(PRIntervalTime timeout); |
+#define _PR_MD_PAUSE_CPU _MD_PAUSE_CPU |
+ |
+extern void _PR_MD_CLEANUP_BEFORE_EXIT(void); |
+#define _PR_MD_CLEANUP_BEFORE_EXIT _MD_CLEANUP_BEFORE_EXIT |
+ |
+extern void _PR_MD_EXIT(PRIntn status); |
+#define _PR_MD_EXIT _MD_EXIT |
+ |
+/* Locks related */ |
+ |
+NSPR_API(void) _PR_MD_INIT_LOCKS(void); |
+#define _PR_MD_INIT_LOCKS _MD_INIT_LOCKS |
+ |
+NSPR_API(PRStatus) _PR_MD_NEW_LOCK(_MDLock *md); |
+#define _PR_MD_NEW_LOCK _MD_NEW_LOCK |
+ |
+NSPR_API(void) _PR_MD_FREE_LOCK(_MDLock *md); |
+#define _PR_MD_FREE_LOCK _MD_FREE_LOCK |
+ |
+NSPR_API(void) _PR_MD_LOCK(_MDLock *md); |
+#define _PR_MD_LOCK _MD_LOCK |
+ |
+/* Return 0 on success, a nonzero value on failure. */ |
+NSPR_API(PRIntn) _PR_MD_TEST_AND_LOCK(_MDLock *md); |
+#define _PR_MD_TEST_AND_LOCK _MD_TEST_AND_LOCK |
+ |
+NSPR_API(void) _PR_MD_UNLOCK(_MDLock *md); |
+#define _PR_MD_UNLOCK _MD_UNLOCK |
+ |
+NSPR_API(void) _PR_MD_IOQ_LOCK(void); |
+#define _PR_MD_IOQ_LOCK _MD_IOQ_LOCK |
+ |
+NSPR_API(void) _PR_MD_IOQ_UNLOCK(void); |
+#define _PR_MD_IOQ_UNLOCK _MD_IOQ_UNLOCK |
+ |
+#ifndef _PR_LOCAL_THREADS_ONLY /* not if only local threads supported */ |
+/* Semaphore related -- only for native threads */ |
+#ifdef HAVE_CVAR_BUILT_ON_SEM |
+NSPR_API(void) _PR_MD_NEW_SEM(_MDSemaphore *md, PRUintn value); |
+#define _PR_MD_NEW_SEM _MD_NEW_SEM |
+ |
+NSPR_API(void) _PR_MD_DESTROY_SEM(_MDSemaphore *md); |
+#define _PR_MD_DESTROY_SEM _MD_DESTROY_SEM |
+ |
+NSPR_API(PRStatus) _PR_MD_TIMED_WAIT_SEM( |
+ _MDSemaphore *md, PRIntervalTime timeout); |
+#define _PR_MD_TIMED_WAIT_SEM _MD_TIMED_WAIT_SEM |
+ |
+NSPR_API(PRStatus) _PR_MD_WAIT_SEM(_MDSemaphore *md); |
+#define _PR_MD_WAIT_SEM _MD_WAIT_SEM |
+ |
+NSPR_API(void) _PR_MD_POST_SEM(_MDSemaphore *md); |
+#define _PR_MD_POST_SEM _MD_POST_SEM |
+#endif /* HAVE_CVAR_BUILT_ON_SEM */ |
+ |
+#endif |
+ |
+/* Condition Variables related -- only for native threads */ |
+ |
+#ifndef _PR_LOCAL_THREADS_ONLY /* not if only local threads supported */ |
+NSPR_API(PRInt32) _PR_MD_NEW_CV(_MDCVar *md); |
+#define _PR_MD_NEW_CV _MD_NEW_CV |
+ |
+NSPR_API(void) _PR_MD_FREE_CV(_MDCVar *md); |
+#define _PR_MD_FREE_CV _MD_FREE_CV |
+ |
+NSPR_API(void) _PR_MD_WAIT_CV( |
+ _MDCVar *mdCVar,_MDLock *mdLock,PRIntervalTime timeout); |
+#define _PR_MD_WAIT_CV _MD_WAIT_CV |
+ |
+NSPR_API(void) _PR_MD_NOTIFY_CV(_MDCVar *md, _MDLock *lock); |
+#define _PR_MD_NOTIFY_CV _MD_NOTIFY_CV |
+ |
+NSPR_API(void) _PR_MD_NOTIFYALL_CV(_MDCVar *md, _MDLock *lock); |
+#define _PR_MD_NOTIFYALL_CV _MD_NOTIFYALL_CV |
+#endif /* _PR_LOCAL_THREADS_ONLY */ |
+ |
+/* Threads related */ |
+NSPR_API(PRThread*) _PR_MD_CURRENT_THREAD(void); |
+#define _PR_MD_CURRENT_THREAD _MD_CURRENT_THREAD |
+ |
+NSPR_API(PRThread*) _PR_MD_GET_ATTACHED_THREAD(void); |
+#define _PR_MD_GET_ATTACHED_THREAD _MD_GET_ATTACHED_THREAD |
+ |
+NSPR_API(PRThread*) _PR_MD_LAST_THREAD(void); |
+#define _PR_MD_LAST_THREAD _MD_LAST_THREAD |
+ |
+NSPR_API(void) _PR_MD_SET_CURRENT_THREAD(PRThread *thread); |
+#define _PR_MD_SET_CURRENT_THREAD _MD_SET_CURRENT_THREAD |
+ |
+NSPR_API(void) _PR_MD_SET_LAST_THREAD(PRThread *thread); |
+#define _PR_MD_SET_LAST_THREAD _MD_SET_LAST_THREAD |
+ |
+extern PRStatus _PR_MD_INIT_THREAD(PRThread *thread); |
+#define _PR_MD_INIT_THREAD _MD_INIT_THREAD |
+ |
+extern void _PR_MD_EXIT_THREAD(PRThread *thread); |
+#define _PR_MD_EXIT_THREAD _MD_EXIT_THREAD |
+ |
+#ifndef _PR_LOCAL_THREADS_ONLY /* not if only local threads supported */ |
+ |
+NSPR_API(PRStatus) _PR_MD_INIT_ATTACHED_THREAD(PRThread *thread); |
+#define _PR_MD_INIT_ATTACHED_THREAD _MD_INIT_ATTACHED_THREAD |
+ |
+extern void _PR_MD_SUSPEND_THREAD(PRThread *thread); |
+#define _PR_MD_SUSPEND_THREAD _MD_SUSPEND_THREAD |
+ |
+extern void _PR_MD_RESUME_THREAD(PRThread *thread); |
+#define _PR_MD_RESUME_THREAD _MD_RESUME_THREAD |
+ |
+extern void _PR_MD_SUSPEND_CPU(_PRCPU *cpu); |
+#define _PR_MD_SUSPEND_CPU _MD_SUSPEND_CPU |
+ |
+extern void _PR_MD_RESUME_CPU(_PRCPU *cpu); |
+#define _PR_MD_RESUME_CPU _MD_RESUME_CPU |
+ |
+extern void _PR_MD_BEGIN_SUSPEND_ALL(void); |
+#define _PR_MD_BEGIN_SUSPEND_ALL _MD_BEGIN_SUSPEND_ALL |
+ |
+extern void _PR_MD_END_SUSPEND_ALL(void); |
+#define _PR_MD_END_SUSPEND_ALL _MD_END_SUSPEND_ALL |
+ |
+extern void _PR_MD_BEGIN_RESUME_ALL(void); |
+#define _PR_MD_BEGIN_RESUME_ALL _MD_BEGIN_RESUME_ALL |
+ |
+extern void _PR_MD_END_RESUME_ALL(void); |
+#define _PR_MD_END_RESUME_ALL _MD_END_RESUME_ALL |
+ |
+#if defined(IRIX) |
+NSPR_API(void) _PR_IRIX_CHILD_PROCESS(void); |
+#endif /* IRIX */ |
+ |
+#endif /* !_PR_LOCAL_THREADS_ONLY */ |
+ |
+extern void _PR_MD_CLEAN_THREAD(PRThread *thread); |
+#define _PR_MD_CLEAN_THREAD _MD_CLEAN_THREAD |
+ |
+#ifdef HAVE_CUSTOM_USER_THREADS |
+extern void _PR_MD_CREATE_PRIMORDIAL_USER_THREAD(PRThread *); |
+#define _PR_MD_CREATE_PRIMORDIAL_USER_THREAD _MD_CREATE_PRIMORDIAL_USER_THREAD |
+ |
+extern PRThread* _PR_MD_CREATE_USER_THREAD( |
+ PRUint32 stacksize, |
+ void (*start)(void *), |
+ void *arg); |
+#define _PR_MD_CREATE_USER_THREAD _MD_CREATE_USER_THREAD |
+#endif |
+ |
+extern PRStatus _PR_MD_CREATE_THREAD( |
+ PRThread *thread, |
+ void (*start) (void *), |
+ PRThreadPriority priority, |
+ PRThreadScope scope, |
+ PRThreadState state, |
+ PRUint32 stackSize); |
+#define _PR_MD_CREATE_THREAD _MD_CREATE_THREAD |
+ |
+extern void _PR_MD_JOIN_THREAD(_MDThread *md); |
+#define _PR_MD_JOIN_THREAD _MD_JOIN_THREAD |
+ |
+extern void _PR_MD_END_THREAD(void); |
+#define _PR_MD_END_THREAD _MD_END_THREAD |
+ |
+extern void _PR_MD_YIELD(void); |
+#define _PR_MD_YIELD _MD_YIELD |
+ |
+extern void _PR_MD_SET_PRIORITY(_MDThread *md, PRThreadPriority newPri); |
+#define _PR_MD_SET_PRIORITY _MD_SET_PRIORITY |
+ |
+NSPR_API(void) _PR_MD_SUSPENDALL(void); |
+#define _PR_MD_SUSPENDALL _MD_SUSPENDALL |
+ |
+NSPR_API(void) _PR_MD_RESUMEALL(void); |
+#define _PR_MD_RESUMEALL _MD_RESUMEALL |
+ |
+extern void _PR_MD_INIT_CONTEXT( |
+ PRThread *thread, char *top, void (*start) (void), PRBool *status); |
+#define _PR_MD_INIT_CONTEXT _MD_INIT_CONTEXT |
+ |
+extern void _PR_MD_SWITCH_CONTEXT(PRThread *thread); |
+#define _PR_MD_SWITCH_CONTEXT _MD_SWITCH_CONTEXT |
+ |
+extern void _PR_MD_RESTORE_CONTEXT(PRThread *thread); |
+#define _PR_MD_RESTORE_CONTEXT _MD_RESTORE_CONTEXT |
+ |
+/* Segment related */ |
+extern void _PR_MD_INIT_SEGS(void); |
+#define _PR_MD_INIT_SEGS _MD_INIT_SEGS |
+ |
+extern PRStatus _PR_MD_ALLOC_SEGMENT(PRSegment *seg, PRUint32 size, void *vaddr); |
+#define _PR_MD_ALLOC_SEGMENT _MD_ALLOC_SEGMENT |
+ |
+extern void _PR_MD_FREE_SEGMENT(PRSegment *seg); |
+#define _PR_MD_FREE_SEGMENT _MD_FREE_SEGMENT |
+ |
+/* Directory enumeration related */ |
+extern PRStatus _PR_MD_OPEN_DIR(_MDDir *md,const char *name); |
+#define _PR_MD_OPEN_DIR _MD_OPEN_DIR |
+ |
+extern char * _PR_MD_READ_DIR(_MDDir *md, PRIntn flags); |
+#define _PR_MD_READ_DIR _MD_READ_DIR |
+ |
+extern PRInt32 _PR_MD_CLOSE_DIR(_MDDir *md); |
+#define _PR_MD_CLOSE_DIR _MD_CLOSE_DIR |
+ |
+/* Named semaphores related */ |
+extern PRSem * _PR_MD_OPEN_SEMAPHORE( |
+ const char *osname, PRIntn flags, PRIntn mode, PRUintn value); |
+#define _PR_MD_OPEN_SEMAPHORE _MD_OPEN_SEMAPHORE |
+ |
+extern PRStatus _PR_MD_WAIT_SEMAPHORE(PRSem *sem); |
+#define _PR_MD_WAIT_SEMAPHORE _MD_WAIT_SEMAPHORE |
+ |
+extern PRStatus _PR_MD_POST_SEMAPHORE(PRSem *sem); |
+#define _PR_MD_POST_SEMAPHORE _MD_POST_SEMAPHORE |
+ |
+extern PRStatus _PR_MD_CLOSE_SEMAPHORE(PRSem *sem); |
+#define _PR_MD_CLOSE_SEMAPHORE _MD_CLOSE_SEMAPHORE |
+ |
+extern PRStatus _PR_MD_DELETE_SEMAPHORE(const char *osname); |
+#define _PR_MD_DELETE_SEMAPHORE _MD_DELETE_SEMAPHORE |
+ |
+/* I/O related */ |
+extern void _PR_MD_INIT_FILEDESC(PRFileDesc *fd); |
+#define _PR_MD_INIT_FILEDESC _MD_INIT_FILEDESC |
+ |
+#ifdef XP_MAC |
+extern void _PR_MD_FREE_FILEDESC(PRFileDesc *fd); |
+#define _PR_MD_FREE_FILEDESC _MD_FREE_FILEDESC |
+#endif |
+ |
+extern void _PR_MD_MAKE_NONBLOCK(PRFileDesc *fd); |
+#define _PR_MD_MAKE_NONBLOCK _MD_MAKE_NONBLOCK |
+ |
+/* File I/O related */ |
+extern PROsfd _PR_MD_OPEN(const char *name, PRIntn osflags, PRIntn mode); |
+#define _PR_MD_OPEN _MD_OPEN |
+ |
+extern PROsfd _PR_MD_OPEN_FILE(const char *name, PRIntn osflags, PRIntn mode); |
+#define _PR_MD_OPEN_FILE _MD_OPEN_FILE |
+ |
+extern PRInt32 _PR_MD_CLOSE_FILE(PROsfd osfd); |
+#define _PR_MD_CLOSE_FILE _MD_CLOSE_FILE |
+ |
+extern PRInt32 _PR_MD_READ(PRFileDesc *fd, void *buf, PRInt32 amount); |
+#define _PR_MD_READ _MD_READ |
+ |
+extern PRInt32 _PR_MD_WRITE(PRFileDesc *fd, const void *buf, PRInt32 amount); |
+#define _PR_MD_WRITE _MD_WRITE |
+ |
+extern PRInt32 _PR_MD_WRITEV( |
+ PRFileDesc *fd, const struct PRIOVec *iov, |
+ PRInt32 iov_size, PRIntervalTime timeout); |
+#define _PR_MD_WRITEV _MD_WRITEV |
+ |
+extern PRInt32 _PR_MD_FSYNC(PRFileDesc *fd); |
+#define _PR_MD_FSYNC _MD_FSYNC |
+ |
+extern PRInt32 _PR_MD_DELETE(const char *name); |
+#define _PR_MD_DELETE _MD_DELETE |
+ |
+extern PRInt32 _PR_MD_RENAME(const char *from, const char *to); |
+#define _PR_MD_RENAME _MD_RENAME |
+ |
+extern PRInt32 _PR_MD_ACCESS(const char *name, PRAccessHow how); |
+#define _PR_MD_ACCESS _MD_ACCESS |
+ |
+extern PRInt32 _PR_MD_STAT(const char *name, struct stat *buf); |
+#define _PR_MD_STAT _MD_STAT |
+ |
+extern PRInt32 _PR_MD_MKDIR(const char *name, PRIntn mode); |
+#define _PR_MD_MKDIR _MD_MKDIR |
+ |
+extern PRInt32 _PR_MD_MAKE_DIR(const char *name, PRIntn mode); |
+#define _PR_MD_MAKE_DIR _MD_MAKE_DIR |
+ |
+extern PRInt32 _PR_MD_RMDIR(const char *name); |
+#define _PR_MD_RMDIR _MD_RMDIR |
+ |
+#ifdef MOZ_UNICODE |
+/* UTF16 File I/O related */ |
+extern PRStatus _PR_MD_OPEN_DIR_UTF16(_MDDirUTF16 *md, const PRUnichar *name); |
+#define _PR_MD_OPEN_DIR_UTF16 _MD_OPEN_DIR_UTF16 |
+ |
+extern PROsfd _PR_MD_OPEN_FILE_UTF16(const PRUnichar *name, PRIntn osflags, PRIntn mode); |
+#define _PR_MD_OPEN_FILE_UTF16 _MD_OPEN_FILE_UTF16 |
+ |
+extern PRUnichar * _PR_MD_READ_DIR_UTF16(_MDDirUTF16 *md, PRIntn flags); |
+#define _PR_MD_READ_DIR_UTF16 _MD_READ_DIR_UTF16 |
+ |
+extern PRInt32 _PR_MD_CLOSE_DIR_UTF16(_MDDirUTF16 *md); |
+#define _PR_MD_CLOSE_DIR_UTF16 _MD_CLOSE_DIR_UTF16 |
+ |
+extern PRInt32 _PR_MD_GETFILEINFO64_UTF16(const PRUnichar *fn, PRFileInfo64 *info); |
+#define _PR_MD_GETFILEINFO64_UTF16 _MD_GETFILEINFO64_UTF16 |
+#endif /* MOZ_UNICODE */ |
+ |
+/* Socket I/O related */ |
+extern void _PR_MD_INIT_IO(void); |
+#define _PR_MD_INIT_IO _MD_INIT_IO |
+ |
+extern PRInt32 _PR_MD_CLOSE_SOCKET(PROsfd osfd); |
+#define _PR_MD_CLOSE_SOCKET _MD_CLOSE_SOCKET |
+ |
+extern PRInt32 _PR_MD_CONNECT( |
+ PRFileDesc *fd, const PRNetAddr *addr, |
+ PRUint32 addrlen, PRIntervalTime timeout); |
+#define _PR_MD_CONNECT _MD_CONNECT |
+ |
+extern PROsfd _PR_MD_ACCEPT( |
+ PRFileDesc *fd, PRNetAddr *addr, |
+ PRUint32 *addrlen, PRIntervalTime timeout); |
+#define _PR_MD_ACCEPT _MD_ACCEPT |
+ |
+extern PRInt32 _PR_MD_BIND(PRFileDesc *fd, const PRNetAddr *addr, PRUint32 addrlen); |
+#define _PR_MD_BIND _MD_BIND |
+ |
+extern PRInt32 _PR_MD_LISTEN(PRFileDesc *fd, PRIntn backlog); |
+#define _PR_MD_LISTEN _MD_LISTEN |
+ |
+extern PRInt32 _PR_MD_SHUTDOWN(PRFileDesc *fd, PRIntn how); |
+#define _PR_MD_SHUTDOWN _MD_SHUTDOWN |
+ |
+extern PRInt32 _PR_MD_RECV(PRFileDesc *fd, void *buf, PRInt32 amount, |
+ PRIntn flags, PRIntervalTime timeout); |
+#define _PR_MD_RECV _MD_RECV |
+ |
+extern PRInt32 _PR_MD_SEND( |
+ PRFileDesc *fd, const void *buf, PRInt32 amount, PRIntn flags, |
+ PRIntervalTime timeout); |
+#define _PR_MD_SEND _MD_SEND |
+ |
+extern PRInt32 _PR_MD_ACCEPT_READ(PRFileDesc *sd, PROsfd *newSock, |
+ PRNetAddr **raddr, void *buf, PRInt32 amount, |
+ PRIntervalTime timeout); |
+#define _PR_MD_ACCEPT_READ _MD_ACCEPT_READ |
+ |
+#ifdef WIN32 |
+extern PROsfd _PR_MD_FAST_ACCEPT(PRFileDesc *fd, PRNetAddr *addr, |
+ PRUint32 *addrlen, PRIntervalTime timeout, |
+ PRBool fast, |
+ _PR_AcceptTimeoutCallback callback, |
+ void *callbackArg); |
+ |
+extern PRInt32 _PR_MD_FAST_ACCEPT_READ(PRFileDesc *sd, PROsfd *newSock, |
+ PRNetAddr **raddr, void *buf, PRInt32 amount, |
+ PRIntervalTime timeout, PRBool fast, |
+ _PR_AcceptTimeoutCallback callback, |
+ void *callbackArg); |
+ |
+extern void _PR_MD_UPDATE_ACCEPT_CONTEXT(PROsfd s, PROsfd ls); |
+#define _PR_MD_UPDATE_ACCEPT_CONTEXT _MD_UPDATE_ACCEPT_CONTEXT |
+#endif /* WIN32 */ |
+ |
+extern PRInt32 _PR_MD_SENDFILE( |
+ PRFileDesc *sock, PRSendFileData *sfd, |
+ PRInt32 flags, PRIntervalTime timeout); |
+#define _PR_MD_SENDFILE _MD_SENDFILE |
+ |
+extern PRStatus _PR_MD_GETSOCKNAME( |
+ PRFileDesc *fd, PRNetAddr *addr, PRUint32 *addrlen); |
+#define _PR_MD_GETSOCKNAME _MD_GETSOCKNAME |
+ |
+extern PRStatus _PR_MD_GETPEERNAME( |
+ PRFileDesc *fd, PRNetAddr *addr, PRUint32 *addrlen); |
+#define _PR_MD_GETPEERNAME _MD_GETPEERNAME |
+ |
+extern PRStatus _PR_MD_GETSOCKOPT( |
+ PRFileDesc *fd, PRInt32 level, PRInt32 optname, char* optval, PRInt32* optlen); |
+#define _PR_MD_GETSOCKOPT _MD_GETSOCKOPT |
+ |
+extern PRStatus _PR_MD_SETSOCKOPT( |
+ PRFileDesc *fd, PRInt32 level, PRInt32 optname, |
+ const char* optval, PRInt32 optlen); |
+#define _PR_MD_SETSOCKOPT _MD_SETSOCKOPT |
+ |
+extern PRStatus PR_CALLBACK _PR_SocketGetSocketOption( |
+ PRFileDesc *fd, PRSocketOptionData *data); |
+ |
+extern PRStatus PR_CALLBACK _PR_SocketSetSocketOption( |
+ PRFileDesc *fd, const PRSocketOptionData *data); |
+ |
+extern PRInt32 _PR_MD_RECVFROM( |
+ PRFileDesc *fd, void *buf, PRInt32 amount, PRIntn flags, |
+ PRNetAddr *addr, PRUint32 *addrlen, PRIntervalTime timeout); |
+#define _PR_MD_RECVFROM _MD_RECVFROM |
+ |
+extern PRInt32 _PR_MD_SENDTO( |
+ PRFileDesc *fd, const void *buf, PRInt32 amount, PRIntn flags, |
+ const PRNetAddr *addr, PRUint32 addrlen, PRIntervalTime timeout); |
+#define _PR_MD_SENDTO _MD_SENDTO |
+ |
+extern PRInt32 _PR_MD_SOCKETPAIR(int af, int type, int flags, PROsfd *osfd); |
+#define _PR_MD_SOCKETPAIR _MD_SOCKETPAIR |
+ |
+extern PROsfd _PR_MD_SOCKET(int af, int type, int flags); |
+#define _PR_MD_SOCKET _MD_SOCKET |
+ |
+extern PRInt32 _PR_MD_SOCKETAVAILABLE(PRFileDesc *fd); |
+#define _PR_MD_SOCKETAVAILABLE _MD_SOCKETAVAILABLE |
+ |
+extern PRInt32 _PR_MD_PIPEAVAILABLE(PRFileDesc *fd); |
+#define _PR_MD_PIPEAVAILABLE _MD_PIPEAVAILABLE |
+ |
+extern PRInt32 _PR_MD_PR_POLL(PRPollDesc *pds, PRIntn npds, |
+ PRIntervalTime timeout); |
+#define _PR_MD_PR_POLL _MD_PR_POLL |
+ |
+/* |
+ * Initialize fd->secret->inheritable for a newly created fd. |
+ * If 'imported' is false, the osfd (i.e., fd->secret->md.osfd) |
+ * was created by NSPR and hence has the OS-dependent default |
+ * inheritable attribute. If 'imported' is true, the osfd was |
+ * not created by NSPR and hence a system call is required to |
+ * query its inheritable attribute. Since we may never need to |
+ * know the inheritable attribute of a fd, a platform may choose |
+ * to initialize fd->secret->inheritable of an imported fd to |
+ * _PR_TRI_UNKNOWN and only pay the cost of the system call |
+ * (in _PR_MD_QUERY_FD_INHERITABLE) when necessary. |
+ */ |
+extern void _PR_MD_INIT_FD_INHERITABLE(PRFileDesc *fd, PRBool imported); |
+#define _PR_MD_INIT_FD_INHERITABLE _MD_INIT_FD_INHERITABLE |
+ |
+extern PRStatus _PR_MD_SET_FD_INHERITABLE(PRFileDesc *fd, PRBool inheritable); |
+#define _PR_MD_SET_FD_INHERITABLE _MD_SET_FD_INHERITABLE |
+ |
+ |
+#define _PR_PROCESS_TIMEOUT_INTERRUPT_ERRORS(me) \ |
+ if (_PR_PENDING_INTERRUPT(me)) { \ |
+ me->flags &= ~_PR_INTERRUPT; \ |
+ PR_SetError( PR_PENDING_INTERRUPT_ERROR, 0); \ |
+ } else { \ |
+ PR_SetError(PR_IO_TIMEOUT_ERROR, 0); \ |
+ } |
+ |
+extern void *_PR_MD_GET_SP(PRThread *thread); |
+#define _PR_MD_GET_SP _MD_GET_SP |
+ |
+#endif /* defined(_PR_PTHREADS) */ |
+ |
+/************************************************************************/ |
+/************************************************************************* |
+** The remainder of the definitions are shared by pthreads and the classic |
+** NSPR code. These too may be conditionalized. |
+*************************************************************************/ |
+/************************************************************************/ |
+ |
+extern PROffset32 _PR_MD_LSEEK(PRFileDesc *fd, PROffset32 offset, PRSeekWhence whence); |
+#define _PR_MD_LSEEK _MD_LSEEK |
+ |
+extern PROffset64 _PR_MD_LSEEK64(PRFileDesc *fd, PROffset64 offset, PRSeekWhence whence); |
+#define _PR_MD_LSEEK64 _MD_LSEEK64 |
+ |
+extern PRInt32 _PR_MD_GETFILEINFO(const char *fn, PRFileInfo *info); |
+#define _PR_MD_GETFILEINFO _MD_GETFILEINFO |
+ |
+extern PRInt32 _PR_MD_GETFILEINFO64(const char *fn, PRFileInfo64 *info); |
+#define _PR_MD_GETFILEINFO64 _MD_GETFILEINFO64 |
+ |
+extern PRInt32 _PR_MD_GETOPENFILEINFO(const PRFileDesc *fd, PRFileInfo *info); |
+#define _PR_MD_GETOPENFILEINFO _MD_GETOPENFILEINFO |
+ |
+extern PRInt32 _PR_MD_GETOPENFILEINFO64(const PRFileDesc *fd, PRFileInfo64 *info); |
+#define _PR_MD_GETOPENFILEINFO64 _MD_GETOPENFILEINFO64 |
+ |
+ |
+/*****************************************************************************/ |
+/************************** File descriptor caching **************************/ |
+/*****************************************************************************/ |
+extern void _PR_InitFdCache(void); |
+extern void _PR_CleanupFdCache(void); |
+extern PRFileDesc *_PR_Getfd(void); |
+extern void _PR_Putfd(PRFileDesc *fd); |
+ |
+/* |
+ * These flags are used by NSPR temporarily in the poll |
+ * descriptor's out_flags field to record the mapping of |
+ * NSPR's poll flags to the system poll flags. |
+ * |
+ * If _PR_POLL_READ_SYS_WRITE bit is set, it means the |
+ * PR_POLL_READ flag specified by the topmost layer is |
+ * mapped to the WRITE flag at the system layer. Similarly |
+ * for the other three _PR_POLL_XXX_SYS_YYY flags. It is |
+ * assumed that the PR_POLL_EXCEPT flag doesn't get mapped |
+ * to other flags. |
+ */ |
+#define _PR_POLL_READ_SYS_READ 0x1 |
+#define _PR_POLL_READ_SYS_WRITE 0x2 |
+#define _PR_POLL_WRITE_SYS_READ 0x4 |
+#define _PR_POLL_WRITE_SYS_WRITE 0x8 |
+ |
+/* |
+** These methods are coerced into file descriptor methods table |
+** when the intended service is inappropriate for the particular |
+** type of file descriptor. |
+*/ |
+extern PRIntn _PR_InvalidInt(void); |
+extern PRInt16 _PR_InvalidInt16(void); |
+extern PRInt64 _PR_InvalidInt64(void); |
+extern PRStatus _PR_InvalidStatus(void); |
+extern PRFileDesc *_PR_InvalidDesc(void); |
+ |
+extern PRIOMethods _pr_faulty_methods; |
+ |
+/* |
+** The PR_NETADDR_SIZE macro can only be called on a PRNetAddr union |
+** whose 'family' field is set. It returns the size of the union |
+** member corresponding to the specified address family. |
+*/ |
+ |
+extern PRUintn _PR_NetAddrSize(const PRNetAddr* addr); |
+ |
+#if defined(_PR_INET6) |
+ |
+#define PR_NETADDR_SIZE(_addr) _PR_NetAddrSize(_addr) |
+ |
+#elif defined(_PR_HAVE_MD_SOCKADDR_IN6) |
+ |
+/* |
+** Under the following conditions: |
+** 1. _PR_INET6 is not defined; |
+** 2. _PR_INET6_PROBE is defined; |
+** 3. struct sockaddr_in6 has nonstandard fields at the end |
+** (e.g., on Solaris 8), |
+** (_addr)->ipv6 is smaller than struct sockaddr_in6, and |
+** hence we can't pass sizeof((_addr)->ipv6) to socket |
+** functions such as connect because they would fail with |
+** EINVAL. |
+** |
+** To pass the correct socket address length to socket |
+** functions, define the macro _PR_HAVE_MD_SOCKADDR_IN6 and |
+** define struct _md_sockaddr_in6 to be isomorphic to |
+** struct sockaddr_in6. |
+*/ |
+ |
+#if defined(XP_UNIX) || defined(XP_OS2) |
+#define PR_NETADDR_SIZE(_addr) \ |
+ ((_addr)->raw.family == PR_AF_INET \ |
+ ? sizeof((_addr)->inet) \ |
+ : ((_addr)->raw.family == PR_AF_INET6 \ |
+ ? sizeof(struct _md_sockaddr_in6) \ |
+ : sizeof((_addr)->local))) |
+#else |
+#define PR_NETADDR_SIZE(_addr) \ |
+ ((_addr)->raw.family == PR_AF_INET \ |
+ ? sizeof((_addr)->inet) \ |
+ : sizeof(struct _md_sockaddr_in6)) |
+#endif /* defined(XP_UNIX) */ |
+ |
+#else |
+ |
+#if defined(XP_UNIX) || defined(XP_OS2) |
+#define PR_NETADDR_SIZE(_addr) \ |
+ ((_addr)->raw.family == PR_AF_INET \ |
+ ? sizeof((_addr)->inet) \ |
+ : ((_addr)->raw.family == PR_AF_INET6 \ |
+ ? sizeof((_addr)->ipv6) \ |
+ : sizeof((_addr)->local))) |
+#else |
+#define PR_NETADDR_SIZE(_addr) \ |
+ ((_addr)->raw.family == PR_AF_INET \ |
+ ? sizeof((_addr)->inet) \ |
+ : sizeof((_addr)->ipv6)) |
+#endif /* defined(XP_UNIX) */ |
+ |
+#endif /* defined(_PR_INET6) */ |
+ |
+extern PRStatus _PR_MapOptionName( |
+ PRSockOption optname, PRInt32 *level, PRInt32 *name); |
+extern void _PR_InitThreads( |
+ PRThreadType type, PRThreadPriority priority, PRUintn maxPTDs); |
+ |
+struct PRLock { |
+#if defined(_PR_PTHREADS) |
+ pthread_mutex_t mutex; /* the underlying lock */ |
+ _PT_Notified notified; /* array of conditions notified */ |
+ PRBool locked; /* whether the mutex is locked */ |
+ pthread_t owner; /* if locked, current lock owner */ |
+#elif defined(_PR_BTHREADS) |
+ sem_id semaphoreID; /* the underlying lock */ |
+ int32 benaphoreCount; /* number of people in lock */ |
+ thread_id owner; /* current lock owner */ |
+#else /* not pthreads or Be threads */ |
+ PRCList links; /* linkage for PRThread.lockList */ |
+ struct PRThread *owner; /* current lock owner */ |
+ PRCList waitQ; /* list of threads waiting for lock */ |
+ PRThreadPriority priority; /* priority of lock */ |
+ PRThreadPriority boostPriority; /* boosted priority of lock owner */ |
+ _MDLock ilock; /* Internal Lock to protect user-level fields */ |
+#endif |
+}; |
+ |
+extern void _PR_InitLocks(void); |
+ |
+struct PRCondVar { |
+ PRLock *lock; /* associated lock that protects the condition */ |
+#if defined(_PR_PTHREADS) |
+ pthread_cond_t cv; /* underlying pthreads condition */ |
+ PRInt32 notify_pending; /* CV has destroy pending notification */ |
+#elif defined(_PR_BTHREADS) |
+ sem_id sem; /* the underlying lock */ |
+ sem_id handshakeSem; /* the lock for 'notify'-threads waiting for confirmation */ |
+ sem_id signalSem; /* the lock for threads waiting for someone to notify */ |
+ volatile int32 nw; /* the number waiting */ |
+ volatile int32 ns; /* the number signalling */ |
+ long signalBenCount; /* the number waiting on the underlying sem */ |
+#else /* not pthreads or Be threads */ |
+ PRCList condQ; /* Condition variable wait Q */ |
+ _MDLock ilock; /* Internal Lock to protect condQ */ |
+ _MDCVar md; |
+#endif |
+}; |
+ |
+/************************************************************************/ |
+ |
+struct PRMonitor { |
+ const char* name; /* monitor name for debugging */ |
+#if defined(_PR_PTHREADS) |
+ PRLock lock; /* the lock structure */ |
+ pthread_t owner; /* the owner of the lock or invalid */ |
+ PRCondVar *cvar; /* condition variable queue */ |
+#else /* defined(_PR_PTHREADS) */ |
+ PRCondVar *cvar; /* associated lock and condition variable queue */ |
+#endif /* defined(_PR_PTHREADS) */ |
+ PRUint32 entryCount; /* # of times re-entered */ |
+}; |
+ |
+/************************************************************************/ |
+ |
+struct PRSemaphore { |
+#if defined(_PR_BTHREADS) |
+ sem_id sem; |
+ int32 benaphoreCount; |
+#else |
+ PRCondVar *cvar; /* associated lock and condition variable queue */ |
+ PRUintn count; /* the value of the counting semaphore */ |
+ PRUint32 waiters; /* threads waiting on the semaphore */ |
+#if defined(_PR_PTHREADS) |
+#else /* defined(_PR_PTHREADS) */ |
+ _MDSemaphore md; |
+#endif /* defined(_PR_PTHREADS) */ |
+#endif /* defined(_PR_BTHREADS) */ |
+}; |
+ |
+NSPR_API(void) _PR_InitSem(void); |
+ |
+/*************************************************************************/ |
+ |
+struct PRSem { |
+#ifdef _PR_HAVE_POSIX_SEMAPHORES |
+ sem_t *sem; |
+#elif defined(_PR_HAVE_SYSV_SEMAPHORES) |
+ int semid; |
+#elif defined(WIN32) |
+ HANDLE sem; |
+#else |
+ PRInt8 notused; |
+#endif |
+}; |
+ |
+/*************************************************************************/ |
+ |
+struct PRStackStr { |
+ /* head MUST be at offset 0; assembly language code relies on this */ |
+#if defined(AIX) |
+ volatile PRStackElem prstk_head; |
+#else |
+ PRStackElem prstk_head; |
+#endif |
+ |
+ PRLock *prstk_lock; |
+ char *prstk_name; |
+}; |
+ |
+/************************************************************************/ |
+ |
+/* XXX this needs to be exported (sigh) */ |
+struct PRThreadStack { |
+ PRCList links; |
+ PRUintn flags; |
+ |
+ char *allocBase; /* base of stack's allocated memory */ |
+ PRUint32 allocSize; /* size of stack's allocated memory */ |
+ char *stackBottom; /* bottom of stack from C's point of view */ |
+ char *stackTop; /* top of stack from C's point of view */ |
+ PRUint32 stackSize; /* size of usable portion of the stack */ |
+ |
+ PRSegment *seg; |
+ PRThread* thr; /* back pointer to thread owning this stack */ |
+ |
+#if defined(_PR_PTHREADS) |
+#else /* defined(_PR_PTHREADS) */ |
+ _MDThreadStack md; |
+#endif /* defined(_PR_PTHREADS) */ |
+}; |
+ |
+extern void _PR_DestroyThreadPrivate(PRThread*); |
+ |
+typedef void (PR_CALLBACK *_PRStartFn)(void *); |
+ |
+struct PRThread { |
+ PRUint32 state; /* thread's creation state */ |
+ PRThreadPriority priority; /* apparent priority, loosly defined */ |
+ |
+ void *arg; /* argument to the client's entry point */ |
+ _PRStartFn startFunc; /* the root of the client's thread */ |
+ |
+ PRThreadStack *stack; /* info about thread's stack (for GC) */ |
+ void *environment; /* pointer to execution environment */ |
+ |
+ PRThreadDumpProc dump; /* dump thread info out */ |
+ void *dumpArg; /* argument for the dump function */ |
+ |
+ /* |
+ ** Per thread private data |
+ */ |
+ PRUint32 tpdLength; /* thread's current vector length */ |
+ void **privateData; /* private data vector or NULL */ |
+ PRErrorCode errorCode; /* current NSPR error code | zero */ |
+ PRInt32 osErrorCode; /* mapping of errorCode | zero */ |
+ PRIntn errorStringLength; /* textLength from last call to PR_SetErrorText() */ |
+ PRInt32 errorStringSize; /* malloc()'d size of buffer | zero */ |
+ char *errorString; /* current error string | NULL */ |
+ |
+#if defined(_PR_PTHREADS) |
+ pthread_t id; /* pthread identifier for the thread */ |
+ PRBool okToDelete; /* ok to delete the PRThread struct? */ |
+ PRCondVar *waiting; /* where the thread is waiting | NULL */ |
+ void *sp; /* recorded sp for garbage collection */ |
+ PRThread *next, *prev; /* simple linked list of all threads */ |
+ PRUint32 suspend; /* used to store suspend and resume flags */ |
+#ifdef PT_NO_SIGTIMEDWAIT |
+ pthread_mutex_t suspendResumeMutex; |
+ pthread_cond_t suspendResumeCV; |
+#endif |
+ PRUint32 interrupt_blocked; /* interrupt blocked */ |
+ struct pollfd *syspoll_list; /* Unix polling list used by PR_Poll */ |
+ PRUint32 syspoll_count; /* number of elements in syspoll_list */ |
+#if defined(_PR_POLL_WITH_SELECT) |
+ int *selectfd_list; /* Unix fd's that PR_Poll selects on */ |
+ PRUint32 selectfd_count; /* number of elements in selectfd_list */ |
+#endif |
+#elif defined(_PR_BTHREADS) |
+ PRUint32 flags; |
+ _MDThread md; |
+ PRBool io_pending; |
+ PRInt32 io_fd; |
+ PRBool io_suspended; |
+#else /* not pthreads or Be threads */ |
+ _MDLock threadLock; /* Lock to protect thread state variables. |
+ * Protects the following fields: |
+ * state |
+ * priority |
+ * links |
+ * wait |
+ * cpu |
+ */ |
+ PRUint32 queueCount; |
+ PRUint32 waitCount; |
+ |
+ PRCList active; /* on list of all active threads */ |
+ PRCList links; |
+ PRCList waitQLinks; /* when thread is PR_Wait'ing */ |
+ PRCList lockList; /* list of locks currently holding */ |
+ PRIntervalTime sleep; /* sleep time when thread is sleeping */ |
+ struct _wait { |
+ struct PRLock *lock; |
+ struct PRCondVar *cvar; |
+ } wait; |
+ |
+ PRUint32 id; |
+ PRUint32 flags; |
+ PRUint32 no_sched; /* Don't schedule the thread to run. |
+ * This flag has relevance only when |
+ * multiple NSPR CPUs are created. |
+ * When a thread is de-scheduled, there |
+ * is a narrow window of time in which |
+ * the thread is put on the run queue |
+ * but the scheduler is actually using |
+ * the stack of this thread. It is safe |
+ * to run this thread on a different CPU |
+ * only when its stack is not in use on |
+ * any other CPU. The no_sched flag is |
+ * set during this interval to prevent |
+ * the thread from being scheduled on a |
+ * different CPU. |
+ */ |
+ |
+ /* thread termination condition variable for join */ |
+ PRCondVar *term; |
+ |
+ _PRCPU *cpu; /* cpu to which this thread is bound */ |
+ PRUint32 threadAllocatedOnStack;/* boolean */ |
+ |
+ /* When an async IO is in progress and a second async IO cannot be |
+ * initiated, the io_pending flag is set to true. Some platforms will |
+ * not use the io_pending flag. If the io_pending flag is true, then |
+ * io_fd is the OS-file descriptor on which IO is pending. |
+ */ |
+ PRBool io_pending; |
+ PRInt32 io_fd; |
+ |
+ /* If a timeout occurs or if an outstanding IO is interrupted and the |
+ * OS doesn't support a real cancellation (NT or MAC), then the |
+ * io_suspended flag will be set to true. The thread will be resumed |
+ * but may run into trouble issuing additional IOs until the io_pending |
+ * flag can be cleared |
+ */ |
+ PRBool io_suspended; |
+ |
+ _MDThread md; |
+#endif |
+}; |
+ |
+struct PRProcessAttr { |
+ PRFileDesc *stdinFd; |
+ PRFileDesc *stdoutFd; |
+ PRFileDesc *stderrFd; |
+ char *currentDirectory; |
+ char *fdInheritBuffer; |
+ PRSize fdInheritBufferSize; |
+ PRSize fdInheritBufferUsed; |
+}; |
+ |
+struct PRProcess { |
+ _MDProcess md; |
+}; |
+ |
+struct PRFileMap { |
+ PRFileDesc *fd; |
+ PRFileMapProtect prot; |
+ _MDFileMap md; |
+}; |
+ |
+/************************************************************************/ |
+ |
+/* |
+** File descriptors of the NSPR layer can be in one of the |
+** following states (stored in the 'state' field of struct |
+** PRFilePrivate): |
+** - _PR_FILEDESC_OPEN: The OS fd is open. |
+** - _PR_FILEDESC_CLOSED: The OS fd is closed. The PRFileDesc |
+** is still open but is unusable. The only operation allowed |
+** on the PRFileDesc is PR_Close(). |
+** - _PR_FILEDESC_FREED: The OS fd is closed and the PRFileDesc |
+** structure is freed. |
+*/ |
+ |
+#define _PR_FILEDESC_OPEN 0xaaaaaaaa /* 1010101... */ |
+#define _PR_FILEDESC_CLOSED 0x55555555 /* 0101010... */ |
+#define _PR_FILEDESC_FREED 0x11111111 |
+ |
+/* |
+** A boolean type with an additional "unknown" state |
+*/ |
+ |
+typedef enum { |
+ _PR_TRI_TRUE = 1, |
+ _PR_TRI_FALSE = 0, |
+ _PR_TRI_UNKNOWN = -1 |
+} _PRTriStateBool; |
+ |
+struct PRFilePrivate { |
+ PRInt32 state; |
+ PRBool nonblocking; |
+ _PRTriStateBool inheritable; |
+ PRFileDesc *next; |
+ PRIntn lockCount; /* 0: not locked |
+ * -1: a native lockfile call is in progress |
+ * > 0: # times the file is locked */ |
+#ifdef _PR_HAVE_PEEK_BUFFER |
+ char *peekBuffer; |
+ PRInt32 peekBufSize; |
+ PRInt32 peekBytes; |
+#endif |
+#if !defined(_PR_HAVE_O_APPEND) |
+ PRBool appendMode; /* Some platforms don't have O_APPEND or its |
+ * equivalent, so they have to seek to end of |
+ * file on write if the file was opened in |
+ * append mode. See Bugzilla 4090, 276330. */ |
+#endif |
+ _MDFileDesc md; |
+#ifdef _PR_NEED_SECRET_AF |
+ PRUint16 af; /* If the platform's implementation of accept() |
+ * requires knowing the address family of the |
+ * socket, we save the address family here. */ |
+#endif |
+}; |
+ |
+#ifdef _WIN64 |
+#define PR_PRIdOSFD "lld" /* for printing PROsfd */ |
+#define PR_PRIxOSFD "llx" |
+#define PR_SCNdOSFD "lld" /* for scanning PROsfd */ |
+#define PR_SCNxOSFD "llx" |
+#else |
+#define PR_PRIdOSFD "ld" /* for printing PROsfd */ |
+#define PR_PRIxOSFD "lx" |
+#define PR_SCNdOSFD "ld" /* for scanning PROsfd */ |
+#define PR_SCNxOSFD "lx" |
+#endif |
+ |
+struct PRDir { |
+ PRDirEntry d; |
+ _MDDir md; |
+}; |
+ |
+#ifdef MOZ_UNICODE |
+struct PRDirUTF16 { |
+ PRDirEntry d; |
+ _MDDirUTF16 md; |
+}; |
+#endif /* MOZ_UNICODE */ |
+ |
+extern void _PR_InitSegs(void); |
+extern void _PR_InitStacks(void); |
+extern void _PR_InitTPD(void); |
+extern void _PR_InitMem(void); |
+extern void _PR_InitEnv(void); |
+extern void _PR_InitCMon(void); |
+extern void _PR_InitIO(void); |
+extern void _PR_InitLog(void); |
+extern void _PR_InitNet(void); |
+extern void _PR_InitClock(void); |
+extern void _PR_InitLinker(void); |
+extern void _PR_InitAtomic(void); |
+extern void _PR_InitCPUs(void); |
+extern void _PR_InitDtoa(void); |
+extern void _PR_InitTime(void); |
+extern void _PR_InitMW(void); |
+extern void _PR_InitRWLocks(void); |
+extern void _PR_NotifyCondVar(PRCondVar *cvar, PRThread *me); |
+extern void _PR_CleanupThread(PRThread *thread); |
+extern void _PR_CleanupCallOnce(void); |
+extern void _PR_CleanupMW(void); |
+extern void _PR_CleanupTime(void); |
+extern void _PR_CleanupDtoa(void); |
+extern void _PR_ShutdownLinker(void); |
+extern void _PR_CleanupEnv(void); |
+extern void _PR_CleanupIO(void); |
+extern void _PR_CleanupCMon(void); |
+extern void _PR_CleanupNet(void); |
+extern void _PR_CleanupLayerCache(void); |
+extern void _PR_CleanupStacks(void); |
+#ifdef WINNT |
+extern void _PR_CleanupCPUs(void); |
+#endif |
+extern void _PR_CleanupThreads(void); |
+extern void _PR_CleanupTPD(void); |
+extern void _PR_Cleanup(void); |
+extern void _PR_LogCleanup(void); |
+extern void _PR_InitLayerCache(void); |
+#ifdef GC_LEAK_DETECTOR |
+extern void _PR_InitGarbageCollector(void); |
+#endif |
+ |
+extern PRBool _pr_initialized; |
+extern void _PR_ImplicitInitialization(void); |
+extern PRBool _PR_Obsolete(const char *obsolete, const char *preferred); |
+ |
+/************************************************************************/ |
+ |
+struct PRSegment { |
+ void *vaddr; |
+ PRUint32 size; |
+ PRUintn flags; |
+#if defined(_PR_PTHREADS) |
+#else /* defined(_PR_PTHREADS) */ |
+ _MDSegment md; |
+#endif /* defined(_PR_PTHREADS) */ |
+}; |
+ |
+/* PRSegment.flags */ |
+#define _PR_SEG_VM 0x1 |
+ |
+/************************************************************************/ |
+ |
+extern PRInt32 _pr_pageSize; |
+extern PRInt32 _pr_pageShift; |
+ |
+extern PRLogModuleInfo *_pr_clock_lm; |
+extern PRLogModuleInfo *_pr_cmon_lm; |
+extern PRLogModuleInfo *_pr_io_lm; |
+extern PRLogModuleInfo *_pr_cvar_lm; |
+extern PRLogModuleInfo *_pr_mon_lm; |
+extern PRLogModuleInfo *_pr_linker_lm; |
+extern PRLogModuleInfo *_pr_sched_lm; |
+extern PRLogModuleInfo *_pr_thread_lm; |
+extern PRLogModuleInfo *_pr_gc_lm; |
+ |
+extern PRFileDesc *_pr_stdin; |
+extern PRFileDesc *_pr_stdout; |
+extern PRFileDesc *_pr_stderr; |
+ |
+/* Zone allocator */ |
+/* |
+** The zone allocator code has hardcoded pthread types and |
+** functions, so it can only be used in the pthreads version. |
+** This can be fixed by replacing the hardcoded pthread types |
+** and functions with macros that expand to the native thread |
+** types and functions on each platform. |
+*/ |
+#if defined(_PR_PTHREADS) && !defined(_PR_DCETHREADS) |
+#define _PR_ZONE_ALLOCATOR |
+#endif |
+ |
+#ifdef _PR_ZONE_ALLOCATOR |
+extern void _PR_InitZones(void); |
+extern void _PR_DestroyZones(void); |
+#endif |
+ |
+/* Overriding malloc, free, etc. */ |
+#if !defined(_PR_NO_PREEMPT) && defined(XP_UNIX) \ |
+ && !defined(_PR_PTHREADS) && !defined(_PR_GLOBAL_THREADS_ONLY) \ |
+ && !defined(PURIFY) \ |
+ && !defined(DARWIN) \ |
+ && !defined(NEXTSTEP) \ |
+ && !defined(QNX) \ |
+ && !(defined (UNIXWARE) && defined (USE_SVR4_THREADS)) |
+#define _PR_OVERRIDE_MALLOC |
+#endif |
+ |
+/************************************************************************* |
+* External machine-dependent code provided by each OS. * * |
+*************************************************************************/ |
+ |
+/* Initialization related */ |
+extern void _PR_MD_EARLY_INIT(void); |
+#define _PR_MD_EARLY_INIT _MD_EARLY_INIT |
+ |
+extern void _PR_MD_INTERVAL_INIT(void); |
+#define _PR_MD_INTERVAL_INIT _MD_INTERVAL_INIT |
+ |
+NSPR_API(void) _PR_MD_FINAL_INIT(void); |
+#define _PR_MD_FINAL_INIT _MD_FINAL_INIT |
+ |
+/* Process control */ |
+ |
+extern PRProcess * _PR_MD_CREATE_PROCESS( |
+ const char *path, |
+ char *const *argv, |
+ char *const *envp, |
+ const PRProcessAttr *attr); |
+#define _PR_MD_CREATE_PROCESS _MD_CREATE_PROCESS |
+ |
+extern PRStatus _PR_MD_DETACH_PROCESS(PRProcess *process); |
+#define _PR_MD_DETACH_PROCESS _MD_DETACH_PROCESS |
+ |
+extern PRStatus _PR_MD_WAIT_PROCESS(PRProcess *process, PRInt32 *exitCode); |
+#define _PR_MD_WAIT_PROCESS _MD_WAIT_PROCESS |
+ |
+extern PRStatus _PR_MD_KILL_PROCESS(PRProcess *process); |
+#define _PR_MD_KILL_PROCESS _MD_KILL_PROCESS |
+ |
+/* Current Time */ |
+NSPR_API(PRTime) _PR_MD_NOW(void); |
+#define _PR_MD_NOW _MD_NOW |
+ |
+/* Environment related */ |
+extern char* _PR_MD_GET_ENV(const char *name); |
+#define _PR_MD_GET_ENV _MD_GET_ENV |
+ |
+extern PRIntn _PR_MD_PUT_ENV(const char *name); |
+#define _PR_MD_PUT_ENV _MD_PUT_ENV |
+ |
+/* Atomic operations */ |
+ |
+extern void _PR_MD_INIT_ATOMIC(void); |
+#define _PR_MD_INIT_ATOMIC _MD_INIT_ATOMIC |
+ |
+extern PRInt32 _PR_MD_ATOMIC_INCREMENT(PRInt32 *); |
+#define _PR_MD_ATOMIC_INCREMENT _MD_ATOMIC_INCREMENT |
+ |
+extern PRInt32 _PR_MD_ATOMIC_ADD(PRInt32 *, PRInt32); |
+#define _PR_MD_ATOMIC_ADD _MD_ATOMIC_ADD |
+ |
+extern PRInt32 _PR_MD_ATOMIC_DECREMENT(PRInt32 *); |
+#define _PR_MD_ATOMIC_DECREMENT _MD_ATOMIC_DECREMENT |
+ |
+extern PRInt32 _PR_MD_ATOMIC_SET(PRInt32 *, PRInt32); |
+#define _PR_MD_ATOMIC_SET _MD_ATOMIC_SET |
+ |
+/* Garbage collection */ |
+ |
+/* |
+** Save the registers that the GC would find interesting into the thread |
+** "t". isCurrent will be non-zero if the thread state that is being |
+** saved is the currently executing thread. Return the address of the |
+** first register to be scanned as well as the number of registers to |
+** scan in "np". |
+** |
+** If "isCurrent" is non-zero then it is allowed for the thread context |
+** area to be used as scratch storage to hold just the registers |
+** necessary for scanning. |
+*/ |
+extern PRWord *_MD_HomeGCRegisters(PRThread *t, int isCurrent, int *np); |
+ |
+/* Time intervals */ |
+ |
+extern PRIntervalTime _PR_MD_GET_INTERVAL(void); |
+#define _PR_MD_GET_INTERVAL _MD_GET_INTERVAL |
+ |
+extern PRIntervalTime _PR_MD_INTERVAL_PER_SEC(void); |
+#define _PR_MD_INTERVAL_PER_SEC _MD_INTERVAL_PER_SEC |
+ |
+/* Affinity masks */ |
+ |
+extern PRInt32 _PR_MD_SETTHREADAFFINITYMASK(PRThread *thread, PRUint32 mask ); |
+#define _PR_MD_SETTHREADAFFINITYMASK _MD_SETTHREADAFFINITYMASK |
+ |
+extern PRInt32 _PR_MD_GETTHREADAFFINITYMASK(PRThread *thread, PRUint32 *mask); |
+#define _PR_MD_GETTHREADAFFINITYMASK _MD_GETTHREADAFFINITYMASK |
+ |
+/* File locking */ |
+ |
+extern PRStatus _PR_MD_LOCKFILE(PROsfd osfd); |
+#define _PR_MD_LOCKFILE _MD_LOCKFILE |
+ |
+extern PRStatus _PR_MD_TLOCKFILE(PROsfd osfd); |
+#define _PR_MD_TLOCKFILE _MD_TLOCKFILE |
+ |
+extern PRStatus _PR_MD_UNLOCKFILE(PROsfd osfd); |
+#define _PR_MD_UNLOCKFILE _MD_UNLOCKFILE |
+ |
+/* Memory-mapped files */ |
+ |
+extern PRStatus _PR_MD_CREATE_FILE_MAP(PRFileMap *fmap, PRInt64 size); |
+#define _PR_MD_CREATE_FILE_MAP _MD_CREATE_FILE_MAP |
+ |
+extern PRInt32 _PR_MD_GET_MEM_MAP_ALIGNMENT(void); |
+#define _PR_MD_GET_MEM_MAP_ALIGNMENT _MD_GET_MEM_MAP_ALIGNMENT |
+ |
+extern void * _PR_MD_MEM_MAP( |
+ PRFileMap *fmap, |
+ PROffset64 offset, |
+ PRUint32 len); |
+#define _PR_MD_MEM_MAP _MD_MEM_MAP |
+ |
+extern PRStatus _PR_MD_MEM_UNMAP(void *addr, PRUint32 size); |
+#define _PR_MD_MEM_UNMAP _MD_MEM_UNMAP |
+ |
+extern PRStatus _PR_MD_CLOSE_FILE_MAP(PRFileMap *fmap); |
+#define _PR_MD_CLOSE_FILE_MAP _MD_CLOSE_FILE_MAP |
+ |
+/* Named Shared Memory */ |
+ |
+/* |
+** Declare PRSharedMemory. |
+*/ |
+struct PRSharedMemory |
+{ |
+ char *ipcname; /* after conversion to native */ |
+ PRSize size; /* from open */ |
+ PRIntn mode; /* from open */ |
+ PRIntn flags; /* from open */ |
+#if defined(PR_HAVE_POSIX_NAMED_SHARED_MEMORY) |
+ int id; |
+#elif defined(PR_HAVE_SYSV_NAMED_SHARED_MEMORY) |
+ int id; |
+#elif defined(PR_HAVE_WIN32_NAMED_SHARED_MEMORY) |
+ HANDLE handle; |
+#else |
+ PRUint32 nothing; /* placeholder, nothing behind here */ |
+#endif |
+ PRUint32 ident; /* guard word at end of struct */ |
+#define _PR_SHM_IDENT 0xdeadbad |
+}; |
+ |
+extern PRSharedMemory * _MD_OpenSharedMemory( |
+ const char *name, |
+ PRSize size, |
+ PRIntn flags, |
+ PRIntn mode |
+); |
+#define _PR_MD_OPEN_SHARED_MEMORY _MD_OpenSharedMemory |
+ |
+extern void * _MD_AttachSharedMemory( PRSharedMemory *shm, PRIntn flags ); |
+#define _PR_MD_ATTACH_SHARED_MEMORY _MD_AttachSharedMemory |
+ |
+extern PRStatus _MD_DetachSharedMemory( PRSharedMemory *shm, void *addr ); |
+#define _PR_MD_DETACH_SHARED_MEMORY _MD_DetachSharedMemory |
+ |
+extern PRStatus _MD_CloseSharedMemory( PRSharedMemory *shm ); |
+#define _PR_MD_CLOSE_SHARED_MEMORY _MD_CloseSharedMemory |
+ |
+extern PRStatus _MD_DeleteSharedMemory( const char *name ); |
+#define _PR_MD_DELETE_SHARED_MEMORY _MD_DeleteSharedMemory |
+ |
+extern PRFileMap* _md_OpenAnonFileMap( |
+ const char *dirName, |
+ PRSize size, |
+ PRFileMapProtect prot |
+); |
+#define _PR_MD_OPEN_ANON_FILE_MAP _md_OpenAnonFileMap |
+ |
+extern PRStatus _md_ExportFileMapAsString( |
+ PRFileMap *fm, |
+ PRSize bufSize, |
+ char *buf |
+); |
+#define _PR_MD_EXPORT_FILE_MAP_AS_STRING _md_ExportFileMapAsString |
+ |
+extern PRFileMap * _md_ImportFileMapFromString( |
+ const char *fmstring |
+); |
+#define _PR_MD_IMPORT_FILE_MAP_FROM_STRING _md_ImportFileMapFromString |
+ |
+ |
+ |
+/* Interprocess communications (IPC) */ |
+ |
+/* |
+ * The maximum length of an NSPR IPC name, including the |
+ * terminating null byte. |
+ */ |
+#define PR_IPC_NAME_SIZE 1024 |
+ |
+/* |
+ * Types of NSPR IPC objects |
+ */ |
+typedef enum { |
+ _PRIPCSem, /* semaphores */ |
+ _PRIPCShm /* shared memory segments */ |
+} _PRIPCType; |
+ |
+/* |
+ * Make a native IPC name from an NSPR IPC name. |
+ */ |
+extern PRStatus _PR_MakeNativeIPCName( |
+ const char *name, /* NSPR IPC name */ |
+ char *result, /* result buffer */ |
+ PRIntn size, /* size of result buffer */ |
+ _PRIPCType type /* type of IPC object */ |
+); |
+ |
+/* Socket call error code */ |
+ |
+NSPR_API(PRInt32) _PR_MD_GET_SOCKET_ERROR(void); |
+#define _PR_MD_GET_SOCKET_ERROR _MD_GET_SOCKET_ERROR |
+ |
+/* Get name of current host */ |
+extern PRStatus _PR_MD_GETHOSTNAME(char *name, PRUint32 namelen); |
+#define _PR_MD_GETHOSTNAME _MD_GETHOSTNAME |
+ |
+extern PRStatus _PR_MD_GETSYSINFO(PRSysInfo cmd, char *name, PRUint32 namelen); |
+#define _PR_MD_GETSYSINFO _MD_GETSYSINFO |
+ |
+/* File descriptor inheritance */ |
+ |
+/* |
+ * If fd->secret->inheritable is _PR_TRI_UNKNOWN and we need to |
+ * know the inheritable attribute of the fd, call this function |
+ * to find that out. This typically requires a system call. |
+ */ |
+extern void _PR_MD_QUERY_FD_INHERITABLE(PRFileDesc *fd); |
+#define _PR_MD_QUERY_FD_INHERITABLE _MD_QUERY_FD_INHERITABLE |
+ |
+/* --- PR_GetRandomNoise() related things --- */ |
+ |
+extern PRSize _PR_MD_GetRandomNoise( void *buf, PRSize size ); |
+#define _PR_MD_GET_RANDOM_NOISE(buf,size) _PR_MD_GetRandomNoise((buf),(size)) |
+extern PRSize _pr_CopyLowBits( void *dest, PRSize dstlen, void *src, PRSize srclen ); |
+ |
+/* end PR_GetRandomNoise() related */ |
+ |
+#ifdef XP_BEOS |
+ |
+extern PRLock *_connectLock; |
+ |
+typedef struct _ConnectListNode { |
+ PRInt32 osfd; |
+ PRNetAddr addr; |
+ PRUint32 addrlen; |
+ PRIntervalTime timeout; |
+} ConnectListNode; |
+ |
+extern ConnectListNode connectList[64]; |
+ |
+extern PRUint32 connectCount; |
+ |
+#endif /* XP_BEOS */ |
+ |
+PR_END_EXTERN_C |
+ |
+#endif /* primpl_h___ */ |