diff --git a/src/modules/thread/sdl/Thread.cpp b/src/modules/thread/sdl/Thread.cpp index f04543dd3..c5e6ae877 100644 --- a/src/modules/thread/sdl/Thread.cpp +++ b/src/modules/thread/sdl/Thread.cpp @@ -112,10 +112,15 @@ namespace sdl this->name = new char[len+1]; memset(this->name, 0, len+1); memcpy(this->name, name, len); - len = strlen(code); - this->code = new char[len+1]; - memset(this->code, 0, len+1); - memcpy(this->code, code, len); + if (code) + { + len = strlen(code); + this->code = new char[len+1]; + memset(this->code, 0, len+1); + memcpy(this->code, code, len); + } + else + this->code = 0; } ThreadData::~ThreadData() @@ -158,7 +163,7 @@ namespace sdl } Thread::Thread(ThreadModuleRegistrar *reg, std::string name, love::Data *data) - : reg(reg), name(name), handle(0) + : reg(reg), name(name), handle(0), isThread(true) { reg->retain(); unsigned int len = data->getSize(); @@ -170,9 +175,19 @@ namespace sdl cond = SDL_CreateCond(); } + Thread::Thread(ThreadModuleRegistrar *reg, std::string name) + : reg(reg), name(name), handle(0), data(0), isThread(false) + { + reg->retain(); + comm = new ThreadData(name.c_str(), NULL); + mutex = SDL_CreateMutex(); + cond = SDL_CreateCond(); + } + Thread::~Thread() { - delete[] data; + if (data) + delete[] data; delete comm; if (handle) SDL_KillThread(handle); @@ -184,7 +199,7 @@ namespace sdl void Thread::start() { - if (!handle) + if (!handle && isThread) handle = SDL_CreateThread((int (*)(void*)) threadfunc, (void*) comm); } @@ -259,6 +274,11 @@ namespace sdl SDL_CondBroadcast(cond); } + ThreadModule::ThreadModule() + { + threads["main"] = new Thread(this, "main"); + } + ThreadModule::~ThreadModule() { for (threadlist_t::iterator i = threads.begin(); i != threads.end(); i++) diff --git a/src/modules/thread/sdl/Thread.h b/src/modules/thread/sdl/Thread.h index 85fa3569b..ddc9edd0f 100644 --- a/src/modules/thread/sdl/Thread.h +++ b/src/modules/thread/sdl/Thread.h @@ -104,9 +104,11 @@ namespace sdl char *data; SDL_mutex *mutex; SDL_cond *cond; + bool isThread; public: Thread(ThreadModuleRegistrar *reg, std::string name, love::Data *data); + Thread(ThreadModuleRegistrar *reg, std::string name); ~Thread(); void start(); void kill(); @@ -128,6 +130,7 @@ namespace sdl threadlist_t threads; public: + ThreadModule(); ~ThreadModule(); Thread *newThread(std::string name, love::Data *data); Thread **getThreads();