Thread-safe sockets for lisp-zmq

My Common Lisp binding of the zeromq messaging library, lisp-zmq, now supports thread-safe sockets.

In the zeromq C library, each socket is supposed to be used in a single thread. While this is reasonable given the message-oriented paradigm of zeromq, it is an issue in a language such as Common Lisp where we have a REPL to interact with the application. In Slime, the Common Lisp backend can evaluate each expression is a separate thread. Therefore calling zmq functions from the REPL is definitely not a good idea.

With the new version of lisp-zmq (1.3.0), you can use the :thread-safe key argument when creating a socket:

(zmq:socket context :pub :thread-safe t)

In that case, operations on this socket will be protected by a mutex.

While this mutex makes socket functions safe, you may need to manually lock sequences of operations, for example if you want to receive a whole multipart message in a thread. For this reason, the macro with-socket-locked has been added.

The bordeaux-threads library is used for portable mutexes, it is a new dependency of lisp-zmq.

Note that sockets are now objects, and not foreign pointers to the underlying zeromq sockets. socket-%socket and socket-lock return respectively the foreign pointer to the zeromq socket and the mutex of a socket.