blob: f4a533bd4f41863b2b2f9351f1da3f29da5e96d8 [file] [log] [blame]
// Copyright 2016 The Cobalt Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// This header defines the interface for a starboard based implementation of
// the subset of nspr that SpiderMonkey depends on. It directly matches the
// NSPR API, with the exception that accessing thread local data should use
// PRTLSIndex, rather than PRUintn.
#ifndef STARBOARD_CLIENT_PORTING_PR_STARBOARD_PR_STARBOARD_H_
#define STARBOARD_CLIENT_PORTING_PR_STARBOARD_PR_STARBOARD_H_
#if defined(STARBOARD)
#include "starboard/common/condition_variable.h"
#include "starboard/common/log.h"
#include "starboard/common/mutex.h"
#include "starboard/common/string.h"
#include "starboard/memory.h"
#include "starboard/thread.h"
#include "starboard/types.h"
#define PR_CALLBACK
#define PR_MSEC_PER_SEC 1000L
#define PR_USEC_PER_SEC 1000000L
#define PR_NSEC_PER_SEC 1000000000L
#define PR_USEC_PER_MSEC 1000L
#define PR_NSEC_PER_MSEC 1000000L
typedef enum { PR_FAILURE = -1, PR_SUCCESS = 0 } PRStatus;
namespace pr_starboard {
// Utility function to map true to PR_SUCCESS and false to PR_FAILURE.
static inline PRStatus ToPRStatus(bool result) {
return result ? PR_SUCCESS : PR_FAILURE;
}
} // namespace pr_starboard
typedef enum PRThreadPriority {
PR_PRIORITY_FIRST = 0,
PR_PRIORITY_LOW = 0,
PR_PRIORITY_NORMAL = 1,
PR_PRIORITY_HIGH = 2,
PR_PRIORITY_URGENT = 3,
PR_PRIORITY_LAST = 3
} PRThreadPriority;
typedef enum PRThreadScope {
PR_LOCAL_THREAD,
PR_GLOBAL_THREAD,
PR_GLOBAL_BOUND_THREAD
} PRThreadScope;
typedef enum PRThreadState {
PR_JOINABLE_THREAD,
PR_UNJOINABLE_THREAD
} PRThreadState;
typedef enum PRThreadType { PR_USER_THREAD, PR_SYSTEM_THREAD } PRThreadType;
typedef SbThreadLocalKey PRTLSIndex;
typedef uint32_t PRIntervalTime;
typedef int32_t PRInt32;
typedef uint32_t PRUint32;
typedef int64_t PRInt64;
typedef uint64_t PRUint64;
typedef void(PR_CALLBACK* PRThreadPrivateDTOR)(void* priv);
struct PRThread {
explicit PRThread(SbThread sb_thread) : sb_thread(sb_thread) {}
SbThread sb_thread;
};
typedef SbMutex PRLock;
#define PR_INTERVAL_NO_WAIT 0UL
#define PR_INTERVAL_NO_TIMEOUT 0xffffffffUL
struct PRCondVar {
SbConditionVariable sb_condition_variable;
SbMutex* lock;
};
PRLock* PR_NewLock();
static inline void PR_Lock(PRLock* lock) {
SbMutexAcquire(lock);
}
static inline void PR_Unlock(PRLock* lock) {
SbMutexRelease(lock);
}
void PR_DestroyLock(PRLock* lock);
PRCondVar* PR_NewCondVar(PRLock* lock);
void PR_DestroyCondVar(PRCondVar* cvar);
PRStatus PR_WaitCondVar(PRCondVar* cvar, PRIntervalTime timeout);
static inline PRStatus PR_NotifyCondVar(PRCondVar* cvar) {
return pr_starboard::ToPRStatus(
SbConditionVariableSignal(&cvar->sb_condition_variable));
}
static inline PRStatus PR_NotifyAllCondVar(PRCondVar* cvar) {
return pr_starboard::ToPRStatus(
SbConditionVariableBroadcast(&cvar->sb_condition_variable));
}
typedef void (*PRThreadEntryPoint)(void*);
PRThread* PR_CreateThread(PRThreadType type,
PRThreadEntryPoint start,
void* arg,
PRThreadPriority priority,
PRThreadScope scope,
PRThreadState state,
PRUint32 stackSize);
static inline PRStatus PR_JoinThread(PRThread* pr_thread) {
SB_DCHECK(pr_thread);
SB_DCHECK(SbThreadIsValid(pr_thread->sb_thread));
return pr_starboard::ToPRStatus(SbThreadJoin(pr_thread->sb_thread, NULL));
}
PRThread* PR_GetCurrentThread();
void PR_DetachThread();
PRStatus PR_NewThreadPrivateIndex(PRTLSIndex* newIndex,
PRThreadPrivateDTOR destructor);
static inline PRStatus PR_SetThreadPrivate(PRTLSIndex index, void* priv) {
return pr_starboard::ToPRStatus(SbThreadSetLocalValue(index, priv));
}
static inline void* PR_GetThreadPrivate(PRTLSIndex index) {
return SbThreadGetLocalValue(index);
}
static inline void PR_SetCurrentThreadName(const char* name) {
SbThreadSetName(name);
}
static inline PRUint32 PR_vsnprintf(char* out,
PRUint32 outlen,
const char* fmt,
va_list ap) {
return static_cast<PRUint32>(SbStringFormat(out, outlen, fmt, ap));
}
PRUint32 PR_snprintf(char* out, PRUint32 outlen, const char* fmt, ...);
PRIntervalTime PR_MillisecondsToInterval(PRUint32 milli);
static inline PRIntervalTime PR_MicrosecondsToInterval(PRUint32 micro) {
return (micro + 999) / 1000;
}
PRUint32 PR_IntervalToMicroseconds(PRIntervalTime ticks);
struct PRCallOnceType {};
typedef PRStatus(PR_CALLBACK* PRCallOnceWithArgFN)(void* arg);
PRStatus PR_CallOnceWithArg(PRCallOnceType* once,
PRCallOnceWithArgFN func,
void* arg);
static inline PRUint32 PR_TicksPerSecond() {
return 1000;
}
#endif // STARBOAR
#endif // STARBOARD_CLIENT_PORTING_PR_STARBOARD_PR_STARBOARD_H_