Enable threading.
The build was successful. Details

This commit is contained in:
Rafal Kupiec 2019-06-27 20:52:37 +02:00
parent 4881ddf6de
commit 3dcc908788
Signed by: belliash
GPG Key ID: 4E829243E0CFE6B4
5 changed files with 3 additions and 126 deletions

View File

@ -27,7 +27,6 @@
*/ */
static struct Global_Data { static struct Global_Data {
SyMemBackend sAllocator; /* Global low level memory allocator */ SyMemBackend sAllocator; /* Global low level memory allocator */
#if defined(PH7_ENABLE_THREADS)
const SyMutexMethods *pMutexMethods; /* Mutex methods */ const SyMutexMethods *pMutexMethods; /* Mutex methods */
SyMutex *pMutex; /* Global mutex */ SyMutex *pMutex; /* Global mutex */
sxu32 nThreadingLevel; /* Threading level: 0 == Single threaded/1 == Multi-Threaded sxu32 nThreadingLevel; /* Threading level: 0 == Single threaded/1 == Multi-Threaded
@ -36,18 +35,15 @@ static struct Global_Data {
* PH7_LIB_CONFIG_THREAD_LEVEL_SINGLE or * PH7_LIB_CONFIG_THREAD_LEVEL_SINGLE or
* PH7_LIB_CONFIG_THREAD_LEVEL_MULTI * PH7_LIB_CONFIG_THREAD_LEVEL_MULTI
*/ */
#endif
const ph7_vfs *pVfs; /* Underlying virtual file system */ const ph7_vfs *pVfs; /* Underlying virtual file system */
sxi32 nEngine; /* Total number of active engines */ sxi32 nEngine; /* Total number of active engines */
ph7 *pEngines; /* List of active engine */ ph7 *pEngines; /* List of active engine */
sxu32 nMagic; /* Sanity check against library misuse */ sxu32 nMagic; /* Sanity check against library misuse */
} sMPGlobal = { } sMPGlobal = {
{0, 0, 0, 0, 0, 0, 0, 0, 0, {0}}, {0, 0, 0, 0, 0, 0, 0, 0, 0, {0}},
#if defined(PH7_ENABLE_THREADS)
0, 0,
0, 0,
0, 0,
#endif
0, 0,
0, 0,
0, 0,
@ -56,9 +52,6 @@ static struct Global_Data {
#define PH7_LIB_MAGIC 0xEA1495BA #define PH7_LIB_MAGIC 0xEA1495BA
/* /*
* Supported threading level. * 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: * PH7_THREAD_LEVEL_SINGLE:
* In this mode,mutexing is disabled and the library can only be used by a single thread. * In this mode,mutexing is disabled and the library can only be used by a single thread.
* PH7_THREAD_LEVEL_MULTI * PH7_THREAD_LEVEL_MULTI
@ -194,7 +187,6 @@ static sxi32 PH7CoreConfigure(sxi32 nOp, va_list ap) {
break; break;
} }
case PH7_LIB_CONFIG_USER_MUTEX: { case PH7_LIB_CONFIG_USER_MUTEX: {
#if defined(PH7_ENABLE_THREADS)
/* Use an alternative low-level mutex subsystem */ /* Use an alternative low-level mutex subsystem */
const SyMutexMethods *pMethods = va_arg(ap, const SyMutexMethods *); const SyMutexMethods *pMethods = va_arg(ap, const SyMutexMethods *);
#if defined (UNTRUST) #if defined (UNTRUST)
@ -241,22 +233,17 @@ static sxi32 PH7CoreConfigure(sxi32 nOp, va_list ap) {
/* Set a default threading level */ /* Set a default threading level */
sMPGlobal.nThreadingLevel = PH7_THREAD_LEVEL_MULTI; sMPGlobal.nThreadingLevel = PH7_THREAD_LEVEL_MULTI;
} }
#endif
break; break;
} }
case PH7_LIB_CONFIG_THREAD_LEVEL_SINGLE: 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) */ /* Single thread mode(Only one thread is allowed to play with the library) */
sMPGlobal.nThreadingLevel = PH7_THREAD_LEVEL_SINGLE; sMPGlobal.nThreadingLevel = PH7_THREAD_LEVEL_SINGLE;
#endif
break; break;
case PH7_LIB_CONFIG_THREAD_LEVEL_MULTI: 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 /* Multi-threading mode (library is thread safe and PH7 engines and virtual machines
* may be shared between multiple threads). * may be shared between multiple threads).
*/ */
sMPGlobal.nThreadingLevel = PH7_THREAD_LEVEL_MULTI; sMPGlobal.nThreadingLevel = PH7_THREAD_LEVEL_MULTI;
#endif
break; break;
default: default:
/* Unknown configuration option */ /* Unknown configuration option */
@ -293,10 +280,8 @@ int ph7_lib_config(int nConfigOp, ...) {
*/ */
static sxi32 PH7CoreInitialize(void) { static sxi32 PH7CoreInitialize(void) {
const ph7_vfs *pVfs; /* Built-in vfs */ const ph7_vfs *pVfs; /* Built-in vfs */
#if defined(PH7_ENABLE_THREADS)
const SyMutexMethods *pMutexMethods = 0; const SyMutexMethods *pMutexMethods = 0;
SyMutex *pMaster = 0; SyMutex *pMaster = 0;
#endif
int rc; int rc;
/* /*
* If the library is already initialized,then a call to this routine * If the library is already initialized,then a call to this routine
@ -309,7 +294,6 @@ static sxi32 PH7CoreInitialize(void) {
pVfs = PH7_ExportBuiltinVfs(); pVfs = PH7_ExportBuiltinVfs();
/* Install it */ /* Install it */
ph7_lib_config(PH7_LIB_CONFIG_VFS, pVfs); ph7_lib_config(PH7_LIB_CONFIG_VFS, pVfs);
#if defined(PH7_ENABLE_THREADS)
if(sMPGlobal.nThreadingLevel != PH7_THREAD_LEVEL_SINGLE) { if(sMPGlobal.nThreadingLevel != PH7_THREAD_LEVEL_SINGLE) {
pMutexMethods = sMPGlobal.pMutexMethods; pMutexMethods = sMPGlobal.pMutexMethods;
if(pMutexMethods == 0) { if(pMutexMethods == 0) {
@ -334,7 +318,6 @@ static sxi32 PH7CoreInitialize(void) {
rc = PH7_OK; rc = PH7_OK;
SyMutexEnter(pMutexMethods, pMaster); /* NO-OP if sMPGlobal.nThreadingLevel == PH7_THREAD_LEVEL_SINGLE */ SyMutexEnter(pMutexMethods, pMaster); /* NO-OP if sMPGlobal.nThreadingLevel == PH7_THREAD_LEVEL_SINGLE */
if(sMPGlobal.nMagic != PH7_LIB_MAGIC) { if(sMPGlobal.nMagic != PH7_LIB_MAGIC) {
#endif
if(sMPGlobal.sAllocator.pMethods == 0) { if(sMPGlobal.sAllocator.pMethods == 0) {
/* Install a memory subsystem */ /* Install a memory subsystem */
rc = ph7_lib_config(PH7_LIB_CONFIG_USER_MALLOC, 0); /* zero mean use the built-in memory backend */ rc = ph7_lib_config(PH7_LIB_CONFIG_USER_MALLOC, 0); /* zero mean use the built-in memory backend */
@ -343,7 +326,6 @@ static sxi32 PH7CoreInitialize(void) {
goto End; goto End;
} }
} }
#if defined(PH7_ENABLE_THREADS)
if(sMPGlobal.nThreadingLevel > PH7_THREAD_LEVEL_SINGLE) { if(sMPGlobal.nThreadingLevel > PH7_THREAD_LEVEL_SINGLE) {
/* Protect the memory allocation subsystem */ /* Protect the memory allocation subsystem */
rc = SyMemBackendMakeThreadSafe(&sMPGlobal.sAllocator, sMPGlobal.pMutexMethods); rc = SyMemBackendMakeThreadSafe(&sMPGlobal.sAllocator, sMPGlobal.pMutexMethods);
@ -351,18 +333,13 @@ static sxi32 PH7CoreInitialize(void) {
goto End; goto End;
} }
} }
#endif
/* Our library is initialized,set the magic number */ /* Our library is initialized,set the magic number */
sMPGlobal.nMagic = PH7_LIB_MAGIC; sMPGlobal.nMagic = PH7_LIB_MAGIC;
rc = PH7_OK; rc = PH7_OK;
#if defined(PH7_ENABLE_THREADS)
} /* sMPGlobal.nMagic != PH7_LIB_MAGIC */ } /* sMPGlobal.nMagic != PH7_LIB_MAGIC */
#endif
End: End:
#if defined(PH7_ENABLE_THREADS)
/* Unlock the master mutex */ /* Unlock the master mutex */
SyMutexLeave(pMutexMethods, pMaster); /* NO-OP if sMPGlobal.nThreadingLevel == PH7_THREAD_LEVEL_SINGLE */ SyMutexLeave(pMutexMethods, pMaster); /* NO-OP if sMPGlobal.nThreadingLevel == PH7_THREAD_LEVEL_SINGLE */
#endif
return rc; return rc;
} }
/* /*
@ -416,7 +393,6 @@ static void PH7CoreShutdown(void) {
pEngine = pNext; pEngine = pNext;
sMPGlobal.nEngine--; sMPGlobal.nEngine--;
} }
#if defined(PH7_ENABLE_THREADS)
/* Release the mutex subsystem */ /* Release the mutex subsystem */
if(sMPGlobal.pMutexMethods) { if(sMPGlobal.pMutexMethods) {
if(sMPGlobal.pMutex) { if(sMPGlobal.pMutex) {
@ -429,7 +405,6 @@ static void PH7CoreShutdown(void) {
sMPGlobal.pMutexMethods = 0; sMPGlobal.pMutexMethods = 0;
} }
sMPGlobal.nThreadingLevel = 0; sMPGlobal.nThreadingLevel = 0;
#endif
if(sMPGlobal.sAllocator.pMethods) { if(sMPGlobal.sAllocator.pMethods) {
/* Release the memory backend */ /* Release the memory backend */
SyMemBackendRelease(&sMPGlobal.sAllocator); SyMemBackendRelease(&sMPGlobal.sAllocator);
@ -456,7 +431,6 @@ int ph7_lib_is_threadsafe(void) {
if(sMPGlobal.nMagic != PH7_LIB_MAGIC) { if(sMPGlobal.nMagic != PH7_LIB_MAGIC) {
return 0; return 0;
} }
#if defined(PH7_ENABLE_THREADS)
if(sMPGlobal.nThreadingLevel > PH7_THREAD_LEVEL_SINGLE) { if(sMPGlobal.nThreadingLevel > PH7_THREAD_LEVEL_SINGLE) {
/* Muli-threading support is enabled */ /* Muli-threading support is enabled */
return 1; return 1;
@ -464,9 +438,6 @@ int ph7_lib_is_threadsafe(void) {
/* Single-threading */ /* Single-threading */
return 0; return 0;
} }
#else
return 0;
#endif
} }
/* /*
* [CAPIREF: ph7_lib_version()] * [CAPIREF: ph7_lib_version()]
@ -499,21 +470,17 @@ int ph7_config(ph7 *pEngine, int nConfigOp, ...) {
if(PH7_ENGINE_MISUSE(pEngine)) { if(PH7_ENGINE_MISUSE(pEngine)) {
return PH7_CORRUPT; return PH7_CORRUPT;
} }
#if defined(PH7_ENABLE_THREADS)
/* Acquire engine mutex */ /* Acquire engine mutex */
SyMutexEnter(sMPGlobal.pMutexMethods, pEngine->pMutex); /* NO-OP if sMPGlobal.nThreadingLevel != PH7_THREAD_LEVEL_MULTI */ SyMutexEnter(sMPGlobal.pMutexMethods, pEngine->pMutex); /* NO-OP if sMPGlobal.nThreadingLevel != PH7_THREAD_LEVEL_MULTI */
if(sMPGlobal.nThreadingLevel > PH7_THREAD_LEVEL_SINGLE && if(sMPGlobal.nThreadingLevel > PH7_THREAD_LEVEL_SINGLE &&
PH7_THRD_ENGINE_RELEASE(pEngine)) { PH7_THRD_ENGINE_RELEASE(pEngine)) {
return PH7_ABORT; /* Another thread have released this instance */ return PH7_ABORT; /* Another thread have released this instance */
} }
#endif
va_start(ap, nConfigOp); va_start(ap, nConfigOp);
rc = EngineConfig(&(*pEngine), nConfigOp, ap); rc = EngineConfig(&(*pEngine), nConfigOp, ap);
va_end(ap); va_end(ap);
#if defined(PH7_ENABLE_THREADS)
/* Leave engine mutex */ /* Leave engine mutex */
SyMutexLeave(sMPGlobal.pMutexMethods, pEngine->pMutex); /* NO-OP if sMPGlobal.nThreadingLevel != PH7_THREAD_LEVEL_MULTI */ SyMutexLeave(sMPGlobal.pMutexMethods, pEngine->pMutex); /* NO-OP if sMPGlobal.nThreadingLevel != PH7_THREAD_LEVEL_MULTI */
#endif
return rc; return rc;
} }
/* /*
@ -547,16 +514,13 @@ int ph7_init(ph7 **ppEngine) {
if(rc != PH7_OK) { if(rc != PH7_OK) {
goto Release; goto Release;
} }
#if defined(PH7_ENABLE_THREADS)
SyMemBackendDisbaleMutexing(&pEngine->sAllocator); SyMemBackendDisbaleMutexing(&pEngine->sAllocator);
#endif
/* Default configuration */ /* Default configuration */
SyBlobInit(&pEngine->xConf.sErrConsumer, &pEngine->sAllocator); SyBlobInit(&pEngine->xConf.sErrConsumer, &pEngine->sAllocator);
/* Install a default compile-time error consumer routine */ /* Install a default compile-time error consumer routine */
ph7_config(pEngine, PH7_CONFIG_ERR_OUTPUT, PH7_VmBlobConsumer, &pEngine->xConf.sErrConsumer); ph7_config(pEngine, PH7_CONFIG_ERR_OUTPUT, PH7_VmBlobConsumer, &pEngine->xConf.sErrConsumer);
/* Built-in vfs */ /* Built-in vfs */
pEngine->pVfs = sMPGlobal.pVfs; pEngine->pVfs = sMPGlobal.pVfs;
#if defined(PH7_ENABLE_THREADS)
if(sMPGlobal.nThreadingLevel > PH7_THREAD_LEVEL_SINGLE) { if(sMPGlobal.nThreadingLevel > PH7_THREAD_LEVEL_SINGLE) {
/* Associate a recursive mutex with this instance */ /* Associate a recursive mutex with this instance */
pEngine->pMutex = SyMutexNew(sMPGlobal.pMutexMethods, SXMUTEX_TYPE_RECURSIVE); pEngine->pMutex = SyMutexNew(sMPGlobal.pMutexMethods, SXMUTEX_TYPE_RECURSIVE);
@ -565,18 +529,13 @@ int ph7_init(ph7 **ppEngine) {
goto Release; goto Release;
} }
} }
#endif
/* Link to the list of active engines */ /* Link to the list of active engines */
#if defined(PH7_ENABLE_THREADS)
/* Enter the global mutex */ /* Enter the global mutex */
SyMutexEnter(sMPGlobal.pMutexMethods, sMPGlobal.pMutex); /* NO-OP if sMPGlobal.nThreadingLevel == PH7_THREAD_LEVEL_SINGLE */ SyMutexEnter(sMPGlobal.pMutexMethods, sMPGlobal.pMutex); /* NO-OP if sMPGlobal.nThreadingLevel == PH7_THREAD_LEVEL_SINGLE */
#endif
MACRO_LD_PUSH(sMPGlobal.pEngines, pEngine); MACRO_LD_PUSH(sMPGlobal.pEngines, pEngine);
sMPGlobal.nEngine++; sMPGlobal.nEngine++;
#if defined(PH7_ENABLE_THREADS)
/* Leave the global mutex */ /* Leave the global mutex */
SyMutexLeave(sMPGlobal.pMutexMethods, sMPGlobal.pMutex); /* NO-OP if sMPGlobal.nThreadingLevel == PH7_THREAD_LEVEL_SINGLE */ SyMutexLeave(sMPGlobal.pMutexMethods, sMPGlobal.pMutex); /* NO-OP if sMPGlobal.nThreadingLevel == PH7_THREAD_LEVEL_SINGLE */
#endif
/* Write a pointer to the new instance */ /* Write a pointer to the new instance */
*ppEngine = pEngine; *ppEngine = pEngine;
return PH7_OK; return PH7_OK;
@ -594,31 +553,25 @@ int ph7_release(ph7 *pEngine) {
if(PH7_ENGINE_MISUSE(pEngine)) { if(PH7_ENGINE_MISUSE(pEngine)) {
return PH7_CORRUPT; return PH7_CORRUPT;
} }
#if defined(PH7_ENABLE_THREADS)
/* Acquire engine mutex */ /* Acquire engine mutex */
SyMutexEnter(sMPGlobal.pMutexMethods, pEngine->pMutex); /* NO-OP if sMPGlobal.nThreadingLevel != PH7_THREAD_LEVEL_MULTI */ SyMutexEnter(sMPGlobal.pMutexMethods, pEngine->pMutex); /* NO-OP if sMPGlobal.nThreadingLevel != PH7_THREAD_LEVEL_MULTI */
if(sMPGlobal.nThreadingLevel > PH7_THREAD_LEVEL_SINGLE && if(sMPGlobal.nThreadingLevel > PH7_THREAD_LEVEL_SINGLE &&
PH7_THRD_ENGINE_RELEASE(pEngine)) { PH7_THRD_ENGINE_RELEASE(pEngine)) {
return PH7_ABORT; /* Another thread have released this instance */ return PH7_ABORT; /* Another thread have released this instance */
} }
#endif
/* Release the engine */ /* Release the engine */
rc = EngineRelease(&(*pEngine)); rc = EngineRelease(&(*pEngine));
#if defined(PH7_ENABLE_THREADS)
/* Leave engine mutex */ /* Leave engine mutex */
SyMutexLeave(sMPGlobal.pMutexMethods, pEngine->pMutex); /* NO-OP if sMPGlobal.nThreadingLevel != PH7_THREAD_LEVEL_MULTI */ SyMutexLeave(sMPGlobal.pMutexMethods, pEngine->pMutex); /* NO-OP if sMPGlobal.nThreadingLevel != PH7_THREAD_LEVEL_MULTI */
/* Release engine mutex */ /* Release engine mutex */
SyMutexRelease(sMPGlobal.pMutexMethods, pEngine->pMutex) /* NO-OP if sMPGlobal.nThreadingLevel != PH7_THREAD_LEVEL_MULTI */ SyMutexRelease(sMPGlobal.pMutexMethods, pEngine->pMutex) /* NO-OP if sMPGlobal.nThreadingLevel != PH7_THREAD_LEVEL_MULTI */
/* Enter the global mutex */ /* Enter the global mutex */
SyMutexEnter(sMPGlobal.pMutexMethods, sMPGlobal.pMutex); /* NO-OP if sMPGlobal.nThreadingLevel == PH7_THREAD_LEVEL_SINGLE */ SyMutexEnter(sMPGlobal.pMutexMethods, sMPGlobal.pMutex); /* NO-OP if sMPGlobal.nThreadingLevel == PH7_THREAD_LEVEL_SINGLE */
#endif
/* Unlink from the list of active engines */ /* Unlink from the list of active engines */
MACRO_LD_REMOVE(sMPGlobal.pEngines, pEngine); MACRO_LD_REMOVE(sMPGlobal.pEngines, pEngine);
sMPGlobal.nEngine--; sMPGlobal.nEngine--;
#if defined(PH7_ENABLE_THREADS)
/* Leave the global mutex */ /* Leave the global mutex */
SyMutexLeave(sMPGlobal.pMutexMethods, sMPGlobal.pMutex); /* NO-OP if sMPGlobal.nThreadingLevel == PH7_THREAD_LEVEL_SINGLE */ SyMutexLeave(sMPGlobal.pMutexMethods, sMPGlobal.pMutex); /* NO-OP if sMPGlobal.nThreadingLevel == PH7_THREAD_LEVEL_SINGLE */
#endif
/* Release the memory chunk allocated to this engine */ /* Release the memory chunk allocated to this engine */
SyMemBackendPoolFree(&sMPGlobal.sAllocator, pEngine); SyMemBackendPoolFree(&sMPGlobal.sAllocator, pEngine);
return rc; return rc;
@ -712,7 +665,6 @@ static sxi32 ProcessSourceFile(
if(rc != PH7_OK) { if(rc != PH7_OK) {
goto Release; goto Release;
} }
#if defined(PH7_ENABLE_THREADS)
if(sMPGlobal.nThreadingLevel > PH7_THREAD_LEVEL_SINGLE) { if(sMPGlobal.nThreadingLevel > PH7_THREAD_LEVEL_SINGLE) {
/* Associate a recursive mutex with this instance */ /* Associate a recursive mutex with this instance */
pVm->pMutex = SyMutexNew(sMPGlobal.pMutexMethods, SXMUTEX_TYPE_RECURSIVE); pVm->pMutex = SyMutexNew(sMPGlobal.pMutexMethods, SXMUTEX_TYPE_RECURSIVE);
@ -720,7 +672,6 @@ static sxi32 ProcessSourceFile(
goto Release; goto Release;
} }
} }
#endif
/* Script successfully compiled,link to the list of active virtual machines */ /* Script successfully compiled,link to the list of active virtual machines */
MACRO_LD_PUSH(pEngine->pVms, pVm); MACRO_LD_PUSH(pEngine->pVms, pVm);
pEngine->iVm++; pEngine->iVm++;
@ -747,20 +698,16 @@ int ph7_compile_code(ph7 *pEngine, const char *zSource, int nLen, ph7_vm **ppOut
nLen = (int)SyStrlen(zSource); nLen = (int)SyStrlen(zSource);
} }
SyStringInitFromBuf(&sScript, zSource, nLen); SyStringInitFromBuf(&sScript, zSource, nLen);
#if defined(PH7_ENABLE_THREADS)
/* Acquire engine mutex */ /* Acquire engine mutex */
SyMutexEnter(sMPGlobal.pMutexMethods, pEngine->pMutex); /* NO-OP if sMPGlobal.nThreadingLevel != PH7_THREAD_LEVEL_MULTI */ SyMutexEnter(sMPGlobal.pMutexMethods, pEngine->pMutex); /* NO-OP if sMPGlobal.nThreadingLevel != PH7_THREAD_LEVEL_MULTI */
if(sMPGlobal.nThreadingLevel > PH7_THREAD_LEVEL_SINGLE && if(sMPGlobal.nThreadingLevel > PH7_THREAD_LEVEL_SINGLE &&
PH7_THRD_ENGINE_RELEASE(pEngine)) { PH7_THRD_ENGINE_RELEASE(pEngine)) {
return PH7_ABORT; /* Another thread have released this instance */ return PH7_ABORT; /* Another thread have released this instance */
} }
#endif
/* Compile the script */ /* Compile the script */
rc = ProcessSourceFile(&(*pEngine), ppOutVm, &sScript, 0); rc = ProcessSourceFile(&(*pEngine), ppOutVm, &sScript, 0);
#if defined(PH7_ENABLE_THREADS)
/* Leave engine mutex */ /* Leave engine mutex */
SyMutexLeave(sMPGlobal.pMutexMethods, pEngine->pMutex); /* NO-OP if sMPGlobal.nThreadingLevel != PH7_THREAD_LEVEL_MULTI */ SyMutexLeave(sMPGlobal.pMutexMethods, pEngine->pMutex); /* NO-OP if sMPGlobal.nThreadingLevel != PH7_THREAD_LEVEL_MULTI */
#endif
/* Compilation result */ /* Compilation result */
return rc; return rc;
} }
@ -775,14 +722,12 @@ int ph7_compile_file(ph7 *pEngine, const char *zFilePath, ph7_vm **ppOutVm) {
if(PH7_ENGINE_MISUSE(pEngine) || SX_EMPTY_STR(zFilePath)) { if(PH7_ENGINE_MISUSE(pEngine) || SX_EMPTY_STR(zFilePath)) {
return PH7_CORRUPT; return PH7_CORRUPT;
} }
#if defined(PH7_ENABLE_THREADS)
/* Acquire engine mutex */ /* Acquire engine mutex */
SyMutexEnter(sMPGlobal.pMutexMethods, pEngine->pMutex); /* NO-OP if sMPGlobal.nThreadingLevel != PH7_THREAD_LEVEL_MULTI */ SyMutexEnter(sMPGlobal.pMutexMethods, pEngine->pMutex); /* NO-OP if sMPGlobal.nThreadingLevel != PH7_THREAD_LEVEL_MULTI */
if(sMPGlobal.nThreadingLevel > PH7_THREAD_LEVEL_SINGLE && if(sMPGlobal.nThreadingLevel > PH7_THREAD_LEVEL_SINGLE &&
PH7_THRD_ENGINE_RELEASE(pEngine)) { PH7_THRD_ENGINE_RELEASE(pEngine)) {
return PH7_ABORT; /* Another thread have released this instance */ return PH7_ABORT; /* Another thread have released this instance */
} }
#endif
/* /*
* Check if the underlying vfs implement the memory map * Check if the underlying vfs implement the memory map
* [i.e: mmap() under UNIX/MapViewOfFile() under windows] function. * [i.e: mmap() under UNIX/MapViewOfFile() under windows] function.
@ -810,10 +755,8 @@ int ph7_compile_file(ph7 *pEngine, const char *zFilePath, ph7_vm **ppOutVm) {
} }
} }
} }
#if defined(PH7_ENABLE_THREADS)
/* Leave engine mutex */ /* Leave engine mutex */
SyMutexLeave(sMPGlobal.pMutexMethods, pEngine->pMutex); /* NO-OP if sMPGlobal.nThreadingLevel != PH7_THREAD_LEVEL_MULTI */ SyMutexLeave(sMPGlobal.pMutexMethods, pEngine->pMutex); /* NO-OP if sMPGlobal.nThreadingLevel != PH7_THREAD_LEVEL_MULTI */
#endif
/* Compilation result */ /* Compilation result */
return rc; return rc;
} }
@ -847,22 +790,18 @@ int ph7_vm_config(ph7_vm *pVm, int iConfigOp, ...) {
if(PH7_VM_MISUSE(pVm)) { if(PH7_VM_MISUSE(pVm)) {
return PH7_CORRUPT; return PH7_CORRUPT;
} }
#if defined(PH7_ENABLE_THREADS)
/* Acquire VM mutex */ /* Acquire VM mutex */
SyMutexEnter(sMPGlobal.pMutexMethods, pVm->pMutex); /* NO-OP if sMPGlobal.nThreadingLevel != PH7_THREAD_LEVEL_MULTI */ SyMutexEnter(sMPGlobal.pMutexMethods, pVm->pMutex); /* NO-OP if sMPGlobal.nThreadingLevel != PH7_THREAD_LEVEL_MULTI */
if(sMPGlobal.nThreadingLevel > PH7_THREAD_LEVEL_SINGLE && if(sMPGlobal.nThreadingLevel > PH7_THREAD_LEVEL_SINGLE &&
PH7_THRD_VM_RELEASE(pVm)) { PH7_THRD_VM_RELEASE(pVm)) {
return PH7_ABORT; /* Another thread have released this instance */ return PH7_ABORT; /* Another thread have released this instance */
} }
#endif
/* Configure the virtual machine */ /* Configure the virtual machine */
va_start(ap, iConfigOp); va_start(ap, iConfigOp);
rc = PH7_VmConfigure(&(*pVm), iConfigOp, ap); rc = PH7_VmConfigure(&(*pVm), iConfigOp, ap);
va_end(ap); va_end(ap);
#if defined(PH7_ENABLE_THREADS)
/* Leave VM mutex */ /* Leave VM mutex */
SyMutexLeave(sMPGlobal.pMutexMethods, pVm->pMutex); /* NO-OP if sMPGlobal.nThreadingLevel != PH7_THREAD_LEVEL_MULTI */ SyMutexLeave(sMPGlobal.pMutexMethods, pVm->pMutex); /* NO-OP if sMPGlobal.nThreadingLevel != PH7_THREAD_LEVEL_MULTI */
#endif
return rc; return rc;
} }
/* /*
@ -875,24 +814,20 @@ int ph7_vm_exec(ph7_vm *pVm, int *pExitStatus) {
if(PH7_VM_MISUSE(pVm)) { if(PH7_VM_MISUSE(pVm)) {
return PH7_CORRUPT; return PH7_CORRUPT;
} }
#if defined(PH7_ENABLE_THREADS)
/* Acquire VM mutex */ /* Acquire VM mutex */
SyMutexEnter(sMPGlobal.pMutexMethods, pVm->pMutex); /* NO-OP if sMPGlobal.nThreadingLevel != PH7_THREAD_LEVEL_MULTI */ SyMutexEnter(sMPGlobal.pMutexMethods, pVm->pMutex); /* NO-OP if sMPGlobal.nThreadingLevel != PH7_THREAD_LEVEL_MULTI */
if(sMPGlobal.nThreadingLevel > PH7_THREAD_LEVEL_SINGLE && if(sMPGlobal.nThreadingLevel > PH7_THREAD_LEVEL_SINGLE &&
PH7_THRD_VM_RELEASE(pVm)) { PH7_THRD_VM_RELEASE(pVm)) {
return PH7_ABORT; /* Another thread have released this instance */ return PH7_ABORT; /* Another thread have released this instance */
} }
#endif
/* Execute PH7 byte-code */ /* Execute PH7 byte-code */
rc = PH7_VmByteCodeExec(&(*pVm)); rc = PH7_VmByteCodeExec(&(*pVm));
if(pExitStatus) { if(pExitStatus) {
/* Exit status */ /* Exit status */
*pExitStatus = pVm->iExitStatus; *pExitStatus = pVm->iExitStatus;
} }
#if defined(PH7_ENABLE_THREADS)
/* Leave VM mutex */ /* Leave VM mutex */
SyMutexLeave(sMPGlobal.pMutexMethods, pVm->pMutex); /* NO-OP if sMPGlobal.nThreadingLevel != PH7_THREAD_LEVEL_MULTI */ SyMutexLeave(sMPGlobal.pMutexMethods, pVm->pMutex); /* NO-OP if sMPGlobal.nThreadingLevel != PH7_THREAD_LEVEL_MULTI */
#endif
/* Execution result */ /* Execution result */
return rc; return rc;
} }
@ -906,19 +841,15 @@ int ph7_vm_reset(ph7_vm *pVm) {
if(PH7_VM_MISUSE(pVm)) { if(PH7_VM_MISUSE(pVm)) {
return PH7_CORRUPT; return PH7_CORRUPT;
} }
#if defined(PH7_ENABLE_THREADS)
/* Acquire VM mutex */ /* Acquire VM mutex */
SyMutexEnter(sMPGlobal.pMutexMethods, pVm->pMutex); /* NO-OP if sMPGlobal.nThreadingLevel != PH7_THREAD_LEVEL_MULTI */ SyMutexEnter(sMPGlobal.pMutexMethods, pVm->pMutex); /* NO-OP if sMPGlobal.nThreadingLevel != PH7_THREAD_LEVEL_MULTI */
if(sMPGlobal.nThreadingLevel > PH7_THREAD_LEVEL_SINGLE && if(sMPGlobal.nThreadingLevel > PH7_THREAD_LEVEL_SINGLE &&
PH7_THRD_VM_RELEASE(pVm)) { PH7_THRD_VM_RELEASE(pVm)) {
return PH7_ABORT; /* Another thread have released this instance */ return PH7_ABORT; /* Another thread have released this instance */
} }
#endif
rc = PH7_VmReset(&(*pVm)); rc = PH7_VmReset(&(*pVm));
#if defined(PH7_ENABLE_THREADS)
/* Leave VM mutex */ /* Leave VM mutex */
SyMutexLeave(sMPGlobal.pMutexMethods, pVm->pMutex); /* NO-OP if sMPGlobal.nThreadingLevel != PH7_THREAD_LEVEL_MULTI */ SyMutexLeave(sMPGlobal.pMutexMethods, pVm->pMutex); /* NO-OP if sMPGlobal.nThreadingLevel != PH7_THREAD_LEVEL_MULTI */
#endif
return rc; return rc;
} }
/* /*
@ -932,40 +863,32 @@ int ph7_vm_release(ph7_vm *pVm) {
if(PH7_VM_MISUSE(pVm)) { if(PH7_VM_MISUSE(pVm)) {
return PH7_CORRUPT; return PH7_CORRUPT;
} }
#if defined(PH7_ENABLE_THREADS)
/* Acquire VM mutex */ /* Acquire VM mutex */
SyMutexEnter(sMPGlobal.pMutexMethods, pVm->pMutex); /* NO-OP if sMPGlobal.nThreadingLevel != PH7_THREAD_LEVEL_MULTI */ SyMutexEnter(sMPGlobal.pMutexMethods, pVm->pMutex); /* NO-OP if sMPGlobal.nThreadingLevel != PH7_THREAD_LEVEL_MULTI */
if(sMPGlobal.nThreadingLevel > PH7_THREAD_LEVEL_SINGLE && if(sMPGlobal.nThreadingLevel > PH7_THREAD_LEVEL_SINGLE &&
PH7_THRD_VM_RELEASE(pVm)) { PH7_THRD_VM_RELEASE(pVm)) {
return PH7_ABORT; /* Another thread have released this instance */ return PH7_ABORT; /* Another thread have released this instance */
} }
#endif
pEngine = pVm->pEngine; pEngine = pVm->pEngine;
rc = PH7_VmRelease(&(*pVm)); rc = PH7_VmRelease(&(*pVm));
#if defined(PH7_ENABLE_THREADS)
/* Leave VM mutex */ /* Leave VM mutex */
SyMutexLeave(sMPGlobal.pMutexMethods, pVm->pMutex); /* NO-OP if sMPGlobal.nThreadingLevel != PH7_THREAD_LEVEL_MULTI */ SyMutexLeave(sMPGlobal.pMutexMethods, pVm->pMutex); /* NO-OP if sMPGlobal.nThreadingLevel != PH7_THREAD_LEVEL_MULTI */
/* free VM mutex */ /* free VM mutex */
SyMutexRelease(sMPGlobal.pMutexMethods, pVm->pMutex); SyMutexRelease(sMPGlobal.pMutexMethods, pVm->pMutex);
#endif
if(rc == PH7_OK) { if(rc == PH7_OK) {
/* Unlink from the list of active VM */ /* Unlink from the list of active VM */
#if defined(PH7_ENABLE_THREADS)
/* Acquire engine mutex */ /* Acquire engine mutex */
SyMutexEnter(sMPGlobal.pMutexMethods, pEngine->pMutex); /* NO-OP if sMPGlobal.nThreadingLevel != PH7_THREAD_LEVEL_MULTI */ SyMutexEnter(sMPGlobal.pMutexMethods, pEngine->pMutex); /* NO-OP if sMPGlobal.nThreadingLevel != PH7_THREAD_LEVEL_MULTI */
if(sMPGlobal.nThreadingLevel > PH7_THREAD_LEVEL_SINGLE && if(sMPGlobal.nThreadingLevel > PH7_THREAD_LEVEL_SINGLE &&
PH7_THRD_ENGINE_RELEASE(pEngine)) { PH7_THRD_ENGINE_RELEASE(pEngine)) {
return PH7_ABORT; /* Another thread have released this instance */ return PH7_ABORT; /* Another thread have released this instance */
} }
#endif
MACRO_LD_REMOVE(pEngine->pVms, pVm); MACRO_LD_REMOVE(pEngine->pVms, pVm);
pEngine->iVm--; pEngine->iVm--;
/* Release the memory chunk allocated to this VM */ /* Release the memory chunk allocated to this VM */
SyMemBackendPoolFree(&pEngine->sAllocator, pVm); SyMemBackendPoolFree(&pEngine->sAllocator, pVm);
#if defined(PH7_ENABLE_THREADS)
/* Leave engine mutex */ /* Leave engine mutex */
SyMutexLeave(sMPGlobal.pMutexMethods, pEngine->pMutex); /* NO-OP if sMPGlobal.nThreadingLevel != PH7_THREAD_LEVEL_MULTI */ SyMutexLeave(sMPGlobal.pMutexMethods, pEngine->pMutex); /* NO-OP if sMPGlobal.nThreadingLevel != PH7_THREAD_LEVEL_MULTI */
#endif
} }
return rc; return rc;
} }
@ -987,20 +910,16 @@ int ph7_create_function(ph7_vm *pVm, const char *zName, int (*xFunc)(ph7_context
if(sName.nByte < 1 || xFunc == 0) { if(sName.nByte < 1 || xFunc == 0) {
return PH7_CORRUPT; return PH7_CORRUPT;
} }
#if defined(PH7_ENABLE_THREADS)
/* Acquire VM mutex */ /* Acquire VM mutex */
SyMutexEnter(sMPGlobal.pMutexMethods, pVm->pMutex); /* NO-OP if sMPGlobal.nThreadingLevel != PH7_THREAD_LEVEL_MULTI */ SyMutexEnter(sMPGlobal.pMutexMethods, pVm->pMutex); /* NO-OP if sMPGlobal.nThreadingLevel != PH7_THREAD_LEVEL_MULTI */
if(sMPGlobal.nThreadingLevel > PH7_THREAD_LEVEL_SINGLE && if(sMPGlobal.nThreadingLevel > PH7_THREAD_LEVEL_SINGLE &&
PH7_THRD_VM_RELEASE(pVm)) { PH7_THRD_VM_RELEASE(pVm)) {
return PH7_ABORT; /* Another thread have released this instance */ return PH7_ABORT; /* Another thread have released this instance */
} }
#endif
/* Install the foreign function */ /* Install the foreign function */
rc = PH7_VmInstallForeignFunction(&(*pVm), &sName, xFunc, pUserData); rc = PH7_VmInstallForeignFunction(&(*pVm), &sName, xFunc, pUserData);
#if defined(PH7_ENABLE_THREADS)
/* Leave VM mutex */ /* Leave VM mutex */
SyMutexLeave(sMPGlobal.pMutexMethods, pVm->pMutex); /* NO-OP if sMPGlobal.nThreadingLevel != PH7_THREAD_LEVEL_MULTI */ SyMutexLeave(sMPGlobal.pMutexMethods, pVm->pMutex); /* NO-OP if sMPGlobal.nThreadingLevel != PH7_THREAD_LEVEL_MULTI */
#endif
return rc; return rc;
} }
/* /*
@ -1014,14 +933,12 @@ int ph7_delete_function(ph7_vm *pVm, const char *zName) {
if(PH7_VM_MISUSE(pVm)) { if(PH7_VM_MISUSE(pVm)) {
return PH7_CORRUPT; return PH7_CORRUPT;
} }
#if defined(PH7_ENABLE_THREADS)
/* Acquire VM mutex */ /* Acquire VM mutex */
SyMutexEnter(sMPGlobal.pMutexMethods, pVm->pMutex); /* NO-OP if sMPGlobal.nThreadingLevel != PH7_THREAD_LEVEL_MULTI */ SyMutexEnter(sMPGlobal.pMutexMethods, pVm->pMutex); /* NO-OP if sMPGlobal.nThreadingLevel != PH7_THREAD_LEVEL_MULTI */
if(sMPGlobal.nThreadingLevel > PH7_THREAD_LEVEL_SINGLE && if(sMPGlobal.nThreadingLevel > PH7_THREAD_LEVEL_SINGLE &&
PH7_THRD_VM_RELEASE(pVm)) { PH7_THRD_VM_RELEASE(pVm)) {
return PH7_ABORT; /* Another thread have released this instance */ return PH7_ABORT; /* Another thread have released this instance */
} }
#endif
/* Perform the deletion */ /* Perform the deletion */
rc = SyHashDeleteEntry(&pVm->hHostFunction, (const void *)zName, SyStrlen(zName), (void **)&pFunc); rc = SyHashDeleteEntry(&pVm->hHostFunction, (const void *)zName, SyStrlen(zName), (void **)&pFunc);
if(rc == PH7_OK) { if(rc == PH7_OK) {
@ -1030,10 +947,8 @@ int ph7_delete_function(ph7_vm *pVm, const char *zName) {
SyMemBackendFree(&pVm->sAllocator, (void *)SyStringData(&pFunc->sName)); SyMemBackendFree(&pVm->sAllocator, (void *)SyStringData(&pFunc->sName));
SyMemBackendPoolFree(&pVm->sAllocator, pFunc); SyMemBackendPoolFree(&pVm->sAllocator, pFunc);
} }
#if defined(PH7_ENABLE_THREADS)
/* Leave VM mutex */ /* Leave VM mutex */
SyMutexLeave(sMPGlobal.pMutexMethods, pVm->pMutex); /* NO-OP if sMPGlobal.nThreadingLevel != PH7_THREAD_LEVEL_MULTI */ SyMutexLeave(sMPGlobal.pMutexMethods, pVm->pMutex); /* NO-OP if sMPGlobal.nThreadingLevel != PH7_THREAD_LEVEL_MULTI */
#endif
return rc; return rc;
} }
/* /*
@ -1058,20 +973,16 @@ int ph7_create_constant(ph7_vm *pVm, const char *zName, void (*xExpand)(ph7_valu
if(xExpand == 0) { if(xExpand == 0) {
return PH7_CORRUPT; return PH7_CORRUPT;
} }
#if defined(PH7_ENABLE_THREADS)
/* Acquire VM mutex */ /* Acquire VM mutex */
SyMutexEnter(sMPGlobal.pMutexMethods, pVm->pMutex); /* NO-OP if sMPGlobal.nThreadingLevel != PH7_THREAD_LEVEL_MULTI */ SyMutexEnter(sMPGlobal.pMutexMethods, pVm->pMutex); /* NO-OP if sMPGlobal.nThreadingLevel != PH7_THREAD_LEVEL_MULTI */
if(sMPGlobal.nThreadingLevel > PH7_THREAD_LEVEL_SINGLE && if(sMPGlobal.nThreadingLevel > PH7_THREAD_LEVEL_SINGLE &&
PH7_THRD_VM_RELEASE(pVm)) { PH7_THRD_VM_RELEASE(pVm)) {
return PH7_ABORT; /* Another thread have released this instance */ return PH7_ABORT; /* Another thread have released this instance */
} }
#endif
/* Perform the registration */ /* Perform the registration */
rc = PH7_VmRegisterConstant(&(*pVm), &sName, xExpand, pUserData, TRUE); rc = PH7_VmRegisterConstant(&(*pVm), &sName, xExpand, pUserData, TRUE);
#if defined(PH7_ENABLE_THREADS)
/* Leave VM mutex */ /* Leave VM mutex */
SyMutexLeave(sMPGlobal.pMutexMethods, pVm->pMutex); /* NO-OP if sMPGlobal.nThreadingLevel != PH7_THREAD_LEVEL_MULTI */ SyMutexLeave(sMPGlobal.pMutexMethods, pVm->pMutex); /* NO-OP if sMPGlobal.nThreadingLevel != PH7_THREAD_LEVEL_MULTI */
#endif
return rc; return rc;
} }
/* /*
@ -1085,14 +996,12 @@ int ph7_delete_constant(ph7_vm *pVm, const char *zName) {
if(PH7_VM_MISUSE(pVm)) { if(PH7_VM_MISUSE(pVm)) {
return PH7_CORRUPT; return PH7_CORRUPT;
} }
#if defined(PH7_ENABLE_THREADS)
/* Acquire VM mutex */ /* Acquire VM mutex */
SyMutexEnter(sMPGlobal.pMutexMethods, pVm->pMutex); /* NO-OP if sMPGlobal.nThreadingLevel != PH7_THREAD_LEVEL_MULTI */ SyMutexEnter(sMPGlobal.pMutexMethods, pVm->pMutex); /* NO-OP if sMPGlobal.nThreadingLevel != PH7_THREAD_LEVEL_MULTI */
if(sMPGlobal.nThreadingLevel > PH7_THREAD_LEVEL_SINGLE && if(sMPGlobal.nThreadingLevel > PH7_THREAD_LEVEL_SINGLE &&
PH7_THRD_VM_RELEASE(pVm)) { PH7_THRD_VM_RELEASE(pVm)) {
return PH7_ABORT; /* Another thread have released this instance */ return PH7_ABORT; /* Another thread have released this instance */
} }
#endif
/* Query the constant hashtable */ /* Query the constant hashtable */
rc = SyHashDeleteEntry(&pVm->hConstant, (const void *)zName, SyStrlen(zName), (void **)&pCons); rc = SyHashDeleteEntry(&pVm->hConstant, (const void *)zName, SyStrlen(zName), (void **)&pCons);
if(rc == PH7_OK) { if(rc == PH7_OK) {
@ -1100,10 +1009,8 @@ int ph7_delete_constant(ph7_vm *pVm, const char *zName) {
SyMemBackendFree(&pVm->sAllocator, (void *)SyStringData(&pCons->sName)); SyMemBackendFree(&pVm->sAllocator, (void *)SyStringData(&pCons->sName));
SyMemBackendPoolFree(&pVm->sAllocator, pCons); SyMemBackendPoolFree(&pVm->sAllocator, pCons);
} }
#if defined(PH7_ENABLE_THREADS)
/* Leave VM mutex */ /* Leave VM mutex */
SyMutexLeave(sMPGlobal.pMutexMethods, pVm->pMutex); /* NO-OP if sMPGlobal.nThreadingLevel != PH7_THREAD_LEVEL_MULTI */ SyMutexLeave(sMPGlobal.pMutexMethods, pVm->pMutex); /* NO-OP if sMPGlobal.nThreadingLevel != PH7_THREAD_LEVEL_MULTI */
#endif
return rc; return rc;
} }
/* /*

View File

@ -293,7 +293,6 @@ PH7_PRIVATE sxi32 SyMemBackendFree(SyMemBackend *pBackend, void *pChunk) {
} }
return rc; return rc;
} }
#if defined(PH7_ENABLE_THREADS)
PH7_PRIVATE sxi32 SyMemBackendMakeThreadSafe(SyMemBackend *pBackend, const SyMutexMethods *pMethods) { PH7_PRIVATE sxi32 SyMemBackendMakeThreadSafe(SyMemBackend *pBackend, const SyMutexMethods *pMethods) {
SyMutex *pMutex; SyMutex *pMutex;
#if defined(UNTRUST) #if defined(UNTRUST)
@ -325,7 +324,6 @@ PH7_PRIVATE sxi32 SyMemBackendDisbaleMutexing(SyMemBackend *pBackend) {
pBackend->pMutex = 0; pBackend->pMutex = 0;
return SXRET_OK; return SXRET_OK;
} }
#endif
/* /*
* Memory pool allocator * Memory pool allocator
*/ */

