-updated tests:
*updated build scripts *removed tls variables from code (needed to support WebAssembly) *some mmutils tweaks *some fixes *pthread TLS thread ID implementation -added Atomic file (reimplementation of atomics templates for emscripten) -added emscripten support to ecs.std
This commit is contained in:
parent
46de0f6adb
commit
946fbf2934
18 changed files with 443 additions and 229 deletions
149
source/ecs/std.d
149
source/ecs/std.d
|
|
@ -1,12 +1,25 @@
|
|||
module ecs.std;
|
||||
|
||||
//import core.stdc.stdlib : malloc, free, realloc;
|
||||
//import core.stdc.string : memcpy;
|
||||
version(Emscripten)version = ECSEmscripten;
|
||||
|
||||
import std.traits;
|
||||
|
||||
version(WebAssembly)
|
||||
version(ECSEmscripten)
|
||||
{
|
||||
extern(C) struct pthread_mutex_t
|
||||
{
|
||||
union
|
||||
{
|
||||
int[6] __i;
|
||||
void[6] *__p;
|
||||
}
|
||||
}
|
||||
|
||||
extern(C) struct pthread_mutexattr_t
|
||||
{
|
||||
uint __attr;
|
||||
}
|
||||
|
||||
extern(C) int memcmp (const void *s1, const void *s2, size_t size);
|
||||
extern(C) void exit (int status) nothrow @nogc;
|
||||
extern(C) void __assert(const(char)* msg, const(char)* file, uint line) { exit(-20);}
|
||||
|
|
@ -17,6 +30,16 @@ version(WebAssembly)
|
|||
extern(C) void* memset(void*, int val, size_t size) @nogc nothrow @system;
|
||||
extern(C) int posix_memalign(void**, size_t, size_t) @nogc nothrow @system;
|
||||
extern(C) void qsort(void* base, size_t num, size_t size, int function(const void*,const void*) compar) @nogc nothrow @system;
|
||||
|
||||
extern(C) int pthread_mutex_lock(pthread_mutex_t *mutex) @nogc nothrow;
|
||||
extern(C) int pthread_mutex_trylock(pthread_mutex_t *mutex) @nogc nothrow;
|
||||
extern(C) int pthread_mutex_unlock(pthread_mutex_t *mutex) @nogc nothrow;
|
||||
extern(C) void pthread_mutexattr_settype(pthread_mutexattr_t *attr, int type) @nogc nothrow;
|
||||
extern(C) void pthread_mutexattr_destroy(pthread_mutexattr_t *attr) @nogc nothrow;
|
||||
extern(C) int pthread_mutexattr_init(pthread_mutexattr_t *attr) @nogc nothrow;
|
||||
extern(C) int pthread_mutex_destroy(pthread_mutex_t *mutex) @nogc nothrow;
|
||||
extern(C) int pthread_mutex_init(pthread_mutex_t* mutex, const pthread_mutexattr_t* attr) @nogc nothrow;
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -25,8 +48,10 @@ else
|
|||
public import core.stdc.stdlib : qsort;
|
||||
}
|
||||
|
||||
|
||||
version (Windows)
|
||||
version(ECSEmscripten)
|
||||
{
|
||||
}
|
||||
else version (Windows)
|
||||
{
|
||||
import core.sys.windows.windows;
|
||||
extern(Windows) void* _aligned_malloc(size_t size,size_t alignment) @nogc nothrow @system;
|
||||
|
|
@ -51,10 +76,28 @@ else version (Posix)
|
|||
import core.sys.posix.stdlib;
|
||||
}
|
||||
|
||||
version(D_betterC)
|
||||
version(ECSEmscripten)
|
||||
{
|
||||
private const uint max_alloca = 10000;
|
||||
private char[max_alloca] alloca_array;
|
||||
private __gshared byte[max_alloca] alloca_array;
|
||||
private __gshared uint alloca_pos = 0;
|
||||
export extern(C) void* alloca(size_t length) @nogc nothrow
|
||||
{
|
||||
if(alloca_pos + length > max_alloca)alloca_pos = 0;
|
||||
void* ret = &alloca_array[alloca_pos];
|
||||
alloca_pos += length;
|
||||
return ret;
|
||||
}
|
||||
//extern(C) void* alloca(size_t size) @nogc nothrow;
|
||||
/*export extern(C) void* alloca(size_t length) @nogc nothrow
|
||||
{
|
||||
return null;
|
||||
}*/
|
||||
}
|
||||
else version(D_BetterC)
|
||||
{
|
||||
private const uint max_alloca = 10000;
|
||||
private __gshared byte[max_alloca] alloca_array;
|
||||
private uint alloca_pos = 0;
|
||||
export extern(C) void* alloca(size_t length) @nogc nothrow
|
||||
{
|
||||
|
|
@ -64,20 +107,10 @@ version(D_betterC)
|
|||
return ret;
|
||||
}
|
||||
}
|
||||
else version(WebAssembly)
|
||||
else
|
||||
{
|
||||
private const uint max_alloca = 10000;
|
||||
private char[max_alloca] alloca_array;
|
||||
private uint alloca_pos = 0;
|
||||
export extern(C) void* alloca(size_t length) @nogc nothrow
|
||||
{
|
||||
if(alloca_pos + length > max_alloca)alloca_pos = 0;
|
||||
void* ret = &alloca_array[alloca_pos];
|
||||
alloca_pos += length;
|
||||
return ret;
|
||||
}
|
||||
public import core.stdc.stdlib : alloca;
|
||||
}
|
||||
else public import core.stdc.stdlib : alloca;
|
||||
|
||||
static struct Mallocator
|
||||
{
|
||||
|
|
@ -143,7 +176,7 @@ static struct Mallocator
|
|||
void* ret;
|
||||
version(Posix)posix_memalign(&ret, alignment, length);//ret = aligned_alloc(alignment, length);
|
||||
else version(Windows)ret = _aligned_malloc(length, alignment);
|
||||
else version(WebAssembly)posix_memalign(&ret, alignment, length);//malloc(length);
|
||||
else version(ECSEmscripten)posix_memalign(&ret, alignment, length);//malloc(length);
|
||||
else static assert(0, "Unimplemented platform!");
|
||||
return ret;
|
||||
}
|
||||
|
|
@ -159,7 +192,7 @@ static struct Mallocator
|
|||
static if(__traits(hasMember, T, "__dtor"))object.__dtor();
|
||||
version(Posix)free(cast(void*)object);
|
||||
else version(Windows)_aligned_free(cast(void*)object);
|
||||
else version(WebAssembly)free(cast(void*)object);
|
||||
else version(ECSEmscripten)free(cast(void*)object);
|
||||
else static assert(0, "Unimplemented platform!");
|
||||
}
|
||||
}
|
||||
|
|
@ -167,7 +200,43 @@ static struct Mallocator
|
|||
struct Mutex
|
||||
{
|
||||
|
||||
version (Windows)
|
||||
version(ECSEmscripten)
|
||||
{
|
||||
void initialize() nothrow @nogc
|
||||
{
|
||||
pthread_mutexattr_t attr = void;
|
||||
|
||||
//pthread_mutexattr_init(&attr);
|
||||
|
||||
//pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
|
||||
pthread_mutex_init(cast(pthread_mutex_t*) &m_handle, &attr);
|
||||
|
||||
//pthread_mutexattr_destroy(&attr);
|
||||
}
|
||||
|
||||
void destroy() nothrow @nogc
|
||||
{
|
||||
pthread_mutex_destroy(&m_handle);
|
||||
}
|
||||
|
||||
void lock() nothrow @nogc
|
||||
{
|
||||
pthread_mutex_lock(&m_handle);
|
||||
}
|
||||
|
||||
void unlock() nothrow @nogc
|
||||
{
|
||||
pthread_mutex_unlock(&m_handle);
|
||||
}
|
||||
|
||||
int tryLock() nothrow @nogc
|
||||
{
|
||||
return pthread_mutex_trylock(&m_handle) == 0;
|
||||
}
|
||||
|
||||
private pthread_mutex_t m_handle;
|
||||
}
|
||||
else version (Windows)
|
||||
{
|
||||
void initialize() nothrow @nogc
|
||||
{
|
||||
|
|
@ -232,41 +301,5 @@ struct Mutex
|
|||
|
||||
private pthread_mutex_t m_handle;
|
||||
}
|
||||
else version(WebAssembly)
|
||||
{
|
||||
void initialize() nothrow @nogc
|
||||
{
|
||||
/*pthread_mutexattr_t attr = void;
|
||||
|
||||
pthread_mutexattr_init(&attr);
|
||||
|
||||
pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
|
||||
pthread_mutex_init(cast(pthread_mutex_t*) &m_handle, &attr);
|
||||
|
||||
pthread_mutexattr_destroy(&attr);*/
|
||||
}
|
||||
|
||||
void destroy() nothrow @nogc
|
||||
{
|
||||
//pthread_mutex_destroy(&m_handle);
|
||||
}
|
||||
|
||||
void lock() nothrow @nogc
|
||||
{
|
||||
//pthread_mutex_lock(&m_handle);
|
||||
}
|
||||
|
||||
void unlock() nothrow @nogc
|
||||
{
|
||||
//pthread_mutex_unlock(&m_handle);
|
||||
}
|
||||
|
||||
int tryLock() nothrow @nogc
|
||||
{
|
||||
return 0;//return pthread_mutex_trylock(&m_handle) == 0;
|
||||
}
|
||||
|
||||
private int m_handle;
|
||||
}
|
||||
else static assert(0, "unsupported platform!");
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue