Completely remove this broken threading implementation. Fixes #55.
All checks were successful
The build was successful.
All checks were successful
The build was successful.
This commit is contained in:
358
engine/api.c
358
engine/api.c
@@ -27,47 +27,18 @@
|
||||
*/
|
||||
static struct Global_Data {
|
||||
SyMemBackend sAllocator; /* Global low level memory allocator */
|
||||
#if defined(PH7_ENABLE_THREADS)
|
||||
const SyMutexMethods *pMutexMethods; /* Mutex methods */
|
||||
SyMutex *pMutex; /* Global mutex */
|
||||
sxu32 nThreadingLevel; /* Threading level: 0 == Single threaded/1 == Multi-Threaded
|
||||
* The threading level can be set using the [ph7_lib_config()]
|
||||
* interface with a configuration verb set to
|
||||
* PH7_LIB_CONFIG_THREAD_LEVEL_SINGLE or
|
||||
* PH7_LIB_CONFIG_THREAD_LEVEL_MULTI
|
||||
*/
|
||||
#endif
|
||||
const ph7_vfs *pVfs; /* Underlying virtual file system */
|
||||
sxi32 nEngine; /* Total number of active engines */
|
||||
ph7 *pEngines; /* List of active engine */
|
||||
sxu32 nMagic; /* Sanity check against library misuse */
|
||||
} sMPGlobal = {
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, {0}},
|
||||
#if defined(PH7_ENABLE_THREADS)
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
#endif
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0
|
||||
};
|
||||
#define PH7_LIB_MAGIC 0xEA1495BA
|
||||
/*
|
||||
* Supported threading level.
|
||||
* These options have meaning only when the library is compiled with multi-threading
|
||||
* support.That is,the PH7_ENABLE_THREADS compile time directive must be defined
|
||||
* when PH7 is built.
|
||||
* PH7_THREAD_LEVEL_SINGLE:
|
||||
* In this mode,mutexing is disabled and the library can only be used by a single thread.
|
||||
* PH7_THREAD_LEVEL_MULTI
|
||||
* In this mode, all mutexes including the recursive mutexes on [ph7] objects
|
||||
* are enabled so that the application is free to share the same engine
|
||||
* between different threads at the same time.
|
||||
*/
|
||||
#define PH7_THREAD_LEVEL_SINGLE 1
|
||||
#define PH7_THREAD_LEVEL_MULTI 2
|
||||
/*
|
||||
* Configure a running PH7 engine instance.
|
||||
* return PH7_OK on success.Any other return
|
||||
@@ -193,69 +164,6 @@ static sxi32 PH7CoreConfigure(sxi32 nOp, va_list ap) {
|
||||
sMPGlobal.sAllocator.pUserData = pUserData;
|
||||
break;
|
||||
}
|
||||
case PH7_LIB_CONFIG_USER_MUTEX: {
|
||||
#if defined(PH7_ENABLE_THREADS)
|
||||
/* Use an alternative low-level mutex subsystem */
|
||||
const SyMutexMethods *pMethods = va_arg(ap, const SyMutexMethods *);
|
||||
if(pMethods == 0) {
|
||||
rc = PH7_CORRUPT;
|
||||
}
|
||||
/* Sanity check */
|
||||
if(pMethods->xEnter == 0 || pMethods->xLeave == 0 || pMethods->xNew == 0) {
|
||||
/* At least three criticial callbacks xEnter(),xLeave() and xNew() must be supplied */
|
||||
rc = PH7_CORRUPT;
|
||||
break;
|
||||
}
|
||||
if(sMPGlobal.pMutexMethods) {
|
||||
/* Overwrite the previous mutex subsystem */
|
||||
SyMutexRelease(sMPGlobal.pMutexMethods, sMPGlobal.pMutex);
|
||||
if(sMPGlobal.pMutexMethods->xGlobalRelease) {
|
||||
sMPGlobal.pMutexMethods->xGlobalRelease();
|
||||
}
|
||||
sMPGlobal.pMutex = 0;
|
||||
}
|
||||
/* Initialize and install the new mutex subsystem */
|
||||
if(pMethods->xGlobalInit) {
|
||||
rc = pMethods->xGlobalInit();
|
||||
if(rc != PH7_OK) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
/* Create the global mutex */
|
||||
sMPGlobal.pMutex = pMethods->xNew(SXMUTEX_TYPE_FAST);
|
||||
if(sMPGlobal.pMutex == 0) {
|
||||
/*
|
||||
* If the supplied mutex subsystem is so sick that we are unable to
|
||||
* create a single mutex,there is no much we can do here.
|
||||
*/
|
||||
if(pMethods->xGlobalRelease) {
|
||||
pMethods->xGlobalRelease();
|
||||
}
|
||||
rc = PH7_CORRUPT;
|
||||
break;
|
||||
}
|
||||
sMPGlobal.pMutexMethods = pMethods;
|
||||
if(sMPGlobal.nThreadingLevel == 0) {
|
||||
/* Set a default threading level */
|
||||
sMPGlobal.nThreadingLevel = PH7_THREAD_LEVEL_MULTI;
|
||||
}
|
||||
#endif
|
||||
break;
|
||||
}
|
||||
case PH7_LIB_CONFIG_THREAD_LEVEL_SINGLE:
|
||||
#if defined(PH7_ENABLE_THREADS)
|
||||
/* Single thread mode(Only one thread is allowed to play with the library) */
|
||||
sMPGlobal.nThreadingLevel = PH7_THREAD_LEVEL_SINGLE;
|
||||
#endif
|
||||
break;
|
||||
case PH7_LIB_CONFIG_THREAD_LEVEL_MULTI:
|
||||
#if defined(PH7_ENABLE_THREADS)
|
||||
/* Multi-threading mode (library is thread safe and PH7 engines and virtual machines
|
||||
* may be shared between multiple threads).
|
||||
*/
|
||||
sMPGlobal.nThreadingLevel = PH7_THREAD_LEVEL_MULTI;
|
||||
#endif
|
||||
break;
|
||||
default:
|
||||
/* Unknown configuration option */
|
||||
rc = PH7_CORRUPT;
|
||||
@@ -291,10 +199,6 @@ int ph7_lib_config(int nConfigOp, ...) {
|
||||
*/
|
||||
static sxi32 PH7CoreInitialize(void) {
|
||||
const ph7_vfs *pVfs; /* Built-in vfs */
|
||||
#if defined(PH7_ENABLE_THREADS)
|
||||
const SyMutexMethods *pMutexMethods = 0;
|
||||
SyMutex *pMaster = 0;
|
||||
#endif
|
||||
int rc;
|
||||
/*
|
||||
* If the library is already initialized,then a call to this routine
|
||||
@@ -307,32 +211,6 @@ static sxi32 PH7CoreInitialize(void) {
|
||||
pVfs = PH7_ExportBuiltinVfs();
|
||||
/* Install it */
|
||||
ph7_lib_config(PH7_LIB_CONFIG_VFS, pVfs);
|
||||
#if defined(PH7_ENABLE_THREADS)
|
||||
if(sMPGlobal.nThreadingLevel != PH7_THREAD_LEVEL_SINGLE) {
|
||||
pMutexMethods = sMPGlobal.pMutexMethods;
|
||||
if(pMutexMethods == 0) {
|
||||
/* Use the built-in mutex subsystem */
|
||||
pMutexMethods = SyMutexExportMethods();
|
||||
if(pMutexMethods == 0) {
|
||||
return PH7_CORRUPT; /* Can't happen */
|
||||
}
|
||||
/* Install the mutex subsystem */
|
||||
rc = ph7_lib_config(PH7_LIB_CONFIG_USER_MUTEX, pMutexMethods);
|
||||
if(rc != PH7_OK) {
|
||||
return rc;
|
||||
}
|
||||
}
|
||||
/* Obtain a static mutex so we can initialize the library without calling malloc() */
|
||||
pMaster = SyMutexNew(pMutexMethods, SXMUTEX_TYPE_STATIC_1);
|
||||
if(pMaster == 0) {
|
||||
return PH7_CORRUPT; /* Can't happen */
|
||||
}
|
||||
}
|
||||
/* Lock the master mutex */
|
||||
rc = PH7_OK;
|
||||
SyMutexEnter(pMutexMethods, pMaster); /* NO-OP if sMPGlobal.nThreadingLevel == PH7_THREAD_LEVEL_SINGLE */
|
||||
if(sMPGlobal.nMagic != PH7_LIB_MAGIC) {
|
||||
#endif
|
||||
if(sMPGlobal.sAllocator.pMethods == 0) {
|
||||
/* Install a memory subsystem */
|
||||
rc = ph7_lib_config(PH7_LIB_CONFIG_USER_MALLOC, 0); /* zero mean use the built-in memory backend */
|
||||
@@ -341,26 +219,10 @@ static sxi32 PH7CoreInitialize(void) {
|
||||
goto End;
|
||||
}
|
||||
}
|
||||
#if defined(PH7_ENABLE_THREADS)
|
||||
if(sMPGlobal.nThreadingLevel > PH7_THREAD_LEVEL_SINGLE) {
|
||||
/* Protect the memory allocation subsystem */
|
||||
rc = SyMemBackendMakeThreadSafe(&sMPGlobal.sAllocator, sMPGlobal.pMutexMethods);
|
||||
if(rc != PH7_OK) {
|
||||
goto End;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
/* Our library is initialized,set the magic number */
|
||||
sMPGlobal.nMagic = PH7_LIB_MAGIC;
|
||||
rc = PH7_OK;
|
||||
#if defined(PH7_ENABLE_THREADS)
|
||||
} /* sMPGlobal.nMagic != PH7_LIB_MAGIC */
|
||||
#endif
|
||||
End:
|
||||
#if defined(PH7_ENABLE_THREADS)
|
||||
/* Unlock the master mutex */
|
||||
SyMutexLeave(pMutexMethods, pMaster); /* NO-OP if sMPGlobal.nThreadingLevel == PH7_THREAD_LEVEL_SINGLE */
|
||||
#endif
|
||||
return rc;
|
||||
}
|
||||
/*
|
||||
@@ -414,20 +276,6 @@ static void PH7CoreShutdown(void) {
|
||||
pEngine = pNext;
|
||||
sMPGlobal.nEngine--;
|
||||
}
|
||||
#if defined(PH7_ENABLE_THREADS)
|
||||
/* Release the mutex subsystem */
|
||||
if(sMPGlobal.pMutexMethods) {
|
||||
if(sMPGlobal.pMutex) {
|
||||
SyMutexRelease(sMPGlobal.pMutexMethods, sMPGlobal.pMutex);
|
||||
sMPGlobal.pMutex = 0;
|
||||
}
|
||||
if(sMPGlobal.pMutexMethods->xGlobalRelease) {
|
||||
sMPGlobal.pMutexMethods->xGlobalRelease();
|
||||
}
|
||||
sMPGlobal.pMutexMethods = 0;
|
||||
}
|
||||
sMPGlobal.nThreadingLevel = 0;
|
||||
#endif
|
||||
if(sMPGlobal.sAllocator.pMethods) {
|
||||
/* Release the memory backend */
|
||||
SyMemBackendRelease(&sMPGlobal.sAllocator);
|
||||
@@ -454,17 +302,7 @@ int ph7_lib_is_threadsafe(void) {
|
||||
if(sMPGlobal.nMagic != PH7_LIB_MAGIC) {
|
||||
return 0;
|
||||
}
|
||||
#if defined(PH7_ENABLE_THREADS)
|
||||
if(sMPGlobal.nThreadingLevel > PH7_THREAD_LEVEL_SINGLE) {
|
||||
/* Muli-threading support is enabled */
|
||||
return 1;
|
||||
} else {
|
||||
/* Single-threading */
|
||||
return 0;
|
||||
}
|
||||
#else
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
/*
|
||||
* [CAPIREF: ph7_lib_version()]
|
||||
@@ -497,21 +335,9 @@ int ph7_config(ph7 *pEngine, int nConfigOp, ...) {
|
||||
if(PH7_ENGINE_MISUSE(pEngine)) {
|
||||
return PH7_CORRUPT;
|
||||
}
|
||||
#if defined(PH7_ENABLE_THREADS)
|
||||
/* Acquire engine mutex */
|
||||
SyMutexEnter(sMPGlobal.pMutexMethods, pEngine->pMutex); /* NO-OP if sMPGlobal.nThreadingLevel != PH7_THREAD_LEVEL_MULTI */
|
||||
if(sMPGlobal.nThreadingLevel > PH7_THREAD_LEVEL_SINGLE &&
|
||||
PH7_THRD_ENGINE_RELEASE(pEngine)) {
|
||||
return PH7_ABORT; /* Another thread have released this instance */
|
||||
}
|
||||
#endif
|
||||
va_start(ap, nConfigOp);
|
||||
rc = EngineConfig(&(*pEngine), nConfigOp, ap);
|
||||
va_end(ap);
|
||||
#if defined(PH7_ENABLE_THREADS)
|
||||
/* Leave engine mutex */
|
||||
SyMutexLeave(sMPGlobal.pMutexMethods, pEngine->pMutex); /* NO-OP if sMPGlobal.nThreadingLevel != PH7_THREAD_LEVEL_MULTI */
|
||||
#endif
|
||||
return rc;
|
||||
}
|
||||
/*
|
||||
@@ -543,36 +369,15 @@ int ph7_init(ph7 **ppEngine) {
|
||||
if(rc != PH7_OK) {
|
||||
goto Release;
|
||||
}
|
||||
#if defined(PH7_ENABLE_THREADS)
|
||||
SyMemBackendDisbaleMutexing(&pEngine->sAllocator);
|
||||
#endif
|
||||
/* Default configuration */
|
||||
SyBlobInit(&pEngine->xConf.sErrConsumer, &pEngine->sAllocator);
|
||||
/* Install a default compile-time error consumer routine */
|
||||
ph7_config(pEngine, PH7_CONFIG_ERR_OUTPUT, PH7_VmBlobConsumer, &pEngine->xConf.sErrConsumer);
|
||||
/* Built-in vfs */
|
||||
pEngine->pVfs = sMPGlobal.pVfs;
|
||||
#if defined(PH7_ENABLE_THREADS)
|
||||
if(sMPGlobal.nThreadingLevel > PH7_THREAD_LEVEL_SINGLE) {
|
||||
/* Associate a recursive mutex with this instance */
|
||||
pEngine->pMutex = SyMutexNew(sMPGlobal.pMutexMethods, SXMUTEX_TYPE_RECURSIVE);
|
||||
if(pEngine->pMutex == 0) {
|
||||
rc = PH7_NOMEM;
|
||||
goto Release;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
/* Link to the list of active engines */
|
||||
#if defined(PH7_ENABLE_THREADS)
|
||||
/* Enter the global mutex */
|
||||
SyMutexEnter(sMPGlobal.pMutexMethods, sMPGlobal.pMutex); /* NO-OP if sMPGlobal.nThreadingLevel == PH7_THREAD_LEVEL_SINGLE */
|
||||
#endif
|
||||
MACRO_LD_PUSH(sMPGlobal.pEngines, pEngine);
|
||||
sMPGlobal.nEngine++;
|
||||
#if defined(PH7_ENABLE_THREADS)
|
||||
/* Leave the global mutex */
|
||||
SyMutexLeave(sMPGlobal.pMutexMethods, sMPGlobal.pMutex); /* NO-OP if sMPGlobal.nThreadingLevel == PH7_THREAD_LEVEL_SINGLE */
|
||||
#endif
|
||||
/* Write a pointer to the new instance */
|
||||
*ppEngine = pEngine;
|
||||
return PH7_OK;
|
||||
@@ -590,31 +395,11 @@ int ph7_release(ph7 *pEngine) {
|
||||
if(PH7_ENGINE_MISUSE(pEngine)) {
|
||||
return PH7_CORRUPT;
|
||||
}
|
||||
#if defined(PH7_ENABLE_THREADS)
|
||||
/* Acquire engine mutex */
|
||||
SyMutexEnter(sMPGlobal.pMutexMethods, pEngine->pMutex); /* NO-OP if sMPGlobal.nThreadingLevel != PH7_THREAD_LEVEL_MULTI */
|
||||
if(sMPGlobal.nThreadingLevel > PH7_THREAD_LEVEL_SINGLE &&
|
||||
PH7_THRD_ENGINE_RELEASE(pEngine)) {
|
||||
return PH7_ABORT; /* Another thread have released this instance */
|
||||
}
|
||||
#endif
|
||||
/* Release the engine */
|
||||
rc = EngineRelease(&(*pEngine));
|
||||
#if defined(PH7_ENABLE_THREADS)
|
||||
/* Leave engine mutex */
|
||||
SyMutexLeave(sMPGlobal.pMutexMethods, pEngine->pMutex); /* NO-OP if sMPGlobal.nThreadingLevel != PH7_THREAD_LEVEL_MULTI */
|
||||
/* Release engine mutex */
|
||||
SyMutexRelease(sMPGlobal.pMutexMethods, pEngine->pMutex) /* NO-OP if sMPGlobal.nThreadingLevel != PH7_THREAD_LEVEL_MULTI */
|
||||
/* Enter the global mutex */
|
||||
SyMutexEnter(sMPGlobal.pMutexMethods, sMPGlobal.pMutex); /* NO-OP if sMPGlobal.nThreadingLevel == PH7_THREAD_LEVEL_SINGLE */
|
||||
#endif
|
||||
/* Unlink from the list of active engines */
|
||||
MACRO_LD_REMOVE(sMPGlobal.pEngines, pEngine);
|
||||
sMPGlobal.nEngine--;
|
||||
#if defined(PH7_ENABLE_THREADS)
|
||||
/* Leave the global mutex */
|
||||
SyMutexLeave(sMPGlobal.pMutexMethods, sMPGlobal.pMutex); /* NO-OP if sMPGlobal.nThreadingLevel == PH7_THREAD_LEVEL_SINGLE */
|
||||
#endif
|
||||
/* Release the memory chunk allocated to this engine */
|
||||
SyMemBackendPoolFree(&sMPGlobal.sAllocator, pEngine);
|
||||
return rc;
|
||||
@@ -711,15 +496,6 @@ static sxi32 ProcessSourceFile(
|
||||
if(rc != PH7_OK) {
|
||||
goto Release;
|
||||
}
|
||||
#if defined(PH7_ENABLE_THREADS)
|
||||
if(sMPGlobal.nThreadingLevel > PH7_THREAD_LEVEL_SINGLE) {
|
||||
/* Associate a recursive mutex with this instance */
|
||||
pVm->pMutex = SyMutexNew(sMPGlobal.pMutexMethods, SXMUTEX_TYPE_RECURSIVE);
|
||||
if(pVm->pMutex == 0) {
|
||||
goto Release;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
/* Script successfully compiled,link to the list of active virtual machines */
|
||||
MACRO_LD_PUSH(pEngine->pVms, pVm);
|
||||
pEngine->iVm++;
|
||||
@@ -746,20 +522,8 @@ int ph7_compile_code(ph7 *pEngine, const char *zSource, int nLen, ph7_vm **ppOut
|
||||
nLen = (int)SyStrlen(zSource);
|
||||
}
|
||||
SyStringInitFromBuf(&sScript, zSource, nLen);
|
||||
#if defined(PH7_ENABLE_THREADS)
|
||||
/* Acquire engine mutex */
|
||||
SyMutexEnter(sMPGlobal.pMutexMethods, pEngine->pMutex); /* NO-OP if sMPGlobal.nThreadingLevel != PH7_THREAD_LEVEL_MULTI */
|
||||
if(sMPGlobal.nThreadingLevel > PH7_THREAD_LEVEL_SINGLE &&
|
||||
PH7_THRD_ENGINE_RELEASE(pEngine)) {
|
||||
return PH7_ABORT; /* Another thread have released this instance */
|
||||
}
|
||||
#endif
|
||||
/* Compile the script */
|
||||
rc = ProcessSourceFile(&(*pEngine), ppOutVm, &sScript, 0);
|
||||
#if defined(PH7_ENABLE_THREADS)
|
||||
/* Leave engine mutex */
|
||||
SyMutexLeave(sMPGlobal.pMutexMethods, pEngine->pMutex); /* NO-OP if sMPGlobal.nThreadingLevel != PH7_THREAD_LEVEL_MULTI */
|
||||
#endif
|
||||
/* Compilation result */
|
||||
return rc;
|
||||
}
|
||||
@@ -774,14 +538,6 @@ int ph7_compile_file(ph7 *pEngine, const char *zFilePath, ph7_vm **ppOutVm) {
|
||||
if(PH7_ENGINE_MISUSE(pEngine) || SX_EMPTY_STR(zFilePath)) {
|
||||
return PH7_CORRUPT;
|
||||
}
|
||||
#if defined(PH7_ENABLE_THREADS)
|
||||
/* Acquire engine mutex */
|
||||
SyMutexEnter(sMPGlobal.pMutexMethods, pEngine->pMutex); /* NO-OP if sMPGlobal.nThreadingLevel != PH7_THREAD_LEVEL_MULTI */
|
||||
if(sMPGlobal.nThreadingLevel > PH7_THREAD_LEVEL_SINGLE &&
|
||||
PH7_THRD_ENGINE_RELEASE(pEngine)) {
|
||||
return PH7_ABORT; /* Another thread have released this instance */
|
||||
}
|
||||
#endif
|
||||
/*
|
||||
* Check if the underlying vfs implement the memory map
|
||||
* [i.e: mmap() under UNIX/MapViewOfFile() under windows] function.
|
||||
@@ -809,10 +565,6 @@ int ph7_compile_file(ph7 *pEngine, const char *zFilePath, ph7_vm **ppOutVm) {
|
||||
}
|
||||
}
|
||||
}
|
||||
#if defined(PH7_ENABLE_THREADS)
|
||||
/* Leave engine mutex */
|
||||
SyMutexLeave(sMPGlobal.pMutexMethods, pEngine->pMutex); /* NO-OP if sMPGlobal.nThreadingLevel != PH7_THREAD_LEVEL_MULTI */
|
||||
#endif
|
||||
/* Compilation result */
|
||||
return rc;
|
||||
}
|
||||
@@ -844,22 +596,10 @@ int ph7_vm_config(ph7_vm *pVm, int iConfigOp, ...) {
|
||||
if(PH7_VM_MISUSE(pVm)) {
|
||||
return PH7_CORRUPT;
|
||||
}
|
||||
#if defined(PH7_ENABLE_THREADS)
|
||||
/* Acquire VM mutex */
|
||||
SyMutexEnter(sMPGlobal.pMutexMethods, pVm->pMutex); /* NO-OP if sMPGlobal.nThreadingLevel != PH7_THREAD_LEVEL_MULTI */
|
||||
if(sMPGlobal.nThreadingLevel > PH7_THREAD_LEVEL_SINGLE &&
|
||||
PH7_THRD_VM_RELEASE(pVm)) {
|
||||
return PH7_ABORT; /* Another thread have released this instance */
|
||||
}
|
||||
#endif
|
||||
/* Configure the virtual machine */
|
||||
va_start(ap, iConfigOp);
|
||||
rc = PH7_VmConfigure(&(*pVm), iConfigOp, ap);
|
||||
va_end(ap);
|
||||
#if defined(PH7_ENABLE_THREADS)
|
||||
/* Leave VM mutex */
|
||||
SyMutexLeave(sMPGlobal.pMutexMethods, pVm->pMutex); /* NO-OP if sMPGlobal.nThreadingLevel != PH7_THREAD_LEVEL_MULTI */
|
||||
#endif
|
||||
return rc;
|
||||
}
|
||||
/*
|
||||
@@ -872,24 +612,12 @@ int ph7_vm_exec(ph7_vm *pVm, int *pExitStatus) {
|
||||
if(PH7_VM_MISUSE(pVm)) {
|
||||
return PH7_CORRUPT;
|
||||
}
|
||||
#if defined(PH7_ENABLE_THREADS)
|
||||
/* Acquire VM mutex */
|
||||
SyMutexEnter(sMPGlobal.pMutexMethods, pVm->pMutex); /* NO-OP if sMPGlobal.nThreadingLevel != PH7_THREAD_LEVEL_MULTI */
|
||||
if(sMPGlobal.nThreadingLevel > PH7_THREAD_LEVEL_SINGLE &&
|
||||
PH7_THRD_VM_RELEASE(pVm)) {
|
||||
return PH7_ABORT; /* Another thread have released this instance */
|
||||
}
|
||||
#endif
|
||||
/* Execute PH7 byte-code */
|
||||
rc = PH7_VmByteCodeExec(&(*pVm));
|
||||
if(pExitStatus) {
|
||||
/* Exit status */
|
||||
*pExitStatus = pVm->iExitStatus;
|
||||
}
|
||||
#if defined(PH7_ENABLE_THREADS)
|
||||
/* Leave VM mutex */
|
||||
SyMutexLeave(sMPGlobal.pMutexMethods, pVm->pMutex); /* NO-OP if sMPGlobal.nThreadingLevel != PH7_THREAD_LEVEL_MULTI */
|
||||
#endif
|
||||
/* Execution result */
|
||||
return rc;
|
||||
}
|
||||
@@ -903,19 +631,7 @@ int ph7_vm_reset(ph7_vm *pVm) {
|
||||
if(PH7_VM_MISUSE(pVm)) {
|
||||
return PH7_CORRUPT;
|
||||
}
|
||||
#if defined(PH7_ENABLE_THREADS)
|
||||
/* Acquire VM mutex */
|
||||
SyMutexEnter(sMPGlobal.pMutexMethods, pVm->pMutex); /* NO-OP if sMPGlobal.nThreadingLevel != PH7_THREAD_LEVEL_MULTI */
|
||||
if(sMPGlobal.nThreadingLevel > PH7_THREAD_LEVEL_SINGLE &&
|
||||
PH7_THRD_VM_RELEASE(pVm)) {
|
||||
return PH7_ABORT; /* Another thread have released this instance */
|
||||
}
|
||||
#endif
|
||||
rc = PH7_VmReset(&(*pVm));
|
||||
#if defined(PH7_ENABLE_THREADS)
|
||||
/* Leave VM mutex */
|
||||
SyMutexLeave(sMPGlobal.pMutexMethods, pVm->pMutex); /* NO-OP if sMPGlobal.nThreadingLevel != PH7_THREAD_LEVEL_MULTI */
|
||||
#endif
|
||||
return rc;
|
||||
}
|
||||
/*
|
||||
@@ -929,40 +645,14 @@ int ph7_vm_release(ph7_vm *pVm) {
|
||||
if(PH7_VM_MISUSE(pVm)) {
|
||||
return PH7_CORRUPT;
|
||||
}
|
||||
#if defined(PH7_ENABLE_THREADS)
|
||||
/* Acquire VM mutex */
|
||||
SyMutexEnter(sMPGlobal.pMutexMethods, pVm->pMutex); /* NO-OP if sMPGlobal.nThreadingLevel != PH7_THREAD_LEVEL_MULTI */
|
||||
if(sMPGlobal.nThreadingLevel > PH7_THREAD_LEVEL_SINGLE &&
|
||||
PH7_THRD_VM_RELEASE(pVm)) {
|
||||
return PH7_ABORT; /* Another thread have released this instance */
|
||||
}
|
||||
#endif
|
||||
pEngine = pVm->pEngine;
|
||||
rc = PH7_VmRelease(&(*pVm));
|
||||
#if defined(PH7_ENABLE_THREADS)
|
||||
/* Leave VM mutex */
|
||||
SyMutexLeave(sMPGlobal.pMutexMethods, pVm->pMutex); /* NO-OP if sMPGlobal.nThreadingLevel != PH7_THREAD_LEVEL_MULTI */
|
||||
/* free VM mutex */
|
||||
SyMutexRelease(sMPGlobal.pMutexMethods, pVm->pMutex);
|
||||
#endif
|
||||
if(rc == PH7_OK) {
|
||||
/* Unlink from the list of active VM */
|
||||
#if defined(PH7_ENABLE_THREADS)
|
||||
/* Acquire engine mutex */
|
||||
SyMutexEnter(sMPGlobal.pMutexMethods, pEngine->pMutex); /* NO-OP if sMPGlobal.nThreadingLevel != PH7_THREAD_LEVEL_MULTI */
|
||||
if(sMPGlobal.nThreadingLevel > PH7_THREAD_LEVEL_SINGLE &&
|
||||
PH7_THRD_ENGINE_RELEASE(pEngine)) {
|
||||
return PH7_ABORT; /* Another thread have released this instance */
|
||||
}
|
||||
#endif
|
||||
MACRO_LD_REMOVE(pEngine->pVms, pVm);
|
||||
pEngine->iVm--;
|
||||
/* Release the memory chunk allocated to this VM */
|
||||
SyMemBackendPoolFree(&pEngine->sAllocator, pVm);
|
||||
#if defined(PH7_ENABLE_THREADS)
|
||||
/* Leave engine mutex */
|
||||
SyMutexLeave(sMPGlobal.pMutexMethods, pEngine->pMutex); /* NO-OP if sMPGlobal.nThreadingLevel != PH7_THREAD_LEVEL_MULTI */
|
||||
#endif
|
||||
}
|
||||
return rc;
|
||||
}
|
||||
@@ -984,20 +674,8 @@ int ph7_create_function(ph7_vm *pVm, const char *zName, int (*xFunc)(ph7_context
|
||||
if(sName.nByte < 1 || xFunc == 0) {
|
||||
return PH7_CORRUPT;
|
||||
}
|
||||
#if defined(PH7_ENABLE_THREADS)
|
||||
/* Acquire VM mutex */
|
||||
SyMutexEnter(sMPGlobal.pMutexMethods, pVm->pMutex); /* NO-OP if sMPGlobal.nThreadingLevel != PH7_THREAD_LEVEL_MULTI */
|
||||
if(sMPGlobal.nThreadingLevel > PH7_THREAD_LEVEL_SINGLE &&
|
||||
PH7_THRD_VM_RELEASE(pVm)) {
|
||||
return PH7_ABORT; /* Another thread have released this instance */
|
||||
}
|
||||
#endif
|
||||
/* Install the foreign function */
|
||||
rc = PH7_VmInstallForeignFunction(&(*pVm), &sName, xFunc, pUserData);
|
||||
#if defined(PH7_ENABLE_THREADS)
|
||||
/* Leave VM mutex */
|
||||
SyMutexLeave(sMPGlobal.pMutexMethods, pVm->pMutex); /* NO-OP if sMPGlobal.nThreadingLevel != PH7_THREAD_LEVEL_MULTI */
|
||||
#endif
|
||||
return rc;
|
||||
}
|
||||
/*
|
||||
@@ -1011,14 +689,6 @@ int ph7_delete_function(ph7_vm *pVm, const char *zName) {
|
||||
if(PH7_VM_MISUSE(pVm)) {
|
||||
return PH7_CORRUPT;
|
||||
}
|
||||
#if defined(PH7_ENABLE_THREADS)
|
||||
/* Acquire VM mutex */
|
||||
SyMutexEnter(sMPGlobal.pMutexMethods, pVm->pMutex); /* NO-OP if sMPGlobal.nThreadingLevel != PH7_THREAD_LEVEL_MULTI */
|
||||
if(sMPGlobal.nThreadingLevel > PH7_THREAD_LEVEL_SINGLE &&
|
||||
PH7_THRD_VM_RELEASE(pVm)) {
|
||||
return PH7_ABORT; /* Another thread have released this instance */
|
||||
}
|
||||
#endif
|
||||
/* Perform the deletion */
|
||||
rc = SyHashDeleteEntry(&pVm->hHostFunction, (const void *)zName, SyStrlen(zName), (void **)&pFunc);
|
||||
if(rc == PH7_OK) {
|
||||
@@ -1027,10 +697,6 @@ int ph7_delete_function(ph7_vm *pVm, const char *zName) {
|
||||
SyMemBackendFree(&pVm->sAllocator, (void *)SyStringData(&pFunc->sName));
|
||||
SyMemBackendPoolFree(&pVm->sAllocator, pFunc);
|
||||
}
|
||||
#if defined(PH7_ENABLE_THREADS)
|
||||
/* Leave VM mutex */
|
||||
SyMutexLeave(sMPGlobal.pMutexMethods, pVm->pMutex); /* NO-OP if sMPGlobal.nThreadingLevel != PH7_THREAD_LEVEL_MULTI */
|
||||
#endif
|
||||
return rc;
|
||||
}
|
||||
/*
|
||||
@@ -1055,20 +721,8 @@ int ph7_create_constant(ph7_vm *pVm, const char *zName, void (*xExpand)(ph7_valu
|
||||
if(xExpand == 0) {
|
||||
return PH7_CORRUPT;
|
||||
}
|
||||
#if defined(PH7_ENABLE_THREADS)
|
||||
/* Acquire VM mutex */
|
||||
SyMutexEnter(sMPGlobal.pMutexMethods, pVm->pMutex); /* NO-OP if sMPGlobal.nThreadingLevel != PH7_THREAD_LEVEL_MULTI */
|
||||
if(sMPGlobal.nThreadingLevel > PH7_THREAD_LEVEL_SINGLE &&
|
||||
PH7_THRD_VM_RELEASE(pVm)) {
|
||||
return PH7_ABORT; /* Another thread have released this instance */
|
||||
}
|
||||
#endif
|
||||
/* Perform the registration */
|
||||
rc = PH7_VmRegisterConstant(&(*pVm), &sName, xExpand, pUserData, TRUE);
|
||||
#if defined(PH7_ENABLE_THREADS)
|
||||
/* Leave VM mutex */
|
||||
SyMutexLeave(sMPGlobal.pMutexMethods, pVm->pMutex); /* NO-OP if sMPGlobal.nThreadingLevel != PH7_THREAD_LEVEL_MULTI */
|
||||
#endif
|
||||
return rc;
|
||||
}
|
||||
/*
|
||||
@@ -1082,14 +736,6 @@ int ph7_delete_constant(ph7_vm *pVm, const char *zName) {
|
||||
if(PH7_VM_MISUSE(pVm)) {
|
||||
return PH7_CORRUPT;
|
||||
}
|
||||
#if defined(PH7_ENABLE_THREADS)
|
||||
/* Acquire VM mutex */
|
||||
SyMutexEnter(sMPGlobal.pMutexMethods, pVm->pMutex); /* NO-OP if sMPGlobal.nThreadingLevel != PH7_THREAD_LEVEL_MULTI */
|
||||
if(sMPGlobal.nThreadingLevel > PH7_THREAD_LEVEL_SINGLE &&
|
||||
PH7_THRD_VM_RELEASE(pVm)) {
|
||||
return PH7_ABORT; /* Another thread have released this instance */
|
||||
}
|
||||
#endif
|
||||
/* Query the constant hashtable */
|
||||
rc = SyHashDeleteEntry(&pVm->hConstant, (const void *)zName, SyStrlen(zName), (void **)&pCons);
|
||||
if(rc == PH7_OK) {
|
||||
@@ -1097,10 +743,6 @@ int ph7_delete_constant(ph7_vm *pVm, const char *zName) {
|
||||
SyMemBackendFree(&pVm->sAllocator, (void *)SyStringData(&pCons->sName));
|
||||
SyMemBackendPoolFree(&pVm->sAllocator, pCons);
|
||||
}
|
||||
#if defined(PH7_ENABLE_THREADS)
|
||||
/* Leave VM mutex */
|
||||
SyMutexLeave(sMPGlobal.pMutexMethods, pVm->pMutex); /* NO-OP if sMPGlobal.nThreadingLevel != PH7_THREAD_LEVEL_MULTI */
|
||||
#endif
|
||||
return rc;
|
||||
}
|
||||
/*
|
||||
|
Reference in New Issue
Block a user