mirror of
https://github.com/love2d/love.git
synced 2026-08-17 11:00:31 +02:00
Merge (the hardest merge evahr, thanks rude)
This commit is contained in:
@@ -3232,6 +3232,10 @@
|
|||||||
<Filter
|
<Filter
|
||||||
Name="thread"
|
Name="thread"
|
||||||
>
|
>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\src\modules\thread\ThreadModule.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
<Filter
|
<Filter
|
||||||
Name="sdl"
|
Name="sdl"
|
||||||
>
|
>
|
||||||
|
|||||||
@@ -205,6 +205,10 @@
|
|||||||
>
|
>
|
||||||
</File>
|
</File>
|
||||||
</Filter>
|
</Filter>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\..\src\modules\thread\ThreadModule.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
</Files>
|
</Files>
|
||||||
<Globals>
|
<Globals>
|
||||||
</Globals>
|
</Globals>
|
||||||
|
|||||||
@@ -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
|
||||||
@@ -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;
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
Reference in New Issue
Block a user