diff src/modules/thread/wrap_ThreadModule.cpp @ 1304:ee1448bb9680 minor

Fix race conditions and deadlocks in Channels (hopefully) (issue #554) Also, this is a giant commit because of the official Code Style (tm) was applied.
author Bart van Strien <bart.bes+projects@gmail.com>
date Wed, 30 Jan 2013 17:15:12 +0100
parents a74672ba1320
children
line wrap: on
line diff
--- a/src/modules/thread/wrap_ThreadModule.cpp	Sun Jan 27 20:04:16 2013 +0100
+++ b/src/modules/thread/wrap_ThreadModule.cpp	Wed Jan 30 17:15:12 2013 +0100
@@ -28,99 +28,99 @@
 {
 namespace thread
 {
-	static ThreadModule *instance = 0;
+static ThreadModule *instance = 0;
 
-	int w_newThread(lua_State *L)
+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))
 	{
-		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
 		{
-			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());
-			}
+			love::filesystem::File * file = luax_checktype<love::filesystem::File>(L, 1, "File", FILESYSTEM_FILE_T);
+			name = std::string("@") + file->getFilename();
+			data = file->read();
 		}
-		else if (luax_istype(L, 1, FILESYSTEM_FILE_DATA_T))
+		catch (love::Exception & e)
 		{
-			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();
+			return luaL_error(L, "%s", e.what());
 		}
-		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;
+	}
+	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_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;
-	}
+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 }
-	};
+// 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
-	};
+static const lua_CFunction types[] = {
+	luaopen_thread,
+	luaopen_channel,
+	0
+};
 
-	extern "C" int luaopen_love_thread(lua_State *L)
+extern "C" int luaopen_love_thread(lua_State *L)
+{
+	if (instance == 0)
 	{
-		if (instance == 0)
+		try
 		{
-			try
-			{
-				instance = new ThreadModule();
-			}
-			catch (Exception & e)
-			{
-				return luaL_error(L, "%s", e.what());
-			}
+			instance = new ThreadModule();
+		}
+		catch (Exception & e)
+		{
+			return luaL_error(L, "%s", e.what());
 		}
-		else
-			instance->retain();
+	}
+	else
+		instance->retain();
 
-		WrappedModule w;
-		w.module = instance;
-		w.name = "thread";
-		w.flags = MODULE_T;
-		w.functions = module_functions;
-		w.types = types;
+	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);
-	}
+	return luax_register_module(L, w);
 }
 }
+}