diff src/modules/thread/wrap_Channel.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 1a59c21cd2f3
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/modules/thread/wrap_Channel.cpp	Wed Jul 04 17:15:16 2012 +0200
@@ -0,0 +1,107 @@
+/**
+* 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_Channel.h"
+
+namespace love
+{
+namespace thread
+{
+	Channel *luax_checkchannel(lua_State *L, int idx)
+	{
+		return luax_checktype<Channel>(L, idx, "Channel", THREAD_CHANNEL_T);
+	}
+
+	int w_Channel_push(lua_State *L)
+	{
+		Channel *c = luax_checkchannel(L, 1);
+		Variant *var = Variant::fromLua(L, 2);
+		c->push(var);
+		var->release();
+		return 0;
+	}
+
+	int w_Channel_pop(lua_State *L)
+	{
+		Channel *c = luax_checkchannel(L, 1);
+		Variant *var = c->pop();
+		if (var)
+		{
+			var->toLua(L);
+			var->release();
+		}
+		else
+			lua_pushnil(L);
+		return 1;
+	}
+
+	int w_Channel_demand(lua_State *L)
+	{
+		Channel *c = luax_checkchannel(L, 1);
+		Variant *var = c->demand();
+		var->toLua(L);
+		var->release();
+		return 1;
+	}
+
+	int w_Channel_peek(lua_State *L)
+	{
+		Channel *c = luax_checkchannel(L, 1);
+		Variant *var = c->peek();
+		if (var)
+		{
+			var->toLua(L);
+			var->release();
+		}
+		else
+			lua_pushnil(L);
+		return 1;
+	}
+
+	int w_Channel_count(lua_State *L)
+	{
+		Channel *c = luax_checkchannel(L, 1);
+		lua_pushnumber(L, c->count());
+		return 1;
+	}
+
+	int w_Channel_clear(lua_State *L)
+	{
+		Channel *c = luax_checkchannel(L, 1);
+		c->clear();
+		return 0;
+	}
+
+	static const luaL_Reg type_functions[] = {
+		{ "push", w_Channel_push },
+		{ "pop", w_Channel_pop },
+		{ "demand", w_Channel_demand },
+		{ "peek", w_Channel_peek },
+		{ "count", w_Channel_count },
+		{ "clear", w_Channel_clear },
+		{ 0, 0 }
+	};
+
+	extern "C" int luaopen_channel(lua_State *L)
+	{
+		return luax_register_type(L, "Channel", type_functions);
+	}
+}
+}