michael@0: /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- michael@0: * vim: set ts=8 sts=4 et sw=4 tw=99: michael@0: * This Source Code Form is subject to the terms of the Mozilla Public michael@0: * License, v. 2.0. If a copy of the MPL was not distributed with this michael@0: * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ michael@0: michael@0: #ifndef vm_PosixNSPR_h michael@0: #define vm_PosixNSPR_h michael@0: michael@0: #ifdef JS_POSIX_NSPR michael@0: michael@0: #ifndef JS_THREADSAFE michael@0: #error "This file must not be included in non-threadsafe mode" michael@0: #endif michael@0: michael@0: #include michael@0: #include michael@0: michael@0: namespace nspr { michael@0: class Thread; michael@0: class Lock; michael@0: class CondVar; michael@0: }; michael@0: michael@0: typedef nspr::Thread PRThread; michael@0: typedef nspr::Lock PRLock; michael@0: typedef nspr::CondVar PRCondVar; michael@0: michael@0: enum PRThreadType { michael@0: PR_USER_THREAD, michael@0: PR_SYSTEM_THREAD michael@0: }; michael@0: michael@0: enum PRThreadPriority michael@0: { michael@0: PR_PRIORITY_FIRST = 0, michael@0: PR_PRIORITY_LOW = 0, michael@0: PR_PRIORITY_NORMAL = 1, michael@0: PR_PRIORITY_HIGH = 2, michael@0: PR_PRIORITY_URGENT = 3, michael@0: PR_PRIORITY_LAST = 3 michael@0: }; michael@0: michael@0: enum PRThreadScope { michael@0: PR_LOCAL_THREAD, michael@0: PR_GLOBAL_THREAD, michael@0: PR_GLOBAL_BOUND_THREAD michael@0: }; michael@0: michael@0: enum PRThreadState { michael@0: PR_JOINABLE_THREAD, michael@0: PR_UNJOINABLE_THREAD michael@0: }; michael@0: michael@0: PRThread * michael@0: PR_CreateThread(PRThreadType type, michael@0: void (*start)(void *arg), michael@0: void *arg, michael@0: PRThreadPriority priority, michael@0: PRThreadScope scope, michael@0: PRThreadState state, michael@0: uint32_t stackSize); michael@0: michael@0: typedef enum { PR_FAILURE = -1, PR_SUCCESS = 0 } PRStatus; michael@0: michael@0: PRStatus michael@0: PR_JoinThread(PRThread *thread); michael@0: michael@0: PRThread * michael@0: PR_GetCurrentThread(); michael@0: michael@0: PRStatus michael@0: PR_SetCurrentThreadName(const char *name); michael@0: michael@0: typedef void (*PRThreadPrivateDTOR)(void *priv); michael@0: michael@0: PRStatus michael@0: PR_NewThreadPrivateIndex(unsigned *newIndex, PRThreadPrivateDTOR destructor); michael@0: michael@0: PRStatus michael@0: PR_SetThreadPrivate(unsigned index, void *priv); michael@0: michael@0: void * michael@0: PR_GetThreadPrivate(unsigned index); michael@0: michael@0: struct PRCallOnceType { michael@0: int initialized; michael@0: int32_t inProgress; michael@0: PRStatus status; michael@0: }; michael@0: michael@0: typedef PRStatus (*PRCallOnceFN)(); michael@0: michael@0: PRStatus michael@0: PR_CallOnce(PRCallOnceType *once, PRCallOnceFN func); michael@0: michael@0: typedef PRStatus (*PRCallOnceWithArgFN)(void *); michael@0: michael@0: PRStatus michael@0: PR_CallOnceWithArg(PRCallOnceType *once, PRCallOnceWithArgFN func, void *arg); michael@0: michael@0: PRLock * michael@0: PR_NewLock(); michael@0: michael@0: void michael@0: PR_DestroyLock(PRLock *lock); michael@0: michael@0: void michael@0: PR_Lock(PRLock *lock); michael@0: michael@0: PRStatus michael@0: PR_Unlock(PRLock *lock); michael@0: michael@0: PRCondVar * michael@0: PR_NewCondVar(PRLock *lock); michael@0: michael@0: void michael@0: PR_DestroyCondVar(PRCondVar *cvar); michael@0: michael@0: PRStatus michael@0: PR_NotifyCondVar(PRCondVar *cvar); michael@0: michael@0: PRStatus michael@0: PR_NotifyAllCondVar(PRCondVar *cvar); michael@0: michael@0: #define PR_INTERVAL_MIN 1000UL michael@0: #define PR_INTERVAL_MAX 100000UL michael@0: michael@0: #define PR_INTERVAL_NO_WAIT 0UL michael@0: #define PR_INTERVAL_NO_TIMEOUT 0xffffffffUL michael@0: michael@0: uint32_t michael@0: PR_MillisecondsToInterval(uint32_t milli); michael@0: michael@0: uint32_t michael@0: PR_TicksPerSecond(); michael@0: michael@0: PRStatus michael@0: PR_WaitCondVar(PRCondVar *cvar, uint32_t timeout); michael@0: michael@0: #endif /* JS_POSIX_NSPR */ michael@0: michael@0: #endif /* vm_PosixNSPR_h */