Make lua data race free
Fixes tsan trace report between lua viewscreen and other threads running lua without CoreSuspender lock. But I would assume similar races exists when using lua from console thread, remote thread and vmethods same time.develop
parent
ea37eecfb1
commit
a90a6b2a7b
@ -0,0 +1,61 @@
|
|||||||
|
/**
|
||||||
|
Copyright © 2018 Pauli <suokkos@gmail.com>
|
||||||
|
|
||||||
|
This software is provided 'as-is', without any express or implied
|
||||||
|
warranty. In no event will the authors be held liable for any
|
||||||
|
damages arising from the use of this software.
|
||||||
|
|
||||||
|
Permission is granted to anyone to use this software for any
|
||||||
|
purpose, including commercial applications, and to alter it and
|
||||||
|
redistribute it freely, subject to the following restrictions:
|
||||||
|
|
||||||
|
1. The origin of this software must not be misrepresented; you must
|
||||||
|
not claim that you wrote the original software. If you use this
|
||||||
|
software in a product, an acknowledgment in the product
|
||||||
|
documentation would be appreciated but is not required.
|
||||||
|
|
||||||
|
2. Altered source versions must be plainly marked as such, and
|
||||||
|
must not be misrepresented as being the original software.
|
||||||
|
|
||||||
|
3. This notice may not be removed or altered from any source
|
||||||
|
distribution.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
#include <windows.h>
|
||||||
|
#else
|
||||||
|
#include <pthread.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
/*! \file lualimit.h
|
||||||
|
* dfhack specific lua porting header that overrides lua defaults for thread
|
||||||
|
* safety.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
typedef CRITICAL_SECTION mutex_t;
|
||||||
|
#else
|
||||||
|
typedef pthread_mutex_t mutex_t;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
struct lua_extra_state {
|
||||||
|
mutex_t* mutex;
|
||||||
|
};
|
||||||
|
|
||||||
|
#define luai_mutex(L) ((lua_extra_state*)lua_getextraspace(L))->mutex
|
||||||
|
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
#define luai_userstateopen(L) luai_mutex(L) = (mutex_t*)malloc(sizeof(mutex_t)); InitializeCriticalSection(luai_mutex(L))
|
||||||
|
#define luai_userstateclose(L) lua_unlock(L); DeleteCriticalSection(luai_mutex(L)); free(luai_mutex(L))
|
||||||
|
#define lua_lock(L) EnterCriticalSection(luai_mutex(L))
|
||||||
|
#define lua_unlock(L) LeaveCriticalSection(luai_mutex(L))
|
||||||
|
#else
|
||||||
|
#define luai_userstateopen(L) luai_mutex(L) = (mutex_t*)malloc(sizeof(mutex_t)); *luai_mutex(L) = PTHREAD_MUTEX_INITIALIZER
|
||||||
|
#define luai_userstateclose(L) lua_unlock(L); pthread_mutex_destroy(luai_mutex(L)); free(luai_mutex(L))
|
||||||
|
#define lua_lock(L) pthread_mutex_lock(luai_mutex(L))
|
||||||
|
#define lua_unlock(L) pthread_mutex_unlock(luai_mutex(L))
|
||||||
|
#endif
|
Loading…
Reference in New Issue