diff --git a/README.windows.md b/README.windows.md new file mode 100644 index 0000000..533dc20 --- /dev/null +++ b/README.windows.md @@ -0,0 +1,47 @@ +Steps to install on Windows XP (using MinGW+MSYS) +------------------------------------------------- + +1. Download source code of ZeroMQ-2.1.7 + +2. Use mingw+msys to compile + + >sh configure --prefix=c:/zeromq + >make + >make install + + copy the header & lib to c:\mingw\include_or_lib + +3. Download source code of luajit-2.0.0-beta7 + + >make + >make install + + copy the header & lib to c:\mingw\include_or_lib + +4. Install cmake-2.8.4-win32-x86 + +5. Download Neopallium-lua-zmq-1.0 + +6. Use cmake+mingw+msys to build + + >mkdir build + >cd build + >cmake -G "MSYS Makefiles" -D ZMQ_PATH=c:/zeromq .. + >make + + Warning: conflicting type ... comment line 62, 63, 66, 67 in src/prepre_generated-zmq.nobj.c, and try again + + >make + + The zmq.dll generated in [build] folder + + >make install + + 3 files zmq.dll, poller.lua and threads.lua are installed in c:\program files\lua-zmq + +Author +------ + xumingyong@gmail.com +xumingyong@ehdc.com.cn + + diff --git a/src/pre_generated-zmq.nobj.c b/src/pre_generated-zmq.nobj.c index 99fa660..ee2a4b7 100644 --- a/src/pre_generated-zmq.nobj.c +++ b/src/pre_generated-zmq.nobj.c @@ -41,21 +41,7 @@ /* for MinGW32 compiler need to include */ #ifdef __GNUC__ #include -#endif - -/* wrap strerror_s(). */ -#ifdef __GNUC__ -#ifndef strerror_r -#define strerror_r(errno, buf, buflen) do { \ - strncpy((buf), strerror(errno), (buflen)-1); \ - (buf)[(buflen)-1] = '\0'; \ -} while(0) -#endif #else -#ifndef strerror_r -#define strerror_r(errno, buf, buflen) strerror_s((buf), (buflen), (errno)) -#endif -#endif /* define some standard types missing on Windows. */ #ifndef __INT32_MAX__ @@ -74,6 +60,22 @@ typedef int bool; #define false 1 #endif +#endif + +/* wrap strerror_s(). */ +#ifdef __GNUC__ +#ifndef strerror_r +#define strerror_r(errno, buf, buflen) do { \ + strncpy((buf), strerror(errno), (buflen)-1); \ + (buf)[(buflen)-1] = '\0'; \ +} while(0) +#endif +#else +#ifndef strerror_r +#define strerror_r(errno, buf, buflen) strerror_s((buf), (buflen), (errno)) +#endif +#endif + #define FUNC_UNUSED #define LUA_NOBJ_API __declspec(dllexport) @@ -327,9 +329,6 @@ static FUNC_UNUSED void *obj_udata_luadelete(lua_State *L, int _index, obj_type /* null userdata. */ ud->obj = NULL; ud->flags = 0; - /* clear the metatable to invalidate userdata. */ - lua_pushnil(L); - lua_setmetatable(L, _index); return obj; } @@ -361,9 +360,6 @@ static FUNC_UNUSED void *obj_udata_luadelete_weak(lua_State *L, int _index, obj_ /* null userdata. */ ud->obj = NULL; ud->flags = 0; - /* clear the metatable to invalidate userdata. */ - lua_pushnil(L); - lua_setmetatable(L, _index); /* get objects weak table. */ lua_pushlightuserdata(L, obj_udata_weak_ref_key); lua_rawget(L, LUA_REGISTRYINDEX); /* weak ref table. */ @@ -762,6 +758,7 @@ static const char zmq_ffi_lua_code[] = "local error = error\n" "local type = type\n" "local tonumber = tonumber\n" "local tostring = tostring\n" +"local rawset = rawset\n" "\n" "-- try loading luajit's ffi\n" "local stat, ffi=pcall(require,\"ffi\")\n" @@ -826,6 +823,14 @@ static const char zmq_ffi_lua_code[] = "local error = error\n" " return ud.obj\n" "end\n" "\n" +"local function obj_udata_to_cdata(objects, ud_obj, c_type, ud_mt)\n" +" -- convert userdata to cdata.\n" +" local c_obj = ffi.cast(c_type, obj_udata_luacheck(ud_obj, ud_mt))\n" +" -- cache converted cdata\n" +" rawset(objects, ud_obj, c_obj)\n" +" return c_obj\n" +"end\n" +"\n" "local function obj_udata_luadelete(ud_obj, type_mt)\n" " local ud = obj_udata_luacheck_internal(ud_obj, type_mt)\n" " local obj, flags = ud.obj, ud.flags\n" @@ -912,6 +917,14 @@ static const char zmq_ffi_lua_code[] = "local error = error\n" " error(\"(expected `\" .. type_mt['.name'] .. \"`, got \" .. type(ud_obj) .. \")\", 3)\n" "end\n" "\n" +"local function obj_simple_udata_to_cdata(objects, ud_obj, c_type, ud_mt)\n" +" -- convert userdata to cdata.\n" +" local c_obj = ffi.cast(c_type, obj_simple_udata_luacheck(ud_obj, ud_mt))\n" +" -- cache converted cdata\n" +" rawset(objects, ud_obj, c_obj)\n" +" return c_obj\n" +"end\n" +"\n" "local function obj_simple_udata_luadelete(ud_obj, type_mt)\n" " local c_obj = obj_simple_udata_luacheck(ud_obj, type_mt)\n" " -- invalid userdata, by setting the metatable to nil.\n" @@ -1054,16 +1067,13 @@ static const char zmq_ffi_lua_code[] = "local error = error\n" "\n" "(function()\n" "local zmq_msg_t_mt = _priv.zmq_msg_t\n" -"local zmq_msg_t_objects = setmetatable({}, { __mode = \"k\" })\n" +"local zmq_msg_t_objects = setmetatable({}, { __mode = \"k\",\n" +"__index = function(objects, ud_obj)\n" +" return obj_simple_udata_to_cdata(objects, ud_obj, \"zmq_msg_t *\", zmq_msg_t_mt)\n" +"end,\n" +"})\n" "function obj_type_zmq_msg_t_check(ud_obj)\n" -" local c_obj = zmq_msg_t_objects[ud_obj]\n" -" if c_obj == nil then\n" -" -- cdata object not in cache\n" -" c_obj = obj_simple_udata_luacheck(ud_obj, zmq_msg_t_mt)\n" -" c_obj = ffi.cast(\"zmq_msg_t *\", c_obj) -- cast from 'void *'\n" -" zmq_msg_t_objects[ud_obj] = c_obj\n" -" end\n" -" return c_obj\n" +" return zmq_msg_t_objects[ud_obj]\n" "end\n" "\n" "function obj_type_zmq_msg_t_delete(ud_obj)\n" @@ -1086,16 +1096,13 @@ static const char zmq_ffi_lua_code[] = "local error = error\n" "\n" "(function()\n" "local ZMQ_Socket_mt = _priv.ZMQ_Socket\n" -"local ZMQ_Socket_objects = setmetatable({}, { __mode = \"k\" })\n" +"local ZMQ_Socket_objects = setmetatable({}, { __mode = \"k\",\n" +"__index = function(objects, ud_obj)\n" +" return obj_udata_to_cdata(objects, ud_obj, \"ZMQ_Socket *\", ZMQ_Socket_mt)\n" +"end,\n" +"})\n" "function obj_type_ZMQ_Socket_check(ud_obj)\n" -" local c_obj = ZMQ_Socket_objects[ud_obj]\n" -" if c_obj == nil then\n" -" -- cdata object not in cache\n" -" c_obj = obj_udata_luacheck(ud_obj, ZMQ_Socket_mt)\n" -" c_obj = ffi.cast(\"ZMQ_Socket *\", c_obj) -- cast from 'void *'\n" -" ZMQ_Socket_objects[ud_obj] = c_obj\n" -" end\n" -" return c_obj\n" +" return ZMQ_Socket_objects[ud_obj]\n" "end\n" "\n" "function obj_type_ZMQ_Socket_delete(ud_obj)\n" @@ -1118,16 +1125,13 @@ static const char zmq_ffi_lua_code[] = "local error = error\n" "\n" "(function()\n" "local ZMQ_Poller_mt = _priv.ZMQ_Poller\n" -"local ZMQ_Poller_objects = setmetatable({}, { __mode = \"k\" })\n" +"local ZMQ_Poller_objects = setmetatable({}, { __mode = \"k\",\n" +"__index = function(objects, ud_obj)\n" +" return obj_simple_udata_to_cdata(objects, ud_obj, \"ZMQ_Poller *\", ZMQ_Poller_mt)\n" +"end,\n" +"})\n" "function obj_type_ZMQ_Poller_check(ud_obj)\n" -" local c_obj = ZMQ_Poller_objects[ud_obj]\n" -" if c_obj == nil then\n" -" -- cdata object not in cache\n" -" c_obj = obj_simple_udata_luacheck(ud_obj, ZMQ_Poller_mt)\n" -" c_obj = ffi.cast(\"ZMQ_Poller *\", c_obj) -- cast from 'void *'\n" -" ZMQ_Poller_objects[ud_obj] = c_obj\n" -" end\n" -" return c_obj\n" +" return ZMQ_Poller_objects[ud_obj]\n" "end\n" "\n" "function obj_type_ZMQ_Poller_delete(ud_obj)\n" @@ -1150,16 +1154,13 @@ static const char zmq_ffi_lua_code[] = "local error = error\n" "\n" "(function()\n" "local ZMQ_Ctx_mt = _priv.ZMQ_Ctx\n" -"local ZMQ_Ctx_objects = setmetatable({}, { __mode = \"k\" })\n" +"local ZMQ_Ctx_objects = setmetatable({}, { __mode = \"k\",\n" +"__index = function(objects, ud_obj)\n" +" return obj_udata_to_cdata(objects, ud_obj, \"ZMQ_Ctx *\", ZMQ_Ctx_mt)\n" +"end,\n" +"})\n" "function obj_type_ZMQ_Ctx_check(ud_obj)\n" -" local c_obj = ZMQ_Ctx_objects[ud_obj]\n" -" if c_obj == nil then\n" -" -- cdata object not in cache\n" -" c_obj = obj_udata_luacheck(ud_obj, ZMQ_Ctx_mt)\n" -" c_obj = ffi.cast(\"ZMQ_Ctx *\", c_obj) -- cast from 'void *'\n" -" ZMQ_Ctx_objects[ud_obj] = c_obj\n" -" end\n" -" return c_obj\n" +" return ZMQ_Ctx_objects[ud_obj]\n" "end\n" "\n" "function obj_type_ZMQ_Ctx_delete(ud_obj)\n" @@ -1182,16 +1183,13 @@ static const char zmq_ffi_lua_code[] = "local error = error\n" "\n" "(function()\n" "local ZMQ_StopWatch_mt = _priv.ZMQ_StopWatch\n" -"local ZMQ_StopWatch_objects = setmetatable({}, { __mode = \"k\" })\n" +"local ZMQ_StopWatch_objects = setmetatable({}, { __mode = \"k\",\n" +"__index = function(objects, ud_obj)\n" +" return obj_udata_to_cdata(objects, ud_obj, \"ZMQ_StopWatch *\", ZMQ_StopWatch_mt)\n" +"end,\n" +"})\n" "function obj_type_ZMQ_StopWatch_check(ud_obj)\n" -" local c_obj = ZMQ_StopWatch_objects[ud_obj]\n" -" if c_obj == nil then\n" -" -- cdata object not in cache\n" -" c_obj = obj_udata_luacheck(ud_obj, ZMQ_StopWatch_mt)\n" -" c_obj = ffi.cast(\"ZMQ_StopWatch *\", c_obj) -- cast from 'void *'\n" -" ZMQ_StopWatch_objects[ud_obj] = c_obj\n" -" end\n" -" return c_obj\n" +" return ZMQ_StopWatch_objects[ud_obj]\n" "end\n" "\n" "function obj_type_ZMQ_StopWatch_delete(ud_obj)\n" @@ -1515,6 +1513,7 @@ static const char zmq_ffi_lua_code[] = "local error = error\n" "function _meth.ZMQ_Socket.getopt(self, opt2)\n" " local this1 = obj_type_ZMQ_Socket_check(self)\n" " \n" +" local val1\n" " local err2\n" " local ctype = option_types[opt2]\n" " local val\n" @@ -1539,7 +1538,7 @@ static const char zmq_ffi_lua_code[] = "local error = error\n" " end\n" "\n" " err2 = error_code__ZMQ_Error__push(err2)\n" -" return err2\n" +" return val1, err2\n" "end\n" "\n" "-- temp. values for 'events' function.\n" @@ -1688,6 +1687,7 @@ static const char zmq_ffi_lua_code[] = "local error = error\n" "-- method: next_revents\n" "function _meth.ZMQ_Poller.next_revents(self)\n" " local this1 = obj_type_ZMQ_Poller_check(self)\n" +" local sock1\n" " local revents2\n" " local sock\n" " local idx = this1.next\n" @@ -1721,7 +1721,7 @@ static const char zmq_ffi_lua_code[] = "local error = error\n" " this1.next = idx\n" "\n" " revents2 = revents2\n" -" return revents2\n" +" return sock1, revents2\n" "end\n" "\n" "-- method: count\n"