/*
 * call-seq:
 *   zmq.close() -> nil
 *
 * Terminates the 0MQ context.
 *
 * Context termination is performed in the following steps:
 *
 * 1. Any blocking operations currently in progress on sockets open
 *    within context shall return immediately with an error code of
 *    ETERM. With the exception of ZMQ::Socket#close(), any further operations on
 *    sockets open within context shall fail with an error code of ETERM.
 *
 * 2. After interrupting all blocking calls, zmq_term() shall block until
 *    the following conditions are satisfied:
 *    * All sockets open within context have been closed with ZMQ::Socket#close().
 *    * For each socket within context, all messages sent by the
 *      application with ZMQ::Socket#send() have either been physically
 *      transferred to a network peer, or the socket’s linger period
 *      set with the ZMQ::LINGER socket option has expired.
 *
 * For further details regarding socket linger behaviour refer to the
 * ZMQ::LINGER option in ZMQ::Socket#setsockopt().
 */
static VALUE context_close (VALUE self_)
{
    void * ctx = NULL;
    Data_Get_Struct (self_, void, ctx);
    
    if (ctx != NULL) {
        int rc = zmq_term (ctx);
        assert (rc == 0);

        DATA_PTR (self_) = NULL;
    }

    return Qnil;
}