From 29ac928f786936739f45393d9b3218df1b1d6f4a Mon Sep 17 00:00:00 2001 From: "Robert G. Jakabosky" Date: Sat, 3 Dec 2011 11:03:54 -0800 Subject: [PATCH] Add partial work on generating socket option code. --- src/socket.nobj.lua | 211 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 211 insertions(+) diff --git a/src/socket.nobj.lua b/src/socket.nobj.lua index 0b4c9b3..bdca021 100644 --- a/src/socket.nobj.lua +++ b/src/socket.nobj.lua @@ -18,6 +18,217 @@ -- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -- THE SOFTWARE. +local OPT_TYPES = { +NONE = "NONE", +INT = "int", +UINT32 = "uint32_t", +UINT64 = "uint64_t", +INT64 = "int64_t", +BLOB = "const char *", +FD = "int", +} +local get_set_prefix = { +rw = { c_get = "lzmq_socket_", get='', c_set = "lzmq_socket_set_", set='set_' }, +r = { c_get = "lzmq_socket_", get='' }, +w = { c_set = "lzmq_socket_", set='' }, +} + +local socket_options = { + { ver_def = 'VERSION_2_0', + [1] = { name="hwm", otype="UINT64", mode="rw", ltype="int" }, + [2] = { }, + [3] = { name="swap", otype="INT64", mode="rw", ltype="int" }, + [4] = { name="affinity", otype="UINT64", mode="rw", ltype="uint64_t" }, + [5] = { name="identity", otype="BLOB", mode="rw", ltype="const char *" }, + [6] = { name="subscribe", otype="BLOB", mode="w", ltype="const char *" }, + [7] = { name="unsubscribe", otype="BLOB", mode="w", ltype="const char *" }, + [8] = { name="rate", otype="INT64", mode="rw", ltype="int" }, + [9] = { name="recovery_ivl", otype="INT64", mode="rw", ltype="int" }, + [10] = { name="mcast_loop", otype="INT64", mode="rw", ltype="int" }, + [11] = { name="sndbuf", otype="UINT64", mode="rw", ltype="int" }, + [12] = { name="rcvbuf", otype="UINT64", mode="rw", ltype="int" }, + [13] = { name="rcvmore", otype="INT64", mode="r", ltype="int" }, + }, + { ver_def = 'version_2_1', + [14] = { name="fd", otype="FD", mode="r", ltype="int" }, + [15] = { name="events", otype="UINT32", mode="r", ltype="int" }, + [16] = { name="type", otype="INT", mode="r", ltype="int" }, + [17] = { name="linger", otype="INT", mode="rw", ltype="int" }, + [18] = { name="reconnect_ivl", otype="INT", mode="rw", ltype="int" }, + [19] = { name="backlog", otype="INT", mode="rw", ltype="int" }, + [20] = { name="recovery_ivl_msec", otype="INT64", mode="rw", ltype="int64_t" }, + [21] = { name="reconnect_ivl_max", otype="INT", mode="rw", ltype="int" }, + }, + { ver_def = 'VERSION_3_0', + [1] = { name="hwm", otype="INT", mode="rw", +custom = [[ +ZMQ_Error lzmq_socket_set_hwm(ZMQ_Socket *sock, int value) { + int val; + int rc; + val = (int)value; + rc = zmq_setsockopt(sock, ZMQ_SNDHWM, &value, sizeof(value)); + if(-1 == rc) return rc; + val = (int)value; + return zmq_setsockopt(sock, ZMQ_RCVHWM, &value, sizeof(value)); +} +ZMQ_Error lzmq_socket_hwm(ZMQ_Socket *sock, int *value) { + size_t val_len; + int rc; + val_len = sizeof(value); + rc = zmq_getsockopt(sock, ZMQ_SNDHWM, value, &val_len); + if(-1 == rc) return rc; + val_len = sizeof(value); + return zmq_getsockopt(sock, ZMQ_RCVHWM, value, &val_len); +} + +]] }, + [2] = { }, + [3] = { }, + [4] = { name="affinity", otype="UINT64", mode="rw", ltype="uint64_t" }, + [5] = { name="identity", otype="BLOB", mode="rw", ltype="const char *" }, + [6] = { name="subscribe", otype="BLOB", mode="w", ltype="const char *" }, + [7] = { name="unsubscribe", otype="BLOB", mode="w", ltype="const char *" }, + [8] = { name="rate", otype="INT", mode="rw", ltype="int" }, + [9] = { name="recovery_ivl", otype="INT", mode="rw", ltype="int" }, + [10] = { name="mcast_loop", otype="INT", mode="rw", ltype="int" }, + [11] = { name="sndbuf", otype="INT", mode="rw", ltype="int" }, + [12] = { name="rcvbuf", otype="INT", mode="rw", ltype="int" }, + [13] = { name="rcvmore", otype="INT", mode="r", ltype="int" }, + [14] = { name="fd", otype="FD", mode="r", ltype="int" }, + [15] = { name="events", otype="INT", mode="r", ltype="int" }, + [16] = { name="type", otype="INT", mode="r", ltype="int" }, + [17] = { name="linger", otype="INT", mode="rw", ltype="int" }, + [18] = { name="reconnect_ivl", otype="INT", mode="rw", ltype="int" }, + [19] = { name="backlog", otype="INT", mode="rw", ltype="int" }, + [20] = { }, + [21] = { name="reconnect_ivl_max", otype="INT", mode="rw", ltype="int" }, + [22] = { name="maxmsgsize", otype="INT64", mode="rw", ltype="int64" }, + [23] = { name="sndhwm", otype="INT", mode="rw", ltype="int" }, + [24] = { name="rcvhwm", otype="INT", mode="rw", ltype="int" }, + [25] = { name="multicast_hops", otype="INT", mode="rw", ltype="int" }, + [26] = { }, + [27] = { name="rcvtimeo", otype="INT", mode="rw", ltype="int" }, + [28] = { name="sndtimeo", otype="INT", mode="rw", ltype="int" }, + [29] = { name="rcvlabel", otype="INT", mode="rw", ltype="int" }, + }, +} + +local function foreach_opt(func) + for i=1,#socket_options do + local ver_opts = socket_options[i] + for num,opt in pairs(ver_opts) do + if type(num) == 'number' and opt.name then + func(num, opt, ver_opts) + end + end + end +end +local function template(data, templ) + return templ:gsub("%${(.-)}", data) +end + +-- do pre-processing of options. +foreach_opt(function(num, opt) + opt.num = num + opt.DEF = "ZMQ_" .. opt.name:upper() + -- ctype & ffi_type + local ctype = OPT_TYPES[opt.otype] + opt.ctype = ctype + if opt.otype == 'BLOB' then + opt.ffi_type = 'string' + opt.set_len_param = ', size_t value_len' + opt.set_val_name = 'value' + opt.set_len_name = 'value_len' + elseif ctype ~= 'NONE' then + opt.ffi_type = ctype .. '[1]' + opt.set_len_param = '' + opt.set_val_name = '&value' + opt.set_len_name = 'sizeof(value)' + end + -- getter/setter names + for meth,prefix in pairs(get_set_prefix[opt.mode]) do + opt[meth] = prefix .. opt.name + end +end) + +local add=function(t,val) return table.insert(t,val) end +local options_c_code = {} + +local function endif(t, def) + return add(t, "#endif /* #if " .. def .. " */\n") +end + +-- build C code for socket options setters/getters +local last_ver +foreach_opt(function(num, opt, ver) + if ver ~= last_ver then + if last_ver then + endif(options_c_code, last_ver.ver_def) + end + last_ver = ver + add(options_c_code, "#if " .. ver.ver_def .. "\n") + end + -- generate setter + local set = '' + local get = '' + if opt.c_set then + if opt.otype == 'BLOB' then + set = [[ +ZMQ_Error ${c_set}(ZMQ_Socket *sock, const char *value, size_t str_len) { + return zmq_setsockopt(sock, ${DEF}, value, str_len); +]] + elseif opt.ctype == opt.ltype then + set = [[ +ZMQ_Error ${c_set}(ZMQ_Socket *sock, ${ltype} value) { + return zmq_setsockopt(sock, ${DEF}, &value, sizeof(value)); +]] + else + set = [[ +ZMQ_Error ${c_set}(ZMQ_Socket *sock, ${ltype} value) { + ${ctype} val = (${ctype})value; + return zmq_setsockopt(sock, ${DEF}, &val, sizeof(val)); +]] + end + set = set .. "}\n\n" + end + -- generate getter + if opt.c_get then + if opt.otype == 'BLOB' then + get = [[ +ZMQ_Error ${c_get}(ZMQ_Socket *sock, char *value, size_t *len) { + return zmq_getsockopt(sock, ${DEF}, value, len); +]] + elseif opt.ctype == opt.ltype then + get = [[ +ZMQ_Error ${c_get}(ZMQ_Socket *sock, ${ltype} *value) { + size_t val_len = sizeof(${ltype}); + return zmq_getsockopt(sock, ${DEF}, value, &val_len); +]] + else + get = [[ +ZMQ_Error ${c_get}(ZMQ_Socket *sock, ${ltype} *value) { + ${ctype} val; + size_t val_len = sizeof(val); + int rc = zmq_getsockopt(sock, ${DEF}, &val, &val_len); + *value = (${ltype})val; + return rc; +]] + end + get = get .. "}\n\n" + end + local templ + if opt.custom then + templ = opt.custom + else + templ = set .. get + end + add(options_c_code, template(opt,templ)) +end) +endif(options_c_code, last_ver.ver_def) + +options_c_code = table.concat(options_c_code) +print(options_c_code) + object "ZMQ_Socket" { error_on_null = "get_zmq_strerror()", c_source [[