[zeromq-dev] Portability of 0MQ API

Martin Lucina mato at kotelna.sk
Mon Aug 9 09:51:45 CEST 2010

ph at imatix.com said:
> Anyone have other ideas?  Two options that seem obvious but presumably
> won't work are:
> * promote zmq_errno(3) for use on all platforms
> * write the win32 error code to errno (mapping to Unix error codes too)

I presume what you meant by the 2nd point is "Write the win32 error code to
use errno". This is in fact the current state of affairs and provided
certain factors are met code using errno will work just fine on Win32.

Now to elaborate on those "certain factors": The reason zmq_errno(3) exists
at all is that on Win32 you have this wonderful mess of different C runtime
libraries, and the combination of (an application plus it's dependent DLLs)
can put you in a situation where multiple C runtime libraries are in use.

If you are in this unhappy situation, then you have a problem as the
"errno" value does not get shared *between* those multiple C runtime
libraries. Hence the the need for some mechanism for component Foo to ask
whichever Bar version of the 0MQ library it might be using for "its" value
of "errno", which is exactly what zmq_errno(3) does:

    [from zmq.cpp]
    int zmq_errno ()
        return errno;

The main use case for this on Win32 (and indeed the reason we came up with
zmq_errno()) is language bindings, where the language runtime (e.g. Python)
may be using (built with) a different CRT to that which LIBZMQ.DLL is using
(built with).

Note that this situation will never occur on a UNIX-like system since AFAIK
there are no modern UNIX-like systems which allow you to mix CRTs. I'm sure
you *could* get yourself into a situation like this if you really wanted to
by doing various perverse things with dlopen() but then you're just
shooting yourself in the foot.

So, to summarize, I don't think we are asking users to write non-portable
code. Users should be using just "errno", which will work fine on Win32,
unless they're mixing CRTs in which case they should know about that and
use zmq_errno(). I don't consider mixing CRTs to be a sane enough case that
it would warrant telling everyone to use zmq_errno().

The only action item I see from this is that maybe the scary comments in
zmq_errno(3) should say something about mixing CRTs on Win32.

Does this make sense?

> We already use zmq_strerror(3) instead of strerror.

This is necessary since 0MQ introduces it's own EXXXX errno codes which are
not in POSIX. Obviously, strerror() does not understand these so you need
to use zmq_strerror() instead. Same logic as for zmq_socket() vs socket().


More information about the zeromq-dev mailing list