Merge (the hardest merge evahr, thanks rude)

This commit is contained in:
bart@bartbes.ath.cx
2010-02-25 20:13:50 +01:00
6 changed files with 102 additions and 54 deletions
+4
View File
@@ -3232,6 +3232,10 @@
<Filter <Filter
Name="thread" Name="thread"
> >
<File
RelativePath="..\..\src\modules\thread\ThreadModule.h"
>
</File>
<Filter <Filter
Name="sdl" Name="sdl"
> >
+4
View File
@@ -205,6 +205,10 @@
> >
</File> </File>
</Filter> </Filter>
<File
RelativePath="..\..\..\src\modules\thread\ThreadModule.h"
>
</File>
</Files> </Files>
<Globals> <Globals>
</Globals> </Globals>
+41
View File
@@ -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 <common/Module.h>
#include <string>
namespace love
{
namespace thread
{
class ThreadModule : public Module
{
public:
virtual ~ThreadModule(){};
virtual void unregister(const std::string & name) = 0;
}; // ThreadModule
} // thread
} // love
#endif // LOVE_THREAD_THREAD_H
+25 -23
View File
@@ -43,7 +43,7 @@ namespace sdl
#endif // LOVE_BUILD_STANDALONE #endif // LOVE_BUILD_STANDALONE
luaopen_love_thread(L); luaopen_love_thread(L);
lua_pushstring(L, comm->getName()); lua_pushstring(L, comm->getName());
luax_convobj(L, lua_gettop(L), "thread", "getThread"); luax_convobj(L, lua_gettop(L), "thread", "getThread");
lua_getglobal(L, "love"); lua_getglobal(L, "love");
lua_pushvalue(L, -2); lua_pushvalue(L, -2);
lua_setfield(L, -2, "_curthread"); lua_setfield(L, -2, "_curthread");
@@ -143,14 +143,14 @@ namespace sdl
return name; return name;
} }
ThreadVariant* ThreadData::getValue(std::string name) ThreadVariant* ThreadData::getValue(const std::string & name)
{ {
if (shared.count(name) == 0) if (shared.count(name) == 0)
return 0; return 0;
return shared[name]; return shared[name];
} }
void ThreadData::clearValue(std::string name) void ThreadData::clearValue(const std::string & name)
{ {
if (shared.count(name) == 0) if (shared.count(name) == 0)
return; return;
@@ -158,7 +158,7 @@ namespace sdl
shared.erase(name); 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) if (shared.count(name) != 0)
shared[name]->release(); shared[name]->release();
@@ -166,10 +166,10 @@ namespace sdl
shared[name] = v; shared[name] = v;
} }
Thread::Thread(ThreadModuleRegistrar *reg, std::string name, love::Data *data) Thread::Thread(love::thread::ThreadModule *module, const std::string & name, love::Data *data)
: handle(0), reg(reg), name(name), isThread(true) : handle(0), module(module), name(name), isThread(true)
{ {
reg->retain(); module->retain();
unsigned int len = data->getSize(); unsigned int len = data->getSize();
this->data = new char[len+1]; this->data = new char[len+1];
memset(this->data, 0, len+1); memset(this->data, 0, len+1);
@@ -179,10 +179,10 @@ namespace sdl
cond = SDL_CreateCond(); cond = SDL_CreateCond();
} }
Thread::Thread(ThreadModuleRegistrar *reg, std::string name) Thread::Thread(love::thread::ThreadModule *module, const std::string & name)
: handle(0), reg(reg), name(name), data(0), isThread(false) : handle(0), module(module), name(name), data(0), isThread(false)
{ {
reg->retain(); module->retain();
comm = new ThreadData(name.c_str(), NULL); comm = new ThreadData(name.c_str(), NULL);
mutex = SDL_CreateMutex(); mutex = SDL_CreateMutex();
cond = SDL_CreateCond(); cond = SDL_CreateCond();
@@ -195,10 +195,10 @@ namespace sdl
delete comm; delete comm;
if (handle) if (handle)
SDL_KillThread(handle); SDL_KillThread(handle);
reg->unregister(name); module->unregister(name);
SDL_DestroyMutex(mutex); SDL_DestroyMutex(mutex);
SDL_DestroyCond(cond); SDL_DestroyCond(cond);
reg->release(); module->release();
} }
void Thread::start() void Thread::start()
@@ -240,7 +240,7 @@ namespace sdl
return name; return name;
} }
ThreadVariant *Thread::receive(std::string name) ThreadVariant *Thread::receive(const std::string & name)
{ {
lock(); lock();
ThreadVariant *v = comm->getValue(name); ThreadVariant *v = comm->getValue(name);
@@ -248,7 +248,7 @@ namespace sdl
return v; return v;
} }
ThreadVariant *Thread::demand(std::string name) ThreadVariant *Thread::demand(const std::string & name)
{ {
lock(); lock();
ThreadVariant *v = comm->getValue(name); ThreadVariant *v = comm->getValue(name);
@@ -263,14 +263,14 @@ namespace sdl
return v; return v;
} }
void Thread::clear(std::string name) void Thread::clear(const std::string & name)
{ {
lock(); lock();
comm->clearValue(name); comm->clearValue(name);
unlock(); unlock();
} }
void Thread::send(std::string name, ThreadVariant *v) void Thread::send(const std::string & name, ThreadVariant *v)
{ {
lock(); lock();
comm->setValue(name, v); comm->setValue(name, v);
@@ -291,7 +291,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) if (threads.count(name) != 0)
return 0; return 0;
@@ -300,7 +300,7 @@ namespace sdl
return t; return t;
} }
Thread *ThreadModule::getThread(std::string name) Thread *ThreadModule::getThread(const std::string & name)
{ {
if (threads.count(name) == 0) if (threads.count(name) == 0)
return 0; return 0;
@@ -308,19 +308,21 @@ namespace sdl
return i->second; return i->second;
} }
Thread **ThreadModule::getThreads() void ThreadModule::getThreads(Thread ** list)
{ {
Thread **list = new Thread*[threads.size()+1];
int c = 0; int c = 0;
for (threadlist_t::iterator i = threads.begin(); i != threads.end(); i++, c++) for (threadlist_t::iterator i = threads.begin(); i != threads.end(); i++, c++)
{ {
list[c] = i->second; list[c] = i->second;
} }
list[threads.size()] = 0;
return list;
} }
void ThreadModule::unregister(std::string name) unsigned ThreadModule::getThreadCount() const
{
return threads.size();
}
void ThreadModule::unregister(const std::string & name)
{ {
if (threads.count(name) == 0) if (threads.count(name) == 0)
return; return;
+23 -28
View File
@@ -18,8 +18,8 @@
* 3. This notice may not be removed or altered from any source distribution. * 3. This notice may not be removed or altered from any source distribution.
**/ **/
#ifndef LOVE_THREAD_THREAD_H #ifndef LOVE_THREAD_SDL_THREAD_H
#define LOVE_THREAD_THREAD_H #define LOVE_THREAD_SDL_THREAD_H
// SDL // SDL
#include <SDL_thread.h> #include <SDL_thread.h>
@@ -30,7 +30,7 @@
#include <string> #include <string>
// LOVE // LOVE
#include <common/Module.h> #include <thread/ThreadModule.h>
#include <filesystem/File.h> #include <filesystem/File.h>
#include <common/runtime.h> #include <common/runtime.h>
@@ -40,12 +40,6 @@ namespace thread
{ {
namespace sdl namespace sdl
{ {
class ThreadModuleRegistrar : public Module
{
public:
virtual void unregister(std::string name) = 0;
};
enum ThreadVariantType enum ThreadVariantType
{ {
UNKNOWN = 0, UNKNOWN = 0,
@@ -64,7 +58,7 @@ namespace sdl
ThreadVariant(const char *string); ThreadVariant(const char *string);
ThreadVariant(void *userdata); ThreadVariant(void *userdata);
ThreadVariant(Type udatatype, void *userdata); ThreadVariant(Type udatatype, void *userdata);
~ThreadVariant(); virtual ~ThreadVariant();
ThreadVariantType type; ThreadVariantType type;
union union
{ {
@@ -89,16 +83,16 @@ namespace sdl
~ThreadData(); ~ThreadData();
const char *getCode(); const char *getCode();
const char *getName(); const char *getName();
ThreadVariant* getValue(std::string name); ThreadVariant* getValue(const std::string & name);
void clearValue(std::string name); void clearValue(const std::string & name);
void setValue(std::string name, ThreadVariant *v); void setValue(const std::string & name, ThreadVariant *v);
}; };
class Thread : public love::Object class Thread : public love::Object
{ {
private: private:
SDL_Thread *handle; SDL_Thread *handle;
ThreadModuleRegistrar *reg; love::thread::ThreadModule *module;
ThreadData *comm; ThreadData *comm;
std::string name; std::string name;
char *data; char *data;
@@ -107,39 +101,40 @@ namespace sdl
bool isThread; bool isThread;
public: public:
Thread(ThreadModuleRegistrar *reg, std::string name, love::Data *data); Thread(love::thread::ThreadModule *module, const std::string & name, love::Data *data);
Thread(ThreadModuleRegistrar *reg, std::string name); Thread(love::thread::ThreadModule *module, const std::string & name);
~Thread(); virtual ~Thread();
void start(); void start();
void kill(); void kill();
void wait(); void wait();
std::string getName(); std::string getName();
ThreadVariant *receive(std::string name); ThreadVariant *receive(const std::string & name);
ThreadVariant *demand(std::string name); ThreadVariant *demand(const std::string & name);
void clear(std::string name); void clear(const std::string & name);
void send(std::string name, ThreadVariant *v); void send(const std::string & name, ThreadVariant *v);
void lock(); void lock();
void unlock(); void unlock();
}; // Thread }; // Thread
typedef std::map<std::string, Thread*> threadlist_t; typedef std::map<std::string, Thread*> threadlist_t;
class ThreadModule : public ThreadModuleRegistrar class ThreadModule : public love::thread::ThreadModule
{ {
private: private:
threadlist_t threads; threadlist_t threads;
public: public:
ThreadModule(); ThreadModule();
~ThreadModule(); virtual ~ThreadModule();
Thread *newThread(std::string name, love::Data *data); Thread *newThread(const std::string & name, love::Data *data);
Thread **getThreads(); void getThreads(Thread ** list);
Thread *getThread(std::string name); Thread *getThread(const std::string & name);
void unregister(std::string name); unsigned getThreadCount() const;
void unregister(const std::string & name);
const char *getName() const; const char *getName() const;
}; // ThreadModule }; // ThreadModule
} // sdl } // sdl
} // thread } // thread
} // love } // love
#endif // LOVE_THREAD_THREAD_H #endif // LOVE_THREAD_SDL_THREAD_H
+5 -3
View File
@@ -201,7 +201,7 @@ namespace sdl
ThreadVariant *v; ThreadVariant *v;
if (lua_isboolean(L, 3)) 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)) else if (lua_isnumber(L, 3))
{ {
@@ -260,9 +260,11 @@ namespace sdl
int w_getThreads(lua_State *L) 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); lua_newtable(L);
for (int i = 0; list[i] != 0; i++) for (unsigned int i = 0; i<count; i++)
{ {
luax_newtype(L, "Thread", THREAD_THREAD_T, (void*) list[i]); luax_newtype(L, "Thread", THREAD_THREAD_T, (void*) list[i]);
list[i]->lock(); list[i]->lock();