Rough outline of proposal to fix the bad choice of socket type.
(And possibly others like contexts).

1. Change the docs to name the type zmq_socket_t

2. Add two macros

ZMQ_TYPE_SAFE
ZMQ_TYPE_UNSAFE

3. In the C binding:

        if exactly one of these is set, use that
        if two are set, bug out the compile
        if none are set, select a default

4. The default for 3.1 will be ZMQ_TYPE_UNSAFE
5. The default for 4.x will be ZMQ_TYPE_SAFE

6. In the binding, for ZMQ_TYPE_UNSAFE

        typedef void *zmq_socket_t;

  For ZMQ_TYPE_SAFE

        typedef struct zmq_socket_t { data *void; } zmq_socket_t;

7. Put casts in to fix the types inside the binding.

This provides a migration path. The default for 3.1 breaks nothing.
People are encouraged to change application code to use zmq_socket_t
instead of void * for socket type. New code should always do this.

By compiling with ZMQ_TYPE_SAFE you can use your compiler to check
where you need to fix your application code. If you make some of the changes
and then give up, that's fine. In 3.1, just don't set the macro. In 4.x, just do
set the macro ZMQ_TYPE_UNSAFE.

I think this will work without changing the library, provided the C binding
code is NOT compiled against the header file. C doesn't have type safe linkage,
the two types (void * and the struct) are the same size, they should both be
passed in a register the same way.

A half way proposal: 

        typedef struct zmq_socket_object *zmq_socket_t;

is better than void *, but is still vulnerable to conversions to
and (in C only) from, void*.

--
john skaller
skal...@users.sourceforge.net




_______________________________________________
zeromq-dev mailing list
zeromq-dev@lists.zeromq.org
http://lists.zeromq.org/mailman/listinfo/zeromq-dev

Reply via email to