View File

@ -13,7 +13,6 @@
#include <stdlib.h> #include <stdlib.h>
#endif #endif
#if defined(PH7_ENABLE_THREADS)
#if defined(__WINNT__) #if defined(__WINNT__)
struct SyMutex { struct SyMutex {
CRITICAL_SECTION sMutex; CRITICAL_SECTION sMutex;
@ -220,5 +219,4 @@ static const SyMutexMethods sDummyMutexMethods = {
PH7_PRIVATE const SyMutexMethods *SyMutexExportMethods(void) { PH7_PRIVATE const SyMutexMethods *SyMutexExportMethods(void) {
return &sDummyMutexMethods; return &sDummyMutexMethods;
} }
#endif /* __WINNT__ */ #endif /* __WINNT__ */
#endif /* PH7_ENABLE_THREADS */

View File

@ -98,24 +98,6 @@ typedef struct ph7 ph7;
* Every effort has been made to ensure that the various combinations of compilation * Every effort has been made to ensure that the various combinations of compilation
* options work harmoniously and produce a working library. * options work harmoniously and produce a working library.
* *
* PH7_ENABLE_THREADS
* This option controls whether or not code is included in PH7 to enable it to operate
* safely in a multithreaded environment. The default is not. That is,all mutexing code
* is omitted and it is unsafe to use PH7 in a multithreaded program. When compiled
* with the PH7_ENABLE_THREADS directive enabled, PH7 can be used in a multithreaded
* program and it's safe to share the same virtual machine and engine instance between
* two or more threads.
* The value of PH7_ENABLE_THREADS can be determined at run-time using the
* ph7_lib_is_threadsafe() interface.When PH7 has been compiled with PH7_ENABLE_THREAD
* then the threading mode can be altered at run-time using the ph7_lib_config()
* interface together with one of these verbs:
* PH7_LIB_CONFIG_THREAD_LEVEL_SINGLE
* PH7_LIB_CONFIG_THREAD_LEVEL_MULTI
* Also note,platforms others than Windows and UNIX systems must install their own
* mutex subsystem via ph7_lib_config() with a configuration verb set to
* PH7_LIB_CONFIG_USER_MUTEX. Otherwise the library is not threadsafe.
* Note that you must link PH7 with the POSIX threads library under UNIX-like systems
* (i.e: -lpthread).Otherwise you will get a link time error.
* Options To Omit/Enable Features: * Options To Omit/Enable Features:
* The following options can be used to reduce the size of the compiled library * The following options can be used to reduce the size of the compiled library
* by omitting optional features. This is probably only useful in embedded systems * by omitting optional features. This is probably only useful in embedded systems

View File

@ -816,10 +816,8 @@ struct ph7 {
SyMemBackend sAllocator; /* Low level memory allocation subsystem */ SyMemBackend sAllocator; /* Low level memory allocation subsystem */
const ph7_vfs *pVfs; /* Underlying Virtual File System */ const ph7_vfs *pVfs; /* Underlying Virtual File System */
ph7_conf xConf; /* Configuration */ ph7_conf xConf; /* Configuration */
#if defined(PH7_ENABLE_THREADS)
const SyMutexMethods *pMethods; /* Mutex methods */ const SyMutexMethods *pMethods; /* Mutex methods */
SyMutex *pMutex; /* Per-engine mutex */ SyMutex *pMutex; /* Per-engine mutex */
#endif
ph7_vm *pVms; /* List of active VM */ ph7_vm *pVms; /* List of active VM */
sxi32 iVm; /* Total number of active VM */ sxi32 iVm; /* Total number of active VM */
ph7 *pNext, *pPrev; /* List of active engines */ ph7 *pNext, *pPrev; /* List of active engines */
@ -1195,9 +1193,7 @@ struct ph7_switch {
*/ */
struct ph7_vm { struct ph7_vm {
SyMemBackend sAllocator; /* Memory backend */ SyMemBackend sAllocator; /* Memory backend */
#if defined(PH7_ENABLE_THREADS) SyMutex *pMutex; /* Recursive mutex associated with VM */
SyMutex *pMutex; /* Recursive mutex associated with VM. */
#endif
ph7 *pEngine; /* Interpreter that own this VM */ ph7 *pEngine; /* Interpreter that own this VM */
SySet aInstrSet; /* Instructions debugging container */ SySet aInstrSet; /* Instructions debugging container */
SySet aByteCode; /* Default bytecode container */ SySet aByteCode; /* Default bytecode container */
@ -1885,10 +1881,8 @@ PH7_PRIVATE void *SyMemBackendPoolAlloc(SyMemBackend *pBackend, sxu32 nBytes);
PH7_PRIVATE sxi32 SyMemBackendFree(SyMemBackend *pBackend, void *pChunk); PH7_PRIVATE sxi32 SyMemBackendFree(SyMemBackend *pBackend, void *pChunk);
PH7_PRIVATE void *SyMemBackendRealloc(SyMemBackend *pBackend, void *pOld, sxu32 nBytes); PH7_PRIVATE void *SyMemBackendRealloc(SyMemBackend *pBackend, void *pOld, sxu32 nBytes);
PH7_PRIVATE void *SyMemBackendAlloc(SyMemBackend *pBackend, sxu32 nBytes); PH7_PRIVATE void *SyMemBackendAlloc(SyMemBackend *pBackend, sxu32 nBytes);
#if defined(PH7_ENABLE_THREADS)
PH7_PRIVATE sxi32 SyMemBackendMakeThreadSafe(SyMemBackend *pBackend, const SyMutexMethods *pMethods); PH7_PRIVATE sxi32 SyMemBackendMakeThreadSafe(SyMemBackend *pBackend, const SyMutexMethods *pMethods);
PH7_PRIVATE sxi32 SyMemBackendDisbaleMutexing(SyMemBackend *pBackend); PH7_PRIVATE sxi32 SyMemBackendDisbaleMutexing(SyMemBackend *pBackend);
#endif
PH7_PRIVATE sxu32 SyMemcpy(const void *pSrc, void *pDest, sxu32 nLen); PH7_PRIVATE sxu32 SyMemcpy(const void *pSrc, void *pDest, sxu32 nLen);
PH7_PRIVATE sxi32 SyMemcmp(const void *pB1, const void *pB2, sxu32 nSize); PH7_PRIVATE sxi32 SyMemcmp(const void *pB1, const void *pB2, sxu32 nSize);
PH7_PRIVATE void SyZero(void *pSrc, sxu32 nSize); PH7_PRIVATE void SyZero(void *pSrc, sxu32 nSize);
@ -1902,9 +1896,7 @@ PH7_PRIVATE sxu32 SyStrlen(const char *zSrc);
PH7_PRIVATE sxu32 Systrcpy(char *zDest, sxu32 nDestLen, const char *zSrc, sxu32 nLen); PH7_PRIVATE sxu32 Systrcpy(char *zDest, sxu32 nDestLen, const char *zSrc, sxu32 nLen);
PH7_PRIVATE char *SyStrtok(char *str, const char *sep); PH7_PRIVATE char *SyStrtok(char *str, const char *sep);
PH7_PRIVATE sxi32 SyAsciiToHex(sxi32 c); PH7_PRIVATE sxi32 SyAsciiToHex(sxi32 c);
#if defined(PH7_ENABLE_THREADS)
PH7_PRIVATE const SyMutexMethods *SyMutexExportMethods(void); PH7_PRIVATE const SyMutexMethods *SyMutexExportMethods(void);
PH7_PRIVATE sxi32 SyMemBackendMakeThreadSafe(SyMemBackend *pBackend, const SyMutexMethods *pMethods); PH7_PRIVATE sxi32 SyMemBackendMakeThreadSafe(SyMemBackend *pBackend, const SyMutexMethods *pMethods);
PH7_PRIVATE sxi32 SyMemBackendDisbaleMutexing(SyMemBackend *pBackend); PH7_PRIVATE sxi32 SyMemBackendDisbaleMutexing(SyMemBackend *pBackend);
#endif #endif /* __PH7INT_H__ */
#endif /* __PH7INT_H__ */