It looks like a dirty hack, it probably is, but this fixes the GC

This commit is contained in:
bart@bartbes.ath.cx
2010-05-20 21:53:50 +02:00
parent a349c9f85a
commit 200d4bc653
3 changed files with 30 additions and 7 deletions
+11 -2
View File
@@ -31,10 +31,13 @@
// SDL
#include <SDL_mutex.h>
#include <SDL_thread.h>
namespace love
{
static SDL_mutex *gcmutex = 0;
void *_gcmutex = 0;
unsigned int _gcthread = 0;
/**
* Called when an object is collected. The object is released
* once in this function, possibly deleting it.
@@ -42,13 +45,19 @@ namespace love
static int w__gc(lua_State * L)
{
if (!gcmutex)
{
gcmutex = SDL_CreateMutex();
_gcmutex = (void*) gcmutex;
}
Proxy * p = (Proxy *)lua_touserdata(L, 1);
Object * t = (Object *)p->data;
SDL_mutexP(gcmutex);
if(p->own)
{
SDL_mutexP(gcmutex);
_gcthread = (unsigned int) SDL_ThreadID();
t->release();
SDL_mutexV(gcmutex);
SDL_mutexV(gcmutex);
}
return 0;
}
+4
View File
@@ -37,6 +37,10 @@ namespace love
class Module;
class Reference;
// Exposed mutex of the GC
extern void *_gcmutex;
extern unsigned int _gcthread;
/**
* Registries represent special tables which can be accessed with
* luax_getregistry.
+10
View File
@@ -194,7 +194,15 @@ namespace sdl
delete[] data;
delete comm;
if (handle)
{
bool inGC = (_gcthread == SDL_GetThreadID(handle));
bool collectSelf = (inGC && _gcthread == SDL_ThreadID());
inGC = inGC && !collectSelf;
if (inGC) SDL_mutexP((SDL_mutex *) _gcmutex);
if (collectSelf) SDL_mutexV((SDL_mutex *) _gcmutex);
SDL_KillThread(handle);
if (inGC) SDL_mutexV((SDL_mutex *) _gcmutex);
}
module->unregister(name);
SDL_DestroyMutex(mutex);
SDL_DestroyCond(cond);
@@ -211,8 +219,10 @@ namespace sdl
{
if (handle)
{
SDL_mutexP((SDL_mutex *) _gcmutex);
SDL_KillThread(handle);
handle = 0;
SDL_mutexV((SDL_mutex *) _gcmutex);
}
}