From 4ba513b67957ea49e14e4f1fe1481246703fe960 Mon Sep 17 00:00:00 2001 From: rude Date: Wed, 24 Feb 2010 20:40:59 +0100 Subject: [PATCH 1/6] Bye-bye ThreadModuleRegistrar. An abstract ThreadModule will do that job. --- platform/msvc2008/love.vcproj | 4 +++ platform/msvc2008/thread/thread.vcproj | 4 +++ src/modules/thread/ThreadModule.h | 41 ++++++++++++++++++++++++++ src/modules/thread/sdl/Thread.cpp | 16 +++++----- src/modules/thread/sdl/Thread.h | 22 +++++--------- 5 files changed, 65 insertions(+), 22 deletions(-) create mode 100644 src/modules/thread/ThreadModule.h diff --git a/platform/msvc2008/love.vcproj b/platform/msvc2008/love.vcproj index 46ec8e992..3a4a54bff 100644 --- a/platform/msvc2008/love.vcproj +++ b/platform/msvc2008/love.vcproj @@ -3232,6 +3232,10 @@ + + diff --git a/platform/msvc2008/thread/thread.vcproj b/platform/msvc2008/thread/thread.vcproj index 8866848b8..809af69b4 100644 --- a/platform/msvc2008/thread/thread.vcproj +++ b/platform/msvc2008/thread/thread.vcproj @@ -205,6 +205,10 @@ > + + diff --git a/src/modules/thread/ThreadModule.h b/src/modules/thread/ThreadModule.h new file mode 100644 index 000000000..cc26a4f1c --- /dev/null +++ b/src/modules/thread/ThreadModule.h @@ -0,0 +1,41 @@ +/** +* Copyright (c) 2006-2010 LOVE Development Team +* +* 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. +**/ + +#ifndef LOVE_THREAD_THREAD_H +#define LOVE_THREAD_THREAD_H + +#include +#include + +namespace love +{ +namespace thread +{ + class ThreadModule : public Module + { + public: + virtual ~ThreadModule(){}; + virtual void unregister(std::string name) = 0; + }; // ThreadModule + +} // thread +} // love + +#endif // LOVE_THREAD_THREAD_H diff --git a/src/modules/thread/sdl/Thread.cpp b/src/modules/thread/sdl/Thread.cpp index 99cc030fa..602fad526 100644 --- a/src/modules/thread/sdl/Thread.cpp +++ b/src/modules/thread/sdl/Thread.cpp @@ -164,10 +164,10 @@ namespace sdl shared[name] = v; } - Thread::Thread(ThreadModuleRegistrar *reg, std::string name, love::Data *data) - : handle(0), reg(reg), name(name), isThread(true) + Thread::Thread(love::thread::ThreadModule *module, std::string name, love::Data *data) + : handle(0), module(module), name(name), isThread(true) { - reg->retain(); + module->retain(); unsigned int len = data->getSize(); this->data = new char[len+1]; memset(this->data, 0, len+1); @@ -177,10 +177,10 @@ namespace sdl cond = SDL_CreateCond(); } - Thread::Thread(ThreadModuleRegistrar *reg, std::string name) - : handle(0), reg(reg), name(name), data(0), isThread(false) + Thread::Thread(love::thread::ThreadModule *module, std::string name) + : handle(0), module(module), name(name), data(0), isThread(false) { - reg->retain(); + module->retain(); comm = new ThreadData(name.c_str(), NULL); mutex = SDL_CreateMutex(); cond = SDL_CreateCond(); @@ -193,10 +193,10 @@ namespace sdl delete comm; if (handle) SDL_KillThread(handle); - reg->unregister(name); + module->unregister(name); SDL_DestroyMutex(mutex); SDL_DestroyCond(cond); - reg->release(); + module->release(); } void Thread::start() diff --git a/src/modules/thread/sdl/Thread.h b/src/modules/thread/sdl/Thread.h index ddc9edd0f..81f665026 100644 --- a/src/modules/thread/sdl/Thread.h +++ b/src/modules/thread/sdl/Thread.h @@ -18,8 +18,8 @@ * 3. This notice may not be removed or altered from any source distribution. **/ -#ifndef LOVE_THREAD_THREAD_H -#define LOVE_THREAD_THREAD_H +#ifndef LOVE_THREAD_SDL_THREAD_H +#define LOVE_THREAD_SDL_THREAD_H // SDL #include @@ -30,7 +30,7 @@ #include // LOVE -#include +#include #include #include @@ -40,12 +40,6 @@ namespace thread { namespace sdl { - class ThreadModuleRegistrar : public Module - { - public: - virtual void unregister(std::string name) = 0; - }; - enum ThreadVariantType { UNKNOWN = 0, @@ -98,7 +92,7 @@ namespace sdl { private: SDL_Thread *handle; - ThreadModuleRegistrar *reg; + love::thread::ThreadModule *module; ThreadData *comm; std::string name; char *data; @@ -107,8 +101,8 @@ namespace sdl bool isThread; public: - Thread(ThreadModuleRegistrar *reg, std::string name, love::Data *data); - Thread(ThreadModuleRegistrar *reg, std::string name); + Thread(love::thread::ThreadModule *module, std::string name, love::Data *data); + Thread(love::thread::ThreadModule *module, std::string name); ~Thread(); void start(); void kill(); @@ -124,7 +118,7 @@ namespace sdl typedef std::map threadlist_t; - class ThreadModule : public ThreadModuleRegistrar + class ThreadModule : public love::thread::ThreadModule { private: threadlist_t threads; @@ -142,4 +136,4 @@ namespace sdl } // thread } // love -#endif // LOVE_THREAD_THREAD_H +#endif // LOVE_THREAD_SDL_THREAD_H From b4ad36cc51174f9207907f6313f35729dd110e97 Mon Sep 17 00:00:00 2001 From: rude Date: Wed, 24 Feb 2010 20:43:05 +0100 Subject: [PATCH 2/6] Objects extending love::Object need to have virtual destructors. They are garbage collected as love::Object. --- src/modules/thread/sdl/Thread.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/modules/thread/sdl/Thread.h b/src/modules/thread/sdl/Thread.h index 81f665026..1fe4355a3 100644 --- a/src/modules/thread/sdl/Thread.h +++ b/src/modules/thread/sdl/Thread.h @@ -58,7 +58,7 @@ namespace sdl ThreadVariant(const char *string); ThreadVariant(void *userdata); ThreadVariant(Type udatatype, void *userdata); - ~ThreadVariant(); + virtual ~ThreadVariant(); ThreadVariantType type; union { @@ -103,7 +103,7 @@ namespace sdl public: Thread(love::thread::ThreadModule *module, std::string name, love::Data *data); Thread(love::thread::ThreadModule *module, std::string name); - ~Thread(); + virtual ~Thread(); void start(); void kill(); void wait(); @@ -125,7 +125,7 @@ namespace sdl public: ThreadModule(); - ~ThreadModule(); + virtual ~ThreadModule(); Thread *newThread(std::string name, love::Data *data); Thread **getThreads(); Thread *getThread(std::string name); From bdafe0e4552e01b07b93603a40598562a57e1c1d Mon Sep 17 00:00:00 2001 From: rude Date: Wed, 24 Feb 2010 20:47:56 +0100 Subject: [PATCH 3/6] Globals?! When did Bartbes the Sex Machine abandon reason for MADNESS? --- src/modules/thread/sdl/Thread.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/modules/thread/sdl/Thread.cpp b/src/modules/thread/sdl/Thread.cpp index 602fad526..e18e7f4ff 100644 --- a/src/modules/thread/sdl/Thread.cpp +++ b/src/modules/thread/sdl/Thread.cpp @@ -42,9 +42,6 @@ namespace sdl luaopen_love(L); #endif // LOVE_BUILD_STANDALONE luaopen_love_thread(L); - lua_pushstring(L, comm->getName()); - luax_convobj(L, lua_gettop(L), "thread", "getThread"); - lua_setglobal(L, "thread"); if(luaL_dostring(L, comm->getCode()) == 1) { ThreadVariant *v = new ThreadVariant(lua_tostring(L, -1)); From 368765820e83909cba4aa13bd7d44bb0c148ddc3 Mon Sep 17 00:00:00 2001 From: rude Date: Wed, 24 Feb 2010 21:21:45 +0100 Subject: [PATCH 4/6] Changed unnecessary pass-by-value to pass-by-reference. --- src/modules/thread/ThreadModule.h | 2 +- src/modules/thread/sdl/Thread.cpp | 24 ++++++++++++------------ src/modules/thread/sdl/Thread.h | 24 ++++++++++++------------ 3 files changed, 25 insertions(+), 25 deletions(-) diff --git a/src/modules/thread/ThreadModule.h b/src/modules/thread/ThreadModule.h index cc26a4f1c..0c09c237b 100644 --- a/src/modules/thread/ThreadModule.h +++ b/src/modules/thread/ThreadModule.h @@ -32,7 +32,7 @@ namespace thread { public: virtual ~ThreadModule(){}; - virtual void unregister(std::string name) = 0; + virtual void unregister(const std::string & name) = 0; }; // ThreadModule } // thread diff --git a/src/modules/thread/sdl/Thread.cpp b/src/modules/thread/sdl/Thread.cpp index e18e7f4ff..6aac24605 100644 --- a/src/modules/thread/sdl/Thread.cpp +++ b/src/modules/thread/sdl/Thread.cpp @@ -138,14 +138,14 @@ namespace sdl return name; } - ThreadVariant* ThreadData::getValue(std::string name) + ThreadVariant* ThreadData::getValue(const std::string & name) { if (shared.count(name) == 0) return 0; return shared[name]; } - void ThreadData::clearValue(std::string name) + void ThreadData::clearValue(const std::string & name) { if (shared.count(name) == 0) return; @@ -153,7 +153,7 @@ namespace sdl shared.erase(name); } - void ThreadData::setValue(std::string name, ThreadVariant *v) + void ThreadData::setValue(const std::string & name, ThreadVariant *v) { if (shared.count(name) != 0) shared[name]->release(); @@ -161,7 +161,7 @@ namespace sdl shared[name] = v; } - Thread::Thread(love::thread::ThreadModule *module, std::string name, love::Data *data) + Thread::Thread(love::thread::ThreadModule *module, const std::string & name, love::Data *data) : handle(0), module(module), name(name), isThread(true) { module->retain(); @@ -174,7 +174,7 @@ namespace sdl cond = SDL_CreateCond(); } - Thread::Thread(love::thread::ThreadModule *module, std::string name) + Thread::Thread(love::thread::ThreadModule *module, const std::string & name) : handle(0), module(module), name(name), data(0), isThread(false) { module->retain(); @@ -235,7 +235,7 @@ namespace sdl return name; } - ThreadVariant *Thread::receive(std::string name) + ThreadVariant *Thread::receive(const std::string & name) { lock(); ThreadVariant *v = comm->getValue(name); @@ -243,7 +243,7 @@ namespace sdl return v; } - ThreadVariant *Thread::demand(std::string name) + ThreadVariant *Thread::demand(const std::string & name) { lock(); ThreadVariant *v = comm->getValue(name); @@ -258,14 +258,14 @@ namespace sdl return v; } - void Thread::clear(std::string name) + void Thread::clear(const std::string & name) { lock(); comm->clearValue(name); unlock(); } - void Thread::send(std::string name, ThreadVariant *v) + void Thread::send(const std::string & name, ThreadVariant *v) { lock(); comm->setValue(name, v); @@ -286,7 +286,7 @@ namespace sdl } } - Thread *ThreadModule::newThread(std::string name, love::Data *data) + Thread *ThreadModule::newThread(const std::string & name, love::Data *data) { if (threads.count(name) != 0) return 0; @@ -295,7 +295,7 @@ namespace sdl return t; } - Thread *ThreadModule::getThread(std::string name) + Thread *ThreadModule::getThread(const std::string & name) { if (threads.count(name) == 0) return 0; @@ -315,7 +315,7 @@ namespace sdl return list; } - void ThreadModule::unregister(std::string name) + void ThreadModule::unregister(const std::string & name) { if (threads.count(name) == 0) return; diff --git a/src/modules/thread/sdl/Thread.h b/src/modules/thread/sdl/Thread.h index 1fe4355a3..af1a89c4c 100644 --- a/src/modules/thread/sdl/Thread.h +++ b/src/modules/thread/sdl/Thread.h @@ -83,9 +83,9 @@ namespace sdl ~ThreadData(); const char *getCode(); const char *getName(); - ThreadVariant* getValue(std::string name); - void clearValue(std::string name); - void setValue(std::string name, ThreadVariant *v); + ThreadVariant* getValue(const std::string & name); + void clearValue(const std::string & name); + void setValue(const std::string & name, ThreadVariant *v); }; class Thread : public love::Object @@ -101,17 +101,17 @@ namespace sdl bool isThread; public: - Thread(love::thread::ThreadModule *module, std::string name, love::Data *data); - Thread(love::thread::ThreadModule *module, std::string name); + Thread(love::thread::ThreadModule *module, const std::string & name, love::Data *data); + Thread(love::thread::ThreadModule *module, const std::string & name); virtual ~Thread(); void start(); void kill(); void wait(); std::string getName(); - ThreadVariant *receive(std::string name); - ThreadVariant *demand(std::string name); - void clear(std::string name); - void send(std::string name, ThreadVariant *v); + ThreadVariant *receive(const std::string & name); + ThreadVariant *demand(const std::string & name); + void clear(const std::string & name); + void send(const std::string & name, ThreadVariant *v); void lock(); void unlock(); }; // Thread @@ -126,10 +126,10 @@ namespace sdl public: ThreadModule(); virtual ~ThreadModule(); - Thread *newThread(std::string name, love::Data *data); + Thread *newThread(const std::string & name, love::Data *data); Thread **getThreads(); - Thread *getThread(std::string name); - void unregister(std::string name); + Thread *getThread(const std::string & name); + void unregister(const std::string & name); const char *getName() const; }; // ThreadModule } // sdl From 5fca0e9b335b6a039d8f4211eb6a85cd3a077160 Mon Sep 17 00:00:00 2001 From: rude Date: Wed, 24 Feb 2010 21:34:55 +0100 Subject: [PATCH 5/6] Changed getThreads so that the caller must allocate the memory. --- src/modules/thread/sdl/Thread.cpp | 10 ++++++---- src/modules/thread/sdl/Thread.h | 3 ++- src/modules/thread/sdl/wrap_Thread.cpp | 6 ++++-- 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/src/modules/thread/sdl/Thread.cpp b/src/modules/thread/sdl/Thread.cpp index 6aac24605..4043a7afc 100644 --- a/src/modules/thread/sdl/Thread.cpp +++ b/src/modules/thread/sdl/Thread.cpp @@ -303,16 +303,18 @@ namespace sdl return i->second; } - Thread **ThreadModule::getThreads() + void ThreadModule::getThreads(Thread ** list) { - Thread **list = new Thread*[threads.size()+1]; int c = 0; for (threadlist_t::iterator i = threads.begin(); i != threads.end(); i++, c++) { list[c] = i->second; } - list[threads.size()] = 0; - return list; + } + + unsigned ThreadModule::getThreadCount() const + { + return threads.size(); } void ThreadModule::unregister(const std::string & name) diff --git a/src/modules/thread/sdl/Thread.h b/src/modules/thread/sdl/Thread.h index af1a89c4c..69143d205 100644 --- a/src/modules/thread/sdl/Thread.h +++ b/src/modules/thread/sdl/Thread.h @@ -127,8 +127,9 @@ namespace sdl ThreadModule(); virtual ~ThreadModule(); Thread *newThread(const std::string & name, love::Data *data); - Thread **getThreads(); + void getThreads(Thread ** list); Thread *getThread(const std::string & name); + unsigned getThreadCount() const; void unregister(const std::string & name); const char *getName() const; }; // ThreadModule diff --git a/src/modules/thread/sdl/wrap_Thread.cpp b/src/modules/thread/sdl/wrap_Thread.cpp index d6798fff9..fe7c5be9d 100644 --- a/src/modules/thread/sdl/wrap_Thread.cpp +++ b/src/modules/thread/sdl/wrap_Thread.cpp @@ -260,9 +260,11 @@ namespace sdl int w_getThreads(lua_State *L) { - Thread **list = instance->getThreads(); + unsigned count = instance->getThreadCount(); + Thread **list = new Thread*[count]; + instance->getThreads(list); lua_newtable(L); - for (int i = 0; list[i] != 0; i++) + for (unsigned int i = 0; ilock(); From 16bf591c96e22b2c5376a34e1ca063b5b4bac7ca Mon Sep 17 00:00:00 2001 From: rude Date: Wed, 24 Feb 2010 21:35:21 +0100 Subject: [PATCH 6/6] Fixed a MSVC warning. --- src/modules/thread/sdl/wrap_Thread.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/modules/thread/sdl/wrap_Thread.cpp b/src/modules/thread/sdl/wrap_Thread.cpp index fe7c5be9d..766513f40 100644 --- a/src/modules/thread/sdl/wrap_Thread.cpp +++ b/src/modules/thread/sdl/wrap_Thread.cpp @@ -201,7 +201,7 @@ namespace sdl ThreadVariant *v; if (lua_isboolean(L, 3)) { - v = new ThreadVariant((bool) lua_toboolean(L, 3)); + v = new ThreadVariant(luax_toboolean(L, 3)); } else if (lua_isnumber(L, 3)) {