78 lines
1.9 KiB
Python
78 lines
1.9 KiB
Python
|
# coding: utf-8
|
||
|
"""zmq Context class"""
|
||
|
|
||
|
# Copyright (C) PyZMQ Developers
|
||
|
# Distributed under the terms of the Modified BSD License.
|
||
|
|
||
|
from ._cffi import C, ffi
|
||
|
|
||
|
from .constants import EINVAL, IO_THREADS, LINGER
|
||
|
|
||
|
from zmq.error import ZMQError, InterruptedSystemCall, _check_rc
|
||
|
|
||
|
class Context(object):
|
||
|
_zmq_ctx = None
|
||
|
_iothreads = None
|
||
|
_closed = None
|
||
|
_shadow = False
|
||
|
|
||
|
def __init__(self, io_threads=1, shadow=None):
|
||
|
|
||
|
if shadow:
|
||
|
self._zmq_ctx = ffi.cast("void *", shadow)
|
||
|
self._shadow = True
|
||
|
else:
|
||
|
self._shadow = False
|
||
|
if not io_threads >= 0:
|
||
|
raise ZMQError(EINVAL)
|
||
|
|
||
|
self._zmq_ctx = C.zmq_ctx_new()
|
||
|
if self._zmq_ctx == ffi.NULL:
|
||
|
raise ZMQError(C.zmq_errno())
|
||
|
if not shadow:
|
||
|
C.zmq_ctx_set(self._zmq_ctx, IO_THREADS, io_threads)
|
||
|
self._closed = False
|
||
|
|
||
|
@property
|
||
|
def underlying(self):
|
||
|
"""The address of the underlying libzmq context"""
|
||
|
return int(ffi.cast('size_t', self._zmq_ctx))
|
||
|
|
||
|
@property
|
||
|
def closed(self):
|
||
|
return self._closed
|
||
|
|
||
|
def set(self, option, value):
|
||
|
"""set a context option
|
||
|
|
||
|
see zmq_ctx_set
|
||
|
"""
|
||
|
rc = C.zmq_ctx_set(self._zmq_ctx, option, value)
|
||
|
_check_rc(rc)
|
||
|
|
||
|
def get(self, option):
|
||
|
"""get context option
|
||
|
|
||
|
see zmq_ctx_get
|
||
|
"""
|
||
|
rc = C.zmq_ctx_get(self._zmq_ctx, option)
|
||
|
_check_rc(rc)
|
||
|
return rc
|
||
|
|
||
|
def term(self):
|
||
|
if self.closed:
|
||
|
return
|
||
|
|
||
|
rc = C.zmq_ctx_destroy(self._zmq_ctx)
|
||
|
try:
|
||
|
_check_rc(rc)
|
||
|
except InterruptedSystemCall:
|
||
|
# ignore interrupted term
|
||
|
# see PEP 475 notes about close & EINTR for why
|
||
|
pass
|
||
|
|
||
|
self._zmq_ctx = None
|
||
|
self._closed = True
|
||
|
|
||
|
__all__ = ['Context']
|