浏览代码

Added function host:destroy(), added error handling for trying to work with a destroyed host, added lua5.2 support, fixed awkward naming of socket_get_address (it now matches the rest of the lib as get_socket_address now).

Dalton Nell 11 年之前
父节点
当前提交
7c152a8787
共有 1 个文件被更改,包括 76 次插入22 次删除
  1. 76 22
      enet.c

+ 76 - 22
enet.c

@@ -24,6 +24,9 @@
 #include <stdlib.h>
 #include <string.h>
 
+// For lua5.2 support, instead we could replace all the luaL_register's with whatever
+// lua5.2's equivalent function is, but this is easier so whatever.
+#define LUA_COMPAT_MODULE
 #include "lua.h"
 #include "lualib.h"
 #include "lauxlib.h"
@@ -37,9 +40,9 @@
 
 /**
  * Parse address string, eg:
- * 	*:5959
- * 	127.0.0.1:*
- * 	website.com:8080
+ *	*:5959
+ *	127.0.0.1:*
+ *	website.com:8080
  */
 static void parse_address(lua_State *l, const char *addr_str, ENetAddress *address) {
 	int host_i = 0, port_i = 0;
@@ -201,11 +204,11 @@ static ENetPacket *read_packet(lua_State *l, int idx, enet_uint8 *channel_id) {
 /**
  * Create a new host
  * Args:
- * 	address (nil for client)
- * 	[peer_count = 64]
- * 	[channel_count = 1]
- * 	[in_bandwidth = 0]
- * 	[out_bandwidth = 0]
+ *	address (nil for client)
+ *	[peer_count = 64]
+ *	[channel_count = 1]
+ *	[in_bandwidth = 0]
+ *	[out_bandwidth = 0]
  */
 static int host_create(lua_State *l) {
 	ENetHost *host;
@@ -233,7 +236,7 @@ static int host_create(lua_State *l) {
 	}
 
 	// printf("host create, peers=%d, channels=%d, in=%d, out=%d\n",
-	// 		peer_count, channel_count, in_bandwidth, out_bandwidth);
+	//		peer_count, channel_count, in_bandwidth, out_bandwidth);
 	host = enet_host_create(have_address ? &address : NULL, peer_count,
 			channel_count, in_bandwidth, out_bandwidth);
 
@@ -261,14 +264,17 @@ static int linked_version(lua_State *l) {
 /**
  * Serice a host
  * Args:
- * 	timeout
+ *	timeout
  *
  * Return
- * 	nil on no event
- * 	an event table on event
+ *	nil on no event
+ *	an event table on event
  */
 static int host_service(lua_State *l) {
 	ENetHost *host = check_host(l, 1);
+	if (!host) {
+		return luaL_error(l, "Tried to index a nil host!");
+	}
 	ENetEvent event;
 	int timeout = 0, out;
 
@@ -288,6 +294,9 @@ static int host_service(lua_State *l) {
  */
 static int host_check_events(lua_State *l) {
 	ENetHost *host = check_host(l, 1);
+	if (!host) {
+		return luaL_error(l, "Tried to index a nil host!");
+	}
 	ENetEvent event;
 	int out = enet_host_check_events(host, &event);
 	if (out == 0) return 0;
@@ -303,6 +312,9 @@ static int host_check_events(lua_State *l) {
  */
 static int host_compress_with_range_coder(lua_State *l) {
 	ENetHost *host = check_host(l, 1);
+	if (!host) {
+		return luaL_error(l, "Tried to index a nil host!");
+	}
 
 	int result = enet_host_compress_with_range_coder (host);
 	if (result == 0) {
@@ -317,12 +329,15 @@ static int host_compress_with_range_coder(lua_State *l) {
 /**
  * Connect a host to an address
  * Args:
- * 	the address
- * 	[channel_count = 1]
- * 	[data = 0]
+ *	the address
+ *	[channel_count = 1]
+ *	[data = 0]
  */
 static int host_connect(lua_State *l) {
 	ENetHost *host = check_host(l, 1);
+	if (!host) {
+		return luaL_error(l, "Tried to index a nil host!");
+	}
 	ENetAddress address;
 	ENetPeer *peer;
 
@@ -352,12 +367,18 @@ static int host_connect(lua_State *l) {
 
 static int host_flush(lua_State *l) {
 	ENetHost *host = check_host(l, 1);
+	if (!host) {
+		return luaL_error(l, "Tried to index a nil host!");
+	}
 	enet_host_flush(host);
 	return 0;
 }
 
 static int host_broadcast(lua_State *l) {
 	ENetHost *host = check_host(l, 1);
+	if (!host) {
+		return luaL_error(l, "Tried to index a nil host!");
+	}
 
 	enet_uint8 channel_id;
 	ENetPacket *packet = read_packet(l, 2, &channel_id);
@@ -368,6 +389,9 @@ static int host_broadcast(lua_State *l) {
 // Args: limit:number
 static int host_channel_limit(lua_State *l) {
 	ENetHost *host = check_host(l, 1);
+	if (!host) {
+		return luaL_error(l, "Tried to index a nil host!");
+	}
 	int limit = luaL_checkint(l, 2);
 	enet_host_channel_limit(host, limit);
 	return 0;
@@ -375,14 +399,20 @@ static int host_channel_limit(lua_State *l) {
 
 static int host_bandwidth_limit(lua_State *l) {
 	ENetHost *host = check_host(l, 1);
+	if (!host) {
+		return luaL_error(l, "Tried to index a nil host!");
+	}
 	enet_uint32 in_bandwidth = luaL_checkint(l, 2);
 	enet_uint32 out_bandwidth = luaL_checkint(l, 2);
 	enet_host_bandwidth_limit(host, in_bandwidth, out_bandwidth);
 	return 0;
 }
 
-static int host_socket_get_address(lua_State *l) {
+static int host_get_socket_address(lua_State *l) {
 	ENetHost *host = check_host(l, 1);
+	if (!host) {
+		return luaL_error(l, "Tried to index a nil host!");
+	}
 	ENetAddress address;
 	enet_socket_get_address (host->socket, &address);
 
@@ -397,6 +427,9 @@ static int host_socket_get_address(lua_State *l) {
 }
 static int host_total_sent_data(lua_State *l) {
 	ENetHost *host = check_host(l, 1);
+	if (!host) {
+		return luaL_error(l, "Tried to index a nil host!");
+	}
 
 	lua_pushinteger (l, host->totalSentData);
 
@@ -405,6 +438,9 @@ static int host_total_sent_data(lua_State *l) {
 
 static int host_total_received_data(lua_State *l) {
 	ENetHost *host = check_host(l, 1);
+	if (!host) {
+		return luaL_error(l, "Tried to index a nil host!");
+	}
 
 	lua_pushinteger (l, host->totalReceivedData);
 
@@ -412,6 +448,9 @@ static int host_total_received_data(lua_State *l) {
 }
 static int host_service_time(lua_State *l) {
 	ENetHost *host = check_host(l, 1);
+	if (!host) {
+		return luaL_error(l, "Tried to index a nil host!");
+	}
 
 	lua_pushinteger (l, host->serviceTime);
 
@@ -420,6 +459,9 @@ static int host_service_time(lua_State *l) {
 
 static int host_peer_count(lua_State *l) {
 	ENetHost *host = check_host(l, 1);
+	if (!host) {
+		return luaL_error(l, "Tried to index a nil host!");
+	}
 
 	lua_pushinteger (l, host->peerCount);
 
@@ -428,6 +470,9 @@ static int host_peer_count(lua_State *l) {
 
 static int host_get_peer(lua_State *l) {
 	ENetHost *host = check_host(l, 1);
+	if (!host) {
+		return luaL_error(l, "Tried to index a nil host!");
+	}
 
 	size_t peer_index = (size_t) luaL_checkint(l, 2) - 1;
 
@@ -442,8 +487,13 @@ static int host_get_peer(lua_State *l) {
 }
 
 static int host_gc(lua_State *l) {
-	ENetHost *host = check_host(l, 1);
-	enet_host_destroy(host);
+	// We have to manually grab the userdata so that we can set it to NULL.
+	ENetHost** host = luaL_checkudata(l, 1, "enet_host");
+	// We don't want to crash by destroying a non-existant host.
+	if (*host) {
+		enet_host_destroy(*host);
+	}
+	*host = NULL;
 	return 0;
 }
 
@@ -651,9 +701,9 @@ static int peer_receive(lua_State *l) {
 /**
  * Send a lua string to a peer
  * Args:
- * 	packet data, string
- * 	channel id
- * 	flags ["reliable", nil]
+ *	packet data, string
+ *	channel id
+ *	flags ["reliable", nil]
  *
  */
 static int peer_send(lua_State *l) {
@@ -682,7 +732,11 @@ static const struct luaL_Reg enet_host_funcs [] = {
 	{"broadcast", host_broadcast},
 	{"channel_limit", host_channel_limit},
 	{"bandwidth_limit", host_bandwidth_limit},
-	{"socket_get_address", host_socket_get_address},
+	// Since ENetSocket isn't part of enet-lua, we should try to keep
+	// naming conventions the same as the rest of the lib.
+	{"get_socket_address", host_get_socket_address},
+	// We need this function to free up our ports when needed!
+	{"destroy", host_gc},
 
 	// additional convenience functions (mostly accessors)
 	{"total_sent_data", host_total_sent_data},