Mercurial > love-experiments
diff src/modules/thread/wrap_ThreadModule.cpp @ 1098:a74672ba1320 minor
Merge in channels from love-experiments
Rewritten love.thread and changed communication
method from weird system before, to channels.
| author | Bart van Strien <bart.bes+projects@gmail.com> |
|---|---|
| date | Wed, 04 Jul 2012 17:15:16 +0200 |
| parents | |
| children | ee1448bb9680 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/modules/thread/wrap_ThreadModule.cpp Wed Jul 04 17:15:16 2012 +0200 @@ -0,0 +1,126 @@ +/** +* 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. +**/ + +#include "wrap_ThreadModule.h" +#include "wrap_LuaThread.h" +#include "wrap_Channel.h" +#include <filesystem/File.h> +#include <filesystem/FileData.h> + +namespace love +{ +namespace thread +{ + static ThreadModule *instance = 0; + + int w_newThread(lua_State *L) + { + std::string name = "Thread code"; + love::Data *data; + if (lua_isstring(L, 1)) + luax_convobj(L, 1, "filesystem", "newFile"); + if (luax_istype(L, 1, FILESYSTEM_FILE_T)) + { + try + { + love::filesystem::File * file = luax_checktype<love::filesystem::File>(L, 1, "File", FILESYSTEM_FILE_T); + name = std::string("@") + file->getFilename(); + data = file->read(); + } + catch (love::Exception & e) + { + return luaL_error(L, "%s", e.what()); + } + } + else if (luax_istype(L, 1, FILESYSTEM_FILE_DATA_T)) + { + love::filesystem::FileData * fdata = luax_checktype<love::filesystem::FileData>(L, 1, "FileData", FILESYSTEM_FILE_DATA_T); + name = std::string("@") + fdata->getFilename(); + data = fdata; + data->retain(); + } + else + { + data = luax_checktype<love::Data>(L, 1, "Data", DATA_T); + data->retain(); + } + LuaThread *t = instance->newThread(name, data); + // do not worry, file->read() returns retained data + data->release(); + luax_newtype(L, "Thread", THREAD_THREAD_T, (void*)t); + return 1; + } + + int w_newChannel(lua_State *L) + { + Channel *c = instance->newChannel(); + luax_newtype(L, "Channel", THREAD_CHANNEL_T, (void*)c); + return 1; + } + + int w_getChannel(lua_State *L) + { + std::string name = luax_checkstring(L, 1); + Channel *c = instance->getChannel(name); + luax_newtype(L, "Channel", THREAD_CHANNEL_T, (void*)c); + return 1; + } + + // List of functions to wrap. + static const luaL_Reg module_functions[] = { + { "newThread", w_newThread }, + { "newChannel", w_newChannel }, + { "getChannel", w_getChannel }, + { 0, 0 } + }; + + static const lua_CFunction types[] = { + luaopen_thread, + luaopen_channel, + 0 + }; + + extern "C" int luaopen_love_thread(lua_State *L) + { + if (instance == 0) + { + try + { + instance = new ThreadModule(); + } + catch (Exception & e) + { + return luaL_error(L, "%s", e.what()); + } + } + else + instance->retain(); + + WrappedModule w; + w.module = instance; + w.name = "thread"; + w.flags = MODULE_T; + w.functions = module_functions; + w.types = types; + + return luax_register_module(L, w); + } +} +}
