Monday November 1, 2010

[Time] NameMessage
[00:06] Guthur sustrik, I'm off to bed now, but if you get a chance to review that clrzmq code and suggestion any changes it would be great, its not a massive update to be fair, I'll probably provide the multithreading demo when the device code is finalised
[01:06] gandhijee Hi all, what flag to i need to pass gcc for it to link/use zeromq?
[01:06] gandhijee -l<what goes here for zeromq>?
[01:08] gandhijee bm
[01:08] gandhijee *nm
[04:05] gandhijee is there away to check the size of an incoming message?
[04:23] xraid gandhijee: -- what binding are you using ?
[04:26] gandhijee xraid: C, i am using protocol buffers from google
[04:27] gandhijee and i am trying to figure out how to allocate the memory for the message after i get it from the sender
[04:29] gandhijee xraid: that was it, thanks!
[07:27] dccmx i have a question
[08:28] xraid hey whats up with the ML i am subscribed but cants send to it as i am not a member of the list ? i thought i was a member of the list if subscribed ?
[08:33] sustrik xraid: what's your address?
[08:34] xraid zmq
[08:38] sustrik let me see
[08:40] xraid hehe i tried to sub as xraid but i was banned . i then replied with a "why so" . no answer yet ...
[08:41] sustrik xraid: the subscription is see is "omq at"
[08:43] xraid ahhh that explains it then ...
[08:48] xraid sustrik: if possible i much prefer to change omq to xraid if possible
[08:54] sustrik well, do so
[08:54] sustrik ah, xraid is banned?
[08:55] xraid huh ;-9
[08:55] xraid how come
[08:56] sustrik hm, it's not in the ban list
[08:56] sustrik ???
[08:56] sustrik "hehe i tried to sub as xraid but i was banned"
[11:33] Ogedei do I understand correctly that msg's *can* be passed between threads (as long as they are accessed in a single-threaded way), and don't have restriction that sockets have?
[11:39] sustrik Ogedei: yes
[11:39] sustrik they are plain structures
[11:45] Ogedei sustrik: thank you
[11:47] sustrik you are welcome
[12:32] mato sustrik: are you there?
[12:32] sustrik hi
[12:33] mato hi
[12:33] mato sustrik: what exactly would you like me to test with the new signaler, performance-wise?
[12:33] sustrik not yet, just test whether it works for you
[12:33] mato ah, ok
[12:33] mato i'll do that now then
[12:33] sustrik ok
[12:35] mato sustrik: note that my userspace (Debian lenny) is too old for eventfd, so I'll be testing the socketpair implementation
[12:36] sustrik goosd
[12:36] mato i can maybe hack something together to try and make eventfd work on my systems, but not right now
[12:36] sustrik just test what you have
[13:01] CIA-21 zeromq2: 03Mikael Helbo Kjaer 07master * r0ad71f8 10/ (src/select.cpp src/select.hpp):
[13:01] CIA-21 zeromq2: select now uses Erase-Remove idiom for retired fds
[13:01] CIA-21 zeromq2: Signed-off-by: Mikael Helbo Kjaer <> -
[13:04] mato sustrik: seems to work so far... testing with up to 600 nodes
[13:04] sustrik mato: the patch you've sent means that INSTALL goes to git, right?
[13:04] mato sustrik: the topology setup time obviously increases, and i increased the listen backlog and turned wait_before_reconnect on as usual
[13:05] mato sustrik: yes, that's correct, just apply the patch as is
[13:05] mato sustrik: it removes INSTALL from .gitignore and adds it into git, yes
[13:05] sustrik interestingly, git apply doesn't add the new file to the git
[13:06] mato probably because it's in .gitignore
[13:06] sustrik np
[13:06] mato just add it in by hand or something
[13:06] sustrik i did
[13:06] mato and don't forget to remote it from .gitignore :-)
[13:06] sustrik that part was applied ok
[13:09] pieterh sustrik: without the foreign flag, autotools will generate INSTALL automatically
[13:10] mato pieterh: kind of, but with the foreign flag it breaks our automatic ChangeLog generation
[13:10] pieterh you mean without foreign flag?
[13:10] mato yes, I wrote about it
[13:10] pieterh yes
[13:10] sustrik patch looks like working ok
[13:10] sustrik committing it
[13:10] mato there's a reason for that foreign flag
[13:10] mato as I explained.
[13:11] pieterh mato: I was just explaining to sustrik that INSTALL is usually generated code
[13:11] sustrik it used to be
[13:11] mato no, it's stuck in as a template if it's not there
[13:11] sustrik not it's not
[13:11] pieterh we were looking for this yesterday but I couldn't see where the foreign flag was being set
[13:11] sustrik i don't care much
[13:12] mato whatever, the INSTALL file will eventually contain custom content anyway
[13:12] mato so it'll be in git anyway
[13:12] pieterh presumably, yes
[13:12] CIA-21 zeromq2: 03Martin Lucina 07maint * reb83678 10/ (.gitignore INSTALL):
[13:12] CIA-21 zeromq2: Add INSTALL to Git, thus making it a normal file
[13:12] CIA-21 zeromq2: INSTALL gets added in somewhat magically by automake, or not. Adding it into
[13:12] CIA-21 zeromq2: Git ensures it's always included in the distribution.
[13:12] CIA-21 zeromq2: Signed-off-by: Martin Lucina <> -
[13:17] sustrik mato, pieter: for development releases i propose we won't upload the man pages to the website
[13:17] sustrik they are included in the package
[13:18] mato sustrik: dunno, maybe... or we have two sets on the website
[13:18] sustrik and it would confuse users using the stable release
[13:18] mato to be determined
[13:18] sustrik it there are 2 versions of docs on the website
[13:18] pieterh to be determined
[13:18] pieterh how does, e.g. APR do this? How does any project do this?
[13:18] sustrik no idea
[13:19] sustrik do they have 'unstable' releases?
[13:19] pieterh sure
[13:19] mato yes
[13:19] pieterh every serious project has
[13:19] mato and they have multiple versions of the docs uploaded
[13:19] mato clearly marked
[13:19] pieterh indeed
[13:19] pieterh it's just code at a URL
[13:19] mato some people will of course not read the clear marking and get confused anyway, too bad
[13:19] pieterh indeed
[13:19] sustrik ok
[13:21] mato sustrik: ok, so what are we going to do with the new signaler?
[13:21] mato sustrik: it seems to work as far as I can tell, but as I say, I've only tested on a single platform and have not done any serious performance tests...
[13:21] CIA-21 zeromq2: 03Martin Lucina 07master * reb83678 10/ (.gitignore INSTALL):
[13:21] CIA-21 zeromq2: Add INSTALL to Git, thus making it a normal file
[13:21] CIA-21 zeromq2: INSTALL gets added in somewhat magically by automake, or not. Adding it into
[13:21] CIA-21 zeromq2: Git ensures it's always included in the distribution.
[13:21] CIA-21 zeromq2: Signed-off-by: Martin Lucina <> -
[13:21] CIA-21 zeromq2: 03Martin Sustrik 07master * rdbcd382 10/ (.gitignore INSTALL):
[13:21] CIA-21 zeromq2: Merge branch 'maint'
[13:21] CIA-21 zeromq2: * maint:
[13:21] CIA-21 zeromq2: Add INSTALL to Git, thus making it a normal file -
[13:22] sustrik mato: well, it's kind of complex
[13:22] sustrik maybe you want just to patch your version as for now?
[13:22] mato why?
[13:22] sustrik time pressure?
[13:22] mato that all gets very confusing rapidly
[13:22] mato and i'd like to avoid extra patches if at all possible...
[13:22] sustrik so, for starters we need win32 implementation of event
[13:23] sustrik i've only did linux one
[13:23] sustrik also, i've merged the hp-ux/aix code with linux code
[13:23] mato right, i saw that
[13:23] sustrik hopefully, brett will test that part
[13:23] mato that doesn't matter too much, if hp-ux/aix breaks then i'd expect those users to speak up
[13:23] mato we cannot obviously test on platforms we don't have
[13:24] mato and hp-ux/aix are a minority platform anyway
[13:24] sustrik so, we need win implementation
[13:24] mato right...
[13:24] sustrik test the eventfd implementation
[13:24] sustrik i've did a bit, but maybe running some larger payload would be good
[13:24] sustrik then we need to optimise it
[13:25] sustrik will you do the win32 part?
[13:26] mato i could do that, yes
[13:26] sustrik thx
[13:28] sustrik mato: btw, i copied your release process here:
[13:28] sustrik
[13:29] mato sustrik: oh, good
[13:29] sustrik it's not perfect, but at least it's documented
[13:30] mato yup, good
[13:34] pieterh sustrik: very nice, we were missing this
[14:34] mato sustrik_: hmm, event_t::wait() is supposed to busy-loop?
[14:35] mato sustrik_: ah, sorry, i misread the code
[15:10] mato sustrik_: here?
[15:25] mato sustrik_: um, the signaler has always been ignoring EINTR as far as I can tell...
[15:26] mato sustrik_: so it would seem that is the *correct* behaviour
[15:26] mato sustrik_: and the do { recv() } while() loop has to stay for POSIX platforms
[15:26] sustrik hm
[15:26] sustrik ignoring = looping?
[15:27] mato yes
[15:27] sustrik even blocking read?
[15:27] sustrik let me see
[15:27] mato ah, hang on
[15:27] mato the different implementations are a mess...
[15:28] sustrik if (nbytes == -1 && (errno == EAGAIN || errno == EINTR))
[15:28] sustrik return -1;
[15:28] mato yeah, because that implementation uses MSG_DONTWAIT
[15:28] mato which is specific to god knows what platforms
[15:28] sustrik yep
[15:28] sustrik we don't need that now so we can drop it
[15:29] sustrik in any case if (EINTR) return -1
[15:29] mato yeah but your event_t has no notion of returning anything (all the methods are void)
[15:29] mato i'm just wondering how that is supposed to work...
[15:30] sustrik we'll have to add the reurn codes then
[15:30] sustrik the idea is that application thread exits on EINTR
[15:30] sustrik while I/O thread restarts the operation
[15:31] mato so that means that signaler_t::recv() must return EINTR if the underlying blocking call is interrupted, right?
[15:31] sustrik tes
[15:31] sustrik yes
[15:31] sustrik actually, i am not sure EINTR can even happen in I/O thread
[15:32] mato so both event_t::wait() and event_t::reset() need to be able to return -1 and errno=EINTR, right?
[15:32] sustrik given that signals are switched off in those threads
[15:32] mato good question, no idea
[15:32] sustrik even set can return EINTR
[15:32] mato if ::send() is interrupted?
[15:32] sustrik yes
[15:33] mato right, so all of those need to be int
[15:33] sustrik ack
[15:33] mato i will change that
[15:36] sustrik ok, I/O thread handles EINTR correctly (restarts the operation)
[15:37] mato ok, but what about signaler_t::send()?
[15:37] mato that method does not return anything...
[15:37] mato so what is it supposed to do if event_t::set() returns EINTR? restart it?
[15:39] sustrik hmm
[15:40] sustrik the problem is that by restarting you loose the signal
[15:40] sustrik but the signal handling is not 100% efficient anyway
[15:40] sustrik so yes, we can just restart the send
[15:41] pieterh sustrik: you have a second?
[15:41] pieterh question on code structure
[15:41] pieterh why does select.cpp do a bunch of stuff for windows, and then invoke select.hpp that does the same?
[15:42] pieterh afaics select.hpp isn't used by any other code
[15:42] sustrik pieterh: historic reasons
[15:43] pieterh ?
[15:43] pieterh i mean, is this by design or just bogus?
[15:43] sustrik the poll algo classes should be refactored
[15:43] sustrik bogus
[15:43] pieterh ok... cause there's duplicate code but it's not quite the same in both cases
[15:43] pieterh actually it's worse, there's also windows.hpp that does the same again
[15:44] sustrik i know, but it's hard to change without breaking anything
[15:44] mato there is much historical weird stuff to clean up wrt windows.wpp and the bits that depend on it
[15:44] mato but, as sustrik says, it's all pretty fragile, so if it ain't broke, don't fix it
[15:44] pieterh well, select.hpp is only used in one place
[15:44] pieterh and it is broken
[15:45] pieterh and I do intend to fix it, the FD_SETSIZE issue has been there for years and should go
[15:45] sustrik sure, send the patch
[15:45] mato oh dear, not that again
[15:45] pieterh well, my question is whether you really want me to 'fix' three places that are all actually the same?
[15:45] mato FD_SETSIZE is a problem because zmq.h depends on winsock for SOCKET *
[15:45] pieterh mato: please
[15:45] pieterh we do understand the case pretty well
[15:46] pieterh the problem here is just 0MQ's code, not the fix in question
[15:46] mato sure
[15:46] pieterh winsock.h is included 4 times
[15:46] pieterh that is the problem
[15:46] sustrik i don't know about FD_SETSIZE, but if there's a bug in select.cpp, just fix it and send the patch
[15:46] mato if you can make all the code work *correctly* *and* avoid redefining an *application's* view of FD_SETSIZE, go for it
[15:46] pieterh mato: we've been over this
[15:47] pieterh code that calls a library must defacto use that library's value for FD_SETSIZE
[15:47] mato pieterh: I will not accept any patch that redefines FD_SETSIZE of an *application* including zmq.h
[15:47] mato for reasons that I have explained
[15:47] pieterh you've not explained, and/or have not understood
[15:47] mato zmq.h is the *API* header
[15:47] pieterh every library that wraps select() must define a value for FD_SETSIZE
[15:47] mato it has no business changing the *application's* view of FD_SETSIZE
[15:48] mato yes, sure
[15:48] pieterh lll
[15:48] mato i have no problem with that
[15:48] pieterh it changes the API's definition
[15:48] pieterh this is standard stuff
[15:48] pieterh now, including zmq.h magically sets FD_SETSIZE to 64
[15:48] pieterh which is not a feature, but a bug
[15:48] mato no it doesn't, it leaves it at whatever the default is
[15:48] pieterh no it doesn't
[15:49] pieterh winsock.h defines it
[15:49] mato bah
[15:49] pieterh unless it's already defined
[15:49] mato exactly
[15:49] pieterh well... did you think I'd ignore a previous definition?
[15:49] pieterh / Raise max sockets from default of 64 to more usable value
[15:49] pieterh / Must be consistent in any code that shares FD sets
[15:49] pieterh #ifndef FD_SETSIZE
[15:49] pieterh #define FD_SETSIZE 1024
[15:49] pieterh #endif
[15:49] sustrik afaiu, the problem is that 0mq and the application have to have same value of FD_SETSIZE to work well
[15:49] sustrik right?
[15:49] pieterh it's just an array max for the select call
[15:49] mato no, i don't think so
[15:50] pieterh so any code that shares fdsets must agree on the max
[15:50] mato sustrik_: libzmq.dll's FD_SETSIZE AFAICT has nothing to do with the app's FD_SETSIZE
[15:50] pieterh mato: there is no 'app's FD_SETSIZE'
[15:50] mato huh?
[15:50] pieterh every select call has an FD_SETSIZE
[15:50] pieterh it's not per application or per binary
[15:50] pieterh it's per select() call...
[15:50] mato sure
[15:50] mato my point is...
[15:51] mato what if you have an existing application which is mixing normal sockets and zmq code
[15:51] mato including zmq.h should not go and magically change that app's FD_SETSIZE...
[15:51] pieterh (a) that is 1% of the case where as 'normal 0MQ apps' are 99% of the case
[15:51] pieterh (b) you can set your own FD_SETSIZE beforehand
[15:51] pieterh (c) you need to recompile ALL your code then to match
[15:51] pieterh including 0MQ
[15:51] pieterh that's pretty straight-forward
[15:52] mato does it really work that way? (c) included?
[15:52] pieterh what is not acceptable is "install 0MQ, build app, watch it break at 64 sockets'
[15:52] pieterh yes mato
[15:52] pieterh define the macro in your project, rebuild
[15:52] pieterh period
[15:52] pieterh i've been doing this for 15 years or so with Xitami / SFL /...
[15:52] mato ok, ok, i believe you
[15:53] mato i was just trying to avoid zmq.h doing anything "surprising"
[15:53] pieterh the _only_ difficulty here is that 0MQ includes winsock 4 times in different places
[15:53] pieterh which is... less than elegant
[15:53] mato yes, that needs to be refactored
[15:53] mato oh
[15:53] mato there is one other complexity
[15:53] mato when building zmq on windows
[15:53] pieterh yes?
[15:54] mato FD_SETSIZE must be defined correctly the 1st time winsock.h is included in the app
[15:54] pieterh there is no 'app'
[15:54] mato which for zmq basically means changing all those places
[15:54] pieterh you keep speaking of 'apps'
[15:54] mato i'm sorry, zeromq *library*
[15:54] pieterh every source file
[15:54] pieterh is compiled with a certain value for FD_SETSIZE
[15:54] pieterh winsock.h is included 4 times in different places
[15:55] pieterh some are obviously redundant (select.cpp, select.hpp)
[15:55] pieterh others are less so
[15:55] sustrik can someone explain what FD_SETSIZE actually affects? if every call to select can have different FD_SETSIZE why not define it to 1024 in our cpp files and leave the header alone?
[15:55] pieterh sustrik_, it tells the win32 library how large the fdset arrays are
[15:56] sustrik and can it differ throughout the program?
[15:56] mato no one knows :-)
[15:56] pieterh if you include winsock.h or winsock2.h without defining this, it sets a value of 64
[15:56] pieterh so each source file can have different values compiled into it
[15:56] pieterh winsock.h passes the macro value to the win32 functions
[15:56] pieterh so it can differ in every call to select()
[15:57] pieterh does that make sense?
[15:57] mato if that's how it actually works, then yes, i think so
[15:57] sustrik then why not go for defining FD_SETSIZE only for select.cpp and zmq.cpp?
[15:57] pieterh sustrik: if those are the only places you call select(), yes
[15:57] pieterh in fact only in select.cpp then
[15:57] mato zmq.cpp also calls select()
[15:57] sustrik yes
[15:57] pieterh right
[15:57] mato for the zmq_poll() implementation
[15:58] pieterh ok, i'll make a patch and ask for volunteers to test that under win32
[15:58] pieterh if it's stable we can include it
[15:58] pieterh zmq.h and select.cpp only then
[15:59] mato zmq.h?
[15:59] sustrik noo
[15:59] mato zmq.cpp you mean
[15:59] pieterh well, it has to be defined _before_ including winsock.h
[15:59] pieterh that happens in zmq.h
[15:59] mato yes, so?
[16:00] pieterh so you want me to add this code to the very start of zmq.cpp?
[16:00] pieterh wow
[16:00] mato then put the #define in zmq.cpp before it include anything
[16:00] mato yes
[16:00] pieterh no way
[16:00] pieterh that's so ugly
[16:00] mato the whole FD_SETSIZE thing is ugly
[16:00] mato not our fault
[16:00] pieterh 'here's our global header file but wait, some magic stuff happens before that!'
[16:00] pieterh no, it's the fault of this code structure
[16:00] pieterh it should be done in windows.hpp
[16:01] pieterh or somewhere for 'include all random windows stuff'
[16:01] mato yes, but not in zmq.h
[16:01] mato that's the only point i'm making, pieter
[16:01] mato do it any way you like, just not in zmq.h please
[16:01] sustrik windows.hpp is actually a nice place to set it
[16:01] mato if you clean up the mess with windows.hpp while you're at it, so much the better
[16:01] pieterh you're not making a point, you're just imposing an arbitrary limitation
[16:02] mato it's not arbitrary
[16:02] sustrik as it's included from all 0mq compilation units
[16:02] sustrik but not from zmq.h
[16:02] pieterh it should be _consistent_ for the whole library
[16:02] pieterh and it should be easy to override from the project file
[16:02] pieterh period
[16:02] pieterh look, I'm willing to spend some effort cleaning this up, but not to navigate random opinions
[16:02] mato sustrik_: do you understand why making the change in zmq.h seems like a bad idea? or am I alone in this?
[16:02] pieterh the windows build of 0MQ is broken
[16:02] sustrik mato: i do
[16:02] pieterh 64 sockets is not realistic, period
[16:03] pieterh you are both wrong, then
[16:03] sustrik pieterh: try putting it into windows.hpp, that should work ok
[16:03] pieterh any application that mixes tcp and 0mq must in any case define a FD_SETSIZE
[16:03] pieterh externally
[16:03] pieterh in its project file
[16:03] pieterh this applies to any library that wraps select()
[16:03] pieterh sustrik: nope, windows.hpp is not used by select.cpp for instance
[16:04] sustrik it should
[16:04] pieterh yeah, it should
[16:04] pieterh hence my original question about the code structure
[16:04] pieterh the platform code shouldn't be spread out like that IMO
[16:04] sustrik historic reasons
[16:04] pieterh sorry, poor excuse :-)
[16:05] sustrik well, fix it then
[16:05] mato exactly
[16:05] mato stop bitching about it
[16:05] mato and fix it
[16:05] pieterh that's all I was asking for
[16:05] mato all i'm saying, and sustrik is agreeing, is don't change FD_SETSIZE in zmq.h
[16:05] mato and all of this *can* be done without that
[16:05] pieterh i'm curious to see how you will do that, mato
[16:06] mato ?
[16:06] pieterh since zmq.h includes winsock.h
[16:06] pieterh well, since you know best, I step back
[16:06] mato yes, so you make sure FD_SETSIZE is defined before zmq.h is included in the relevant places
[16:07] pieterh that IMO makes the code dirtier and I won't do that, sorry
[16:07] pieterh zmq.h is the system-wide header file
[16:07] sustrik afaiu, each compilation unit has to have a consistent value of FD_SETSIZE
[16:07] mato it's not the syste-wide header file
[16:07] mato it's the exported API header file
[16:07] sustrik but there's no requirement that different compilation units have to have the same value
[16:07] pieterh then it should absolutely not call winsock.h
[16:07] pieterh because today it effectively sets FD_SETSIZE to 64
[16:08] pieterh don't you get this?
[16:08] pieterh zmq.h already makes a mess for any app
[16:08] mato *that* is an entirely different problem
[16:08] pieterh ?
[16:08] mato the reason it's included winsock.h is...
[16:09] mato that the zmq_pollitem_t definition needs a type for "OS sockets"
[16:09] mato so it needs access to SOCKET
[16:09] sustrik yeah, that's a really annoying problem
[16:09] pieterh it sets FD_SETSIZE to 64
[16:09] sustrik in reality SOCKET is void*
[16:09] pieterh that is a serious fault
[16:09] pieterh i'm proposing to make it a less serious faulyt
[16:09] pieterh *fault
[16:10] mato no you're not
[16:10] sustrik what about using void* instead of SOCKET
[16:10] mato well, would that work?
[16:10] sustrik it's not nice but all the other alternatives are even worse
[16:10] pieterh "zmq.h should not magically go and change the app's FD_SETSIZE":
[16:10] pieterh but that's what it does today
[16:11] sustrik i think if holds for all win platforms
[16:11] sustrik hard to check though
[16:11] mato well, there's an easy way to check actually
[16:11] pieterh look, there are several problems here
[16:11] sustrik mato: how?
[16:11] pieterh - windows code is spread out through multiple header files
[16:11] mato sustrik_: in zmq_init, assert (sizeof (SOCKET) == sizeof (void *))
[16:11] pieterh - select() is used with bogus limit of 64
[16:11] sustrik :)
[16:11] mato sustrik_: that would do for starters...
[16:11] sustrik ok, that solves the problem, no?
[16:12] mato it would seem so, yes
[16:12] pieterh yes, that solves zmq.h
[16:12] sustrik when we have that
[16:12] pieterh if zmq.h no longer whacks FD_SETSIZE then it can be safely set per source file where needed
[16:13] mato sustrik_: in fact, you can add a compile-time dummy check
[16:13] mato sustrik_: even better
[16:13] sustrik good
[16:13] mato sustrik_: SOCKET foo; void *bar; bar = foo
[16:13] mato sustrik_: or something like that
[16:13] sustrik ok, however, let's do this after 2.1.0 release
[16:14] sustrik it can break 0mq on some win systems (if we are wrong about void*)
[16:14] mato 2.1.0 is development
[16:14] mato it shoudn't matter too much
[16:14] sustrik thus it would be good to have one functional dev release
[16:14] mato up to you
[16:14] mato anyway, looks like we have a sensible solution
[16:15] sustrik pieter: you can fix it on a topic branch
[16:15] sustrik we can merge it in after 2.1.0 is out
[16:17] pieterh sustrik_, sure
[16:17] pieterh I submit a patch, do what you like with it :-)
[16:20] pieterh please tell me when you've removed the winsock.h call from zmq.h, then I'll make the change
[16:23] mato sustrik_: fd_t is the canonical type used internally for sockets, right?
[16:23] sustrik yes
[16:23] mato sustrik_: i.e. it's SOCKET on windows and int everywhere else
[16:29] sustrik mato: in zmq.h we are using _WIN32 to find out whether we are on windows or somewhere else
[16:30] sustrik does that meen windows.h has to be included prior to zmq.h?
[16:30] mato sustrik_: _WIN32 should be defined by the compiler
[16:30] sustrik ok
[16:30] sustrik what abour win64 btw?
[16:30] mato i hope so anyway, otherwise it's totally braindead
[16:30] mato _WIN32 just means "Win32 API"
[16:31] sustrik i see
[16:31] mato irrelevant to x64 target
[16:35] sustrik ok, i've checked it, MSVC does define _WIN32
[16:35] sustrik good
[16:35] sustrik hopefully, MinGW does the same thing
[16:35] mato it must
[16:41] sustrik i'm checking what SOCKET actually is :(
[16:41] mato oh dear ... :-)
[16:41] sustrik if _WIN64 is defined
[16:42] sustrik it's uinsigned __int64
[16:42] sustrik otherwise it's
[16:42] sustrik __w64 unsigned int
[16:42] sustrik whatever that means
[16:48] pieterh sustrik_, __w64 just means "this integer can be a pointer, safely"
[16:48] pieterh __w64 unsigned int on a 64-bit Windows box is the same as __int64
[16:49] pieterh 'unsigned __int64', sorry
[17:16] mato sustrik_: event_t::reset () should also be restarted automagically on EINTR in signaler_t::recv() ?
[17:17] mato sustrik_: or should it just drop out with EINTR?
[17:19] sustrik mato: if it's hard you can drop it
[17:19] mato sustrik_: it's not hard, i'm asking what it should do...
[17:19] mato sustrik_: what does "set" and "reset" mean, exactly?
[17:20] mato sustrik_: semantically...
[17:21] mato sustrik_: bah, /me is confused...
[17:23] mato sustrik_: i think i need to look at the signaler code together with you, otherwise i'll get it wrong
[17:24] mato sustrik_: anyway, i do have a nicely refactored event.hpp/event.cpp that tries to minimize duplication
[17:25] mato sustrik_: what needs to be protected by the mutex? queue and signaled or just queue?
[17:51] CIA-21 zeromq2: 03Martin Lucina 07wip-signaler * rf78cb39 10/ (8 files in 3 dirs):
[17:51] CIA-21 zeromq2: WIP version of new signaler_t/event_t
[17:51] CIA-21 zeromq2: Signed-off-by: Martin Lucina <> -
[17:52] Guthur sustrik: Thanks for the comments
[17:53] Guthur unfortunately C# doesn't support friends, I had thought of that
[17:54] Guthur And I didn't realise about spaces vs tabs
[17:54] sustrik it makes the code ugly when your editor is set differently
[17:55] Guthur No problem
[17:55] Guthur I'll use spaces
[17:55] sustrik anyway, if there are no friends, it probably have to stay as is
[17:55] Guthur The reason for Queue methods was really to just improve the interface slightly
[17:56] Guthur but I can understand wanting to reflect the underlying API as much as possible
[17:56] Guthur Queue, Forwarder, and Streamer methods*
[17:57] sustrik yes
[17:58] sustrik also, it's easier to tweak constants
[17:58] sustrik than tweaking functions
[17:58] sustrik in case anything changes in the future
[17:58] Guthur Reasonable enough, I'll change to reflect your suggestion
[17:59] sustrik btw, the clrzmq project is kind of orphaned, do you want to help with it?
[18:00] sustrik how it can be done is you'll get write access to the repo
[18:00] sustrik if it is rather one-off patch, then send the patch to the mailing list
[18:01] Guthur sustrik_, Sure no problem
[18:02] Guthur is Jeffrey no longer involved?
[18:04] sustrik haven't heard anything about clrzmq for quite a long time
[18:04] sustrik but maybe i've just missed it?
[18:05] sustrik last update aug, 30
[18:06] Guthur Has there been many interface changes to zmq since then?
[18:06] Guthur or is it mostly under the hood
[18:06] sustrik it's under the hood
[18:06] sustrik some new socket options
[18:07] Guthur I'll try to work through the examples and add the missing ones
[18:07] Guthur Good way to find any missing features I would imagine
[18:07] sustrik just have a look at zmq.h
[18:07] Guthur that would also work, hehe
[18:08] sustrik for the master branch there are these new options:
[18:08] sustrik #define ZMQ_FD 14
[18:08] sustrik #define ZMQ_EVENTS 15
[18:08] sustrik #define ZMQ_TYPE 16
[18:08] sustrik #define ZMQ_LINGER 17
[18:08] sustrik #define ZMQ_RECONNECT_IVL 18
[18:08] sustrik #define ZMQ_BACKLOG 19
[18:08] sustrik first two are irrelevant from clrzmq's point of view
[18:08] sustrik that leaves us with 4 new options
[18:10] Guthur what about ZMQ_RCVMORE
[18:11] sustrik it's not there?
[18:11] Guthur not in what I cloned
[18:11] Guthur let me double check github
[18:11] sustrik what's your name on github?
[18:12] Guthur Guthur, though I notice it gives my real name in the commits
[18:12] Guthur Its not in the clrzmq
[18:12] Guthur ZMQ_RCVMORE that is
[18:12] sustrik ok, you have commit access to clrzmq
[18:13] sustrik be carefull not to break it
[18:13] sustrik let me check...
[18:13] mato sustrik_: should i be disabling interrupt coalescing only for RX or also for TX?
[18:13] toni hi there. I am using zmq with python. The docs of pyzmq only cover sockets. Does anybody know where I can find more information about pyzmq?
[18:13] sustrik Guthur: there's no getsockopt function at all :(
[18:14] sustrik mato: both
[18:14] Guthur sustrik_: Definitely needs some work then
[18:14] sustrik toni_: what do you mean?
[18:14] Guthur I'll try to bring it up to current
[18:15] sustrik Guther: great!
[18:16] toni sustrik_: I downloaded the pyzmq. Building the docs with sphinx I only get some info about the methods of the socket object. I need a more detailed documentation of the python api
[18:16] sustrik socket object presumably _is_ python api
[18:18] mato sustrik_: hmm, i don't entirely trust this switch
[18:18] mato sustrik_: but the results I see *appear* to show that I get ~60us latency with the old code, and ~78us with the new cose
[18:18] mato *code
[18:18] sustrik uhm
[18:19] sustrik ok, we'll need some optimisation
[18:19] mato sustrik_: throughput is weird, it seemed to fluctuate but now appears stablew
[18:19] sustrik throughput is a weird metric
[18:19] mato I guess ideally I should test w/o the switch, no?
[18:19] sustrik fluctuating almost by definition
[18:19] sustrik ideally, but normally switch is not the bottleneck
[18:20] mato well, it's only 100 EUR worth of switch so it won't be *that* great
[18:20] mato i can test tomorrow with a direct link, not now...
[18:20] sustrik i don't think it's needed
[18:20] sustrik the latency test is relevant
[18:20] sustrik 18us delta is too much
[18:20] mato ok, well that consistently shows the same result
[18:21] sustrik we have to optimise
[18:21] mato well, let's sit down and look at it together tomorrow
[18:21] sustrik ok
[18:21] mato now, beer?
[18:21] sustrik allegedly, there's some klezmer-tango concert in nuspirit club
[18:22] mato ah, yes, someone did mention something the other day
[18:22] mato i forget who
[18:22] sustrik your cousin?
[18:22] Guthur sustrik_: By the looks of it someone imported the setsockopt twice instead of doing getsockopt
[18:22] mato dunno
[18:22] sustrik Guthur: quite possible
[18:22] sustrik as I said, the project is kind of orphaned
[18:23] sustrik looks like .net devs have not much love for open source
[18:23] Guthur yeah that tends to be the case
[18:24] Guthur I would have thought mono might be reversing the trend
[18:24] Guthur I'm only interested in it because I am paid to be, hehe
[18:25] sustrik i'm afraid that's the case with most people using the .net binding
[19:27] PythonMQ hello, does anyone knows where can I find a compative version of pyzmq for old Python 2.4?
[19:28] PythonMQ when I try to create an extension for Python 2.4, it asks for .nET 1.1 SDK, Vs 2003, etc... which I dont have
[20:32] mikko good evening
[21:18] sustrik travlr: hi, are you there by chance?
[21:39] Guthur sustrik_, when setting the identity through setsockopt is it string length + 1?
[21:39] Guthur for the optvallen
[21:40] mikko Guthur: no need for +1 as you give the length
[21:41] mikko as far as i remember it doesnt matter as long as it's consistent
[21:41] Guthur oh ok, its just unless I did that it was corrupting the last char
[21:41] Guthur but it could be something wrong with the C# marshal code
[21:42] sustrik i think mikko is right
[21:42] sustrik the identity is a binary blob, not a string
[21:43] sustrik if it corrupts the last byte, it's a bug
[21:44] Guthur ok, I'll investigate a little
[22:53] Guthur sustrik_, should I do some checking so that people don't do silly things like set an affinity of -1