2025-02-05 12:40:54 +10:00
|
|
|
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
2018-09-08 18:08:48 +08:00
|
|
|
*
|
|
|
|
|
* ***** 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 Mozilla Communicator client code, released
|
|
|
|
|
* March 31, 1998.
|
|
|
|
|
*
|
|
|
|
|
* The Initial Developer of the Original Code is
|
|
|
|
|
* Netscape Communications Corporation.
|
|
|
|
|
* Portions created by the Initial Developer are Copyright (C) 1998
|
|
|
|
|
* the Initial Developer. All Rights Reserved.
|
|
|
|
|
*
|
|
|
|
|
* Contributor(s):
|
|
|
|
|
*
|
|
|
|
|
* Alternatively, the contents of this file may be used under the terms of
|
|
|
|
|
* either of 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 ***** */
|
|
|
|
|
|
|
|
|
|
#ifdef JS_THREADSAFE
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* JS locking stubs.
|
|
|
|
|
*/
|
|
|
|
|
#include <stdlib.h>
|
2023-07-12 13:27:26 +10:00
|
|
|
#include <string.h>
|
2018-09-08 18:08:48 +08:00
|
|
|
#include "jspubtd.h"
|
2025-03-19 21:25:58 +10:00
|
|
|
#include "jsutil.h"
|
2018-09-08 18:08:48 +08:00
|
|
|
#include "jstypes.h"
|
2025-02-05 12:40:54 +10:00
|
|
|
#include "jsstdint.h"
|
2018-09-08 18:08:48 +08:00
|
|
|
#include "jsbit.h"
|
|
|
|
|
#include "jscntxt.h"
|
|
|
|
|
#include "jsgc.h"
|
|
|
|
|
#include "jslock.h"
|
|
|
|
|
#include "jsscope.h"
|
|
|
|
|
#include "jsstr.h"
|
|
|
|
|
|
2025-02-05 12:40:54 +10:00
|
|
|
using namespace js;
|
|
|
|
|
|
2018-09-08 18:08:48 +08:00
|
|
|
#define ReadWord(W) (W)
|
|
|
|
|
|
2025-02-05 12:40:54 +10:00
|
|
|
#if !defined(__GNUC__)
|
|
|
|
|
# define __asm__ asm
|
|
|
|
|
# define __volatile__ volatile
|
|
|
|
|
#endif
|
|
|
|
|
|
2025-02-03 12:35:24 +10:00
|
|
|
/* Implement NativeCompareAndSwap. */
|
2018-09-08 18:08:48 +08:00
|
|
|
|
2025-02-05 12:40:54 +10:00
|
|
|
#if defined(_MSC_VER) && defined(_M_IX86)
|
2018-09-08 18:08:48 +08:00
|
|
|
#pragma warning( disable : 4035 )
|
2023-07-12 13:27:26 +10:00
|
|
|
JS_BEGIN_EXTERN_C
|
|
|
|
|
extern long __cdecl
|
|
|
|
|
_InterlockedCompareExchange(long *volatile dest, long exchange, long comp);
|
|
|
|
|
JS_END_EXTERN_C
|
|
|
|
|
#pragma intrinsic(_InterlockedCompareExchange)
|
2018-09-08 18:08:48 +08:00
|
|
|
|
2025-02-05 12:40:54 +10:00
|
|
|
JS_STATIC_ASSERT(sizeof(jsword) == sizeof(long));
|
|
|
|
|
|
2025-02-03 12:35:24 +10:00
|
|
|
static JS_ALWAYS_INLINE int
|
2025-03-19 21:25:58 +10:00
|
|
|
NativeCompareAndSwapHelper(volatile jsword *w, jsword ov, jsword nv)
|
2018-09-08 18:08:48 +08:00
|
|
|
{
|
2025-02-05 12:40:54 +10:00
|
|
|
_InterlockedCompareExchange((long*) w, nv, ov);
|
2018-09-08 18:08:48 +08:00
|
|
|
__asm {
|
|
|
|
|
sete al
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2025-02-03 12:35:24 +10:00
|
|
|
static JS_ALWAYS_INLINE int
|
2025-03-19 21:25:58 +10:00
|
|
|
NativeCompareAndSwap(volatile jsword *w, jsword ov, jsword nv)
|
2023-07-12 13:27:26 +10:00
|
|
|
{
|
2025-02-03 12:35:24 +10:00
|
|
|
return (NativeCompareAndSwapHelper(w, ov, nv) & 1);
|
2023-07-12 13:27:26 +10:00
|
|
|
}
|
|
|
|
|
|
2025-02-05 12:40:54 +10:00
|
|
|
#elif defined(_MSC_VER) && (defined(_M_AMD64) || defined(_M_X64))
|
|
|
|
|
JS_BEGIN_EXTERN_C
|
|
|
|
|
extern long long __cdecl
|
|
|
|
|
_InterlockedCompareExchange64(long long *volatile dest, long long exchange, long long comp);
|
|
|
|
|
JS_END_EXTERN_C
|
|
|
|
|
#pragma intrinsic(_InterlockedCompareExchange64)
|
|
|
|
|
|
|
|
|
|
static JS_ALWAYS_INLINE int
|
2025-03-19 21:25:58 +10:00
|
|
|
NativeCompareAndSwap(volatile jsword *w, jsword ov, jsword nv)
|
2025-02-05 12:40:54 +10:00
|
|
|
{
|
2025-03-19 21:25:58 +10:00
|
|
|
return _InterlockedCompareExchange64((long long *volatile)w, nv, ov) == ov;
|
2025-02-05 12:40:54 +10:00
|
|
|
}
|
|
|
|
|
|
2023-07-12 13:27:26 +10:00
|
|
|
#elif defined(XP_MACOSX) || defined(DARWIN)
|
|
|
|
|
|
|
|
|
|
#include <libkern/OSAtomic.h>
|
|
|
|
|
|
2025-02-03 12:35:24 +10:00
|
|
|
static JS_ALWAYS_INLINE int
|
2025-03-19 21:25:58 +10:00
|
|
|
NativeCompareAndSwap(volatile jsword *w, jsword ov, jsword nv)
|
2023-07-12 13:27:26 +10:00
|
|
|
{
|
|
|
|
|
/* Details on these functions available in the manpage for atomic */
|
2025-02-05 12:40:54 +10:00
|
|
|
return OSAtomicCompareAndSwapPtrBarrier(reinterpret_cast<void *>(ov),
|
|
|
|
|
reinterpret_cast<void *>(nv),
|
2025-03-19 21:25:58 +10:00
|
|
|
reinterpret_cast<void * volatile *>(w));
|
2023-07-12 13:27:26 +10:00
|
|
|
}
|
|
|
|
|
|
2025-02-05 12:40:54 +10:00
|
|
|
#elif defined(__i386) && (defined(__GNUC__) || defined(__SUNPRO_CC))
|
2018-09-08 18:08:48 +08:00
|
|
|
|
|
|
|
|
/* Note: This fails on 386 cpus, cmpxchgl is a >= 486 instruction */
|
2025-02-03 12:35:24 +10:00
|
|
|
static JS_ALWAYS_INLINE int
|
2025-03-19 21:25:58 +10:00
|
|
|
NativeCompareAndSwap(volatile jsword *w, jsword ov, jsword nv)
|
2018-09-08 18:08:48 +08:00
|
|
|
{
|
|
|
|
|
unsigned int res;
|
|
|
|
|
|
|
|
|
|
__asm__ __volatile__ (
|
|
|
|
|
"lock\n"
|
|
|
|
|
"cmpxchgl %2, (%1)\n"
|
|
|
|
|
"sete %%al\n"
|
|
|
|
|
"andl $1, %%eax\n"
|
|
|
|
|
: "=a" (res)
|
2025-02-05 12:40:54 +10:00
|
|
|
#ifdef __SUNPRO_CC
|
|
|
|
|
/* Different code for Sun Studio because of a bug of SS12U1 */
|
|
|
|
|
: "c" (w), "d" (nv), "a" (ov)
|
|
|
|
|
#else
|
2018-09-08 18:08:48 +08:00
|
|
|
: "r" (w), "r" (nv), "a" (ov)
|
2025-02-05 12:40:54 +10:00
|
|
|
#endif
|
2018-09-08 18:08:48 +08:00
|
|
|
: "cc", "memory");
|
|
|
|
|
return (int)res;
|
|
|
|
|
}
|
2025-02-05 12:40:54 +10:00
|
|
|
#elif defined(__x86_64) && (defined(__GNUC__) || defined(__SUNPRO_CC))
|
2018-09-08 18:08:48 +08:00
|
|
|
|
2025-02-03 12:35:24 +10:00
|
|
|
static JS_ALWAYS_INLINE int
|
2025-03-19 21:25:58 +10:00
|
|
|
NativeCompareAndSwap(volatile jsword *w, jsword ov, jsword nv)
|
2025-02-03 12:35:24 +10:00
|
|
|
{
|
|
|
|
|
unsigned int res;
|
|
|
|
|
|
|
|
|
|
__asm__ __volatile__ (
|
|
|
|
|
"lock\n"
|
|
|
|
|
"cmpxchgq %2, (%1)\n"
|
|
|
|
|
"sete %%al\n"
|
|
|
|
|
"movzbl %%al, %%eax\n"
|
|
|
|
|
: "=a" (res)
|
|
|
|
|
: "r" (w), "r" (nv), "a" (ov)
|
|
|
|
|
: "cc", "memory");
|
|
|
|
|
return (int)res;
|
|
|
|
|
}
|
|
|
|
|
|
2025-02-05 12:40:54 +10:00
|
|
|
#elif defined(__sparc)
|
|
|
|
|
#if defined(__GNUC__)
|
2018-09-08 18:08:48 +08:00
|
|
|
|
2025-02-03 12:35:24 +10:00
|
|
|
static JS_ALWAYS_INLINE int
|
2025-03-19 21:25:58 +10:00
|
|
|
NativeCompareAndSwap(volatile jsword *w, jsword ov, jsword nv)
|
2018-09-08 18:08:48 +08:00
|
|
|
{
|
|
|
|
|
unsigned int res;
|
2025-02-05 12:40:54 +10:00
|
|
|
|
|
|
|
|
__asm__ __volatile__ (
|
|
|
|
|
"membar #StoreLoad | #LoadLoad\n"
|
|
|
|
|
#if JS_BITS_PER_WORD == 32
|
|
|
|
|
"cas [%1],%2,%3\n"
|
|
|
|
|
#else
|
|
|
|
|
"casx [%1],%2,%3\n"
|
|
|
|
|
#endif
|
|
|
|
|
"membar #StoreLoad | #LoadLoad\n"
|
|
|
|
|
"cmp %2,%3\n"
|
|
|
|
|
"be,a 1f\n"
|
|
|
|
|
"mov 1,%0\n"
|
|
|
|
|
"mov 0,%0\n"
|
|
|
|
|
"1:"
|
2018-09-08 18:08:48 +08:00
|
|
|
: "=r" (res)
|
|
|
|
|
: "r" (w), "r" (ov), "r" (nv));
|
|
|
|
|
return (int)res;
|
|
|
|
|
}
|
|
|
|
|
|
2025-02-05 12:40:54 +10:00
|
|
|
#elif defined(__SUNPRO_CC)
|
|
|
|
|
|
|
|
|
|
/* Implementation in lock_sparc*.il */
|
|
|
|
|
extern "C" int
|
2025-03-19 21:25:58 +10:00
|
|
|
NativeCompareAndSwap(volatile jsword *w, jsword ov, jsword nv);
|
2025-02-05 12:40:54 +10:00
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
|
2018-09-08 18:08:48 +08:00
|
|
|
#elif defined(AIX)
|
|
|
|
|
|
|
|
|
|
#include <sys/atomic_op.h>
|
|
|
|
|
|
2025-02-03 12:35:24 +10:00
|
|
|
static JS_ALWAYS_INLINE int
|
2025-03-19 21:25:58 +10:00
|
|
|
NativeCompareAndSwap(volatile jsword *w, jsword ov, jsword nv)
|
2018-09-08 18:08:48 +08:00
|
|
|
{
|
2025-02-05 12:40:54 +10:00
|
|
|
int res;
|
|
|
|
|
JS_STATIC_ASSERT(sizeof(jsword) == sizeof(long));
|
|
|
|
|
|
|
|
|
|
res = compare_and_swaplp((atomic_l)w, &ov, nv);
|
|
|
|
|
if (res)
|
|
|
|
|
__asm__("isync");
|
|
|
|
|
return res;
|
2018-09-08 18:08:48 +08:00
|
|
|
}
|
|
|
|
|
|
2025-02-03 12:35:24 +10:00
|
|
|
#elif defined(USE_ARM_KUSER)
|
|
|
|
|
|
|
|
|
|
/* See https://bugzilla.mozilla.org/show_bug.cgi?id=429387 for a
|
|
|
|
|
* description of this ABI; this is a function provided at a fixed
|
|
|
|
|
* location by the kernel in the memory space of each process.
|
|
|
|
|
*/
|
|
|
|
|
typedef int (__kernel_cmpxchg_t)(int oldval, int newval, volatile int *ptr);
|
|
|
|
|
#define __kernel_cmpxchg (*(__kernel_cmpxchg_t *)0xffff0fc0)
|
|
|
|
|
|
|
|
|
|
JS_STATIC_ASSERT(sizeof(jsword) == sizeof(int));
|
|
|
|
|
|
|
|
|
|
static JS_ALWAYS_INLINE int
|
2025-03-19 21:25:58 +10:00
|
|
|
NativeCompareAndSwap(volatile jsword *w, jsword ov, jsword nv)
|
2025-02-03 12:35:24 +10:00
|
|
|
{
|
|
|
|
|
volatile int *vp = (volatile int *) w;
|
|
|
|
|
PRInt32 failed = 1;
|
2018-09-08 18:08:48 +08:00
|
|
|
|
2025-02-03 12:35:24 +10:00
|
|
|
/* Loop until a __kernel_cmpxchg succeeds. See bug 446169 */
|
|
|
|
|
do {
|
|
|
|
|
failed = __kernel_cmpxchg(ov, nv, vp);
|
|
|
|
|
} while (failed && *vp == ov);
|
|
|
|
|
return !failed;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#elif JS_HAS_NATIVE_COMPARE_AND_SWAP
|
|
|
|
|
|
|
|
|
|
#error "JS_HAS_NATIVE_COMPARE_AND_SWAP should be 0 if your platform lacks a compare-and-swap instruction."
|
2018-09-08 18:08:48 +08:00
|
|
|
|
|
|
|
|
#endif /* arch-tests */
|
|
|
|
|
|
2025-02-03 12:35:24 +10:00
|
|
|
#if JS_HAS_NATIVE_COMPARE_AND_SWAP
|
|
|
|
|
|
|
|
|
|
JSBool
|
2025-03-19 21:25:58 +10:00
|
|
|
js_CompareAndSwap(volatile jsword *w, jsword ov, jsword nv)
|
2025-02-03 12:35:24 +10:00
|
|
|
{
|
|
|
|
|
return !!NativeCompareAndSwap(w, ov, nv);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#elif defined(NSPR_LOCK)
|
|
|
|
|
|
|
|
|
|
# ifdef __GNUC__
|
2025-02-05 12:40:54 +10:00
|
|
|
# warning "js_CompareAndSwap is implemented using NSPR lock"
|
2025-02-03 12:35:24 +10:00
|
|
|
# endif
|
|
|
|
|
|
|
|
|
|
JSBool
|
2025-03-19 21:25:58 +10:00
|
|
|
js_CompareAndSwap(volatile jsword *w, jsword ov, jsword nv)
|
2025-02-03 12:35:24 +10:00
|
|
|
{
|
|
|
|
|
int result;
|
|
|
|
|
static PRLock *CompareAndSwapLock = JS_NEW_LOCK();
|
|
|
|
|
|
|
|
|
|
JS_ACQUIRE_LOCK(CompareAndSwapLock);
|
|
|
|
|
result = (*w == ov);
|
|
|
|
|
if (result)
|
|
|
|
|
*w = nv;
|
|
|
|
|
JS_RELEASE_LOCK(CompareAndSwapLock);
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#else /* !defined(NSPR_LOCK) */
|
|
|
|
|
|
|
|
|
|
#error "NSPR_LOCK should be on when the platform lacks native compare-and-swap."
|
|
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
|
2025-02-05 12:40:54 +10:00
|
|
|
void
|
2025-03-19 21:25:58 +10:00
|
|
|
js_AtomicSetMask(volatile jsword *w, jsword mask)
|
2025-02-05 12:40:54 +10:00
|
|
|
{
|
|
|
|
|
jsword ov, nv;
|
|
|
|
|
|
|
|
|
|
do {
|
|
|
|
|
ov = *w;
|
|
|
|
|
nv = ov | mask;
|
|
|
|
|
} while (!js_CompareAndSwap(w, ov, nv));
|
|
|
|
|
}
|
|
|
|
|
|
2025-03-19 21:25:58 +10:00
|
|
|
void
|
|
|
|
|
js_AtomicClearMask(volatile jsword *w, jsword mask)
|
|
|
|
|
{
|
|
|
|
|
jsword ov, nv;
|
|
|
|
|
|
|
|
|
|
do {
|
|
|
|
|
ov = *w;
|
|
|
|
|
nv = ov & ~mask;
|
|
|
|
|
} while (!js_CompareAndSwap(w, ov, nv));
|
|
|
|
|
}
|
|
|
|
|
|
2025-02-03 12:35:24 +10:00
|
|
|
#ifndef NSPR_LOCK
|
|
|
|
|
|
|
|
|
|
struct JSFatLock {
|
|
|
|
|
int susp;
|
|
|
|
|
PRLock *slock;
|
|
|
|
|
PRCondVar *svar;
|
|
|
|
|
JSFatLock *next;
|
|
|
|
|
JSFatLock **prevp;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
typedef struct JSFatLockTable {
|
|
|
|
|
JSFatLock *free;
|
|
|
|
|
JSFatLock *taken;
|
|
|
|
|
} JSFatLockTable;
|
|
|
|
|
|
|
|
|
|
#define GLOBAL_LOCK_INDEX(id) (((uint32)(jsuword)(id)>>2) & global_locks_mask)
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
js_Dequeue(JSThinLock *);
|
|
|
|
|
|
|
|
|
|
static PRLock **global_locks;
|
|
|
|
|
static uint32 global_lock_count = 1;
|
|
|
|
|
static uint32 global_locks_log2 = 0;
|
|
|
|
|
static uint32 global_locks_mask = 0;
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
js_LockGlobal(void *id)
|
|
|
|
|
{
|
|
|
|
|
uint32 i = GLOBAL_LOCK_INDEX(id);
|
|
|
|
|
PR_Lock(global_locks[i]);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
js_UnlockGlobal(void *id)
|
|
|
|
|
{
|
|
|
|
|
uint32 i = GLOBAL_LOCK_INDEX(id);
|
|
|
|
|
PR_Unlock(global_locks[i]);
|
|
|
|
|
}
|
|
|
|
|
|
2018-09-08 18:08:48 +08:00
|
|
|
#endif /* !NSPR_LOCK */
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
js_InitLock(JSThinLock *tl)
|
|
|
|
|
{
|
|
|
|
|
#ifdef NSPR_LOCK
|
|
|
|
|
tl->owner = 0;
|
|
|
|
|
tl->fat = (JSFatLock*)JS_NEW_LOCK();
|
|
|
|
|
#else
|
2025-02-05 12:40:54 +10:00
|
|
|
PodZero(tl);
|
2018-09-08 18:08:48 +08:00
|
|
|
#endif
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
js_FinishLock(JSThinLock *tl)
|
|
|
|
|
{
|
|
|
|
|
#ifdef NSPR_LOCK
|
|
|
|
|
tl->owner = 0xdeadbeef;
|
|
|
|
|
if (tl->fat)
|
|
|
|
|
JS_DESTROY_LOCK(((JSLock*)tl->fat));
|
|
|
|
|
#else
|
|
|
|
|
JS_ASSERT(tl->owner == 0);
|
|
|
|
|
JS_ASSERT(tl->fat == NULL);
|
|
|
|
|
#endif
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#ifndef NSPR_LOCK
|
|
|
|
|
|
|
|
|
|
static JSFatLock *
|
|
|
|
|
NewFatlock()
|
|
|
|
|
{
|
2025-02-05 12:40:54 +10:00
|
|
|
JSFatLock *fl = (JSFatLock *)js_malloc(sizeof(JSFatLock)); /* for now */
|
2018-09-08 18:08:48 +08:00
|
|
|
if (!fl) return NULL;
|
|
|
|
|
fl->susp = 0;
|
|
|
|
|
fl->next = NULL;
|
|
|
|
|
fl->prevp = NULL;
|
|
|
|
|
fl->slock = PR_NewLock();
|
|
|
|
|
fl->svar = PR_NewCondVar(fl->slock);
|
|
|
|
|
return fl;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
DestroyFatlock(JSFatLock *fl)
|
|
|
|
|
{
|
|
|
|
|
PR_DestroyLock(fl->slock);
|
|
|
|
|
PR_DestroyCondVar(fl->svar);
|
2025-02-05 12:40:54 +10:00
|
|
|
js_free(fl);
|
2018-09-08 18:08:48 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static JSFatLock *
|
|
|
|
|
ListOfFatlocks(int listc)
|
|
|
|
|
{
|
|
|
|
|
JSFatLock *m;
|
|
|
|
|
JSFatLock *m0;
|
|
|
|
|
int i;
|
|
|
|
|
|
|
|
|
|
JS_ASSERT(listc>0);
|
|
|
|
|
m0 = m = NewFatlock();
|
|
|
|
|
for (i=1; i<listc; i++) {
|
|
|
|
|
m->next = NewFatlock();
|
|
|
|
|
m = m->next;
|
|
|
|
|
}
|
|
|
|
|
return m0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
DeleteListOfFatlocks(JSFatLock *m)
|
|
|
|
|
{
|
|
|
|
|
JSFatLock *m0;
|
|
|
|
|
for (; m; m=m0) {
|
|
|
|
|
m0 = m->next;
|
|
|
|
|
DestroyFatlock(m);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static JSFatLockTable *fl_list_table = NULL;
|
|
|
|
|
static uint32 fl_list_table_len = 0;
|
|
|
|
|
static uint32 fl_list_chunk_len = 0;
|
|
|
|
|
|
|
|
|
|
static JSFatLock *
|
|
|
|
|
GetFatlock(void *id)
|
|
|
|
|
{
|
|
|
|
|
JSFatLock *m;
|
|
|
|
|
|
|
|
|
|
uint32 i = GLOBAL_LOCK_INDEX(id);
|
|
|
|
|
if (fl_list_table[i].free == NULL) {
|
|
|
|
|
#ifdef DEBUG
|
|
|
|
|
if (fl_list_table[i].taken)
|
|
|
|
|
printf("Ran out of fat locks!\n");
|
|
|
|
|
#endif
|
|
|
|
|
fl_list_table[i].free = ListOfFatlocks(fl_list_chunk_len);
|
|
|
|
|
}
|
|
|
|
|
m = fl_list_table[i].free;
|
|
|
|
|
fl_list_table[i].free = m->next;
|
|
|
|
|
m->susp = 0;
|
|
|
|
|
m->next = fl_list_table[i].taken;
|
|
|
|
|
m->prevp = &fl_list_table[i].taken;
|
|
|
|
|
if (fl_list_table[i].taken)
|
|
|
|
|
fl_list_table[i].taken->prevp = &m->next;
|
|
|
|
|
fl_list_table[i].taken = m;
|
|
|
|
|
return m;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
PutFatlock(JSFatLock *m, void *id)
|
|
|
|
|
{
|
|
|
|
|
uint32 i;
|
|
|
|
|
if (m == NULL)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
/* Unlink m from fl_list_table[i].taken. */
|
|
|
|
|
*m->prevp = m->next;
|
|
|
|
|
if (m->next)
|
|
|
|
|
m->next->prevp = m->prevp;
|
|
|
|
|
|
|
|
|
|
/* Insert m in fl_list_table[i].free. */
|
|
|
|
|
i = GLOBAL_LOCK_INDEX(id);
|
|
|
|
|
m->next = fl_list_table[i].free;
|
|
|
|
|
fl_list_table[i].free = m;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#endif /* !NSPR_LOCK */
|
|
|
|
|
|
|
|
|
|
JSBool
|
|
|
|
|
js_SetupLocks(int listc, int globc)
|
|
|
|
|
{
|
|
|
|
|
#ifndef NSPR_LOCK
|
|
|
|
|
uint32 i;
|
|
|
|
|
|
|
|
|
|
if (global_locks)
|
|
|
|
|
return JS_TRUE;
|
|
|
|
|
#ifdef DEBUG
|
|
|
|
|
if (listc > 10000 || listc < 0) /* listc == fat lock list chunk length */
|
|
|
|
|
printf("Bad number %d in js_SetupLocks()!\n", listc);
|
|
|
|
|
if (globc > 100 || globc < 0) /* globc == number of global locks */
|
|
|
|
|
printf("Bad number %d in js_SetupLocks()!\n", listc);
|
|
|
|
|
#endif
|
|
|
|
|
global_locks_log2 = JS_CeilingLog2(globc);
|
|
|
|
|
global_locks_mask = JS_BITMASK(global_locks_log2);
|
|
|
|
|
global_lock_count = JS_BIT(global_locks_log2);
|
2025-02-05 12:40:54 +10:00
|
|
|
global_locks = (PRLock **) js_malloc(global_lock_count * sizeof(PRLock*));
|
2018-09-08 18:08:48 +08:00
|
|
|
if (!global_locks)
|
|
|
|
|
return JS_FALSE;
|
|
|
|
|
for (i = 0; i < global_lock_count; i++) {
|
|
|
|
|
global_locks[i] = PR_NewLock();
|
|
|
|
|
if (!global_locks[i]) {
|
|
|
|
|
global_lock_count = i;
|
|
|
|
|
js_CleanupLocks();
|
|
|
|
|
return JS_FALSE;
|
|
|
|
|
}
|
|
|
|
|
}
|
2025-02-05 12:40:54 +10:00
|
|
|
fl_list_table = (JSFatLockTable *) js_malloc(i * sizeof(JSFatLockTable));
|
2018-09-08 18:08:48 +08:00
|
|
|
if (!fl_list_table) {
|
|
|
|
|
js_CleanupLocks();
|
|
|
|
|
return JS_FALSE;
|
|
|
|
|
}
|
|
|
|
|
fl_list_table_len = global_lock_count;
|
|
|
|
|
for (i = 0; i < global_lock_count; i++)
|
|
|
|
|
fl_list_table[i].free = fl_list_table[i].taken = NULL;
|
|
|
|
|
fl_list_chunk_len = listc;
|
|
|
|
|
#endif /* !NSPR_LOCK */
|
|
|
|
|
return JS_TRUE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
js_CleanupLocks()
|
|
|
|
|
{
|
|
|
|
|
#ifndef NSPR_LOCK
|
|
|
|
|
uint32 i;
|
|
|
|
|
|
|
|
|
|
if (global_locks) {
|
|
|
|
|
for (i = 0; i < global_lock_count; i++)
|
|
|
|
|
PR_DestroyLock(global_locks[i]);
|
2025-02-05 12:40:54 +10:00
|
|
|
js_free(global_locks);
|
2018-09-08 18:08:48 +08:00
|
|
|
global_locks = NULL;
|
|
|
|
|
global_lock_count = 1;
|
|
|
|
|
global_locks_log2 = 0;
|
|
|
|
|
global_locks_mask = 0;
|
|
|
|
|
}
|
|
|
|
|
if (fl_list_table) {
|
|
|
|
|
for (i = 0; i < fl_list_table_len; i++) {
|
|
|
|
|
DeleteListOfFatlocks(fl_list_table[i].free);
|
|
|
|
|
fl_list_table[i].free = NULL;
|
|
|
|
|
DeleteListOfFatlocks(fl_list_table[i].taken);
|
|
|
|
|
fl_list_table[i].taken = NULL;
|
|
|
|
|
}
|
2025-02-05 12:40:54 +10:00
|
|
|
js_free(fl_list_table);
|
2018-09-08 18:08:48 +08:00
|
|
|
fl_list_table = NULL;
|
|
|
|
|
fl_list_table_len = 0;
|
|
|
|
|
}
|
|
|
|
|
#endif /* !NSPR_LOCK */
|
|
|
|
|
}
|
|
|
|
|
|
2025-02-03 12:35:24 +10:00
|
|
|
#ifdef NSPR_LOCK
|
|
|
|
|
|
|
|
|
|
static JS_ALWAYS_INLINE void
|
|
|
|
|
ThinLock(JSThinLock *tl, jsword me)
|
|
|
|
|
{
|
|
|
|
|
JS_ACQUIRE_LOCK((JSLock *) tl->fat);
|
|
|
|
|
tl->owner = me;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static JS_ALWAYS_INLINE void
|
|
|
|
|
ThinUnlock(JSThinLock *tl, jsword /*me*/)
|
|
|
|
|
{
|
|
|
|
|
tl->owner = 0;
|
|
|
|
|
JS_RELEASE_LOCK((JSLock *) tl->fat);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#else
|
2018-09-08 18:08:48 +08:00
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Fast locking and unlocking is implemented by delaying the allocation of a
|
|
|
|
|
* system lock (fat lock) until contention. As long as a locking thread A
|
|
|
|
|
* runs uncontended, the lock is represented solely by storing A's identity in
|
|
|
|
|
* the object being locked.
|
|
|
|
|
*
|
|
|
|
|
* If another thread B tries to lock the object currently locked by A, B is
|
|
|
|
|
* enqueued into a fat lock structure (which might have to be allocated and
|
|
|
|
|
* pointed to by the object), and suspended using NSPR conditional variables
|
|
|
|
|
* (wait). A wait bit (Bacon bit) is set in the lock word of the object,
|
|
|
|
|
* signalling to A that when releasing the lock, B must be dequeued and
|
|
|
|
|
* notified.
|
|
|
|
|
*
|
|
|
|
|
* The basic operation of the locking primitives (js_Lock, js_Unlock,
|
|
|
|
|
* js_Enqueue, and js_Dequeue) is compare-and-swap. Hence, when locking into
|
|
|
|
|
* the word pointed at by p, compare-and-swap(p, 0, A) success implies that p
|
|
|
|
|
* is unlocked. Similarly, when unlocking p, if compare-and-swap(p, A, 0)
|
|
|
|
|
* succeeds this implies that p is uncontended (no one is waiting because the
|
|
|
|
|
* wait bit is not set).
|
|
|
|
|
*
|
|
|
|
|
* When dequeueing, the lock is released, and one of the threads suspended on
|
|
|
|
|
* the lock is notified. If other threads still are waiting, the wait bit is
|
|
|
|
|
* kept (in js_Enqueue), and if not, the fat lock is deallocated.
|
|
|
|
|
*
|
|
|
|
|
* The functions js_Enqueue, js_Dequeue, js_SuspendThread, and js_ResumeThread
|
|
|
|
|
* are serialized using a global lock. For scalability, a hashtable of global
|
|
|
|
|
* locks is used, which is indexed modulo the thin lock pointer.
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Invariants:
|
|
|
|
|
* (i) global lock is held
|
|
|
|
|
* (ii) fl->susp >= 0
|
|
|
|
|
*/
|
|
|
|
|
static int
|
|
|
|
|
js_SuspendThread(JSThinLock *tl)
|
|
|
|
|
{
|
|
|
|
|
JSFatLock *fl;
|
|
|
|
|
PRStatus stat;
|
|
|
|
|
|
|
|
|
|
if (tl->fat == NULL)
|
|
|
|
|
fl = tl->fat = GetFatlock(tl);
|
|
|
|
|
else
|
|
|
|
|
fl = tl->fat;
|
|
|
|
|
JS_ASSERT(fl->susp >= 0);
|
|
|
|
|
fl->susp++;
|
|
|
|
|
PR_Lock(fl->slock);
|
|
|
|
|
js_UnlockGlobal(tl);
|
|
|
|
|
stat = PR_WaitCondVar(fl->svar, PR_INTERVAL_NO_TIMEOUT);
|
|
|
|
|
JS_ASSERT(stat != PR_FAILURE);
|
|
|
|
|
PR_Unlock(fl->slock);
|
|
|
|
|
js_LockGlobal(tl);
|
|
|
|
|
fl->susp--;
|
|
|
|
|
if (fl->susp == 0) {
|
|
|
|
|
PutFatlock(fl, tl);
|
|
|
|
|
tl->fat = NULL;
|
|
|
|
|
}
|
|
|
|
|
return tl->fat == NULL;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* (i) global lock is held
|
|
|
|
|
* (ii) fl->susp > 0
|
|
|
|
|
*/
|
|
|
|
|
static void
|
|
|
|
|
js_ResumeThread(JSThinLock *tl)
|
|
|
|
|
{
|
|
|
|
|
JSFatLock *fl = tl->fat;
|
|
|
|
|
PRStatus stat;
|
|
|
|
|
|
|
|
|
|
JS_ASSERT(fl != NULL);
|
|
|
|
|
JS_ASSERT(fl->susp > 0);
|
|
|
|
|
PR_Lock(fl->slock);
|
|
|
|
|
js_UnlockGlobal(tl);
|
|
|
|
|
stat = PR_NotifyCondVar(fl->svar);
|
|
|
|
|
JS_ASSERT(stat != PR_FAILURE);
|
|
|
|
|
PR_Unlock(fl->slock);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
js_Enqueue(JSThinLock *tl, jsword me)
|
|
|
|
|
{
|
|
|
|
|
jsword o, n;
|
|
|
|
|
|
|
|
|
|
js_LockGlobal(tl);
|
|
|
|
|
for (;;) {
|
|
|
|
|
o = ReadWord(tl->owner);
|
|
|
|
|
n = Thin_SetWait(o);
|
2025-02-03 12:35:24 +10:00
|
|
|
if (o != 0 && NativeCompareAndSwap(&tl->owner, o, n)) {
|
2018-09-08 18:08:48 +08:00
|
|
|
if (js_SuspendThread(tl))
|
|
|
|
|
me = Thin_RemoveWait(me);
|
|
|
|
|
else
|
|
|
|
|
me = Thin_SetWait(me);
|
|
|
|
|
}
|
2025-02-03 12:35:24 +10:00
|
|
|
else if (NativeCompareAndSwap(&tl->owner, 0, me)) {
|
2018-09-08 18:08:48 +08:00
|
|
|
js_UnlockGlobal(tl);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
js_Dequeue(JSThinLock *tl)
|
|
|
|
|
{
|
|
|
|
|
jsword o;
|
|
|
|
|
|
|
|
|
|
js_LockGlobal(tl);
|
|
|
|
|
o = ReadWord(tl->owner);
|
|
|
|
|
JS_ASSERT(Thin_GetWait(o) != 0);
|
|
|
|
|
JS_ASSERT(tl->fat != NULL);
|
2025-02-03 12:35:24 +10:00
|
|
|
if (!NativeCompareAndSwap(&tl->owner, o, 0)) /* release it */
|
2018-09-08 18:08:48 +08:00
|
|
|
JS_ASSERT(0);
|
|
|
|
|
js_ResumeThread(tl);
|
|
|
|
|
}
|
|
|
|
|
|
2025-02-03 12:35:24 +10:00
|
|
|
static JS_ALWAYS_INLINE void
|
|
|
|
|
ThinLock(JSThinLock *tl, jsword me)
|
2018-09-08 18:08:48 +08:00
|
|
|
{
|
Numerous changes with focus on feature and stability parity across Windows, Linux and MacOS platforms
Added new Makefile that handles compiling UOX3 and Spidermonkey on both Linux and MacOS (punt)
Added VS solution (SpiderMonkey.sln) and VC++ project files for compiling SpiderMonkey on Windows (Xuri)
Updated SpiderMonkey from v1.6.0 to v1.7.0
Added optimization flag -O2 for release build in CMakeLists.txt in project root (Xuri)
Added StringUtility file with general common string manipulation functions (punt)
Updated RandomNum function to use a "seedless" random number generator from C++11 instead of the old C rand() function. (punt)
Overall code cleanup to remove/replace platform-dependent code (punt)
Replaced potentially unsafe usage of C string stuff like sprintf, vsprintf, vsnprintf, strncat, strcpy and strlen throughout the code with calls to a format() function containing only a single, safe use of vsnprintf, ensuring there's a single place of failure if there's anything to fix and and making it easy to potentially replace this with std::format from C++20 when the time comes. (punt)
Replaced usage of char in many places with std::string (punt)
Started process of replacing UString usage with functions provided through StringUtility instead (punt)
Replaced platform specific fileIO handling in Windows/Linux with cross-platform C++17 standard std::filesystem (punt)
Replaced platform specific time handling by using cross-platform chrono library (punt)
Removed UOX namespace to reduce complexity (punt)
Elimitated template code approach to singletons for more modern c++ constructs, removing dependices in the process (punt)
Removed ODBC support; it hasn't been touched since the initial implementation in 2008, and there is a lack of someone to maintain the code. (punt)
Removed some platform specific files like uoxlinux.h, which is no longer required (punt)
Removed legacy crash protection code, and removed support for cluox (punt)
Removed legacy "support" for Borland compiler (punt)
Removed legacy VC++ 6 Workspace/Project files, VS2005 Solution/Project files, as these are no longer supported (Xuri)
Removed legacy BUILD folder with outdated compilation instructions (Xuri)
Removed old Changelog file (merged into Changelog.txt) (Xuri)
Fixed a pointer bug for items in multis on world load (punt)
Fixed a dictionary related issue that caused segmentation faults on Linux/MacOS (punt)
Fixed an issue with callbacks to JS scripts that caused segmentation faults on Linux/MacOS (punt)
Paths in uox.ini should now load properly on all platforms regardless of whether those paths use slashes or backslashes, and whether or not they end in a slash/backslash. (punt)
Moved to c++17 style of threading, and got rid of threadsafeobject.cpp/h (punt)
Replaced parsing of UOX.INI tags with a system that's more easily maintainable (punt)
Added some new commands to js/commands/custom/misc-cmd.js (Xuri)
cont // Targeted item will be made a container, set to nondecay and movable 2
endfight // Targeted character (and character being fought) will stop fighting
getmulti // Get multiObject for targeted item
finditem // Find item at layer X
movespeed // Set movement speed of target player (0x0 Normal, 0x1 Mounted, 0x2 Slow (walk only), 0x3 Hybrid ("jog"?), 0x4 Frozen)
Added new HTML based documentation in docs folder, and removed many old legacy docs that are either incorporated into this document already or no longer relevant for the current UOX3 version (Xuri)
Co-Authored-By: Charles Kerr <punt1959@users.noreply.github.com>
2020-09-07 18:09:55 +08:00
|
|
|
JS_ASSERT(CURRENT_THREAD_IS_ME(me));
|
2025-02-03 12:35:24 +10:00
|
|
|
if (NativeCompareAndSwap(&tl->owner, 0, me))
|
2018-09-08 18:08:48 +08:00
|
|
|
return;
|
|
|
|
|
if (Thin_RemoveWait(ReadWord(tl->owner)) != me)
|
|
|
|
|
js_Enqueue(tl, me);
|
|
|
|
|
#ifdef DEBUG
|
|
|
|
|
else
|
|
|
|
|
JS_ASSERT(0);
|
|
|
|
|
#endif
|
|
|
|
|
}
|
|
|
|
|
|
2025-02-03 12:35:24 +10:00
|
|
|
static JS_ALWAYS_INLINE void
|
|
|
|
|
ThinUnlock(JSThinLock *tl, jsword me)
|
2018-09-08 18:08:48 +08:00
|
|
|
{
|
Numerous changes with focus on feature and stability parity across Windows, Linux and MacOS platforms
Added new Makefile that handles compiling UOX3 and Spidermonkey on both Linux and MacOS (punt)
Added VS solution (SpiderMonkey.sln) and VC++ project files for compiling SpiderMonkey on Windows (Xuri)
Updated SpiderMonkey from v1.6.0 to v1.7.0
Added optimization flag -O2 for release build in CMakeLists.txt in project root (Xuri)
Added StringUtility file with general common string manipulation functions (punt)
Updated RandomNum function to use a "seedless" random number generator from C++11 instead of the old C rand() function. (punt)
Overall code cleanup to remove/replace platform-dependent code (punt)
Replaced potentially unsafe usage of C string stuff like sprintf, vsprintf, vsnprintf, strncat, strcpy and strlen throughout the code with calls to a format() function containing only a single, safe use of vsnprintf, ensuring there's a single place of failure if there's anything to fix and and making it easy to potentially replace this with std::format from C++20 when the time comes. (punt)
Replaced usage of char in many places with std::string (punt)
Started process of replacing UString usage with functions provided through StringUtility instead (punt)
Replaced platform specific fileIO handling in Windows/Linux with cross-platform C++17 standard std::filesystem (punt)
Replaced platform specific time handling by using cross-platform chrono library (punt)
Removed UOX namespace to reduce complexity (punt)
Elimitated template code approach to singletons for more modern c++ constructs, removing dependices in the process (punt)
Removed ODBC support; it hasn't been touched since the initial implementation in 2008, and there is a lack of someone to maintain the code. (punt)
Removed some platform specific files like uoxlinux.h, which is no longer required (punt)
Removed legacy crash protection code, and removed support for cluox (punt)
Removed legacy "support" for Borland compiler (punt)
Removed legacy VC++ 6 Workspace/Project files, VS2005 Solution/Project files, as these are no longer supported (Xuri)
Removed legacy BUILD folder with outdated compilation instructions (Xuri)
Removed old Changelog file (merged into Changelog.txt) (Xuri)
Fixed a pointer bug for items in multis on world load (punt)
Fixed a dictionary related issue that caused segmentation faults on Linux/MacOS (punt)
Fixed an issue with callbacks to JS scripts that caused segmentation faults on Linux/MacOS (punt)
Paths in uox.ini should now load properly on all platforms regardless of whether those paths use slashes or backslashes, and whether or not they end in a slash/backslash. (punt)
Moved to c++17 style of threading, and got rid of threadsafeobject.cpp/h (punt)
Replaced parsing of UOX.INI tags with a system that's more easily maintainable (punt)
Added some new commands to js/commands/custom/misc-cmd.js (Xuri)
cont // Targeted item will be made a container, set to nondecay and movable 2
endfight // Targeted character (and character being fought) will stop fighting
getmulti // Get multiObject for targeted item
finditem // Find item at layer X
movespeed // Set movement speed of target player (0x0 Normal, 0x1 Mounted, 0x2 Slow (walk only), 0x3 Hybrid ("jog"?), 0x4 Frozen)
Added new HTML based documentation in docs folder, and removed many old legacy docs that are either incorporated into this document already or no longer relevant for the current UOX3 version (Xuri)
Co-Authored-By: Charles Kerr <punt1959@users.noreply.github.com>
2020-09-07 18:09:55 +08:00
|
|
|
JS_ASSERT(CURRENT_THREAD_IS_ME(me));
|
|
|
|
|
|
|
|
|
|
/*
|
2025-02-03 12:35:24 +10:00
|
|
|
* Since we can race with the NativeCompareAndSwap in js_Enqueue, we need
|
2023-07-12 13:27:26 +10:00
|
|
|
* to use a C_A_S here as well -- Arjan van de Ven 30/1/08
|
Numerous changes with focus on feature and stability parity across Windows, Linux and MacOS platforms
Added new Makefile that handles compiling UOX3 and Spidermonkey on both Linux and MacOS (punt)
Added VS solution (SpiderMonkey.sln) and VC++ project files for compiling SpiderMonkey on Windows (Xuri)
Updated SpiderMonkey from v1.6.0 to v1.7.0
Added optimization flag -O2 for release build in CMakeLists.txt in project root (Xuri)
Added StringUtility file with general common string manipulation functions (punt)
Updated RandomNum function to use a "seedless" random number generator from C++11 instead of the old C rand() function. (punt)
Overall code cleanup to remove/replace platform-dependent code (punt)
Replaced potentially unsafe usage of C string stuff like sprintf, vsprintf, vsnprintf, strncat, strcpy and strlen throughout the code with calls to a format() function containing only a single, safe use of vsnprintf, ensuring there's a single place of failure if there's anything to fix and and making it easy to potentially replace this with std::format from C++20 when the time comes. (punt)
Replaced usage of char in many places with std::string (punt)
Started process of replacing UString usage with functions provided through StringUtility instead (punt)
Replaced platform specific fileIO handling in Windows/Linux with cross-platform C++17 standard std::filesystem (punt)
Replaced platform specific time handling by using cross-platform chrono library (punt)
Removed UOX namespace to reduce complexity (punt)
Elimitated template code approach to singletons for more modern c++ constructs, removing dependices in the process (punt)
Removed ODBC support; it hasn't been touched since the initial implementation in 2008, and there is a lack of someone to maintain the code. (punt)
Removed some platform specific files like uoxlinux.h, which is no longer required (punt)
Removed legacy crash protection code, and removed support for cluox (punt)
Removed legacy "support" for Borland compiler (punt)
Removed legacy VC++ 6 Workspace/Project files, VS2005 Solution/Project files, as these are no longer supported (Xuri)
Removed legacy BUILD folder with outdated compilation instructions (Xuri)
Removed old Changelog file (merged into Changelog.txt) (Xuri)
Fixed a pointer bug for items in multis on world load (punt)
Fixed a dictionary related issue that caused segmentation faults on Linux/MacOS (punt)
Fixed an issue with callbacks to JS scripts that caused segmentation faults on Linux/MacOS (punt)
Paths in uox.ini should now load properly on all platforms regardless of whether those paths use slashes or backslashes, and whether or not they end in a slash/backslash. (punt)
Moved to c++17 style of threading, and got rid of threadsafeobject.cpp/h (punt)
Replaced parsing of UOX.INI tags with a system that's more easily maintainable (punt)
Added some new commands to js/commands/custom/misc-cmd.js (Xuri)
cont // Targeted item will be made a container, set to nondecay and movable 2
endfight // Targeted character (and character being fought) will stop fighting
getmulti // Get multiObject for targeted item
finditem // Find item at layer X
movespeed // Set movement speed of target player (0x0 Normal, 0x1 Mounted, 0x2 Slow (walk only), 0x3 Hybrid ("jog"?), 0x4 Frozen)
Added new HTML based documentation in docs folder, and removed many old legacy docs that are either incorporated into this document already or no longer relevant for the current UOX3 version (Xuri)
Co-Authored-By: Charles Kerr <punt1959@users.noreply.github.com>
2020-09-07 18:09:55 +08:00
|
|
|
*/
|
2025-02-03 12:35:24 +10:00
|
|
|
if (NativeCompareAndSwap(&tl->owner, me, 0))
|
2018-09-08 18:08:48 +08:00
|
|
|
return;
|
2023-07-12 13:27:26 +10:00
|
|
|
|
Numerous changes with focus on feature and stability parity across Windows, Linux and MacOS platforms
Added new Makefile that handles compiling UOX3 and Spidermonkey on both Linux and MacOS (punt)
Added VS solution (SpiderMonkey.sln) and VC++ project files for compiling SpiderMonkey on Windows (Xuri)
Updated SpiderMonkey from v1.6.0 to v1.7.0
Added optimization flag -O2 for release build in CMakeLists.txt in project root (Xuri)
Added StringUtility file with general common string manipulation functions (punt)
Updated RandomNum function to use a "seedless" random number generator from C++11 instead of the old C rand() function. (punt)
Overall code cleanup to remove/replace platform-dependent code (punt)
Replaced potentially unsafe usage of C string stuff like sprintf, vsprintf, vsnprintf, strncat, strcpy and strlen throughout the code with calls to a format() function containing only a single, safe use of vsnprintf, ensuring there's a single place of failure if there's anything to fix and and making it easy to potentially replace this with std::format from C++20 when the time comes. (punt)
Replaced usage of char in many places with std::string (punt)
Started process of replacing UString usage with functions provided through StringUtility instead (punt)
Replaced platform specific fileIO handling in Windows/Linux with cross-platform C++17 standard std::filesystem (punt)
Replaced platform specific time handling by using cross-platform chrono library (punt)
Removed UOX namespace to reduce complexity (punt)
Elimitated template code approach to singletons for more modern c++ constructs, removing dependices in the process (punt)
Removed ODBC support; it hasn't been touched since the initial implementation in 2008, and there is a lack of someone to maintain the code. (punt)
Removed some platform specific files like uoxlinux.h, which is no longer required (punt)
Removed legacy crash protection code, and removed support for cluox (punt)
Removed legacy "support" for Borland compiler (punt)
Removed legacy VC++ 6 Workspace/Project files, VS2005 Solution/Project files, as these are no longer supported (Xuri)
Removed legacy BUILD folder with outdated compilation instructions (Xuri)
Removed old Changelog file (merged into Changelog.txt) (Xuri)
Fixed a pointer bug for items in multis on world load (punt)
Fixed a dictionary related issue that caused segmentation faults on Linux/MacOS (punt)
Fixed an issue with callbacks to JS scripts that caused segmentation faults on Linux/MacOS (punt)
Paths in uox.ini should now load properly on all platforms regardless of whether those paths use slashes or backslashes, and whether or not they end in a slash/backslash. (punt)
Moved to c++17 style of threading, and got rid of threadsafeobject.cpp/h (punt)
Replaced parsing of UOX.INI tags with a system that's more easily maintainable (punt)
Added some new commands to js/commands/custom/misc-cmd.js (Xuri)
cont // Targeted item will be made a container, set to nondecay and movable 2
endfight // Targeted character (and character being fought) will stop fighting
getmulti // Get multiObject for targeted item
finditem // Find item at layer X
movespeed // Set movement speed of target player (0x0 Normal, 0x1 Mounted, 0x2 Slow (walk only), 0x3 Hybrid ("jog"?), 0x4 Frozen)
Added new HTML based documentation in docs folder, and removed many old legacy docs that are either incorporated into this document already or no longer relevant for the current UOX3 version (Xuri)
Co-Authored-By: Charles Kerr <punt1959@users.noreply.github.com>
2020-09-07 18:09:55 +08:00
|
|
|
JS_ASSERT(Thin_GetWait(tl->owner));
|
2018-09-08 18:08:48 +08:00
|
|
|
if (Thin_RemoveWait(ReadWord(tl->owner)) == me)
|
|
|
|
|
js_Dequeue(tl);
|
|
|
|
|
#ifdef DEBUG
|
|
|
|
|
else
|
Numerous changes with focus on feature and stability parity across Windows, Linux and MacOS platforms
Added new Makefile that handles compiling UOX3 and Spidermonkey on both Linux and MacOS (punt)
Added VS solution (SpiderMonkey.sln) and VC++ project files for compiling SpiderMonkey on Windows (Xuri)
Updated SpiderMonkey from v1.6.0 to v1.7.0
Added optimization flag -O2 for release build in CMakeLists.txt in project root (Xuri)
Added StringUtility file with general common string manipulation functions (punt)
Updated RandomNum function to use a "seedless" random number generator from C++11 instead of the old C rand() function. (punt)
Overall code cleanup to remove/replace platform-dependent code (punt)
Replaced potentially unsafe usage of C string stuff like sprintf, vsprintf, vsnprintf, strncat, strcpy and strlen throughout the code with calls to a format() function containing only a single, safe use of vsnprintf, ensuring there's a single place of failure if there's anything to fix and and making it easy to potentially replace this with std::format from C++20 when the time comes. (punt)
Replaced usage of char in many places with std::string (punt)
Started process of replacing UString usage with functions provided through StringUtility instead (punt)
Replaced platform specific fileIO handling in Windows/Linux with cross-platform C++17 standard std::filesystem (punt)
Replaced platform specific time handling by using cross-platform chrono library (punt)
Removed UOX namespace to reduce complexity (punt)
Elimitated template code approach to singletons for more modern c++ constructs, removing dependices in the process (punt)
Removed ODBC support; it hasn't been touched since the initial implementation in 2008, and there is a lack of someone to maintain the code. (punt)
Removed some platform specific files like uoxlinux.h, which is no longer required (punt)
Removed legacy crash protection code, and removed support for cluox (punt)
Removed legacy "support" for Borland compiler (punt)
Removed legacy VC++ 6 Workspace/Project files, VS2005 Solution/Project files, as these are no longer supported (Xuri)
Removed legacy BUILD folder with outdated compilation instructions (Xuri)
Removed old Changelog file (merged into Changelog.txt) (Xuri)
Fixed a pointer bug for items in multis on world load (punt)
Fixed a dictionary related issue that caused segmentation faults on Linux/MacOS (punt)
Fixed an issue with callbacks to JS scripts that caused segmentation faults on Linux/MacOS (punt)
Paths in uox.ini should now load properly on all platforms regardless of whether those paths use slashes or backslashes, and whether or not they end in a slash/backslash. (punt)
Moved to c++17 style of threading, and got rid of threadsafeobject.cpp/h (punt)
Replaced parsing of UOX.INI tags with a system that's more easily maintainable (punt)
Added some new commands to js/commands/custom/misc-cmd.js (Xuri)
cont // Targeted item will be made a container, set to nondecay and movable 2
endfight // Targeted character (and character being fought) will stop fighting
getmulti // Get multiObject for targeted item
finditem // Find item at layer X
movespeed // Set movement speed of target player (0x0 Normal, 0x1 Mounted, 0x2 Slow (walk only), 0x3 Hybrid ("jog"?), 0x4 Frozen)
Added new HTML based documentation in docs folder, and removed many old legacy docs that are either incorporated into this document already or no longer relevant for the current UOX3 version (Xuri)
Co-Authored-By: Charles Kerr <punt1959@users.noreply.github.com>
2020-09-07 18:09:55 +08:00
|
|
|
JS_ASSERT(0); /* unbalanced unlock */
|
2018-09-08 18:08:48 +08:00
|
|
|
#endif
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#endif /* !NSPR_LOCK */
|
|
|
|
|
|
2025-02-03 12:35:24 +10:00
|
|
|
void
|
|
|
|
|
js_Lock(JSContext *cx, JSThinLock *tl)
|
|
|
|
|
{
|
|
|
|
|
ThinLock(tl, CX_THINLOCK_ID(cx));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
js_Unlock(JSContext *cx, JSThinLock *tl)
|
|
|
|
|
{
|
|
|
|
|
ThinUnlock(tl, CX_THINLOCK_ID(cx));
|
|
|
|
|
}
|
|
|
|
|
|
2018-09-08 18:08:48 +08:00
|
|
|
void
|
|
|
|
|
js_LockRuntime(JSRuntime *rt)
|
|
|
|
|
{
|
|
|
|
|
PR_Lock(rt->rtLock);
|
|
|
|
|
#ifdef DEBUG
|
Numerous changes with focus on feature and stability parity across Windows, Linux and MacOS platforms
Added new Makefile that handles compiling UOX3 and Spidermonkey on both Linux and MacOS (punt)
Added VS solution (SpiderMonkey.sln) and VC++ project files for compiling SpiderMonkey on Windows (Xuri)
Updated SpiderMonkey from v1.6.0 to v1.7.0
Added optimization flag -O2 for release build in CMakeLists.txt in project root (Xuri)
Added StringUtility file with general common string manipulation functions (punt)
Updated RandomNum function to use a "seedless" random number generator from C++11 instead of the old C rand() function. (punt)
Overall code cleanup to remove/replace platform-dependent code (punt)
Replaced potentially unsafe usage of C string stuff like sprintf, vsprintf, vsnprintf, strncat, strcpy and strlen throughout the code with calls to a format() function containing only a single, safe use of vsnprintf, ensuring there's a single place of failure if there's anything to fix and and making it easy to potentially replace this with std::format from C++20 when the time comes. (punt)
Replaced usage of char in many places with std::string (punt)
Started process of replacing UString usage with functions provided through StringUtility instead (punt)
Replaced platform specific fileIO handling in Windows/Linux with cross-platform C++17 standard std::filesystem (punt)
Replaced platform specific time handling by using cross-platform chrono library (punt)
Removed UOX namespace to reduce complexity (punt)
Elimitated template code approach to singletons for more modern c++ constructs, removing dependices in the process (punt)
Removed ODBC support; it hasn't been touched since the initial implementation in 2008, and there is a lack of someone to maintain the code. (punt)
Removed some platform specific files like uoxlinux.h, which is no longer required (punt)
Removed legacy crash protection code, and removed support for cluox (punt)
Removed legacy "support" for Borland compiler (punt)
Removed legacy VC++ 6 Workspace/Project files, VS2005 Solution/Project files, as these are no longer supported (Xuri)
Removed legacy BUILD folder with outdated compilation instructions (Xuri)
Removed old Changelog file (merged into Changelog.txt) (Xuri)
Fixed a pointer bug for items in multis on world load (punt)
Fixed a dictionary related issue that caused segmentation faults on Linux/MacOS (punt)
Fixed an issue with callbacks to JS scripts that caused segmentation faults on Linux/MacOS (punt)
Paths in uox.ini should now load properly on all platforms regardless of whether those paths use slashes or backslashes, and whether or not they end in a slash/backslash. (punt)
Moved to c++17 style of threading, and got rid of threadsafeobject.cpp/h (punt)
Replaced parsing of UOX.INI tags with a system that's more easily maintainable (punt)
Added some new commands to js/commands/custom/misc-cmd.js (Xuri)
cont // Targeted item will be made a container, set to nondecay and movable 2
endfight // Targeted character (and character being fought) will stop fighting
getmulti // Get multiObject for targeted item
finditem // Find item at layer X
movespeed // Set movement speed of target player (0x0 Normal, 0x1 Mounted, 0x2 Slow (walk only), 0x3 Hybrid ("jog"?), 0x4 Frozen)
Added new HTML based documentation in docs folder, and removed many old legacy docs that are either incorporated into this document already or no longer relevant for the current UOX3 version (Xuri)
Co-Authored-By: Charles Kerr <punt1959@users.noreply.github.com>
2020-09-07 18:09:55 +08:00
|
|
|
rt->rtLockOwner = js_CurrentThreadId();
|
2018-09-08 18:08:48 +08:00
|
|
|
#endif
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
js_UnlockRuntime(JSRuntime *rt)
|
|
|
|
|
{
|
|
|
|
|
#ifdef DEBUG
|
2025-02-05 12:40:54 +10:00
|
|
|
rt->rtLockOwner = NULL;
|
2018-09-08 18:08:48 +08:00
|
|
|
#endif
|
|
|
|
|
PR_Unlock(rt->rtLock);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#ifdef DEBUG
|
|
|
|
|
JSBool
|
|
|
|
|
js_IsRuntimeLocked(JSRuntime *rt)
|
|
|
|
|
{
|
Numerous changes with focus on feature and stability parity across Windows, Linux and MacOS platforms
Added new Makefile that handles compiling UOX3 and Spidermonkey on both Linux and MacOS (punt)
Added VS solution (SpiderMonkey.sln) and VC++ project files for compiling SpiderMonkey on Windows (Xuri)
Updated SpiderMonkey from v1.6.0 to v1.7.0
Added optimization flag -O2 for release build in CMakeLists.txt in project root (Xuri)
Added StringUtility file with general common string manipulation functions (punt)
Updated RandomNum function to use a "seedless" random number generator from C++11 instead of the old C rand() function. (punt)
Overall code cleanup to remove/replace platform-dependent code (punt)
Replaced potentially unsafe usage of C string stuff like sprintf, vsprintf, vsnprintf, strncat, strcpy and strlen throughout the code with calls to a format() function containing only a single, safe use of vsnprintf, ensuring there's a single place of failure if there's anything to fix and and making it easy to potentially replace this with std::format from C++20 when the time comes. (punt)
Replaced usage of char in many places with std::string (punt)
Started process of replacing UString usage with functions provided through StringUtility instead (punt)
Replaced platform specific fileIO handling in Windows/Linux with cross-platform C++17 standard std::filesystem (punt)
Replaced platform specific time handling by using cross-platform chrono library (punt)
Removed UOX namespace to reduce complexity (punt)
Elimitated template code approach to singletons for more modern c++ constructs, removing dependices in the process (punt)
Removed ODBC support; it hasn't been touched since the initial implementation in 2008, and there is a lack of someone to maintain the code. (punt)
Removed some platform specific files like uoxlinux.h, which is no longer required (punt)
Removed legacy crash protection code, and removed support for cluox (punt)
Removed legacy "support" for Borland compiler (punt)
Removed legacy VC++ 6 Workspace/Project files, VS2005 Solution/Project files, as these are no longer supported (Xuri)
Removed legacy BUILD folder with outdated compilation instructions (Xuri)
Removed old Changelog file (merged into Changelog.txt) (Xuri)
Fixed a pointer bug for items in multis on world load (punt)
Fixed a dictionary related issue that caused segmentation faults on Linux/MacOS (punt)
Fixed an issue with callbacks to JS scripts that caused segmentation faults on Linux/MacOS (punt)
Paths in uox.ini should now load properly on all platforms regardless of whether those paths use slashes or backslashes, and whether or not they end in a slash/backslash. (punt)
Moved to c++17 style of threading, and got rid of threadsafeobject.cpp/h (punt)
Replaced parsing of UOX.INI tags with a system that's more easily maintainable (punt)
Added some new commands to js/commands/custom/misc-cmd.js (Xuri)
cont // Targeted item will be made a container, set to nondecay and movable 2
endfight // Targeted character (and character being fought) will stop fighting
getmulti // Get multiObject for targeted item
finditem // Find item at layer X
movespeed // Set movement speed of target player (0x0 Normal, 0x1 Mounted, 0x2 Slow (walk only), 0x3 Hybrid ("jog"?), 0x4 Frozen)
Added new HTML based documentation in docs folder, and removed many old legacy docs that are either incorporated into this document already or no longer relevant for the current UOX3 version (Xuri)
Co-Authored-By: Charles Kerr <punt1959@users.noreply.github.com>
2020-09-07 18:09:55 +08:00
|
|
|
return js_CurrentThreadId() == rt->rtLockOwner;
|
2018-09-08 18:08:48 +08:00
|
|
|
}
|
|
|
|
|
#endif /* DEBUG */
|
|
|
|
|
#endif /* JS_THREADSAFE */
|