From b2732e9df76d1024673d1ce14b510dc63df3f14b Mon Sep 17 00:00:00 2001 From: imarom Date: Fri, 11 Mar 2016 14:10:44 +0200 Subject: [PATCH] ZMQ 32 bit for CEL 5.9 --- .../stl/trex_stl_lib/trex_stl_ext.py | 14 +- .../platform/cel59/32bit/zmq/__init__.py | 64 ++ .../platform/cel59/32bit/zmq/auth/__init__.py | 10 + .../platform/cel59/32bit/zmq/auth/base.py | 272 +++++++ .../platform/cel59/32bit/zmq/auth/certs.py | 119 +++ .../platform/cel59/32bit/zmq/auth/ioloop.py | 34 + .../platform/cel59/32bit/zmq/auth/thread.py | 184 +++++ .../platform/cel59/32bit/zmq/backend/__init__.py | 45 ++ .../cel59/32bit/zmq/backend/cffi/__init__.py | 22 + .../platform/cel59/32bit/zmq/backend/cffi/_cdefs.h | 68 ++ .../platform/cel59/32bit/zmq/backend/cffi/_cffi.py | 127 ++++ .../platform/cel59/32bit/zmq/backend/cffi/_poll.py | 56 ++ .../cel59/32bit/zmq/backend/cffi/_verify.c | 12 + .../cel59/32bit/zmq/backend/cffi/constants.py | 15 + .../cel59/32bit/zmq/backend/cffi/context.py | 100 +++ .../cel59/32bit/zmq/backend/cffi/devices.py | 24 + .../platform/cel59/32bit/zmq/backend/cffi/error.py | 13 + .../cel59/32bit/zmq/backend/cffi/message.py | 69 ++ .../cel59/32bit/zmq/backend/cffi/socket.py | 244 ++++++ .../platform/cel59/32bit/zmq/backend/cffi/utils.py | 62 ++ .../cel59/32bit/zmq/backend/cython/__init__.py | 23 + .../cel59/32bit/zmq/backend/cython/_device.so | Bin 0 -> 95085 bytes .../cel59/32bit/zmq/backend/cython/_poll.so | Bin 0 -> 134770 bytes .../cel59/32bit/zmq/backend/cython/_version.so | Bin 0 -> 37898 bytes .../cel59/32bit/zmq/backend/cython/checkrc.pxd | 23 + .../cel59/32bit/zmq/backend/cython/constants.so | Bin 0 -> 138758 bytes .../cel59/32bit/zmq/backend/cython/context.pxd | 41 + .../cel59/32bit/zmq/backend/cython/context.so | Bin 0 -> 143066 bytes .../cel59/32bit/zmq/backend/cython/error.so | Bin 0 -> 50334 bytes .../cel59/32bit/zmq/backend/cython/libzmq.pxd | 110 +++ .../cel59/32bit/zmq/backend/cython/message.pxd | 63 ++ .../cel59/32bit/zmq/backend/cython/message.so | Bin 0 -> 213231 bytes .../cel59/32bit/zmq/backend/cython/socket.pxd | 47 ++ .../cel59/32bit/zmq/backend/cython/socket.so | Bin 0 -> 354893 bytes .../cel59/32bit/zmq/backend/cython/utils.pxd | 29 + .../cel59/32bit/zmq/backend/cython/utils.so | Bin 0 -> 90506 bytes .../platform/cel59/32bit/zmq/backend/select.py | 39 + .../platform/cel59/32bit/zmq/devices/__init__.py | 16 + .../platform/cel59/32bit/zmq/devices/basedevice.py | 229 ++++++ .../cel59/32bit/zmq/devices/monitoredqueue.pxd | 177 +++++ .../cel59/32bit/zmq/devices/monitoredqueue.py | 37 + .../cel59/32bit/zmq/devices/monitoredqueue.so | Bin 0 -> 135659 bytes .../32bit/zmq/devices/monitoredqueuedevice.py | 66 ++ .../cel59/32bit/zmq/devices/proxydevice.py | 90 +++ .../platform/cel59/32bit/zmq/error.py | 164 ++++ .../platform/cel59/32bit/zmq/eventloop/__init__.py | 5 + .../platform/cel59/32bit/zmq/eventloop/ioloop.py | 193 +++++ .../32bit/zmq/eventloop/minitornado/__init__.py | 0 .../32bit/zmq/eventloop/minitornado/concurrent.py | 11 + .../32bit/zmq/eventloop/minitornado/ioloop.py | 829 +++++++++++++++++++++ .../cel59/32bit/zmq/eventloop/minitornado/log.py | 6 + .../zmq/eventloop/minitornado/platform/__init__.py | 0 .../zmq/eventloop/minitornado/platform/auto.py | 45 ++ .../zmq/eventloop/minitornado/platform/common.py | 91 +++ .../eventloop/minitornado/platform/interface.py | 63 ++ .../zmq/eventloop/minitornado/platform/posix.py | 70 ++ .../zmq/eventloop/minitornado/platform/windows.py | 20 + .../zmq/eventloop/minitornado/stack_context.py | 376 ++++++++++ .../cel59/32bit/zmq/eventloop/minitornado/util.py | 184 +++++ .../cel59/32bit/zmq/eventloop/zmqstream.py | 529 +++++++++++++ .../platform/cel59/32bit/zmq/green/__init__.py | 40 + .../platform/cel59/32bit/zmq/green/core.py | 287 +++++++ .../platform/cel59/32bit/zmq/green/device.py | 32 + .../cel59/32bit/zmq/green/eventloop/__init__.py | 3 + .../cel59/32bit/zmq/green/eventloop/ioloop.py | 33 + .../cel59/32bit/zmq/green/eventloop/zmqstream.py | 11 + .../platform/cel59/32bit/zmq/green/poll.py | 95 +++ .../platform/cel59/32bit/zmq/libzmq.so.3 | Bin 0 -> 604489 bytes .../platform/cel59/32bit/zmq/log/__init__.py | 0 .../platform/cel59/32bit/zmq/log/handlers.py | 146 ++++ .../platform/cel59/32bit/zmq/ssh/__init__.py | 1 + .../platform/cel59/32bit/zmq/ssh/forward.py | 91 +++ .../platform/cel59/32bit/zmq/ssh/tunnel.py | 376 ++++++++++ .../platform/cel59/32bit/zmq/sugar/__init__.py | 27 + .../platform/cel59/32bit/zmq/sugar/attrsettr.py | 52 ++ .../platform/cel59/32bit/zmq/sugar/constants.py | 98 +++ .../platform/cel59/32bit/zmq/sugar/context.py | 192 +++++ .../platform/cel59/32bit/zmq/sugar/frame.py | 19 + .../platform/cel59/32bit/zmq/sugar/poll.py | 161 ++++ .../platform/cel59/32bit/zmq/sugar/socket.py | 495 ++++++++++++ .../platform/cel59/32bit/zmq/sugar/tracker.py | 120 +++ .../platform/cel59/32bit/zmq/sugar/version.py | 48 ++ .../platform/cel59/32bit/zmq/tests/__init__.py | 211 ++++++ .../platform/cel59/32bit/zmq/tests/test_auth.py | 431 +++++++++++ .../cel59/32bit/zmq/tests/test_cffi_backend.py | 310 ++++++++ .../cel59/32bit/zmq/tests/test_constants.py | 104 +++ .../platform/cel59/32bit/zmq/tests/test_context.py | 257 +++++++ .../platform/cel59/32bit/zmq/tests/test_device.py | 146 ++++ .../platform/cel59/32bit/zmq/tests/test_error.py | 43 ++ .../platform/cel59/32bit/zmq/tests/test_etc.py | 15 + .../platform/cel59/32bit/zmq/tests/test_imports.py | 62 ++ .../platform/cel59/32bit/zmq/tests/test_ioloop.py | 113 +++ .../platform/cel59/32bit/zmq/tests/test_log.py | 116 +++ .../platform/cel59/32bit/zmq/tests/test_message.py | 362 +++++++++ .../platform/cel59/32bit/zmq/tests/test_monitor.py | 71 ++ .../cel59/32bit/zmq/tests/test_monqueue.py | 227 ++++++ .../cel59/32bit/zmq/tests/test_multipart.py | 35 + .../platform/cel59/32bit/zmq/tests/test_pair.py | 53 ++ .../platform/cel59/32bit/zmq/tests/test_poll.py | 229 ++++++ .../platform/cel59/32bit/zmq/tests/test_pubsub.py | 41 + .../platform/cel59/32bit/zmq/tests/test_reqrep.py | 62 ++ .../cel59/32bit/zmq/tests/test_security.py | 212 ++++++ .../platform/cel59/32bit/zmq/tests/test_socket.py | 450 +++++++++++ .../cel59/32bit/zmq/tests/test_stopwatch.py | 42 ++ .../platform/cel59/32bit/zmq/tests/test_version.py | 44 ++ .../cel59/32bit/zmq/tests/test_win32_shim.py | 56 ++ .../platform/cel59/32bit/zmq/tests/test_z85.py | 63 ++ .../cel59/32bit/zmq/tests/test_zmqstream.py | 34 + .../platform/cel59/32bit/zmq/utils/__init__.py | 0 .../platform/cel59/32bit/zmq/utils/buffers.pxd | 313 ++++++++ .../platform/cel59/32bit/zmq/utils/compiler.json | 19 + .../platform/cel59/32bit/zmq/utils/config.json | 15 + .../cel59/32bit/zmq/utils/constant_names.py | 365 +++++++++ .../platform/cel59/32bit/zmq/utils/garbage.py | 180 +++++ .../platform/cel59/32bit/zmq/utils/getpid_compat.h | 6 + .../platform/cel59/32bit/zmq/utils/interop.py | 33 + .../platform/cel59/32bit/zmq/utils/ipcmaxlen.h | 21 + .../platform/cel59/32bit/zmq/utils/jsonapi.py | 59 ++ .../platform/cel59/32bit/zmq/utils/monitor.py | 68 ++ .../cel59/32bit/zmq/utils/pyversion_compat.h | 25 + .../platform/cel59/32bit/zmq/utils/sixcerpt.py | 52 ++ .../platform/cel59/32bit/zmq/utils/strtypes.py | 45 ++ .../platform/cel59/32bit/zmq/utils/win32.py | 132 ++++ .../platform/cel59/32bit/zmq/utils/z85.py | 56 ++ .../platform/cel59/32bit/zmq/utils/zmq_compat.h | 80 ++ .../platform/cel59/32bit/zmq/utils/zmq_constants.h | 622 ++++++++++++++++ 126 files changed, 13336 insertions(+), 1 deletion(-) create mode 100644 scripts/external_libs/platform/cel59/32bit/zmq/__init__.py create mode 100644 scripts/external_libs/platform/cel59/32bit/zmq/auth/__init__.py create mode 100644 scripts/external_libs/platform/cel59/32bit/zmq/auth/base.py create mode 100644 scripts/external_libs/platform/cel59/32bit/zmq/auth/certs.py create mode 100644 scripts/external_libs/platform/cel59/32bit/zmq/auth/ioloop.py create mode 100644 scripts/external_libs/platform/cel59/32bit/zmq/auth/thread.py create mode 100644 scripts/external_libs/platform/cel59/32bit/zmq/backend/__init__.py create mode 100644 scripts/external_libs/platform/cel59/32bit/zmq/backend/cffi/__init__.py create mode 100644 scripts/external_libs/platform/cel59/32bit/zmq/backend/cffi/_cdefs.h create mode 100644 scripts/external_libs/platform/cel59/32bit/zmq/backend/cffi/_cffi.py create mode 100644 scripts/external_libs/platform/cel59/32bit/zmq/backend/cffi/_poll.py create mode 100644 scripts/external_libs/platform/cel59/32bit/zmq/backend/cffi/_verify.c create mode 100644 scripts/external_libs/platform/cel59/32bit/zmq/backend/cffi/constants.py create mode 100644 scripts/external_libs/platform/cel59/32bit/zmq/backend/cffi/context.py create mode 100644 scripts/external_libs/platform/cel59/32bit/zmq/backend/cffi/devices.py create mode 100644 scripts/external_libs/platform/cel59/32bit/zmq/backend/cffi/error.py create mode 100644 scripts/external_libs/platform/cel59/32bit/zmq/backend/cffi/message.py create mode 100644 scripts/external_libs/platform/cel59/32bit/zmq/backend/cffi/socket.py create mode 100644 scripts/external_libs/platform/cel59/32bit/zmq/backend/cffi/utils.py create mode 100644 scripts/external_libs/platform/cel59/32bit/zmq/backend/cython/__init__.py create mode 100644 scripts/external_libs/platform/cel59/32bit/zmq/backend/cython/_device.so create mode 100644 scripts/external_libs/platform/cel59/32bit/zmq/backend/cython/_poll.so create mode 100644 scripts/external_libs/platform/cel59/32bit/zmq/backend/cython/_version.so create mode 100644 scripts/external_libs/platform/cel59/32bit/zmq/backend/cython/checkrc.pxd create mode 100644 scripts/external_libs/platform/cel59/32bit/zmq/backend/cython/constants.so create mode 100644 scripts/external_libs/platform/cel59/32bit/zmq/backend/cython/context.pxd create mode 100644 scripts/external_libs/platform/cel59/32bit/zmq/backend/cython/context.so create mode 100644 scripts/external_libs/platform/cel59/32bit/zmq/backend/cython/error.so create mode 100644 scripts/external_libs/platform/cel59/32bit/zmq/backend/cython/libzmq.pxd create mode 100644 scripts/external_libs/platform/cel59/32bit/zmq/backend/cython/message.pxd create mode 100644 scripts/external_libs/platform/cel59/32bit/zmq/backend/cython/message.so create mode 100644 scripts/external_libs/platform/cel59/32bit/zmq/backend/cython/socket.pxd create mode 100644 scripts/external_libs/platform/cel59/32bit/zmq/backend/cython/socket.so create mode 100644 scripts/external_libs/platform/cel59/32bit/zmq/backend/cython/utils.pxd create mode 100644 scripts/external_libs/platform/cel59/32bit/zmq/backend/cython/utils.so create mode 100644 scripts/external_libs/platform/cel59/32bit/zmq/backend/select.py create mode 100644 scripts/external_libs/platform/cel59/32bit/zmq/devices/__init__.py create mode 100644 scripts/external_libs/platform/cel59/32bit/zmq/devices/basedevice.py create mode 100644 scripts/external_libs/platform/cel59/32bit/zmq/devices/monitoredqueue.pxd create mode 100644 scripts/external_libs/platform/cel59/32bit/zmq/devices/monitoredqueue.py create mode 100644 scripts/external_libs/platform/cel59/32bit/zmq/devices/monitoredqueue.so create mode 100644 scripts/external_libs/platform/cel59/32bit/zmq/devices/monitoredqueuedevice.py create mode 100644 scripts/external_libs/platform/cel59/32bit/zmq/devices/proxydevice.py create mode 100644 scripts/external_libs/platform/cel59/32bit/zmq/error.py create mode 100644 scripts/external_libs/platform/cel59/32bit/zmq/eventloop/__init__.py create mode 100644 scripts/external_libs/platform/cel59/32bit/zmq/eventloop/ioloop.py create mode 100644 scripts/external_libs/platform/cel59/32bit/zmq/eventloop/minitornado/__init__.py create mode 100644 scripts/external_libs/platform/cel59/32bit/zmq/eventloop/minitornado/concurrent.py create mode 100644 scripts/external_libs/platform/cel59/32bit/zmq/eventloop/minitornado/ioloop.py create mode 100644 scripts/external_libs/platform/cel59/32bit/zmq/eventloop/minitornado/log.py create mode 100644 scripts/external_libs/platform/cel59/32bit/zmq/eventloop/minitornado/platform/__init__.py create mode 100644 scripts/external_libs/platform/cel59/32bit/zmq/eventloop/minitornado/platform/auto.py create mode 100644 scripts/external_libs/platform/cel59/32bit/zmq/eventloop/minitornado/platform/common.py create mode 100644 scripts/external_libs/platform/cel59/32bit/zmq/eventloop/minitornado/platform/interface.py create mode 100644 scripts/external_libs/platform/cel59/32bit/zmq/eventloop/minitornado/platform/posix.py create mode 100644 scripts/external_libs/platform/cel59/32bit/zmq/eventloop/minitornado/platform/windows.py create mode 100644 scripts/external_libs/platform/cel59/32bit/zmq/eventloop/minitornado/stack_context.py create mode 100644 scripts/external_libs/platform/cel59/32bit/zmq/eventloop/minitornado/util.py create mode 100644 scripts/external_libs/platform/cel59/32bit/zmq/eventloop/zmqstream.py create mode 100644 scripts/external_libs/platform/cel59/32bit/zmq/green/__init__.py create mode 100644 scripts/external_libs/platform/cel59/32bit/zmq/green/core.py create mode 100644 scripts/external_libs/platform/cel59/32bit/zmq/green/device.py create mode 100644 scripts/external_libs/platform/cel59/32bit/zmq/green/eventloop/__init__.py create mode 100644 scripts/external_libs/platform/cel59/32bit/zmq/green/eventloop/ioloop.py create mode 100644 scripts/external_libs/platform/cel59/32bit/zmq/green/eventloop/zmqstream.py create mode 100644 scripts/external_libs/platform/cel59/32bit/zmq/green/poll.py create mode 100644 scripts/external_libs/platform/cel59/32bit/zmq/libzmq.so.3 create mode 100644 scripts/external_libs/platform/cel59/32bit/zmq/log/__init__.py create mode 100644 scripts/external_libs/platform/cel59/32bit/zmq/log/handlers.py create mode 100644 scripts/external_libs/platform/cel59/32bit/zmq/ssh/__init__.py create mode 100644 scripts/external_libs/platform/cel59/32bit/zmq/ssh/forward.py create mode 100644 scripts/external_libs/platform/cel59/32bit/zmq/ssh/tunnel.py create mode 100644 scripts/external_libs/platform/cel59/32bit/zmq/sugar/__init__.py create mode 100644 scripts/external_libs/platform/cel59/32bit/zmq/sugar/attrsettr.py create mode 100644 scripts/external_libs/platform/cel59/32bit/zmq/sugar/constants.py create mode 100644 scripts/external_libs/platform/cel59/32bit/zmq/sugar/context.py create mode 100644 scripts/external_libs/platform/cel59/32bit/zmq/sugar/frame.py create mode 100644 scripts/external_libs/platform/cel59/32bit/zmq/sugar/poll.py create mode 100644 scripts/external_libs/platform/cel59/32bit/zmq/sugar/socket.py create mode 100644 scripts/external_libs/platform/cel59/32bit/zmq/sugar/tracker.py create mode 100644 scripts/external_libs/platform/cel59/32bit/zmq/sugar/version.py create mode 100644 scripts/external_libs/platform/cel59/32bit/zmq/tests/__init__.py create mode 100644 scripts/external_libs/platform/cel59/32bit/zmq/tests/test_auth.py create mode 100644 scripts/external_libs/platform/cel59/32bit/zmq/tests/test_cffi_backend.py create mode 100644 scripts/external_libs/platform/cel59/32bit/zmq/tests/test_constants.py create mode 100644 scripts/external_libs/platform/cel59/32bit/zmq/tests/test_context.py create mode 100644 scripts/external_libs/platform/cel59/32bit/zmq/tests/test_device.py create mode 100644 scripts/external_libs/platform/cel59/32bit/zmq/tests/test_error.py create mode 100644 scripts/external_libs/platform/cel59/32bit/zmq/tests/test_etc.py create mode 100644 scripts/external_libs/platform/cel59/32bit/zmq/tests/test_imports.py create mode 100644 scripts/external_libs/platform/cel59/32bit/zmq/tests/test_ioloop.py create mode 100644 scripts/external_libs/platform/cel59/32bit/zmq/tests/test_log.py create mode 100644 scripts/external_libs/platform/cel59/32bit/zmq/tests/test_message.py create mode 100644 scripts/external_libs/platform/cel59/32bit/zmq/tests/test_monitor.py create mode 100644 scripts/external_libs/platform/cel59/32bit/zmq/tests/test_monqueue.py create mode 100644 scripts/external_libs/platform/cel59/32bit/zmq/tests/test_multipart.py create mode 100644 scripts/external_libs/platform/cel59/32bit/zmq/tests/test_pair.py create mode 100644 scripts/external_libs/platform/cel59/32bit/zmq/tests/test_poll.py create mode 100644 scripts/external_libs/platform/cel59/32bit/zmq/tests/test_pubsub.py create mode 100644 scripts/external_libs/platform/cel59/32bit/zmq/tests/test_reqrep.py create mode 100644 scripts/external_libs/platform/cel59/32bit/zmq/tests/test_security.py create mode 100644 scripts/external_libs/platform/cel59/32bit/zmq/tests/test_socket.py create mode 100644 scripts/external_libs/platform/cel59/32bit/zmq/tests/test_stopwatch.py create mode 100644 scripts/external_libs/platform/cel59/32bit/zmq/tests/test_version.py create mode 100644 scripts/external_libs/platform/cel59/32bit/zmq/tests/test_win32_shim.py create mode 100644 scripts/external_libs/platform/cel59/32bit/zmq/tests/test_z85.py create mode 100644 scripts/external_libs/platform/cel59/32bit/zmq/tests/test_zmqstream.py create mode 100644 scripts/external_libs/platform/cel59/32bit/zmq/utils/__init__.py create mode 100644 scripts/external_libs/platform/cel59/32bit/zmq/utils/buffers.pxd create mode 100644 scripts/external_libs/platform/cel59/32bit/zmq/utils/compiler.json create mode 100644 scripts/external_libs/platform/cel59/32bit/zmq/utils/config.json create mode 100644 scripts/external_libs/platform/cel59/32bit/zmq/utils/constant_names.py create mode 100644 scripts/external_libs/platform/cel59/32bit/zmq/utils/garbage.py create mode 100644 scripts/external_libs/platform/cel59/32bit/zmq/utils/getpid_compat.h create mode 100644 scripts/external_libs/platform/cel59/32bit/zmq/utils/interop.py create mode 100644 scripts/external_libs/platform/cel59/32bit/zmq/utils/ipcmaxlen.h create mode 100644 scripts/external_libs/platform/cel59/32bit/zmq/utils/jsonapi.py create mode 100644 scripts/external_libs/platform/cel59/32bit/zmq/utils/monitor.py create mode 100644 scripts/external_libs/platform/cel59/32bit/zmq/utils/pyversion_compat.h create mode 100644 scripts/external_libs/platform/cel59/32bit/zmq/utils/sixcerpt.py create mode 100644 scripts/external_libs/platform/cel59/32bit/zmq/utils/strtypes.py create mode 100644 scripts/external_libs/platform/cel59/32bit/zmq/utils/win32.py create mode 100644 scripts/external_libs/platform/cel59/32bit/zmq/utils/z85.py create mode 100644 scripts/external_libs/platform/cel59/32bit/zmq/utils/zmq_compat.h create mode 100644 scripts/external_libs/platform/cel59/32bit/zmq/utils/zmq_constants.h diff --git a/scripts/automation/trex_control_plane/stl/trex_stl_lib/trex_stl_ext.py b/scripts/automation/trex_control_plane/stl/trex_stl_lib/trex_stl_ext.py index 835918d9..9289e513 100644 --- a/scripts/automation/trex_control_plane/stl/trex_stl_lib/trex_stl_ext.py +++ b/scripts/automation/trex_control_plane/stl/trex_stl_lib/trex_stl_ext.py @@ -36,7 +36,7 @@ def import_module_list(modules_list): sys.path.insert(1, full_path) - +# TODO; REFACTOR THIS....it looks horrible def import_platform_dirs (): # handle platform dirs @@ -58,6 +58,18 @@ def import_platform_dirs (): full_path = os.path.join(TREX_STL_EXT_PATH, 'platform/cel59') fix_path = os.path.normcase(full_path) sys.path.insert(0, full_path) + try: + # try to import and delete it from the namespace + import zmq + del zmq + return + except: + sys.path.pop(0) + pass + + full_path = os.path.join(TREX_STL_EXT_PATH, 'platform/cel59/32bit') + fix_path = os.path.normcase(full_path) + sys.path.insert(0, full_path) try: # try to import and delete it from the namespace import zmq diff --git a/scripts/external_libs/platform/cel59/32bit/zmq/__init__.py b/scripts/external_libs/platform/cel59/32bit/zmq/__init__.py new file mode 100644 index 00000000..3408b3ba --- /dev/null +++ b/scripts/external_libs/platform/cel59/32bit/zmq/__init__.py @@ -0,0 +1,64 @@ +"""Python bindings for 0MQ.""" + +# Copyright (C) PyZMQ Developers +# Distributed under the terms of the Modified BSD License. + +import os +import sys +import glob + +# load bundled libzmq, if there is one: + +here = os.path.dirname(__file__) + +bundled = [] +bundled_sodium = [] +for ext in ('pyd', 'so', 'dll', 'dylib'): + bundled_sodium.extend(glob.glob(os.path.join(here, 'libsodium*.%s*' % ext))) + bundled.extend(glob.glob(os.path.join(here, 'libzmq*.%s*' % ext))) + +if bundled: + import ctypes + if bundled_sodium: + if bundled[0].endswith('.pyd'): + # a Windows Extension + _libsodium = ctypes.cdll.LoadLibrary(bundled_sodium[0]) + else: + _libsodium = ctypes.CDLL(bundled_sodium[0], mode=ctypes.RTLD_GLOBAL) + if bundled[0].endswith('.pyd'): + # a Windows Extension + _libzmq = ctypes.cdll.LoadLibrary(bundled[0]) + else: + _libzmq = ctypes.CDLL(bundled[0], mode=ctypes.RTLD_GLOBAL) + del ctypes +else: + import zipimport + try: + if isinstance(__loader__, zipimport.zipimporter): + # a zipped pyzmq egg + from zmq import libzmq as _libzmq + except (NameError, ImportError): + pass + finally: + del zipimport + +del os, sys, glob, here, bundled, bundled_sodium, ext + +# zmq top-level imports + +from zmq import backend +from zmq.backend import * +from zmq import sugar +from zmq.sugar import * +from zmq import devices + +def get_includes(): + """Return a list of directories to include for linking against pyzmq with cython.""" + from os.path import join, dirname, abspath, pardir + base = dirname(__file__) + parent = abspath(join(base, pardir)) + return [ parent ] + [ join(parent, base, subdir) for subdir in ('utils',) ] + + +__all__ = ['get_includes'] + sugar.__all__ + backend.__all__ + diff --git a/scripts/external_libs/platform/cel59/32bit/zmq/auth/__init__.py b/scripts/external_libs/platform/cel59/32bit/zmq/auth/__init__.py new file mode 100644 index 00000000..11d3ad6b --- /dev/null +++ b/scripts/external_libs/platform/cel59/32bit/zmq/auth/__init__.py @@ -0,0 +1,10 @@ +"""Utilities for ZAP authentication. + +To run authentication in a background thread, see :mod:`zmq.auth.thread`. +For integration with the tornado eventloop, see :mod:`zmq.auth.ioloop`. + +.. versionadded:: 14.1 +""" + +from .base import * +from .certs import * diff --git a/scripts/external_libs/platform/cel59/32bit/zmq/auth/base.py b/scripts/external_libs/platform/cel59/32bit/zmq/auth/base.py new file mode 100644 index 00000000..9b4aaed7 --- /dev/null +++ b/scripts/external_libs/platform/cel59/32bit/zmq/auth/base.py @@ -0,0 +1,272 @@ +"""Base implementation of 0MQ authentication.""" + +# Copyright (C) PyZMQ Developers +# Distributed under the terms of the Modified BSD License. + +import logging + +import zmq +from zmq.utils import z85 +from zmq.utils.strtypes import bytes, unicode, b, u +from zmq.error import _check_version + +from .certs import load_certificates + + +CURVE_ALLOW_ANY = '*' +VERSION = b'1.0' + +class Authenticator(object): + """Implementation of ZAP authentication for zmq connections. + + Note: + - libzmq provides four levels of security: default NULL (which the Authenticator does + not see), and authenticated NULL, PLAIN, and CURVE, which the Authenticator can see. + - until you add policies, all incoming NULL connections are allowed + (classic ZeroMQ behavior), and all PLAIN and CURVE connections are denied. + """ + + def __init__(self, context=None, encoding='utf-8', log=None): + _check_version((4,0), "security") + self.context = context or zmq.Context.instance() + self.encoding = encoding + self.allow_any = False + self.zap_socket = None + self.whitelist = set() + self.blacklist = set() + # passwords is a dict keyed by domain and contains values + # of dicts with username:password pairs. + self.passwords = {} + # certs is dict keyed by domain and contains values + # of dicts keyed by the public keys from the specified location. + self.certs = {} + self.log = log or logging.getLogger('zmq.auth') + + def start(self): + """Create and bind the ZAP socket""" + self.zap_socket = self.context.socket(zmq.REP) + self.zap_socket.linger = 1 + self.zap_socket.bind("inproc://zeromq.zap.01") + + def stop(self): + """Close the ZAP socket""" + if self.zap_socket: + self.zap_socket.close() + self.zap_socket = None + + def allow(self, *addresses): + """Allow (whitelist) IP address(es). + + Connections from addresses not in the whitelist will be rejected. + + - For NULL, all clients from this address will be accepted. + - For PLAIN and CURVE, they will be allowed to continue with authentication. + + whitelist is mutually exclusive with blacklist. + """ + if self.blacklist: + raise ValueError("Only use a whitelist or a blacklist, not both") + self.whitelist.update(addresses) + + def deny(self, *addresses): + """Deny (blacklist) IP address(es). + + Addresses not in the blacklist will be allowed to continue with authentication. + + Blacklist is mutually exclusive with whitelist. + """ + if self.whitelist: + raise ValueError("Only use a whitelist or a blacklist, not both") + self.blacklist.update(addresses) + + def configure_plain(self, domain='*', passwords=None): + """Configure PLAIN authentication for a given domain. + + PLAIN authentication uses a plain-text password file. + To cover all domains, use "*". + You can modify the password file at any time; it is reloaded automatically. + """ + if passwords: + self.passwords[domain] = passwords + + def configure_curve(self, domain='*', location=None): + """Configure CURVE authentication for a given domain. + + CURVE authentication uses a directory that holds all public client certificates, + i.e. their public keys. + + To cover all domains, use "*". + + You can add and remove certificates in that directory at any time. + + To allow all client keys without checking, specify CURVE_ALLOW_ANY for the location. + """ + # If location is CURVE_ALLOW_ANY then allow all clients. Otherwise + # treat location as a directory that holds the certificates. + if location == CURVE_ALLOW_ANY: + self.allow_any = True + else: + self.allow_any = False + try: + self.certs[domain] = load_certificates(location) + except Exception as e: + self.log.error("Failed to load CURVE certs from %s: %s", location, e) + + def handle_zap_message(self, msg): + """Perform ZAP authentication""" + if len(msg) < 6: + self.log.error("Invalid ZAP message, not enough frames: %r", msg) + if len(msg) < 2: + self.log.error("Not enough information to reply") + else: + self._send_zap_reply(msg[1], b"400", b"Not enough frames") + return + + version, request_id, domain, address, identity, mechanism = msg[:6] + credentials = msg[6:] + + domain = u(domain, self.encoding, 'replace') + address = u(address, self.encoding, 'replace') + + if (version != VERSION): + self.log.error("Invalid ZAP version: %r", msg) + self._send_zap_reply(request_id, b"400", b"Invalid version") + return + + self.log.debug("version: %r, request_id: %r, domain: %r," + " address: %r, identity: %r, mechanism: %r", + version, request_id, domain, + address, identity, mechanism, + ) + + + # Is address is explicitly whitelisted or blacklisted? + allowed = False + denied = False + reason = b"NO ACCESS" + + if self.whitelist: + if address in self.whitelist: + allowed = True + self.log.debug("PASSED (whitelist) address=%s", address) + else: + denied = True + reason = b"Address not in whitelist" + self.log.debug("DENIED (not in whitelist) address=%s", address) + + elif self.blacklist: + if address in self.blacklist: + denied = True + reason = b"Address is blacklisted" + self.log.debug("DENIED (blacklist) address=%s", address) + else: + allowed = True + self.log.debug("PASSED (not in blacklist) address=%s", address) + + # Perform authentication mechanism-specific checks if necessary + username = u("user") + if not denied: + + if mechanism == b'NULL' and not allowed: + # For NULL, we allow if the address wasn't blacklisted + self.log.debug("ALLOWED (NULL)") + allowed = True + + elif mechanism == b'PLAIN': + # For PLAIN, even a whitelisted address must authenticate + if len(credentials) != 2: + self.log.error("Invalid PLAIN credentials: %r", credentials) + self._send_zap_reply(request_id, b"400", b"Invalid credentials") + return + username, password = [ u(c, self.encoding, 'replace') for c in credentials ] + allowed, reason = self._authenticate_plain(domain, username, password) + + elif mechanism == b'CURVE': + # For CURVE, even a whitelisted address must authenticate + if len(credentials) != 1: + self.log.error("Invalid CURVE credentials: %r", credentials) + self._send_zap_reply(request_id, b"400", b"Invalid credentials") + return + key = credentials[0] + allowed, reason = self._authenticate_curve(domain, key) + + if allowed: + self._send_zap_reply(request_id, b"200", b"OK", username) + else: + self._send_zap_reply(request_id, b"400", reason) + + def _authenticate_plain(self, domain, username, password): + """PLAIN ZAP authentication""" + allowed = False + reason = b"" + if self.passwords: + # If no domain is not specified then use the default domain + if not domain: + domain = '*' + + if domain in self.passwords: + if username in self.passwords[domain]: + if password == self.passwords[domain][username]: + allowed = True + else: + reason = b"Invalid password" + else: + reason = b"Invalid username" + else: + reason = b"Invalid domain" + + if allowed: + self.log.debug("ALLOWED (PLAIN) domain=%s username=%s password=%s", + domain, username, password, + ) + else: + self.log.debug("DENIED %s", reason) + + else: + reason = b"No passwords defined" + self.log.debug("DENIED (PLAIN) %s", reason) + + return allowed, reason + + def _authenticate_curve(self, domain, client_key): + """CURVE ZAP authentication""" + allowed = False + reason = b"" + if self.allow_any: + allowed = True + reason = b"OK" + self.log.debug("ALLOWED (CURVE allow any client)") + else: + # If no explicit domain is specified then use the default domain + if not domain: + domain = '*' + + if domain in self.certs: + # The certs dict stores keys in z85 format, convert binary key to z85 bytes + z85_client_key = z85.encode(client_key) + if z85_client_key in self.certs[domain] or self.certs[domain] == b'OK': + allowed = True + reason = b"OK" + else: + reason = b"Unknown key" + + status = "ALLOWED" if allowed else "DENIED" + self.log.debug("%s (CURVE) domain=%s client_key=%s", + status, domain, z85_client_key, + ) + else: + reason = b"Unknown domain" + + return allowed, reason + + def _send_zap_reply(self, request_id, status_code, status_text, user_id='user'): + """Send a ZAP reply to finish the authentication.""" + user_id = user_id if status_code == b'200' else b'' + if isinstance(user_id, unicode): + user_id = user_id.encode(self.encoding, 'replace') + metadata = b'' # not currently used + self.log.debug("ZAP reply code=%s text=%s", status_code, status_text) + reply = [VERSION, request_id, status_code, status_text, user_id, metadata] + self.zap_socket.send_multipart(reply) + +__all__ = ['Authenticator', 'CURVE_ALLOW_ANY'] diff --git a/scripts/external_libs/platform/cel59/32bit/zmq/auth/certs.py b/scripts/external_libs/platform/cel59/32bit/zmq/auth/certs.py new file mode 100644 index 00000000..4d26ad7b --- /dev/null +++ b/scripts/external_libs/platform/cel59/32bit/zmq/auth/certs.py @@ -0,0 +1,119 @@ +"""0MQ authentication related functions and classes.""" + +# Copyright (C) PyZMQ Developers +# Distributed under the terms of the Modified BSD License. + + +import datetime +import glob +import io +import os +import zmq +from zmq.utils.strtypes import bytes, unicode, b, u + + +_cert_secret_banner = u("""# **** Generated on {0} by pyzmq **** +# ZeroMQ CURVE **Secret** Certificate +# DO NOT PROVIDE THIS FILE TO OTHER USERS nor change its permissions. + +""") + +_cert_public_banner = u("""# **** Generated on {0} by pyzmq **** +# ZeroMQ CURVE Public Certificate +# Exchange securely, or use a secure mechanism to verify the contents +# of this file after exchange. Store public certificates in your home +# directory, in the .curve subdirectory. + +""") + +def _write_key_file(key_filename, banner, public_key, secret_key=None, metadata=None, encoding='utf-8'): + """Create a certificate file""" + if isinstance(public_key, bytes): + public_key = public_key.decode(encoding) + if isinstance(secret_key, bytes): + secret_key = secret_key.decode(encoding) + with io.open(key_filename, 'w', encoding='utf8') as f: + f.write(banner.format(datetime.datetime.now())) + + f.write(u('metadata\n')) + if metadata: + for k, v in metadata.items(): + if isinstance(v, bytes): + v = v.decode(encoding) + f.write(u(" {0} = {1}\n").format(k, v)) + + f.write(u('curve\n')) + f.write(u(" public-key = \"{0}\"\n").format(public_key)) + + if secret_key: + f.write(u(" secret-key = \"{0}\"\n").format(secret_key)) + + +def create_certificates(key_dir, name, metadata=None): + """Create zmq certificates. + + Returns the file paths to the public and secret certificate files. + """ + public_key, secret_key = zmq.curve_keypair() + base_filename = os.path.join(key_dir, name) + secret_key_file = "{0}.key_secret".format(base_filename) + public_key_file = "{0}.key".format(base_filename) + now = datetime.datetime.now() + + _write_key_file(public_key_file, + _cert_public_banner.format(now), + public_key) + + _write_key_file(secret_key_file, + _cert_secret_banner.format(now), + public_key, + secret_key=secret_key, + metadata=metadata) + + return public_key_file, secret_key_file + + +def load_certificate(filename): + """Load public and secret key from a zmq certificate. + + Returns (public_key, secret_key) + + If the certificate file only contains the public key, + secret_key will be None. + """ + public_key = None + secret_key = None + if not os.path.exists(filename): + raise IOError("Invalid certificate file: {0}".format(filename)) + + with open(filename, 'rb') as f: + for line in f: + line = line.strip() + if line.startswith(b'#'): + continue + if line.startswith(b'public-key'): + public_key = line.split(b"=", 1)[1].strip(b' \t\'"') + if line.startswith(b'secret-key'): + secret_key = line.split(b"=", 1)[1].strip(b' \t\'"') + if public_key and secret_key: + break + + return public_key, secret_key + + +def load_certificates(directory='.'): + """Load public keys from all certificates in a directory""" + certs = {} + if not os.path.isdir(directory): + raise IOError("Invalid certificate directory: {0}".format(directory)) + # Follow czmq pattern of public keys stored in *.key files. + glob_string = os.path.join(directory, "*.key") + + cert_files = glob.glob(glob_string) + for cert_file in cert_files: + public_key, _ = load_certificate(cert_file) + if public_key: + certs[public_key] = 'OK' + return certs + +__all__ = ['create_certificates', 'load_certificate', 'load_certificates'] diff --git a/scripts/external_libs/platform/cel59/32bit/zmq/auth/ioloop.py b/scripts/external_libs/platform/cel59/32bit/zmq/auth/ioloop.py new file mode 100644 index 00000000..1f448b47 --- /dev/null +++ b/scripts/external_libs/platform/cel59/32bit/zmq/auth/ioloop.py @@ -0,0 +1,34 @@ +"""ZAP Authenticator integrated with the tornado IOLoop. + +.. versionadded:: 14.1 +""" + +# Copyright (C) PyZMQ Developers +# Distributed under the terms of the Modified BSD License. + +from zmq.eventloop import ioloop, zmqstream +from .base import Authenticator + + +class IOLoopAuthenticator(Authenticator): + """ZAP authentication for use in the tornado IOLoop""" + + def __init__(self, context=None, encoding='utf-8', log=None, io_loop=None): + super(IOLoopAuthenticator, self).__init__(context) + self.zap_stream = None + self.io_loop = io_loop or ioloop.IOLoop.instance() + + def start(self): + """Start ZAP authentication""" + super(IOLoopAuthenticator, self).start() + self.zap_stream = zmqstream.ZMQStream(self.zap_socket, self.io_loop) + self.zap_stream.on_recv(self.handle_zap_message) + + def stop(self): + """Stop ZAP authentication""" + if self.zap_stream: + self.zap_stream.close() + self.zap_stream = None + super(IOLoopAuthenticator, self).stop() + +__all__ = ['IOLoopAuthenticator'] diff --git a/scripts/external_libs/platform/cel59/32bit/zmq/auth/thread.py b/scripts/external_libs/platform/cel59/32bit/zmq/auth/thread.py new file mode 100644 index 00000000..8c3355a9 --- /dev/null +++ b/scripts/external_libs/platform/cel59/32bit/zmq/auth/thread.py @@ -0,0 +1,184 @@ +"""ZAP Authenticator in a Python Thread. + +.. versionadded:: 14.1 +""" + +# Copyright (C) PyZMQ Developers +# Distributed under the terms of the Modified BSD License. + +import logging +from threading import Thread + +import zmq +from zmq.utils import jsonapi +from zmq.utils.strtypes import bytes, unicode, b, u + +from .base import Authenticator + +class AuthenticationThread(Thread): + """A Thread for running a zmq Authenticator + + This is run in the background by ThreadedAuthenticator + """ + + def __init__(self, context, endpoint, encoding='utf-8', log=None): + super(AuthenticationThread, self).__init__() + self.context = context or zmq.Context.instance() + self.encoding = encoding + self.log = log = log or logging.getLogger('zmq.auth') + self.authenticator = Authenticator(context, encoding=encoding, log=log) + + # create a socket to communicate back to main thread. + self.pipe = context.socket(zmq.PAIR) + self.pipe.linger = 1 + self.pipe.connect(endpoint) + + def run(self): + """ Start the Authentication Agent thread task """ + self.authenticator.start() + zap = self.authenticator.zap_socket + poller = zmq.Poller() + poller.register(self.pipe, zmq.POLLIN) + poller.register(zap, zmq.POLLIN) + while True: + try: + socks = dict(poller.poll()) + except zmq.ZMQError: + break # interrupted + + if self.pipe in socks and socks[self.pipe] == zmq.POLLIN: + terminate = self._handle_pipe() + if terminate: + break + + if zap in socks and socks[zap] == zmq.POLLIN: + self._handle_zap() + + self.pipe.close() + self.authenticator.stop() + + def _handle_zap(self): + """ + Handle a message from the ZAP socket. + """ + msg = self.authenticator.zap_socket.recv_multipart() + if not msg: return + self.authenticator.handle_zap_message(msg) + + def _handle_pipe(self): + """ + Handle a message from front-end API. + """ + terminate = False + + # Get the whole message off the pipe in one go + msg = self.pipe.recv_multipart() + + if msg is None: + terminate = True + return terminate + + command = msg[0] + self.log.debug("auth received API command %r", command) + + if command == b'ALLOW': + addresses = [u(m, self.encoding) for m in msg[1:]] + try: + self.authenticator.allow(*addresses) + except Exception as e: + self.log.exception("Failed to allow %s", addresses) + + elif command == b'DENY': + addresses = [u(m, self.encoding) for m in msg[1:]] + try: + self.authenticator.deny(*addresses) + except Exception as e: + self.log.exception("Failed to deny %s", addresses) + + elif command == b'PLAIN': + domain = u(msg[1], self.encoding) + json_passwords = msg[2] + self.authenticator.configure_plain(domain, jsonapi.loads(json_passwords)) + + elif command == b'CURVE': + # For now we don't do anything with domains + domain = u(msg[1], self.encoding) + + # If location is CURVE_ALLOW_ANY, allow all clients. Otherwise + # treat location as a directory that holds the certificates. + location = u(msg[2], self.encoding) + self.authenticator.configure_curve(domain, location) + + elif command == b'TERMINATE': + terminate = True + + else: + self.log.error("Invalid auth command from API: %r", command) + + return terminate + +def _inherit_docstrings(cls): + """inherit docstrings from Authenticator, so we don't duplicate them""" + for name, method in cls.__dict__.items(): + if name.startswith('_'): + continue + upstream_method = getattr(Authenticator, name, None) + if not method.__doc__: + method.__doc__ = upstream_method.__doc__ + return cls + +@_inherit_docstrings +class ThreadAuthenticator(object): + """Run ZAP authentication in a background thread""" + + def __init__(self, context=None, encoding='utf-8', log=None): + self.context = context or zmq.Context.instance() + self.log = log + self.encoding = encoding + self.pipe = None + self.pipe_endpoint = "inproc://{0}.inproc".format(id(self)) + self.thread = None + + def allow(self, *addresses): + self.pipe.send_multipart([b'ALLOW'] + [b(a, self.encoding) for a in addresses]) + + def deny(self, *addresses): + self.pipe.send_multipart([b'DENY'] + [b(a, self.encoding) for a in addresses]) + + def configure_plain(self, domain='*', passwords=None): + self.pipe.send_multipart([b'PLAIN', b(domain, self.encoding), jsonapi.dumps(passwords or {})]) + + def configure_curve(self, domain='*', location=''): + domain = b(domain, self.encoding) + location = b(location, self.encoding) + self.pipe.send_multipart([b'CURVE', domain, location]) + + def start(self): + """Start the authentication thread""" + # create a socket to communicate with auth thread. + self.pipe = self.context.socket(zmq.PAIR) + self.pipe.linger = 1 + self.pipe.bind(self.pipe_endpoint) + self.thread = AuthenticationThread(self.context, self.pipe_endpoint, encoding=self.encoding, log=self.log) + self.thread.start() + + def stop(self): + """Stop the authentication thread""" + if self.pipe: + self.pipe.send(b'TERMINATE') + if self.is_alive(): + self.thread.join() + self.thread = None + self.pipe.close() + self.pipe = None + + def is_alive(self): + """Is the ZAP thread currently running?""" + if self.thread and self.thread.is_alive(): + return True + return False + + def __del__(self): + self.stop() + +__all__ = ['ThreadAuthenticator'] diff --git a/scripts/external_libs/platform/cel59/32bit/zmq/backend/__init__.py b/scripts/external_libs/platform/cel59/32bit/zmq/backend/__init__.py new file mode 100644 index 00000000..7cac725c --- /dev/null +++ b/scripts/external_libs/platform/cel59/32bit/zmq/backend/__init__.py @@ -0,0 +1,45 @@ +"""Import basic exposure of libzmq C API as a backend""" + +# Copyright (C) PyZMQ Developers +# Distributed under the terms of the Modified BSD License. + + +import os +import platform +import sys + +from zmq.utils.sixcerpt import reraise + +from .select import public_api, select_backend + +if 'PYZMQ_BACKEND' in os.environ: + backend = os.environ['PYZMQ_BACKEND'] + if backend in ('cython', 'cffi'): + backend = 'zmq.backend.%s' % backend + _ns = select_backend(backend) +else: + # default to cython, fallback to cffi + # (reverse on PyPy) + if platform.python_implementation() == 'PyPy': + first, second = ('zmq.backend.cffi', 'zmq.backend.cython') + else: + first, second = ('zmq.backend.cython', 'zmq.backend.cffi') + + try: + _ns = select_backend(first) + except Exception: + exc_info = sys.exc_info() + exc = exc_info[1] + try: + _ns = select_backend(second) + except ImportError: + # prevent 'During handling of the above exception...' on py3 + # can't use `raise ... from` on Python 2 + if hasattr(exc, '__cause__'): + exc.__cause__ = None + # raise the *first* error, not the fallback + reraise(*exc_info) + +globals().update(_ns) + +__all__ = public_api diff --git a/scripts/external_libs/platform/cel59/32bit/zmq/backend/cffi/__init__.py b/scripts/external_libs/platform/cel59/32bit/zmq/backend/cffi/__init__.py new file mode 100644 index 00000000..ca3164d3 --- /dev/null +++ b/scripts/external_libs/platform/cel59/32bit/zmq/backend/cffi/__init__.py @@ -0,0 +1,22 @@ +"""CFFI backend (for PyPY)""" + +# Copyright (C) PyZMQ Developers +# Distributed under the terms of the Modified BSD License. + +from zmq.backend.cffi import (constants, error, message, context, socket, + _poll, devices, utils) + +__all__ = [] +for submod in (constants, error, message, context, socket, + _poll, devices, utils): + __all__.extend(submod.__all__) + +from .constants import * +from .error import * +from .message import * +from .context import * +from .socket import * +from .devices import * +from ._poll import * +from ._cffi import zmq_version_info, ffi +from .utils import * diff --git a/scripts/external_libs/platform/cel59/32bit/zmq/backend/cffi/_cdefs.h b/scripts/external_libs/platform/cel59/32bit/zmq/backend/cffi/_cdefs.h new file mode 100644 index 00000000..d3300575 --- /dev/null +++ b/scripts/external_libs/platform/cel59/32bit/zmq/backend/cffi/_cdefs.h @@ -0,0 +1,68 @@ +void zmq_version(int *major, int *minor, int *patch); + +void* zmq_socket(void *context, int type); +int zmq_close(void *socket); + +int zmq_bind(void *socket, const char *endpoint); +int zmq_connect(void *socket, const char *endpoint); + +int zmq_errno(void); +const char * zmq_strerror(int errnum); + +void* zmq_stopwatch_start(void); +unsigned long zmq_stopwatch_stop(void *watch); +void zmq_sleep(int seconds_); +int zmq_device(int device, void *frontend, void *backend); + +int zmq_unbind(void *socket, const char *endpoint); +int zmq_disconnect(void *socket, const char *endpoint); +void* zmq_ctx_new(); +int zmq_ctx_destroy(void *context); +int zmq_ctx_get(void *context, int opt); +int zmq_ctx_set(void *context, int opt, int optval); +int zmq_proxy(void *frontend, void *backend, void *capture); +int zmq_socket_monitor(void *socket, const char *addr, int events); + +int zmq_curve_keypair (char *z85_public_key, char *z85_secret_key); +int zmq_has (const char *capability); + +typedef struct { ...; } zmq_msg_t; +typedef ... zmq_free_fn; + +int zmq_msg_init(zmq_msg_t *msg); +int zmq_msg_init_size(zmq_msg_t *msg, size_t size); +int zmq_msg_init_data(zmq_msg_t *msg, + void *data, + size_t size, + zmq_free_fn *ffn, + void *hint); + +size_t zmq_msg_size(zmq_msg_t *msg); +void *zmq_msg_data(zmq_msg_t *msg); +int zmq_msg_close(zmq_msg_t *msg); + +int zmq_msg_send(zmq_msg_t *msg, void *socket, int flags); +int zmq_msg_recv(zmq_msg_t *msg, void *socket, int flags); + +int zmq_getsockopt(void *socket, + int option_name, + void *option_value, + size_t *option_len); + +int zmq_setsockopt(void *socket, + int option_name, + const void *option_value, + size_t option_len); +typedef struct +{ + void *socket; + int fd; + short events; + short revents; +} zmq_pollitem_t; + +int zmq_poll(zmq_pollitem_t *items, int nitems, long timeout); + +// miscellany +void * memcpy(void *restrict s1, const void *restrict s2, size_t n); +int get_ipc_path_max_len(void); diff --git a/scripts/external_libs/platform/cel59/32bit/zmq/backend/cffi/_cffi.py b/scripts/external_libs/platform/cel59/32bit/zmq/backend/cffi/_cffi.py new file mode 100644 index 00000000..c73ebf83 --- /dev/null +++ b/scripts/external_libs/platform/cel59/32bit/zmq/backend/cffi/_cffi.py @@ -0,0 +1,127 @@ +# coding: utf-8 +"""The main CFFI wrapping of libzmq""" + +# Copyright (C) PyZMQ Developers +# Distributed under the terms of the Modified BSD License. + + +import json +import os +from os.path import dirname, join +from cffi import FFI + +from zmq.utils.constant_names import all_names, no_prefix + + +base_zmq_version = (3,2,2) + +def load_compiler_config(): + """load pyzmq compiler arguments""" + import zmq + zmq_dir = dirname(zmq.__file__) + zmq_parent = dirname(zmq_dir) + + fname = join(zmq_dir, 'utils', 'compiler.json') + if os.path.exists(fname): + with open(fname) as f: + cfg = json.load(f) + else: + cfg = {} + + cfg.setdefault("include_dirs", []) + cfg.setdefault("library_dirs", []) + cfg.setdefault("runtime_library_dirs", []) + cfg.setdefault("libraries", ["zmq"]) + + # cast to str, because cffi can't handle unicode paths (?!) + cfg['libraries'] = [str(lib) for lib in cfg['libraries']] + for key in ("include_dirs", "library_dirs", "runtime_library_dirs"): + # interpret paths relative to parent of zmq (like source tree) + abs_paths = [] + for p in cfg[key]: + if p.startswith('zmq'): + p = join(zmq_parent, p) + abs_paths.append(str(p)) + cfg[key] = abs_paths + return cfg + + +def zmq_version_info(): + """Get libzmq version as tuple of ints""" + major = ffi.new('int*') + minor = ffi.new('int*') + patch = ffi.new('int*') + + C.zmq_version(major, minor, patch) + + return (int(major[0]), int(minor[0]), int(patch[0])) + + +cfg = load_compiler_config() +ffi = FFI() + +def _make_defines(names): + _names = [] + for name in names: + define_line = "#define %s ..." % (name) + _names.append(define_line) + + return "\n".join(_names) + +c_constant_names = [] +for name in all_names: + if no_prefix(name): + c_constant_names.append(name) + else: + c_constant_names.append("ZMQ_" + name) + +# load ffi definitions +here = os.path.dirname(__file__) +with open(os.path.join(here, '_cdefs.h')) as f: + _cdefs = f.read() + +with open(os.path.join(here, '_verify.c')) as f: + _verify = f.read() + +ffi.cdef(_cdefs) +ffi.cdef(_make_defines(c_constant_names)) + +try: + C = ffi.verify(_verify, + modulename='_cffi_ext', + libraries=cfg['libraries'], + include_dirs=cfg['include_dirs'], + library_dirs=cfg['library_dirs'], + runtime_library_dirs=cfg['runtime_library_dirs'], + ) + _version_info = zmq_version_info() +except Exception as e: + raise ImportError("PyZMQ CFFI backend couldn't find zeromq: %s\n" + "Please check that you have zeromq headers and libraries." % e) + +if _version_info < (3,2,2): + raise ImportError("PyZMQ CFFI backend requires zeromq >= 3.2.2," + " but found %i.%i.%i" % _version_info + ) + +nsp = new_sizet_pointer = lambda length: ffi.new('size_t*', length) + +new_uint64_pointer = lambda: (ffi.new('uint64_t*'), + nsp(ffi.sizeof('uint64_t'))) +new_int64_pointer = lambda: (ffi.new('int64_t*'), + nsp(ffi.sizeof('int64_t'))) +new_int_pointer = lambda: (ffi.new('int*'), + nsp(ffi.sizeof('int'))) +new_binary_data = lambda length: (ffi.new('char[%d]' % (length)), + nsp(ffi.sizeof('char') * length)) + +value_uint64_pointer = lambda val : (ffi.new('uint64_t*', val), + ffi.sizeof('uint64_t')) +value_int64_pointer = lambda val: (ffi.new('int64_t*', val), + ffi.sizeof('int64_t')) +value_int_pointer = lambda val: (ffi.new('int*', val), + ffi.sizeof('int')) +value_binary_data = lambda val, length: (ffi.new('char[%d]' % (length + 1), val), + ffi.sizeof('char') * length) + +IPC_PATH_MAX_LEN = C.get_ipc_path_max_len() diff --git a/scripts/external_libs/platform/cel59/32bit/zmq/backend/cffi/_poll.py b/scripts/external_libs/platform/cel59/32bit/zmq/backend/cffi/_poll.py new file mode 100644 index 00000000..9bca34ca --- /dev/null +++ b/scripts/external_libs/platform/cel59/32bit/zmq/backend/cffi/_poll.py @@ -0,0 +1,56 @@ +# coding: utf-8 +"""zmq poll function""" + +# Copyright (C) PyZMQ Developers +# Distributed under the terms of the Modified BSD License. + +from ._cffi import C, ffi, zmq_version_info + +from .constants import * + +from zmq.error import _check_rc + + +def _make_zmq_pollitem(socket, flags): + zmq_socket = socket._zmq_socket + zmq_pollitem = ffi.new('zmq_pollitem_t*') + zmq_pollitem.socket = zmq_socket + zmq_pollitem.fd = 0 + zmq_pollitem.events = flags + zmq_pollitem.revents = 0 + return zmq_pollitem[0] + +def _make_zmq_pollitem_fromfd(socket_fd, flags): + zmq_pollitem = ffi.new('zmq_pollitem_t*') + zmq_pollitem.socket = ffi.NULL + zmq_pollitem.fd = socket_fd + zmq_pollitem.events = flags + zmq_pollitem.revents = 0 + return zmq_pollitem[0] + +def zmq_poll(sockets, timeout): + cffi_pollitem_list = [] + low_level_to_socket_obj = {} + for item in sockets: + if isinstance(item[0], int): + low_level_to_socket_obj[item[0]] = item + cffi_pollitem_list.append(_make_zmq_pollitem_fromfd(item[0], item[1])) + else: + low_level_to_socket_obj[item[0]._zmq_socket] = item + cffi_pollitem_list.append(_make_zmq_pollitem(item[0], item[1])) + items = ffi.new('zmq_pollitem_t[]', cffi_pollitem_list) + list_length = ffi.cast('int', len(cffi_pollitem_list)) + c_timeout = ffi.cast('long', timeout) + rc = C.zmq_poll(items, list_length, c_timeout) + _check_rc(rc) + result = [] + for index in range(len(items)): + if not items[index].socket == ffi.NULL: + if items[index].revents > 0: + result.append((low_level_to_socket_obj[items[index].socket][0], + items[index].revents)) + else: + result.append((items[index].fd, items[index].revents)) + return result + +__all__ = ['zmq_poll'] diff --git a/scripts/external_libs/platform/cel59/32bit/zmq/backend/cffi/_verify.c b/scripts/external_libs/platform/cel59/32bit/zmq/backend/cffi/_verify.c new file mode 100644 index 00000000..547840eb --- /dev/null +++ b/scripts/external_libs/platform/cel59/32bit/zmq/backend/cffi/_verify.c @@ -0,0 +1,12 @@ +#include +#include +#include + +#include +#include +#include "zmq_compat.h" + +int get_ipc_path_max_len(void) { + struct sockaddr_un *dummy; + return sizeof(dummy->sun_path) - 1; +} diff --git a/scripts/external_libs/platform/cel59/32bit/zmq/backend/cffi/constants.py b/scripts/external_libs/platform/cel59/32bit/zmq/backend/cffi/constants.py new file mode 100644 index 00000000..ee293e74 --- /dev/null +++ b/scripts/external_libs/platform/cel59/32bit/zmq/backend/cffi/constants.py @@ -0,0 +1,15 @@ +# coding: utf-8 +"""zmq constants""" + +from ._cffi import C, c_constant_names +from zmq.utils.constant_names import all_names + +g = globals() +for cname in c_constant_names: + if cname.startswith("ZMQ_"): + name = cname[4:] + else: + name = cname + g[name] = getattr(C, cname) + +__all__ = all_names diff --git a/scripts/external_libs/platform/cel59/32bit/zmq/backend/cffi/context.py b/scripts/external_libs/platform/cel59/32bit/zmq/backend/cffi/context.py new file mode 100644 index 00000000..16a7b257 --- /dev/null +++ b/scripts/external_libs/platform/cel59/32bit/zmq/backend/cffi/context.py @@ -0,0 +1,100 @@ +# coding: utf-8 +"""zmq Context class""" + +# Copyright (C) PyZMQ Developers +# Distributed under the terms of the Modified BSD License. + +import weakref + +from ._cffi import C, ffi + +from .socket import * +from .constants import * + +from zmq.error import ZMQError, _check_rc + +class Context(object): + _zmq_ctx = None + _iothreads = None + _closed = None + _sockets = 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 + self._sockets = set() + + @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 _add_socket(self, socket): + ref = weakref.ref(socket) + self._sockets.add(ref) + return ref + + def _rm_socket(self, ref): + if ref in self._sockets: + self._sockets.remove(ref) + + 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 + + C.zmq_ctx_destroy(self._zmq_ctx) + + self._zmq_ctx = None + self._closed = True + + def destroy(self, linger=None): + if self.closed: + return + + sockets = self._sockets + self._sockets = set() + for s in sockets: + s = s() + if s and not s.closed: + if linger: + s.setsockopt(LINGER, linger) + s.close() + + self.term() + +__all__ = ['Context'] diff --git a/scripts/external_libs/platform/cel59/32bit/zmq/backend/cffi/devices.py b/scripts/external_libs/platform/cel59/32bit/zmq/backend/cffi/devices.py new file mode 100644 index 00000000..c7a514a8 --- /dev/null +++ b/scripts/external_libs/platform/cel59/32bit/zmq/backend/cffi/devices.py @@ -0,0 +1,24 @@ +# coding: utf-8 +"""zmq device functions""" + +# Copyright (C) PyZMQ Developers +# Distributed under the terms of the Modified BSD License. + +from ._cffi import C, ffi, zmq_version_info +from .socket import Socket +from zmq.error import ZMQError, _check_rc + +def device(device_type, frontend, backend): + rc = C.zmq_proxy(frontend._zmq_socket, backend._zmq_socket, ffi.NULL) + _check_rc(rc) + +def proxy(frontend, backend, capture=None): + if isinstance(capture, Socket): + capture = capture._zmq_socket + else: + capture = ffi.NULL + + rc = C.zmq_proxy(frontend._zmq_socket, backend._zmq_socket, capture) + _check_rc(rc) + +__all__ = ['device', 'proxy'] diff --git a/scripts/external_libs/platform/cel59/32bit/zmq/backend/cffi/error.py b/scripts/external_libs/platform/cel59/32bit/zmq/backend/cffi/error.py new file mode 100644 index 00000000..3bb64de0 --- /dev/null +++ b/scripts/external_libs/platform/cel59/32bit/zmq/backend/cffi/error.py @@ -0,0 +1,13 @@ +"""zmq error functions""" + +# Copyright (C) PyZMQ Developers +# Distributed under the terms of the Modified BSD License. + +from ._cffi import C, ffi + +def strerror(errno): + return ffi.string(C.zmq_strerror(errno)) + +zmq_errno = C.zmq_errno + +__all__ = ['strerror', 'zmq_errno'] diff --git a/scripts/external_libs/platform/cel59/32bit/zmq/backend/cffi/message.py b/scripts/external_libs/platform/cel59/32bit/zmq/backend/cffi/message.py new file mode 100644 index 00000000..c35decb6 --- /dev/null +++ b/scripts/external_libs/platform/cel59/32bit/zmq/backend/cffi/message.py @@ -0,0 +1,69 @@ +"""Dummy Frame object""" + +# Copyright (C) PyZMQ Developers +# Distributed under the terms of the Modified BSD License. + +from ._cffi import ffi, C + +import zmq +from zmq.utils.strtypes import unicode + +try: + view = memoryview +except NameError: + view = buffer + +_content = lambda x: x.tobytes() if type(x) == memoryview else x + +class Frame(object): + _data = None + tracker = None + closed = False + more = False + buffer = None + + + def __init__(self, data, track=False): + try: + view(data) + except TypeError: + raise + + self._data = data + + if isinstance(data, unicode): + raise TypeError("Unicode objects not allowed. Only: str/bytes, " + + "buffer interfaces.") + + self.more = False + self.tracker = None + self.closed = False + if track: + self.tracker = zmq.MessageTracker() + + self.buffer = view(self.bytes) + + @property + def bytes(self): + data = _content(self._data) + return data + + def __len__(self): + return len(self.bytes) + + def __eq__(self, other): + return self.bytes == _content(other) + + def __str__(self): + if str is unicode: + return self.bytes.decode() + else: + return self.bytes + + @property + def done(self): + return True + +Message = Frame + +__all__ = ['Frame', 'Message'] diff --git a/scripts/external_libs/platform/cel59/32bit/zmq/backend/cffi/socket.py b/scripts/external_libs/platform/cel59/32bit/zmq/backend/cffi/socket.py new file mode 100644 index 00000000..3c427739 --- /dev/null +++ b/scripts/external_libs/platform/cel59/32bit/zmq/backend/cffi/socket.py @@ -0,0 +1,244 @@ +# coding: utf-8 +"""zmq Socket class""" + +# Copyright (C) PyZMQ Developers +# Distributed under the terms of the Modified BSD License. + +import random +import codecs + +import errno as errno_mod + +from ._cffi import (C, ffi, new_uint64_pointer, new_int64_pointer, + new_int_pointer, new_binary_data, value_uint64_pointer, + value_int64_pointer, value_int_pointer, value_binary_data, + IPC_PATH_MAX_LEN) + +from .message import Frame +from .constants import * + +import zmq +from zmq.error import ZMQError, _check_rc, _check_version +from zmq.utils.strtypes import unicode + + +def new_pointer_from_opt(option, length=0): + from zmq.sugar.constants import ( + int64_sockopts, bytes_sockopts, + ) + if option in int64_sockopts: + return new_int64_pointer() + elif option in bytes_sockopts: + return new_binary_data(length) + else: + # default + return new_int_pointer() + +def value_from_opt_pointer(option, opt_pointer, length=0): + from zmq.sugar.constants import ( + int64_sockopts, bytes_sockopts, + ) + if option in int64_sockopts: + return int(opt_pointer[0]) + elif option in bytes_sockopts: + return ffi.buffer(opt_pointer, length)[:] + else: + return int(opt_pointer[0]) + +def initialize_opt_pointer(option, value, length=0): + from zmq.sugar.constants import ( + int64_sockopts, bytes_sockopts, + ) + if option in int64_sockopts: + return value_int64_pointer(value) + elif option in bytes_sockopts: + return value_binary_data(value, length) + else: + return value_int_pointer(value) + + +class Socket(object): + context = None + socket_type = None + _zmq_socket = None + _closed = None + _ref = None + _shadow = False + + def __init__(self, context=None, socket_type=None, shadow=None): + self.context = context + if shadow is not None: + self._zmq_socket = ffi.cast("void *", shadow) + self._shadow = True + else: + self._shadow = False + self._zmq_socket = C.zmq_socket(context._zmq_ctx, socket_type) + if self._zmq_socket == ffi.NULL: + raise ZMQError() + self._closed = False + if context: + self._ref = context._add_socket(self) + + @property + def underlying(self): + """The address of the underlying libzmq socket""" + return int(ffi.cast('size_t', self._zmq_socket)) + + @property + def closed(self): + return self._closed + + def close(self, linger=None): + rc = 0 + if not self._closed and hasattr(self, '_zmq_socket'): + if self._zmq_socket is not None: + rc = C.zmq_close(self._zmq_socket) + self._closed = True + if self.context: + self.context._rm_socket(self._ref) + return rc + + def bind(self, address): + if isinstance(address, unicode): + address = address.encode('utf8') + rc = C.zmq_bind(self._zmq_socket, address) + if rc < 0: + if IPC_PATH_MAX_LEN and C.zmq_errno() == errno_mod.ENAMETOOLONG: + # py3compat: address is bytes, but msg wants str + if str is unicode: + address = address.decode('utf-8', 'replace') + path = address.split('://', 1)[-1] + msg = ('ipc path "{0}" is longer than {1} ' + 'characters (sizeof(sockaddr_un.sun_path)).' + .format(path, IPC_PATH_MAX_LEN)) + raise ZMQError(C.zmq_errno(), msg=msg) + else: + _check_rc(rc) + + def unbind(self, address): + _check_version((3,2), "unbind") + if isinstance(address, unicode): + address = address.encode('utf8') + rc = C.zmq_unbind(self._zmq_socket, address) + _check_rc(rc) + + def connect(self, address): + if isinstance(address, unicode): + address = address.encode('utf8') + rc = C.zmq_connect(self._zmq_socket, address) + _check_rc(rc) + + def disconnect(self, address): + _check_version((3,2), "disconnect") + if isinstance(address, unicode): + address = address.encode('utf8') + rc = C.zmq_disconnect(self._zmq_socket, address) + _check_rc(rc) + + def set(self, option, value): + length = None + if isinstance(value, unicode): + raise TypeError("unicode not allowed, use bytes") + + if isinstance(value, bytes): + if option not in zmq.constants.bytes_sockopts: + raise TypeError("not a bytes sockopt: %s" % option) + length = len(value) + + c_data = initialize_opt_pointer(option, value, length) + + c_value_pointer = c_data[0] + c_sizet = c_data[1] + + rc = C.zmq_setsockopt(self._zmq_socket, + option, + ffi.cast('void*', c_value_pointer), + c_sizet) + _check_rc(rc) + + def get(self, option): + c_data = new_pointer_from_opt(option, length=255) + + c_value_pointer = c_data[0] + c_sizet_pointer = c_data[1] + + rc = C.zmq_getsockopt(self._zmq_socket, + option, + c_value_pointer, + c_sizet_pointer) + _check_rc(rc) + + sz = c_sizet_pointer[0] + v = value_from_opt_pointer(option, c_value_pointer, sz) + if option != zmq.IDENTITY and option in zmq.constants.bytes_sockopts and v.endswith(b'\0'): + v = v[:-1] + return v + + def send(self, message, flags=0, copy=False, track=False): + if isinstance(message, unicode): + raise TypeError("Message must be in bytes, not an unicode Object") + + if isinstance(message, Frame): + message = message.bytes + + zmq_msg = ffi.new('zmq_msg_t*') + c_message = ffi.new('char[]', message) + rc = C.zmq_msg_init_size(zmq_msg, len(message)) + C.memcpy(C.zmq_msg_data(zmq_msg), c_message, len(message)) + + rc = C.zmq_msg_send(zmq_msg, self._zmq_socket, flags) + C.zmq_msg_close(zmq_msg) + _check_rc(rc) + + if track: + return zmq.MessageTracker() + + def recv(self, flags=0, copy=True, track=False): + zmq_msg = ffi.new('zmq_msg_t*') + C.zmq_msg_init(zmq_msg) + + rc = C.zmq_msg_recv(zmq_msg, self._zmq_socket, flags) + + if rc < 0: + C.zmq_msg_close(zmq_msg) + _check_rc(rc) + + _buffer = ffi.buffer(C.zmq_msg_data(zmq_msg), C.zmq_msg_size(zmq_msg)) + value = _buffer[:] + C.zmq_msg_close(zmq_msg) + + frame = Frame(value, track=track) + frame.more = self.getsockopt(RCVMORE) + + if copy: + return frame.bytes + else: + return frame + + def monitor(self, addr, events=-1): + """s.monitor(addr, flags) + + Start publishing socket events on inproc. + See libzmq docs for zmq_monitor for details. + + Note: requires libzmq >= 3.2 + + Parameters + ---------- + addr : str + The inproc url used for monitoring. Passing None as + the addr will cause an existing socket monitor to be + deregistered. + events : int [default: zmq.EVENT_ALL] + The zmq event bitmask for which events will be sent to the monitor. + """ + + _check_version((3,2), "monitor") + if events < 0: + events = zmq.EVENT_ALL + if addr is None: + addr = ffi.NULL + rc = C.zmq_socket_monitor(self._zmq_socket, addr, events) + + +__all__ = ['Socket', 'IPC_PATH_MAX_LEN'] diff --git a/scripts/external_libs/platform/cel59/32bit/zmq/backend/cffi/utils.py b/scripts/external_libs/platform/cel59/32bit/zmq/backend/cffi/utils.py new file mode 100644 index 00000000..fde7827b --- /dev/null +++ b/scripts/external_libs/platform/cel59/32bit/zmq/backend/cffi/utils.py @@ -0,0 +1,62 @@ +# coding: utf-8 +"""miscellaneous zmq_utils wrapping""" + +# Copyright (C) PyZMQ Developers +# Distributed under the terms of the Modified BSD License. + +from ._cffi import ffi, C + +from zmq.error import ZMQError, _check_rc, _check_version +from zmq.utils.strtypes import unicode + +def has(capability): + """Check for zmq capability by name (e.g. 'ipc', 'curve') + + .. versionadded:: libzmq-4.1 + .. versionadded:: 14.1 + """ + _check_version((4,1), 'zmq.has') + if isinstance(capability, unicode): + capability = capability.encode('utf8') + return bool(C.zmq_has(capability)) + +def curve_keypair(): + """generate a Z85 keypair for use with zmq.CURVE security + + Requires libzmq (≥ 4.0) to have been linked with libsodium. + + Returns + ------- + (public, secret) : two bytestrings + The public and private keypair as 40 byte z85-encoded bytestrings. + """ + _check_version((3,2), "monitor") + public = ffi.new('char[64]') + private = ffi.new('char[64]') + rc = C.zmq_curve_keypair(public, private) + _check_rc(rc) + return ffi.buffer(public)[:40], ffi.buffer(private)[:40] + + +class Stopwatch(object): + def __init__(self): + self.watch = ffi.NULL + + def start(self): + if self.watch == ffi.NULL: + self.watch = C.zmq_stopwatch_start() + else: + raise ZMQError('Stopwatch is already runing.') + + def stop(self): + if self.watch == ffi.NULL: + raise ZMQError('Must start the Stopwatch before calling stop.') + else: + time = C.zmq_stopwatch_stop(self.watch) + self.watch = ffi.NULL + return time + + def sleep(self, seconds): + C.zmq_sleep(seconds) + +__all__ = ['has', 'curve_keypair', 'Stopwatch'] diff --git a/scripts/external_libs/platform/cel59/32bit/zmq/backend/cython/__init__.py b/scripts/external_libs/platform/cel59/32bit/zmq/backend/cython/__init__.py new file mode 100644 index 00000000..e5358185 --- /dev/null +++ b/scripts/external_libs/platform/cel59/32bit/zmq/backend/cython/__init__.py @@ -0,0 +1,23 @@ +"""Python bindings for core 0MQ objects.""" + +# Copyright (C) PyZMQ Developers +# Distributed under the terms of the Lesser GNU Public License (LGPL). + +from . import (constants, error, message, context, + socket, utils, _poll, _version, _device ) + +__all__ = [] +for submod in (constants, error, message, context, + socket, utils, _poll, _version, _device): + __all__.extend(submod.__all__) + +from .constants import * +from .error import * +from .message import * +from .context import * +from .socket import * +from ._poll import * +from .utils import * +from ._device import * +from ._version import * + diff --git a/scripts/external_libs/platform/cel59/32bit/zmq/backend/cython/_device.so b/scripts/external_libs/platform/cel59/32bit/zmq/backend/cython/_device.so new file mode 100644 index 0000000000000000000000000000000000000000..b375648a5e7350e071762758141db7ae74c4153d GIT binary patch literal 95085 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%0D70gs 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

&V7ic7*FIW(U&+eH36+~njPT>&eug~ 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 PDGp#GsIj9%cXR(2n{5oB literal 0 HcmV?d00001 diff --git a/scripts/external_libs/platform/cel59/32bit/zmq/backend/cython/_version.so b/scripts/external_libs/platform/cel59/32bit/zmq/backend/cython/_version.so new file mode 100644 index 0000000000000000000000000000000000000000..827322138698ffe2fff1234f07dc35bc9bb96df9 GIT binary patch literal 37898 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 %Kc;KrI_Yv@w4^)L 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. +# + +#----------------------------------------------------------------------------- +# Code +#----------------------------------------------------------------------------- + +cdef class Context: + + cdef object __weakref__ # enable weakref + cdef void *handle # The C handle for the underlying zmq object. + cdef bint _shadow # whether the Context is a shadow wrapper of another + cdef void **_sockets # A C-array containg socket handles + cdef size_t _n_sockets # the number of sockets + cdef size_t _max_sockets # the size of the _sockets array + cdef int _pid # the pid of the process which created me (for fork safety) + + cdef public bint closed # bool property for a closed context. + cdef inline int _term(self) + # helpers for events on _sockets in Socket.__cinit__()/close() + cdef inline void _add_socket(self, void* handle) + cdef inline void _remove_socket(self, void* handle) + diff --git a/scripts/external_libs/platform/cel59/32bit/zmq/backend/cython/context.so b/scripts/external_libs/platform/cel59/32bit/zmq/backend/cython/context.so new file mode 100644 index 0000000000000000000000000000000000000000..f8d8799f44813d189d1c164e072e495c6e7adb08 GIT binary patch literal 143066 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%0A3j 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 sWqEx-A)Y-|=w9D(g5XPm+<^2Jgu1 z{Xg}lDaYbu_0>kJG^CTS)}GR+zTz3iY39Sk&QBE;M-`JaURIUbVpWARx`u6yx=8KO zD}$AC*iB~fZM)1~91OEr%jdARV98#bv#!QIS@dx5xT{eI(&y%Zqa~TZ0Y&zQ2_0iK zw+}WBuaxu5x?!r^TNMwndO>i_PBn+cw5Stu-|?#j|})*`TmIsA*a39@lHDSv;fGUQvwA+|KTYPFFZ9+Oe#pdnH;h z7#Hi#@=m=ONn0x8XS1Hv3XX0o^~z_$8HvR(`fI40{$~v+SE}O-tQPT&inU?t6&Z%8 zs6KLp1yZY|O0j}=#tD?G?Hevu?W8e^p`(=^?#)DP{d7!u=ZIc%RV1fTTZgL(i1L+q z#0z?AHw_4e{l(@Dt+nnnM^oh?f@-4^h)h#O+Y&#Fsy_Tj|0NC-cd@E$XYF22*h*r6 zrdp}mS8KSLx@ve#r~M(>Xgdv^oU~=O8KS*zrBce0!>5JaT78>pn~Qw4Xj$TC-00l# z&Y5;)ve%+mIFV}|QIByzRzz1{Wg}WG!d%pB*)mYl$vSk@cJG&Vt%8b}>Q?2%BZ!@5 z=t1q`G|)E9{Hz;_htZwk87!=yqly#*!=>K5S+h9ar1$LDxaYgze&0LBcG-z^e>)V9 zm7z>e^cvmRvbzBV-Eh&&8V<*JTMY*XV()2zV?_@ITb3-{W8>Ey!;|j~eUlubY&5dC zMfdjTa5|YOmEXn)p~g<S?imizCrg3JDOI?daE11W1fVgdRTIcz9#DS5O*T7;;2H0W>&bP zSPUo+*W6sldms);;*RVvw7In#P2orq#WmzZIyeofit>=cZSW|};nu7z^1V`rh<+Uq zstD7yxRf1A;yp2WnUl2rz}%*rPO(s3Ox1CS@^w)) z%FZUL#9OqrQ&6Qex(%l*tNI~rSMV&k|7dxDy|`>Wb(sQf&v3cY!{#r#R_*TOjKhv@ zuyLddI~L|XeV~rjq8*ja=7GkNWj1qluT8#XclHZ5KB`6TWH<3NC9PAV_U+nHYv1dW zLx)MuLYf-dx!Dcc%sSY7z9-CPEhw?DWH5KejkO@BU)NL=&Gei_TJW3tCj#6n(9n+* z2klO+#AP zhcFg5Jl2$u!mNos)Nf6WH%CKr6$QiX7Uo^Bfy3E;b_srnRF~HZX=F4HZRZ=-inZlx z&o)B8_9pzCN%yeE@*|LXQNKy**FCaOs|~x)wsLhn&zpjY+LUQetDm;4v+iPB7t8pN zs1BVcq`!ASJHVlIKOqa%{ZHW50A0FCzXd7}hAs_z%1(|{Awg>i3yU_{y8Yibbjets z&Q-G>McuOOi8pF3eoCe8wuEPV$$C&bFmoRA2T&t=3?N}SQ0+m?tfptYrH|LENnyC8 z&8lVj9vNm+XtS{vQCG&BmFvS}h>Sg5Q}3{Tyrw~sK^%*$jOK+-+)|^Px^dI)^C9+9 z%d%p(qK!R9VS{Hs-3m8);+>MP)un}uwC0%ZuogF12+-+9$AKZ;w^l{8Ujv;#!U>L( zuexW4JA$@>w>vu8D}{x#w$tGjN;FK<#7`1I(aPRlTN~{ru^fQ|%qER~JThwT$5pj< zC&|>#W-!8i^58yfy!z~ErwpR!H3MP`%=tC@>VDJsqMmR&ML*nAcX(%7s3Ou@pb9Iv zejLcN%Modv&8_59Jd)=JFZ27LslT?5YQ&MkN9v-3!Pi)o{_tZ~uIbSG$= zjY%BIFh0H_<(o3?IeIzl?y)IYIn-;*bUyeYV1$spc74m5*l_wcKIIJdSBpzxR#iJO zPdm9r`L3Z_Jf)WA8;EMrcMx*>TrI;^(EYFSc^2wR1Lub4bu2S?}HDOCn8ULxRXjdOT9LBrCuAZQm>6wsrM8DLU4I=)VQ)}CfUkTyYs(;GrcWZY@zMx zP8Js?4V7G$n}yni#4c?)WsifEx*)pZnoHP-hAk*#%t9M>4g|qbNMAI#p{|D}TNTxO zEmb`#Ue>Z>8|>QgM8PL4f9WZT^S;z+qiVMgw0p7DBfRU7zI@QFU9cW;(8739wi6^V z9zutaqTRtmneVZXUi3CylHv;h?G1^gI~caTa@^Wkv0Z zZ9NFj3N+@S8`*{Hgc=n3QJ33eHOJ(prrlxDlc6{g`E0Oz)5(!9V+eFi@+cEPkB#ZRHq&l*9>A?a-Jp?_fJDxrnYg)LkT_Tvd5Pe z|JB!(@ajt_p$%WrUx$G95E!Pq9YCXjvsfrjNe9Gkgv!IXQxLYgqwEB9yQQpcaG0F* zg$0DLld$c?l(S&PUj2H|#^Bx5qP+;;H7uz}VoB)}O?jWKm=Gs^4|r zVWwjqs)(zL_6W7{jW>oBX~Nzrf2kvXJs}is@ey&S$il5ht$9%!XCggEsXZ38$Dv`& z>^6w}i)~nK4d^ObN5K=(?e#ZF>kP>Hzf-Z&z?+Q(zklZ`GU3{xVux#i^AeMaIc8^>uM zYw|QhzSd_q1Ja17XxUTJ(=J&QtSPSIiCmXQcVC8U2ju=KPsDAi*?$@ld-l0ekN8v@ubZ$a z$yVNTv(wblyo=)DR-5tgG|l(CLxZDwfyH}|G4uyGG5+eoyPa!1EYBjWoG$0^L+mUb z0VSpSwWw=@pWHu8U*73=f3vkju4qpo{T#_C_)S7v5s4za2dJPOorUHmPg6A0Lt9m0 z`p(7bG7E7>``Xj8QJ(dOdwCjpE#&Nm^jv+)qjS{O_HZ`9Z94XhXWD97B+0kB!ArDT z;SQbsr*W59-2BKpd|7-oJcaJK%W2YA~%jVg&%Ni{!=20dASfn)we!~EwqK7N#0_AJRQ%to@M$5*mrYdOa%l`hyb=Xpwf zk>IJdGM8kgY^f5LPnU6q5??x9#@R}wWA;!*H(~!C86;jOn42w`1k**0*^aDvG0pK_ z;g$dU1h^CU{y;Z^e;Vio;0FS|5d2V}7l9{_(N6}l>cd9t5+g;6z#j7ApVA*+k>~rN^tL`NvL@aFk$9)&)Y{ zlzbA_hkQ_feLe~A3;7`GpHklK_?YbYsX&v_lMa+UN0@1aCZS^k>A4+ZuePLGfr{8y z2B|BA-WW(P@UYmw2(0-KG)>J)^GTYUP3Xg3;lkVxSz5IL{Eowl%q^P1 zI|97`yfe^^;PF7$TmjuT2{dA$2aN0lJtzpS0QFeN0HI>4k9=FHcbh;PvVRC6lmA8UC=o3`eoU9des#!j9L8=xzQS0`q6>coaXn2xo zD1cTO*$G-B&*YZDNAD^0ZvdXOvYFz3Bu_uKj5So(~7Q}86 z5R1U?4|FqlS4;Ae1G3ex=ww%X>{9 zQtnNHgA~xWA0HM5&-**2zfy2uwteCJ5M*I7NJ%HnZ??#fB{vEhr6Hv3OXp`K`2~SS z0u*em&1f9{(%>)+;8zB^5qxE!7l3~p=w>huFXGmUnNk@AhM_W zz_m)bQ$Uw`7ragUy96o(B3r`?x+|oDs4W?E^z2#2HF_=cvI8HV^u!xggio`o8c+I^ z*w0K&!sMR_@FwuXfo=pJ(q!pP;6nr52tF*(wO&BS{Q}hl%9K4X8yT2{I9M=0o7gsg z_0f~il%3i|cWB7IFTeuu_l~D{b=O>oy98u_zkEW>$l^uGLzSU=K_P$QO|RKAzb(ms z%ar_PtDt%E65*R7eW&mPkv6P~wWiD!I#0k@4hd6VIilsm2HzyZwMJ6SJ^h{24mW>CQv8{wFeSJ(Zn0>SKUFd zgWAfL+kp^Dlg?xQEfUa2;HL$;5qwmj7l5A;=!M|t26_>=EYR%SZN!$C0p1$uh2U+0 zUI6Y3bR+oUKsRLZ!kA?OjRy!3nd*{LdpDPDLl)IqkU(ffHt)9eN_n{n)I#6sVpoSG z&^bo7fi5z#6Vz>F0Yo#B{@tZs{D6RN1Aj2kjo=#sy#Rb;pcjHa9Oy;hPwCs)>bA@0 zKzv#tMT@|n3G_nnX9K+e{JB6kf_DeH0esX8qM|HbSoZG%^&#l5-Y%_J zoJ^2Es3ggWrFFT7T5cPNvig89e{hRtogq*kfoNgO@kXL~gO%+9#j>ZxvJ^;mSO`-C z?R}>3u~x8ixzL$`oUR|!Qk15oJYca9B}IPeB>lBK0eZoI5~$h()sJ+q$it)cNMKZ9 zPs4()*4&r^Hl1ZPv{J)v!MyB}%O)ZCM!ik}7Ye;5kW{hG)V6x(;BH}jCmI;kvrV!C zL_;-}4Hy$$uNFZl_K<+FrWlp@xQD^c{UVWVPh`!zr<0B5Y(_TPusN}zHkZ&_R6FS~ za9N<92K~y&4p6EsSlK)YE(eP@(2-xUW!FO zwq9wT1m7o+MW8{m$mR{TE5uPlP}_;xe-+RYFjc5rI!6CHss$flx(c8xjO?PTHd})f z34}uxg}jQc)NmZP0enuNo51U1I(Q(ayH%7s)6$wJ^ZdM8ba_5_jX+)tLR=Q?uaxJji>tLxOVzr7 z#_ag9WXzB`U64BSbmcT0ubMwa^D>nRH|-aCJ4ci>YRak&;3vJvHi>r_F<%VZR&bMN zcuAyxu{f9k{+-bi1s6`u+ly@b-ejK^^@7h9sE?W^Awnh1lQS*oeK*^(N2@ON->c_M zLM<0)BJWShHi_*t(E^B0(F%a62MZFXL{X1mZZ^_L7JUotUHf|Fz12$Bg6oIG-aIww zRt>&n-d-+$3 ze}iDUn~dmQBS>yC!lEv@$%t{U5;W=oR=CNyFP(3dFAiF{2YeZ_xF4?zRb{pt7Ms|RHB5mPV4fU`<^8j>+RD=wu!vx9zJ-wCzMNP^` z?HE;QA_{oS6c#}5FtTG(=v#pV-DP9}gaJ|o3ijs?hyC-Ej#}`+CRzZYT20-IGKxZj z|75gw8Nvt1NYZJ^bgB=Hvf$?k)QhOS)X26^3f&gSR541YQ%0|1C-|*atZPz;qS~y0 z=w2kin5XL8N=Zy-B)Zm`WCy4$PbGyZIb*Cfwr2U9|^QYqs}&ISrEp`8ZWy-!m9+#A@ExQ z-2}cWrh~r})6;U>lqRj9D~;>|Asy}_dAVd$*saVbSgdMQw4rn|kpC?7*+9BkWwAl9 z6~T8|ZYzi~bF)fAUZ~Xz?N-)TEnD|Ch0j`Q(|NZMFA+oMfLlESqBCZIulI~p)9N%*IS{eh%DOiZHGiDH9b0m1Vvw*W#oS-#MSu#(7m@6_B~Vs8*I zTHu$RY;-fY5a;oom?>h7nEbKQPbk_0mtu)3$lqoIGv7)9#&d zElB=ZkiQWDhfb}di{isNtn3!#59_=laxN7R(mbt4{D5G(bsPCEL9%YcqC8o*_oZQ2 zq7{Lh9rQXQYpe7%V&5)cSir?)aj}HBNI(YoKF@%7FlK;HJf&`VMdjB7st`oJ;%|$$ z_RmVwA9o||q9c^oBuGMDl3nm@i58|Q-jd|k)E_9-sMmb+Y>{62Fy*|=a=YfKUTjO^ z-x10wSZ-&YTMN~5l@m0ZVb8F#HM^R{o-Clhz?TW^sQ|>~F$279dCYK|+Lfpuc4UWW z)3xH<F*YY$bK&j@hfuM49ib>>@QP3m-4FVb};LvfP?9~Ec@Blr~6C=x+> zD4Ev?&6R}w=}6@~({c+SgcHHfOYrxmu>*|=D~{zFJG>1|%01UKwtCXKT2g_W(87t$ zc?k0TH8vVFI5*>MFkLAWiOIH4Ww7^y{f~?gJW6_U77QH%Kh#)tCg6` z1%4X22kPXEpGNNPIyvKAZjsETF-dR3#%{8<|A%-@)C<5rGSOC0@Q-|VofMn4cggP! z#X&m+(%SA?q1`CDlzcgcXNyd8ueRI{dg<;!rn&!QNnPHDNg%+8pt%jrcbZ@=h>Xaw zwhNf*;O`4G)vuWY@q?HF{?yu-;k8n7mq2EMK4WAj2=TB$Lp>TYKsTK38Bm`TXbeDK zJHs=e?i45kbkJFz0kue=3=rl_-2~jA3O;Og6+pqBE-ZMXkp*IKe?Lss}!2ooItVh^e z0liU8&>t1C^b3V|MEcjlFO|v2fCtR{4qAfEBrlhhKM+9w=c>@l&@-|1LbIw1TZ4ht z;ZIjDqk$g3S%yJBDttmT>h%2@*oA@Lk}(toW0?ByQO)u1s4MqnUr{4ZK7ARC>I7X7 z4Z$D`K!hHnx1bs4J$tGXL*}jsBHt0-)2PnrI?XG$o50?HDR+cFqG1pITEGMTw?MNB zOK%d0r1$PHe=XpdbY2o2J`sy!dg?(aK%8`nxV_UE$!x}i>2xp=Ne4d=tN{JN$TrZE z<%XJ=Aos{MqKBe)enxmj>~p-6{+BptZ;pDBhJZSmeTUKSqQNH!R1_3OXri5Axy_Ob zpmc=XuWy!r9~1o=AOBc%Cwk%-`4QT|D+QWapaDysXa~PV!3Gg9fhP^z`|3DC8|5An z_K9$;x@&`g^tTH?8fkFo#scU9fnGzs_A-cf3Xliy5)g8Q?l-a)!H^)5J=J=*3#7l6 zrh?V%Il@arGKeuSzP zn0knGP#H|T+@tKJh>@u&#gXiHE5)NEuY$iq{g=*tC2 ze_Pm>04DH{q7Q-bBee*0rn${T3%D9x2>d#ML_nW5vXj{H8hHxJ-zdyvl#hdMx8#Wy zFe?ZmzLIE?;Y@fA$?idN{T5tkXH36Z*yB3*^8ytGeNlk({fF?qAsO_jB~P?~8{{Ce z78C;2L`&*!1T9=n3UhDkSRwBrEMV4jks1?I?;%usAjtiq&HA z4xSXKe$cI!JkbLFfh89}!9ONi2qwRbegi&S{-VZ#z9m2*YgTZfi54*10f~U{C`7&G0Ipw4QJyZQb2UPY66xSA8V|IC!w|KC{@Icz3Sf`m`2?LP zFaUoSdm3C3sCPkhJlfMu1HBvO@I=8QyTr42)lcVVThBF5g2NmxR78F>CWAjOkOmNa zYmvqF8=8W&rz}j&SIB&yP&(!QqUooiOu71@Ff~5UjA5cNtI)}m^34=@iOrWbP?$Ph zK6F;p=h4)`E3h|wpGJygMvQp{O_WYY?;?xTZNB6pGFJn3f&ls);SWdJgEr}pDUI+9 z%@lk`q`@B(sO6v^8QE4p1(|P>@M(tq>bf&Jr z@V`?aH_qZ!Km6%r+1HL*UUmW9jb@GyF$|cE&Z~6^Zs<7F6S

FNyo=tunq|i}X%MdBK#o<$`Sp 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 VRdgpM2I3ed1F~T%S1LLH{(n)gEaw0K literal 0 HcmV?d00001 diff --git a/scripts/external_libs/platform/cel59/32bit/zmq/backend/cython/error.so b/scripts/external_libs/platform/cel59/32bit/zmq/backend/cython/error.so new file mode 100644 index 0000000000000000000000000000000000000000..26ef58adfc8af3c06e128f66237415f62ebe9f3c GIT binary patch literal 50334 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 CR?vq4 literal 0 HcmV?d00001 diff --git a/scripts/external_libs/platform/cel59/32bit/zmq/backend/cython/libzmq.pxd b/scripts/external_libs/platform/cel59/32bit/zmq/backend/cython/libzmq.pxd new file mode 100644 index 00000000..e42f6d6b --- /dev/null +++ b/scripts/external_libs/platform/cel59/32bit/zmq/backend/cython/libzmq.pxd @@ -0,0 +1,110 @@ +"""All the C imports for 0MQ""" + +# +# Copyright (c) 2010 Brian E. Granger & Min Ragan-Kelley +# +# This file is part of pyzmq. +# +# pyzmq is free software; you can redistribute it and/or modify it under +# the terms of the Lesser GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# pyzmq is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# Lesser GNU General Public License for more details. +# +# You should have received a copy of the Lesser GNU General Public License +# along with this program. If not, see . +# + +#----------------------------------------------------------------------------- +# Imports +#----------------------------------------------------------------------------- + +#----------------------------------------------------------------------------- +# Import the C header files +#----------------------------------------------------------------------------- + +cdef extern from *: + ctypedef void* const_void_ptr "const void *" + ctypedef char* const_char_ptr "const char *" + +cdef extern from "zmq_compat.h": + ctypedef signed long long int64_t "pyzmq_int64_t" + +include "constant_enums.pxi" + +cdef extern from "zmq.h" nogil: + + void _zmq_version "zmq_version"(int *major, int *minor, int *patch) + + ctypedef int fd_t "ZMQ_FD_T" + + enum: errno + char *zmq_strerror (int errnum) + int zmq_errno() + + void *zmq_ctx_new () + int zmq_ctx_destroy (void *context) + int zmq_ctx_set (void *context, int option, int optval) + int zmq_ctx_get (void *context, int option) + void *zmq_init (int io_threads) + int zmq_term (void *context) + + # blackbox def for zmq_msg_t + ctypedef void * zmq_msg_t "zmq_msg_t" + + ctypedef void zmq_free_fn(void *data, void *hint) + + int zmq_msg_init (zmq_msg_t *msg) + int zmq_msg_init_size (zmq_msg_t *msg, size_t size) + int zmq_msg_init_data (zmq_msg_t *msg, void *data, + size_t size, zmq_free_fn *ffn, void *hint) + int zmq_msg_send (zmq_msg_t *msg, void *s, int flags) + int zmq_msg_recv (zmq_msg_t *msg, void *s, int flags) + int zmq_msg_close (zmq_msg_t *msg) + int zmq_msg_move (zmq_msg_t *dest, zmq_msg_t *src) + int zmq_msg_copy (zmq_msg_t *dest, zmq_msg_t *src) + void *zmq_msg_data (zmq_msg_t *msg) + size_t zmq_msg_size (zmq_msg_t *msg) + int zmq_msg_more (zmq_msg_t *msg) + int zmq_msg_get (zmq_msg_t *msg, int option) + int zmq_msg_set (zmq_msg_t *msg, int option, int optval) + const_char_ptr zmq_msg_gets (zmq_msg_t *msg, const_char_ptr property) + int zmq_has (const_char_ptr capability) + + void *zmq_socket (void *context, int type) + int zmq_close (void *s) + int zmq_setsockopt (void *s, int option, void *optval, size_t optvallen) + int zmq_getsockopt (void *s, int option, void *optval, size_t *optvallen) + int zmq_bind (void *s, char *addr) + int zmq_connect (void *s, char *addr) + int zmq_unbind (void *s, char *addr) + int zmq_disconnect (void *s, char *addr) + + int zmq_socket_monitor (void *s, char *addr, int flags) + + # send/recv + int zmq_sendbuf (void *s, const_void_ptr buf, size_t n, int flags) + int zmq_recvbuf (void *s, void *buf, size_t n, int flags) + + ctypedef struct zmq_pollitem_t: + void *socket + int fd + short events + short revents + + int zmq_poll (zmq_pollitem_t *items, int nitems, long timeout) + + int zmq_device (int device_, void *insocket_, void *outsocket_) + int zmq_proxy (void *frontend, void *backend, void *capture) + +cdef extern from "zmq_utils.h" nogil: + + void *zmq_stopwatch_start () + unsigned long zmq_stopwatch_stop (void *watch_) + void zmq_sleep (int seconds_) + int zmq_curve_keypair (char *z85_public_key, char *z85_secret_key) + diff --git a/scripts/external_libs/platform/cel59/32bit/zmq/backend/cython/message.pxd b/scripts/external_libs/platform/cel59/32bit/zmq/backend/cython/message.pxd new file mode 100644 index 00000000..4781195f --- /dev/null +++ b/scripts/external_libs/platform/cel59/32bit/zmq/backend/cython/message.pxd @@ -0,0 +1,63 @@ +"""0MQ Message related class declarations.""" + +# +# Copyright (c) 2010-2011 Brian E. Granger & Min Ragan-Kelley +# +# This file is part of pyzmq. +# +# pyzmq is free software; you can redistribute it and/or modify it under +# the terms of the Lesser GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# pyzmq is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# Lesser GNU General Public License for more details. +# +# You should have received a copy of the Lesser GNU General Public License +# along with this program. If not, see . +# + +#----------------------------------------------------------------------------- +# Imports +#----------------------------------------------------------------------------- + +from cpython cimport PyBytes_FromStringAndSize + +from libzmq cimport zmq_msg_t, zmq_msg_data, zmq_msg_size + +#----------------------------------------------------------------------------- +# Code +#----------------------------------------------------------------------------- + +cdef class MessageTracker(object): + + cdef set events # Message Event objects to track. + cdef set peers # Other Message or MessageTracker objects. + + +cdef class Frame: + + cdef zmq_msg_t zmq_msg + cdef object _data # The actual message data as a Python object. + cdef object _buffer # A Python Buffer/View of the message contents + cdef object _bytes # A bytes/str copy of the message. + cdef bint _failed_init # Flag to handle failed zmq_msg_init + cdef public object tracker_event # Event for use with zmq_free_fn. + cdef public object tracker # MessageTracker object. + cdef public bint more # whether RCVMORE was set + + cdef Frame fast_copy(self) # Create shallow copy of Message object. + cdef object _getbuffer(self) # Construct self._buffer. + + +cdef inline object copy_zmq_msg_bytes(zmq_msg_t *zmq_msg): + """ Copy the data from a zmq_msg_t """ + cdef char *data_c = NULL + cdef Py_ssize_t data_len_c + data_c = zmq_msg_data(zmq_msg) + data_len_c = zmq_msg_size(zmq_msg) + return PyBytes_FromStringAndSize(data_c, data_len_c) + + diff --git a/scripts/external_libs/platform/cel59/32bit/zmq/backend/cython/message.so b/scripts/external_libs/platform/cel59/32bit/zmq/backend/cython/message.so new file mode 100644 index 0000000000000000000000000000000000000000..ceea2307f1ad808369baf4a89652f6982d47aed4 GIT binary patch literal 213231 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

3-H_=#KR@;aV}TfKJ6O)QZ{h zIa9F2vSB8>496w_6$VAX_nZ!#SOw?HBxXo&hMU+m#+u0n=0?CT!D7~Jl2Xkg!nH`9 zgK-}=M#0yI@UyMsP>q<$x^uiJ)b#<7l!L2#xWxJy^Ej@f5)MxgxLZUbtRX7JjRfe)GtO*&guDkhvt2o?@TV~l)yj5e7HOUX3K&+M*h zFaWJ6Ewip>^Q8*D#45)+&?7jZ0JY#p$h**1U|nKJ7lba z^A9Z<{6rYvel3a)zd)-dy);4DmZt;c_n4L+53;*5EGK_pw`azIg-=w~C03_sh_p%N zNPUm)Z~%bLL$G!) zv4T*6e($K(c(+xtO+^HicP2yT7ixpfZ?MYFnjSBPi9D-S*;~HKuiD0ZgIVg9skq}u zGb1W3v;N`2JPKNJZN0!M2Aii)Y$NHkQuWx&w;kP6r9&>Zr}~kC1#XedU(N zt%?(ATK|US2n@rBIL-+w!aPt_s(KmbAuC51flLPF1)(;8e_ITNhvjv)|U@ z#T0QI*V?x-4;gozzJq|jFq#m zLv%~&oZ5LN_!2`LojXqi29`~owBdrE3Miz?2eD4+Wr=Q`JEKyRg{<9GQHYw^YkVg- zww5)s7vY@-IcD}sK*i2yBLU0S$2zAA3%W+hd^giFJmV0>&P3?0DWWw}>~S^(*|V1= zo0JH>NJ_QR8@RUOpSXQAQ80tWN!O8V_Ui>U)8I?=myJcS4jYR>)((?CP1Do8iFKi` z>?zxelNAO;h58E(PKwB!-brULmOvs~k`IK~!qN<|SM< zvsVwRr!_hH`l(WWXNPG!(dBc()SVd6p_kQJ80l?OJF%Hzm)BViXQzg#Kpd`0@V3zZ zlDk#Y1u+t{ufIQEGV z1i=18BXDv$DWWZuO^y&OvQy0H5_PKTHaVZx*;*LQ#JQ0oBH%oVWB_Ksbe7Bmni5_* zYvAsYlo%+_Jh|_BG%|>Qb5}|dC+1-}>hf8XBk9kMq|cVmmnGPf%uzkRc4`-rm>cdq ztIeZwjOrzoW4_Cp)WxW}8UfwP0y&Q{<_mRgOv_1KIFlBI$tl3%NC34XJCf?mUTIQ) zmxO?wIja0Q6#cLT^<5qRw~eiZ9yP45LVskD8o`?S^w_V6~7jS z&4GW`>e7`7xjA{o-m?6JyqZ8^d6^?2Cm1MC@K+~P0G?Ce^(PeM2#?V;?IwSOn(*r5#3wG@gA0VdRajHrDvMx>=W-Id&>m@u^HKV+h@PLVba9u z?#UzFZd4<81@f5@y+l1pEIWETA9fCZzY*VBcHpHAOO`Z93}3XWX`UI;lRy5yP`xx@ z2kcP=cHgXmc=tw8lZ`)d<{WMXQ$Ja??eXAJ@pb28BG#@K9W#X2?kQds`01Y^3Nu9i zCb6N;LPmSxoVUG(fegTao?qbb6<1=bIz;8BN(mbOmVa{W5T2(;!a5O zNU7}-5A>Aahsz}RjUH)YR~f+9_Gp#*5PXUMqgIIK9KcU?o^2&~6GZ0#xa}#r>=Oa- zoHj}H$`;Q!e4?oq-2eo|>K6&~|1JTs5yj`&`@|7PtGG77J~ny0J$i%al_tvfiB3LI zm4;qdEs0M^*nqDB?^tWQobf$HWgS$ka6@W>=|5+!1tSxaM9|K*YZ~mk z?L*?34$bzNBQ`-wLR?+zi#`@@&k_Yb5tA(nGCs8@CyZONKR7~k$`D=aUv`Uc92w5D z`-|1Cq=cOtcS=d?dC?%AsI{|?4FGoyl!=cc5E#iS%=Qs;OtFyO=POajgqeV>F zCnmYXlsfwiWRb{7b&l-i%R4?W<+tuQGhn+1Zx6E|gi6gU$ z_KQBpz@b>$7Yg zan;~7JYA32C&cAF0-~BCf33_C5A?{uvq?PE1B!lgQ9ulI4z?zW0d-<_nmEG_h-<0R zb)p)-(B*9LUbP*!;TrLn-6Z~AZD)w@ z1>Vd|ahgxud`>+lMU_u6Zl0MTB$OhWINBXmfH7=C5`rVuwI3kcz1|4A|tvw zGAUx5X;y+*0@hXsg5r^p`|PxNVn@b4_k-fYmNwXfcR@F+(YHmd`%zxmx^bkqJEJAIQM{CZQQ9r;pW|}}#cK&oocj07vEzdF zM)9{q+hu2uvIk{??>(b-iS16G_-9tVxNJzag2aTnC4qa8OnOAJh7qZlN1lFQ7@ir7-aL9? zy?Api6spN`iRM9ePx~XWb2&!%uY+AkxWuP}>%?(~bC_ih9$9Bk6sKm39xZv9nQk$~ z&b~B#k~^JiN^tif@hm4yQLE?-CAV)lbjV(6FE}Bds%`y7{NzJ>r#VMjG-{n%#NTi? z>ok|RYOQ@t+-TVu_R@k>ccKk{3$lCDTQ8rxPm}#Y-nV-e#`KuDtDuf0G#*az`ap%Y zCszW+p@A+5-;V0>9%A_ zJfItXO*i}i8_uGD*l;6}ZF(%u;1aR97V`PgK@KhPj-y#V?}T-hi7mC1izR;02%B~O zUn(!%13O)!ENkN9E&jYF0gqTMsz5$uff%ak{(Om|yWXi9{z>QSR9@1BBH0wSC7xWX zu%EFM_CcLLsPb*N2siecxU#lIn$t>a=_8CwV05bIV-PT+bUXh z1HDMiHj+?!I;6?TAuf)rtpE`eqSkb5maz z5*cE3lel6nxCMzTK!VRb-sYg~4L%{>?e83IiE0-Nhzo1qFiT0uogR{q*xL^+y;PWy zDIV*Wfkc`ci8ME@;f8|zL~*E)N^C{fM|1q*#k-*NHhLxP`&(WZs#SIIW4ZMF2_>6g zOT+_fed0B+v3qS@A`y-?VqE7XZc0e__s-G8*74+&^eleoXOEb)*ol<>pZ;usExzv$KWkE@Xz^lY zhXA*O*k|m|c2K+C*Blfd$G`*lYOQaqsIC)RVNbt=z9fh%f!K<1xEjyfe9hv&i9ma! zpjkWtz!&WQwj%WR1#(DGE5`G6bo737^y;D(@i|ep7s1W=ysr-l7YFziV&4R8EQ?L6 zVY4w|vc&~y;_Ni>!XTe`_QJFVtXUc2`@t<@JJzqA;PQ&Kz&Ylq7ca#6>_PDf@a59P zefeqPtyrHN-(H8rUHNsWSTFV(l;-?2yWke_;)*))4A$SLR`?zi2l_OL{b>0`)cvEW z>jk}M^6PerJ7b%~@qC}SA=U@4q5$bMJ9De}>ySG81Y|CrSe7k@*NN=|_d!drF-p5s zyq}8!yrb4`J|Xh4ICVuXu2nof1ka=lk(Ghp{hP$0rS;-2>lhaJSJwu_H?ek|cql(0 zUX9&{r%R+Y+4tK^CyDK`KDBm}qfhhe3W5ncF!!1Z#NJvEyd3O3g=$a7V&Ch+_@o2ns^5z0AENqwv8cW) zA8P+zEPPrZAB=4j4|wZfQtXV~;@^pN;yKXTD-NLM^F-W_s?Ve9L5T2URJbX&af7Hk z-Ecl*ExTyRXh1l+%qgX@s^jFqkfE1%`N?iO2mVe1$-cN5&RYjRxTo72~(gabr#+cS2p8gg;Gm#qLOXO;4Pz7GAlrB~7fo zAK5M9Ib6YgVy!R1Juz63HAy^a1)i)J-7sr|T`T@@5%jxDnh0cwE=UDjqFaWj#5iZ1 z5dD1H+^L!3jlmiA5OLpf=;&dYY+9Zs24jB-{LU?6Nxk@#{`1v&&U2*~ygXoE2URL` zp4CUP?Ht@QdJ4Upp0@0tm>!63ju!6?ZWII6I&$gqV}!g<$Ubr6f@5NJOHg#j@c%r( zInfgT&2`SO#IaS7@Nl@l8Dcn^UgQ$PGekdZ`;LX(d^o<`39|gsA=)XV!}{GaS1@6* zc-m2qfq1g^n7DihhVBG(`>G+?na&|y#XpyU`j#P$;)i7zzb!)oNI+*|TkNLlo%ZNW z-r`|y_oNi;UcO(JZO8b%t5V{F+#O(vOtR!|G%%?Fd*unD44aNLfn8_U`UzwW;%!N) zj~7ju+2XCFH1SxbPkijCgWnlKXb`*BropYN6JHL~vwiELH2cI>5mP7b?9(Xz01LG& z4K}<<{MV5N#|F!W6PBbCcSM~6VnRS1sKqW;rfzj+i*5l}nSgj0(s*8kd<}dVx^qFRcy~m$ zxO;&e2j}v=Ga>PR`R(le;ySC&{)E=x=bpX-?0@9yH3QB6r=+fd2I0mI&Ddh!ng?<) z*Eb~N`AFtIu>*_6M_6vw2|LZ+xmf(PrqwyPmz{#;1U^XDW=;=m{?r&O$9_SKgHnAo zT#LAIVVc-8;+Q>H%x=z~I5N|17uuNxGvl*nW{OP%Og@I+hOtbM$o z4jXS7RTAIDLD#=nj>)xB6o6u7EC2tR)%v}-2@cyg!}KgzkFC+=i|T?2--vJe+Kq3E zFS(9g0bgxtgSd1kti;a6_2REXTg4BH>zqS-iQ{XqaXe@j?BIU(guPAt{Y-Ly$A#3m z?}ownUbZM8{yEHrr%SvWi_P1Kd~ED)yu{AfDQ*+T#OFhS^bwGD3 zw=aeS-yd3sgiHLjx_P(w8q3E4^z&Kv^T1-){o=_4%#W*T(EmFYqq+Amz3u>ZZ%FG; zh(qiapLVDdUFyYuM>wZgV*A2?_YA>4^bc=_Fr|p!k-v(&#%L`#T*4izIo!nsAEmG9j_U;(rLq{)a4!XHx zE|^&$)-B8skM#%by*-bKLkrQ~Bg662&v~XLeqI0{h~{*|LUi`(5q08+`7Z2m5Skg$ z3@e{7G2VU1pDDgvfOyLAR`KVB(7~67W7GcA0=o$}Ba@M=fgU_hSTl*dI~>_TE#mM3 zKpq^?h(v}s3P#1%Yn)YR zF&AQRdGjbll)y~TeMsEA5M%Wr=GComxZW7v+#s%400?uhvRm61+pK;RI#55#b{(=` z6m^i)k1V@%Ap$=zu5~c7b>e5MS$tk?`-0*Vm@@>PZ(Ri(c!aJ)V(UuuVSnX^h>7z{}qjK-F%wA@;a{xF|!!HBA)z<9y;d4;J#c4C$yn?}4MXb1RHf zPz-=q5vPq>s|Ut>U4?u-O|w-Y-7#)Y<35wC{UJ{1NL= zd84SQ6Lpr$K5|I3oZ*~li6=Y(@m!n>PnTHX6WHpkY!q+AHH+gYxB&&nQSh__Ys4pI zHs(#^C|fF17NYCB{R!eVYzuCrVf(}bf!-I_D2~n!VBsEB_XJHfOhy(}Hy$?aEuh|1 z4o%`dkXgHoncG~w#pGf*^*pqdJ_IGR%TR;p^&|X+TmCH1_r+iMam$>Z*#p7L3 zU@sRvnzxF=wEGK-#HoDzz=~t|~q*Y`CQLJbJ3okqD`a|M6!6@j{YtYC7YRzj2_3N1}5TA$h&oKXw zaQ<25KMUudWB%{q{PWBoH+j*rrVepK(F0B-I@1|Fbh`S;;Frv(pMN;m^QCs`&J!#0 z3JMA);NL6H-+Bm6ADHb}kDooK)QiKbTEv5=_`V-Ly3k%;zEK=nRp%Vi=ib5#5iTz& zK&-us-E41k4(TPOaUhy;8K-!*Mg@2dM9W}+jNx#D=?wpjV3xrPXBJL;+#kz&Z`Rb= zRWjgqi_E`1Ptm(SUWUDR8iMfJJh@oci#t}=W$Bjb#ye;7N8)T{Y6gEc;s@bk{EBE9 zY(uO>W%L19G&Vks;U08U4OTP!;=~$e_l{tvbuObePI0v>f}Pg6nw^bn3_A!45Kn4n zm@6w<>Si>AE2)Ir=#$zoYGzSUPO5uSYUV_{H;N4jab&LIXjf#LM@*YLLv1>bkZ4#0 z;`O<53}oc5Ufdo=l(O1E>8_e7qJV`8p)-*Mw%pgHj>OWR3qn3Fq(_yIP8CFGa;^r$wc>xXg6P z;=bqMOIogxC9(_;EY42#x;oyqTGibK97~6K|;TQi(fBO_W=IP zsup-|*K8F5ME-hRGcoiWT_^sDLoFHu3qBv!#uBHu*k?j_ByURFXurfv{%EyhQfq<` z)s%=pjc+j=m{Ex7hNI36_S2kd`H_MmIi>EhAe`Ni z*(oLdW34SCp`sb*PrYO~(%waqVppvi_BX}lRtqe#M6-9j1-BQD)>CVniO0sAhwu-?->x~eBv0Y zg3plwv5?Q=fOrvB_>Zu{ePM-*UC6=;@2zbH&+w@L?+5q_91jrwjuQc+i$U}g2NtLU za_qL?wax%Qn`G|NQxIKQ-74OTs@nix0B1CHyAi&JhmU|(;~Kl(IpkEFBO+`w*KP{h zy~R%>U?iasF7XgH`cKt1LM50c^uTdhJ`)-*YVmG~M-z^SBp+~z{2XF|>mAQ#J`Y==k=jo8r z-B5t{;ceDvWv{ZE-V#rLHRwXiTns``yb%uti4~8a ztLqowz?=F)oDFN>jee(aHoE}4TdbR>n|T*?$mGxbp+&R4adyWQC|u4sJOr0BHchf> z#yzw>IFUs-7b{#Z&w8@(9Gmr|bC`s`?s>sgb`?TKl3HCf*IQCmPvj@gOql4#|Au8w;;h9T3;a5b`y|&o+hv?Ai7=VJ z!->VSg`}#?kp;@uwy8U zH@T8V%K?bK-tK+G9%M@sd5Z(_>9dyM zpgqGLbbv#Q8;C|IcZsQYGwyZbG?;PaWMp&!{*$3-shDvy4$50sQ6uiOKX=amP`OuwtNSoENcHiO3Q`6|6$kFQL( zK@sxuo8M6e(d6exfCGh<-kf|~5!0~z^1OC-aJ0u$1fip2kawlmmj}k?)GXk2I?rtU z8F(#x$-L5xnet+q8l?yp!V;NNGd0KW)#^jA#;Wq*bJr9^87@HPdC^*hH^+#fqP-(B z3L`-s_D~8X{=y<38OB(67FUAHg=LjFMgE-J5^rQvdF5q!XbO5zmHq(k zfKpW>JEj=+7vl0=ZqUa@D$1+9l@4{gPj@BY8I>4LjtVEC{!&4KFeaQ#3MZ4p$+6&j zD#mjPFEc7}g$u{)WVG+nC1m5y_hAq z0~s`<583CH;Ns?Q>7`<>yd>Wf$kjX+d&(;UMY!3E2J}dpE-GbIGm)cftdX}2_eL>O zD3OXv7!g&0y>JIKT1aM=<--z!AFdM+ zjt54)*nw`+AeYNEBCL5Z`O~q!aJZq2Qz{E6RGR#%fV@Z>%nP(ngM3Q+prvRmJoZyB3#_`n(D87QyN&9r;kj2dGWYHt{#o-0tQ=Zh>iMP7OUTJ+?~mr=hn2?=Y@(Ynpa$zhiSuvv>?75 z_>K9}8wpJo>1R3e{Hkku{wXgN-r|DFpch6CCIPG|TcboRomM3Yv~|s5&v{b6MpHC&lJtHnt}=a<1hFm7G@Edgy)slPzF{F-%+o9dD;SW==~d0HGjRr6Dayeo;#wHP=)tme$#HAw9aXRkW43CzEYys z0t{~%R;`>8KU$}+iOF0FhZ4%4BUd_dL5WE10M0`7qRYZ*^GAE8=^02Bpu}?gHD!4o z_(#82cB2xd@WNI!WZ>AeaX1Q!N~CKR5~q&~E?BQ935G3(ViZG9+iw{8%_*Vn`Gk|r zk&;`LRH|ZhUr)pIX`Y2;GYrrr3=y0 zqk^H)MT})=gIdZR5e6!li&xZ&DvVX*9(9F7IcMQ{CRaszt?*tU%@X(+B^0K7nak%3 zd+fy#fdM(`lw~#H8RY?D5@PXMir4c(ix^pT2lxXy`nN0N^|?dyY-4^dLO*yx8BtXhXDN zvC`;q+b4}WS0ouMno}cJA{k-8wDnYAEU@+ms>30kVo;GzoYqP9)ms_hrp^pFC);$q zL2bT{=i=9maG(WJ=nmaD*fmd{0v^0D8{FYnb#R5X~v`7I?xo!-(1#NUl9f zN44!?90AK$RZgX`tX0x`lJN&MOw@Y5=Sh9xZWKO&G)|Vn9=tCKzg`+n z&4$F1;Sx`AHLWb9kOePCj$VZqa~S|Ag=cno0H&zKOC#*f*PCq2mq2NS17wXESHl-} zjHhv@eI7RK#y!g#qm__~SBM1`exbup`N$t|AX(z#rK}5Ob`m{3Nvf#Fi11VfjLiWv zZQ>FUTb_3AW=6q>!DwLdyVd2TxkX+d zgOi#?sp#HS71&&13XpICJTEgLVREo@V?z#1cr4bH5rf8|R{PlBVqH0Y#%|_E_jrM)@ThVeXQEJ`o(5n+{zoIs(2Av!Ny zaLhFf3%1GC4*9Au%t=J=al3uZlQ)Hkb)p67G*M&bkqfMpcr!Rqgq|)| zn_pOiyh^q4kW4}Bk|`D6rm92fAQHKWR@)Nj`^UzL(%ct&&d2KL z57Z#gssyN9?wl&@gQWd{w9B!z!NbG_81%&y)b0|gwA+12;sW47kPzLGnkzT;(n$E> zD$59wxm;Z&P7xJd5#` z^m(f=1`8N4L4dl*R|La>kYwbXsh}qPRzoNGWQs{n!Zu;SVtAU^^_JAAWraEgKD1`w zJ$g7W#;@>}qFwF1>fk5?7XPPU!01Hf1uL%96!d#n1`$N@hGV-qIEsPorRqw3@vg!< z=z4^Ibz5Gl!hY)DL7!#N--JvnYo^iz(iAv1)e@_GCAwwW$SJmnpqFf8*5!Pbn*oLL zI}Rz5ptVLj+q+3QdG?2NKg^(7;5enZdch=P_(DfI#n?8`m=!Q2j3AhfPhg?vgfZMm zZ3>T{T+#8X~_u`VU!{QtkTc&RbYn^Fn*n6=eNvo$ePU$Z7jlWWR^Lu zGd`(4hlOjZJ0Z2+Ea6yy^wtnTWcZv=BSxR$2r{&)c;o3R{mKYUsZ!3N5x87hwY#WB z2O?FYRtzsMyq&`y5-zi}^lihp45q^?{4M#a60hn(Cq%ck)o zAX-xY2fr`LoIGlVxI_7^U>SNOW7=}KN=x*x!f3-y)SO`c&{F=^V4M_7&()r>aTM8S zDv0z(HRbltezT^i=+-m_W#=PU!GM3Vd zi{=d?Xm5~CsbPd4q^%^}GqZ2QW^TIPs%rY}Hl86bCfOYE7nQaN=KfCg4xgyw+b$Rl z@Ixh3kq@;E@|evC&I;)TXqKyZux*Y$B6jIjMc!&3d`V>{BDMw$yJI=R!V3eeqCh$r z6n5+w##cR{hD=jOy$igRrPz>R!=cNHe`TwUQNpzcb)KoBS7B2R8;9T=o!t3qn;LFL zy8_ZaL>kNg*=kTSGqDQDJzze#!(=JLrrjBQ&w z9v*nPAIH+6K!k}flLeUeMKFn2gY)RMa5X+@Bf_Z_3?Q`19U2#X@CdIcd^+Np7Obqq z##isOjYAfaZ|K;Wz7)oMDngW=8D20Xw>P=Eo|YWV1zXY8vnGUmT_u_J+FBp>Hn9H{ z*p^0YBO(rG&sVp6OdzxEY4QKbGIvqZG)gjPQN_XDVn#9RnMhOXpdx1ZGIh1(K{W24WOC z%cydeQQ|DKzGsUK;{|$ewD*X{GS=#+xhX{)C*-(O zdG)E5IcJt0v)UZ-Mpr2A>nOmN&kzHV(@vGE#m8))q*a&K#7H$H2VA@|eUSR0EUp5z zJLsSS877YLJ1dXY8%Z*V6;mD7(1`G)!W%k~)B2>jWsav4MY+L1n;jy8i?}6fy2RO` z(og_Sq2F@olw0G|ff%XY?KVM53b^)zhOpUFZrgNkAg_>y9$TwmINSj}y2Qut7QtZ1V*<6*QC8UPFXGiSqp#FP+}ImOTSV6k z5hGj~D=J$VED8ms5r_?4vXpBn5Ce=Jsw;$W?O`e)2C5e5s<8kxVi7BD6L`i%=3OM- zm#QeoS$f#!P;QYuQAB0960tP7sLWK?dvMrMRuGq8j&DnP85xvBAVY-uK^J!n^teDv ze#aI=o)xLMjxhzA4$RbVY4u6t@;fJ}((6z>5nbW63i&a|$aA)=(QWoQ#Za1vohap} zt~lv)COz^P4JxSa3%1I6c|1|T;Vh!snEr_0!*elL9S|E<(eGJmv7~B-E)uqTqGF25 z?Yf8I`|yP~HKbwBcd9zd^~>W$c@IaTgp`BPnsE%EjlAkYKW_eo$)0gpg_C^Qa zv4rX9=PVUQ)&tC5%4-hTK+t{1x>**!!N$^1K!L5K^D2})P>(QZ=1}$|`yZi~x-r~> zgsV|r7P@1E0~F=JYga=q%*p}72VBcTt36|jj&S(YthtD1n?N$G4Gct)jAyCo1kZ}s zHt1c2Pcdi1FEVSIiKi68wTjrtFzkclhTph4uhu24u93BQqbTfEg*TRPAoEvgIbl%t7;ghJzIDK3oa=zc zc-MjO9x)U@3wVr!9q>$G2w!=y)Q>qh${G!WWF}hZ$WoQH z+p~$7!tA*p8wNyH&1nHQgZ{#t(3VifE`QU4DHddSxvZ2vA2q^A2PA(>7f!O~P{l%A zEmTw^9ox{R82ZR#5-MX^eo?8sDK6X84##Xph1F?@-nCJ-a&0?TE@MWrYHbF`I#z;9 zDLjWbf4;|Grh~ZJcaBg|ypMuHy!;Rf-6xK6uv{&}a(aZ_0L-!3yvJ37%}m(2<)Mi= zp3TXZN|lo@^(ZG_Dp5{;GL5;K%X+@bO%W`Jbf!XGt)@ATSeS|t@5j+FK=S<$<&{B) zFui#sk8p|>ZN!X#XQ~bf!v}*pbSe8y_ktk_tjr8ZsOjZ7&s_Y6rSO%8eN=fKi_NIq z1O46=X1v}$s?n#x!{?I?ZJHLjr;t}0<@UljQ@T%8o{AuJ4`;cUQw5=AxZTqO(O2Ud zdQ4D~lOh!P!ZM-U(g@p1_NZW7X_dDs-<~lCsyu`+%B)Xnb)Z}y#^ME}YHXU$r(K6G zVt;J*Ptpfew@cLvA~^6_ID6)_^UpOVDi_Dg*eY}U4bhM&5K~92NkzN;NFeUzk>~1c z#Oxn=wWN)5hqPKRW#Ka^b)p_RO$T$KE3dF6Cw(D3p;R67;WOYs{NGS*yBF+}kJv&H zRP+Kf1RbG+tnN)JF`M;t0Y*;EaD4_qfR@hhb5@~c@&zpwbwb0uBO%Y8REz)T&V)8s zN`o-D!!`n!^x7zK@h=2cPr89m^^x}pC>dtRXJk~a&D#QPrS(gjC`9MOSGq8_w9kci z`(O=lXV+ZHIUn|uH!LFeI^25j+O;;Vyk{uyvq>KXDp9Fkt5Qs0dmLI?mEo2<5ItBd zl~xgxtlgp>JxZNmV**Ik=OKfNDfoF|2B8XGB-7>wqLTJr?RDgar%n8?QpKm>!RO=N znpxan_;~F}bphvRGMI$56b+UHOUrO8AfgRv#0~1SUkQ=7WACFpC)j+s>5H%s;T!U5 z6A6b&vxaRYFNcLr!sO*pC1!b(+;An|-Nc@>R0VKQf$MCWwJfBbvvLpzkoV*&Fe+#v z;?N!M3Ml6a+~I{92!j{<>7!yA1=V{@nze{UNPR}0p*K%>8DcFNUkeMm_~bx|x+$jF z1oP6IL1%cY7b+JS`eS&?3>a^KMI6OvjSk=SPy*rQDkDK2!~Lf5_IZkA2sWec5Th*5;rRB550jJ!_*D5QOIXHgjW)>yk&woztf4IMSZ*l@>zW+E>o zg+@Dcimc4O78PSyDtgNo<<#r4kveE5HP=JsCoIUxjl6gFJ9e8V9fh{PtKqwI=AZ@h zO3R#EGPP-vvt0f#IENJ+j#`;{*MrV6y3F@BW$0*hc#L!a6Z>}cs-xKumX-Q(C7hSN z^a2!8o|6JCoG>sQxHlkQgmUP!?~qbpZ>@Gg(s_c})g|pVeW5*WXn9fhRq?W8#2KcF zw#m4IJfwqWnJAg`W@KzN#8k-kV@(RZ+g<#Np*J;q+CN-l+AOc(x1bdr4p_t$C>TB^ zFU{HSKVlD`owmJ6cdiWYEL<>syu;7i;VN4g(In#wTxOBh1fj%{*+zYa9rN z>F}GB8hk*d_h$5e^Xx=MRLnM1ty%H{hx~!!q5-`Dn2B{zS_pI38!ji`!qNh7@1-T_ zLCJ9sMRn)nHPgtzOcwTu-v8NaMktRq6RPDZkGvzJ0t1Z3%LT@V1R|GMc(4TH_A;ep zgwlRhmO*&6oPb;7cS#d3y)i=(hj)?*v{iz)im*|TW=T!#$TOz$vaF&~T#?4jUR)}` z8`yMWRCn<5@l1I*96BvGuB6fau!BXv6DA|P(8=Q>Zl6IijuyoXsXQ4C>vHIT0wzGM zlJd1vgiN$uh1tiZ@%%hE5|!$uE-WKOdGc~cgsBZ_Wtg~Z(DH*qc z{4n<*fvXLeLy!P(hfCe!Uy^|utqkHMi~WM8c`GX_aaxA=C14#K{1YvC_~I`H|R zO2_f}kcQ*0CCUG;K>iy1vmA2_s2JHhC1?>Jsz!q;bsPljS^Oh)K8NEkb0QtbXQE1X z;4@XjO~p@v`y>9LrJwQWk76W8;4xk$4dMqV?Il5r`5=bV(IB6sX*m`f%*n`3k;Q=y zd`?wqo6l(~-G$G&D&3vWzo>K^pYLfnpYN-57d}5wX`9cZD&2ukd`ez+)wGY#5;=nS zhkmTa;|iIaTaU-BDtQ+kdt`FX6L`F(k{{x6TqXa3#}6_&_uqKfXuxvJ?Tkl%nG6le zLX;ksh>Q6k2?~Wzaup$zIAn+8pVN`J(=d8Y1dL@P@GoM-6Om29zsM@%B48{_#lMIu zlaZZ)IGA|^SB4FGkkrzIO2b-}R3r!n-WOqx@;{Qk9n}Anc z9e>;xh!{00wYbzZ?mGtDu+ICsyn9$g-@G84d4pJ-v31k`WYX2Cc3?7DU~Iwj(?WgZN^e=AaRz$U8hlc@s+io!6$?GY*fTy!4a4`sQYDb%35ePGij z`l^Us2t=iSrr*kMWisvXTgEyN|El|tI{0dlh5{HX($;uN>XtZh>+z}=9xTOp7%WmT zFxA*P;0%${nfa>l>!H~F4$}Y}Dk9rpOW-TP8L=GvN-R(9PE(m015gQBg1anK0N8a- zA1#hCg&M#uYue%Fg$m#tQNK*{(tl~}muXpH%+B^N8(Ri~y99m!xNG1mz}*604(=ZKvNV_< z%c;@^e0~?$THw2)kSMrCp#s1~=M2)L^-ZA$aD`$*j!<>*$6gkH;i92NVm@@KQ7|d6 zZtx9>FIZ8*;30{R1+8BRmIT%f4pP&HiLCoDbS=5qqn;vdcolB5K&$vF5pxH8I`Ea? zl34D#UzPlnNV5N^5yViP{wzB@A$bDh_jEHu@X9Hgjz90BX z@Pk+m{yFf41~dBC>-|Ld0Dpj-X<1^-qF4b|4v7`s`j=EVO{6&k+-7X;gM!xr`;Gvs zWDRbhqM%p@psYleflrE*6aYhtiw+7quS6zm)uYD=VgBh2%d6y)y9g`D(a8+P$5qvYSu6VM1Tv zLMB_9mqIFbm$+x=B0@ev#0&(-2fiGYr<^Z+Lx5H!GIYk{BuGefBTgt%e_p@zokueJ;5E}TTS9rJks^D^w@&w!q3Kejhg$e+NofEgSN)8AL-pW=IcM3(oA;#7L!$K*5rzAIw$VDR3 z3|<`ga`3vqSAd)BX*yNlrvqOB4h(!bxM|=EGXvjW6{&Lo)t&orn@Tq}qvGcC4VB## zi~#&5;krc^MV+R<>-EhHE-Z=f%H2c3vuA9H#9wzV$|^r~A`$|QI>096!oD!0MO1)a zI51YYGc2zZsk=a^Z@Z{<_4=Bm{<2Q>_sNh6_r7qDHCEMLE1VE{@LZA3>A=&m_+26G zrE`^VUXAX+H$@5!z_T)lW4vGmE(pcIl~&x6xkmU(CPG77Y|NQ5u&1yO9R zO4<~c_T$XpjF$0@N>}|Lgr8ge%mLJY#`-yPK$_O;V$0yIp=E$>$9_(cWl6Z-QZ0>w zO~>9$z-eUYx<78&z{SOIQ6G*)=zSn7K% zGz=^>whll&EETw4g$m#=g$lS$0X}QG zZKJ^>MJfiilbOysqrtsJDhBXIaq8?!b5;XHXQPVFYH;?QgUxCb_(PFK4v1}xDz;IR zv@t4e<3%}VN`pIDl(pUl#W#F5letHv0icbah$v1y^pzE5;HKsw3j}9%IKxS2XLa}t zT`oEsp%6w}IBnJg{Xcrz^|qc>6;UQdGbB=+L|0N9QkVs>T_@9T+M6M54_msj0KJMe z-WZ;LX`XXHw4EJoF-Yz(QKkj@_;umUB2De@3myt=SGh~Au*Oo8;T{2&Vh>T0rpDZX zb3|(PVgV@?drgdVXAc)x}`4#PlO;p_&$kiTY*EnAZ+-o%yYPS@5sG(!>+y zws051%nM`MR>nX+YMQk`oRDP%6Q^|H4!$m8k&+Wyk-BG{VzU3D6=#80 zf=1fClhjSplFU+ida{V#gY_as1iWLctrc3=l%j>;whp&LV%EU0S_+r$xSb`!E%;^g zl?B!@UpZ3sqIF2CUl^Lm7MsYWk$VC+l;*CYqz7KaSo*Q+=X3=kQduD+*VDYEnk1_F zlz#~aSWdD4jcPHn)Fy}x*(&%rL`{b!(KZSU>!6m{Uky+Q7=^0# zIdVML+NdiwSLfYM*YxYLcNz_MG%WTiDO#waTST1S!M6fm39g9c;EA6%ol1B0h{|3N zDSV(qq`@nDTevC|0|%H@@#!5_Q8j~VtaqoGR|@r2?So}YeW%-oqJye-91O4qs@g%6 z^$E<9d-Ms6d+bTSU#7fx|Iw3jS!VrN8x>qXq2}p&e?24P37L1@We;JD!kTYkwi#Y1 zUh@XHBo?Qt7h73zYsTEmKx}00CJQ89C1U)*=K@~^z8K5Fv0pHqs?=_g)mODYU#KrO z`z@7Guc-o{qVY96K(15_1h2(?$gP-%Yx3&#tITax`}*=#VG&lfZzUWNd5^Z#uh)ab zpkY7i-elN&($`3i=+oX?@6!I+1_kZkDdvwwTEhTo=$DyQ(eC-sfS+{fV?{Y-Uay&cNPFtGRH1a~ct3GM zM`=?NucYa{LMcEL3TRDjD3kAQ-0m9FWH4RC+y!q7d?k2$EC+uc%Tv4St*olOSYMpG zvsBk6QnWxYFHTab-5k8xROBsFJRqECiO6Mgy*NVs~h(onk62(KI z6d?8_r(Lz7obIq*yGOA^2EP%JQ?OyU-8L;TW`YDN!1-R`mS`Vi3RUf3jqz<+S57Bb zH@c&`)15Ue^clQaq{RKC9VRqV)!th}Pw3j(o~^c&s6Okq!(AuRiK{0ki>3CWsb&F^ zqSZ>MQ;aQa!Z`Y=sBdOkIaTBqJ`;~+s(VkQq4uJ6q%uI16m2VwQ%tK4m?_ehdsHSK zR1R<32%ugGIVG+BmQ~jPPa9hc z{8-+2)>6|Bw?w3I1KuxG!2LN?03Q}A;Akn?m&woxDkk$_tw=EeGmNdBC%7xHzz>Yg z0t6seK#0G%P2u)65pKbEL~;w@T3sEDGfd&ZmyEA!2j7h4^rS1-A4J#Sy3&aepJZ&! zRf1asn>xm6SI)>Pae`CLEH_VpsV)To(u)R2cxuk0ltx!U;%gVvtOX7ish`8J`a>x8 zk-k-$|0mL|0PsVRuG2HRXJNGZ+Gte+>xyCx>?Wbc-7tx;RcP3S+QN$brfPm5S`3cQNSraulofp{41=k1G{U0tdC|095%WA6uZ2D%J%Zf&Y#}o@yb&FN&PC~de z@Ri`pu^jwUEC=6<<=!wp9u+Acz)Qx~0a%87z`YqNfOn0}0(k5Ei1imL`F&9ECRRxN zvxuPr4>-*DO7OtImx0&B^3-lyl`#PXsD!rQjt&*T1%(Q@1)&1KVdv-w<)0#*ih!L> zHwU=)ns&HJp#qp8($(hVc9?TT{^1?GH(k>XM|;Vf`TPH}F}f3yRYM1cTPQUEDblI2 zj0i(=YCOYZRkZe9b?b$)zQvqt`U!VD+|DM8jM+&70}kHl6{+RVWTBA-I*hFYP!B@} zS0mE37=Vw?V@dOWH_IBpEo<80_BG2I;QVM=(++n{r~uq$P2t4+Y-g7n6)f}Oy7hB& zLCyPzpQKanC)MD((kX(UMg9jxG^KpR%P)-zImYbkhi(-q_))qY$ z9yITynj}FeliFe)P)Ks`3dM-2JVm6K02Goy4wiUSs0BtETLT2e!mfIsitZONQNT|f zVSE+1Mc~W8cVoHd7rU3tPA6ti^=f|;!Re-2)qb%Mvm`96-i}tN2Cv1d1M2a_IhFb` zkq2?BtJy()%<bMs){$aYw|-_enkym>dEWUp7sz^`3Bv^v}N%YdTB9BU1Ww@ z&kXpnNJHzIB*X)9N0d?jEfG8zQ?Xw$6+LOIyFW;;meW8Og2SWtw56^hNp-P7UxV_( zrrpJ;ny&nKkGqO%87Wjx!I&VLt&AapJBgGxpmcJjnZOJkyt%HT-KXokb)$W2u?J{u zCsNZuSOUenZ>mFCaTqD{Igk)9 zTVuHo3wB#uSylU>LVd9Z>#J-JkxsY(D!P_6#8q-0M$w1$a&1 z%fagdUj|-ybadnsfyn-5EmgJ8lfq>pjqYEgE(uFjQK2kRy|x?G&7vx}yGVD9KvgUT z4-Lh@7h^GaVkibqiN#=3C}yhb%M^1c zl7nOcQ^O3^T~R3q(@5QE+o$C!L_DIwFbDAZ3|xV481jtT4u0y?6#0DPoQpzOVX-$-$9pl1y5 z+XxSg{5`@|ik@M7HWpQmSVMr8@E0ZGfs9X6 zVDJwMUyuCXg=-ElM}U_q7)(I|Q~n;-D-)M1m1~M`yCjz(s5)Tl*f;?Z04~TF*@9=B zSI<-(fjlZg<#J_g^`PpyN?Imn#6Fev4s`m6_O!x$%`yYNFVdJ@haz->Ku5$(|0yz%wH4?3p)(AB19nF)-&ao7rGw z0R|*AD&`&$E`7qmvsiq@e8FfbmhLj&kAnw3C(@Y=_*i7_VbVcmB-JP1luU+%^(?%!;!>*r?h@rqhj0izz3E#o1QN zWf9u~VRf}r6Jk1h*s6UaD9(%8Lp1(}iIgoMY!7WCL1qKq!MsTA1DwZk4qj))Ss=`h zwvlWmcgJ}HJ|~iM;8NR6G!+U{sBI)uiOT`00L&=b1jA{qZ6tVOEdP#h_-gx5_owFL z<9r$|WKO9Mz%5qXmIc#k#?q&Ga1Z0#vY?+HedQ-Zfx54J75_?$`gxJ&77#|LEen>O zOO?cIdNO6pW|SxgchMN&9SlQM4NS4(wk+s7cyWQYWf_32Vy3|%B4rmK@pw-!8pv)~ z!);mL*`?mya(-0{mY~3}hOXYbCa}<0Rrq8{`Nb6YzDWBm5SC8Pht5oW9bsA=ye!v-r^GeIh_S9v zVV6!vuhP!5HGaxPg~5AW1YfSfn`i@B)$W@%<-SkDvjl5xB=z+PMpC4n12-C5Q@R9M zZ_@B(hZFYbXRWyA3mWx0TWU2v8Km6xV$8iO#r0(*a1*>M+ zDWu2G8U)hY%V_4xntbafzvDi=v+&>Yuh>WT zcIW)fl;=XwcMP@(&car%l^%BNs&;~4L!g|^Ae~IUq`gseSc`r=R6Lc1d%v({>P|=7 zWa$LHUvd3br1gT@Z^DWKUKaJs%$(c~vqDrD`GNAoIZrlzj!Tvs9)D>bYk(!j=77-u zwvlXl4_n{bM*4+;Caj%y@eL2|U~SX@;cBgIB<)=gih+0uuRMq2duk=LU5$h7OtTum z37_4Adx+Li8~t}IEBe!DhGU7k+N(6Ufe&r}OvT5C)U4M|_ZT{ty^AihkC1DZeOO#B z^=os=otoetO>lQ6xGxjj(Q}%2AKS^Qj&m~0OylJ{xmYI7K-+`sfNe!K@-Taf3L~F- ze9t`A08C~(Co!8hQrA13piH3QuUf-305MoOQT#HL1FU;1XFhY$W`a*>6Fi0&)$j)v zLoLp)7is?iXn?T>ZxQJ=fve|fuxV?FDA}eqP!ns_^Wxh5oZX^@wfni`p~L5rwfMPq z54~^ZbA@Lw?!yMjHvkj-oNj_IX%pO!37!Hj)cS{Q8}JJ?_Jwf6)s_WYLZ1OLrRAj| ziigYwnui>adN?|&f_Ou)r9R zzLUMkL(&J{9!a<+34JMEAa`@U?Ran_MgEblsd@E4wwSUozDiZcZK*=?uM%E~AFprIf}a92ZE5J0NuoKW(O% z1-Q9U*1^r z140wg~FJWbA1IjFKFFO^QDi;Rk#|q%i&MLraR6=N{01xn+h4V>WtZ+}%p@WZ1wc-)PR?#>dH`oIQ#+oe!MsneE4EBA;t z%1nDU(|_2ZJ8c<$wT2cqS2|0}pI2GAyq0HX#h<*nP15&8>i;*?)ZNz6ERlU$RBBHE z7l@>NwmSV4QPI_dq@h#EAmx3ysHl^P$Jz$|GX+lYYS{arRZifKT6g@nWjtl1_X_pp zs?Z;R?#ZURt{tZCo+v8*PK{?AU*20e@NSCr{)x@1n|YgNg|oq84Z@2e#ax_2g<2+V zIzd|1J6c*G{BGpw>c^31W-}SkVQMq4;prCB6P~`ch~UBNL~0#)+1Og3p9T<(t%SRX zG=qV`vG@q#cOw5I;V=y;>SqfXaQNlIRU(;^13FJJ3AoIXPz$shn*|;Wr9fDW-R2?f z%g2h=BW2pbgI9_486!}-W=hlATX+6B@qf~%cKx2*F#|pbbA&b9Rc~HWIUT2d=QtU@ zEX->{P|hOQBTfJ&#mvYv{h1u-d{3BW;*gkFCjF_A2d9cOVSu^D=71MOcwv^X1Hc!D zA$P1M!o)Z+&K7<<@(&6-BF}_jC%_bB#;76So>*L*8#?=j<7Ra^?8tS+6;#J8-_4?{ zD{jI%i+8rMebTK=a61#+veS0z?GdG$!n-BB8^U{=w-w^dxmnz4LYz4_QmNZKQ?RKm z*6QLV9A4Xftgg{rO#L-Q28*;r34)Op>;AV^%@?dT3$W=ZHm1)ckyvICGe|7vdzg6^ zVD6|C2u`z1a{8dsy~fC|NMj2yHB_33#~?K`+M2S3ajV(X6m1GuMkw|+yk587D5vbQ zitR^g`6t$TVILw_Q?0fZk7y`g#1=YHNFA{;$|Rly&~x~%t^%%=E~hT#fW^bsnxx}y z)hx2wEbu2|Ykl3Sb!>Jsn=HT%tx_O(vh@?rI)(7wl$Q_8Qw{KuNMB=E@rFKkP+u+) zXV^g6H2q&JlGGF%6z%wgcZ1I#>Sdq9Q4DHw` z(yrKIn}ufu8>zja)@BV#3r(?xON!qGHWLpNLvXbOcd`XnTMVccbG9F43-b_LAw|_P zKf&6`0&Jujm7;lJzJ5wID61Ba-!_jqJhHDPBk2J#4~WQ5&hC?Pj|tv`g3rW*6MW1# z=l3o$?wa$Z`L2ak%Le~&=st7tI9r>w#mh9iHf0hk6K=jhrnj1T76_hlcv@tha(Low zpbi#2<(S_anWrqUxv@DQ_%E!aAIm98&}`tm^J-w3v3OHyCLV0SvjDprTf_C^4C`@WRjs)eHzA^`_VnV@TlRW8DY!zX6WDpmT5{3%h7DrvRtjPl z3#68nuu7!q(Bs9LH;dDso2MK$oUfCqPtB87n+3R5P;IfD!eY8uHTPL<4Q{4|{ib-G zSV$7>eJo;ec^`1HcyoKM?%MSY}bn z5@Q~fpu6FL;7IrW1}Gi}jMwq9x_062I8%W3+yOACNs%MFk#e>Pc zR#b3^#yl&^0%3j>l6{zp@SVJ2d6?oGWuaF0Q_X})<`UkM)5zCV^nX@ch;ETIek$TI5_rS-xDa4&6j1>#pHQ+wu)NR| z^zMRiS>(Zr23~1g|L{KTaLU8K()`?Mb*-$$GOEKo19 za+oWuymmV!Yj2UJ{z$<|#@1dUxH+(%MFJcw(hr80V=znv@Aa4vQ2M)!#j@hJ#=T70 zd+)B~o99XSn`t?nAy0hs+;!4#p>LtOy+!IknVR2RB$h}z0_y>y$fUDV=ymD|T{nTQ z(0LO)sh!TWZp*ZCQ+T(8cf)k*Z7Hubqli3=&nkrDL%fXa>mt?S=&;olJH`8sR9BDJ z{VrE68c9>5V~@235%iC(wy=DQwYA0C!p7va+R`#!4ey8kk56WL=!O?zGFRkDqP;X3 zEvh>&nBega3#X8mVuK;YSo;b~Tkw6ugVIu{E`D32D=*T>Rup!FbUwM?Vp;JweY~u6 zo+jm;=IIKJ-k(Kmdf>>3j8@AcW3m#c0Oy_-E4=khRCtg`!vq{FQl`tnX`vXXl^Mk# zE|T*K%|)v+u+FUN05oM)mbNuW<%|nB#8k6D2%#1S!K%1}dRUrUFRA)9QK#iW5B3!$ zzod?cS@EjCBP;$`xCfY+rE%UabK?AwkS5{(A#Aoj6{GX~QBNc2r*=Mz@KM^cHQBx> zeeKL$nR)M$#kM9-Az|fzYVXR|DQf28(A3`Q+2?I+YZ&I!0_!;;UALNI9g3tOxt64c zj433Nv?{Ow%8BAw6@ATWYpDrysj%+ntLPjNvlToy@a5onfv*715Bvb|lE4oHr%$%o zJ-;u^OpzQ71ZM?)0607F72uq}mxJ>IUk3i`{OHKLzgXU%7pa556zS;tbbDBo>2jgks>2EkPUXZ&Bue7)BXk95XYhfTKk;FCbGi zpGNl|%DQ)yW$HcEt^3key1I$RkqX9>K3W9~-Jt@!@{CvkbGwKNa8+}xVBG1nnZtxG z>-WWCm#u<6j~8JM?srzSfN2#`0si*vSOK%;+)x3&IxkkhZ`z%aGd z+e|#VNk>O_>F8+fCLJBE-K3+VHAzQDYd7iWXzeB)9j)D@qocK(bab?Kla7woZqm`w zDIFhbDUf<_9a|DvfcdAKzHOOV=>kkTYvLSu+d9p#n~ASD6VlX&byn5RRS4V5IU3Ii3TU1A@r$!U6 zWF013QAcaC{dBY@TTVx7vdwg~CR-iDu*%9lx5$l-|>v`Eg zYkFgmMsV3|eR)JwGMIljJ*-)9nMm^qcuS-V&z}eL(IgXAw8DHQZWnZDa>?n5HBOh_ z5XpK)E6k^KdZGf{C7h~Ow0>4h+_P5LNHk3kTHqBTGlx0O&gOc>RX8S`+*Y(+&dJRM z(zU53G>w2vb~E?nnc(R|%ku}Hn_oC@t*}vSQvns=?IN>=c{5gkhny2DU?O;4Nt|*)gm^I6lc7gyI0$r6SBe8OAM`C4nBe60aiIv@r z#LCugMq*_;5-V*Lbukhv(-pO{u%gy55-YnKiIuIlcRdm-Te}$v^|0%aSlQamNUSW3 z#95l}^F&%RKwJmQT7O-fn&o~$Tc69rMtzl)?{uiYfa|Uvesk{ zEo)`oEESo9yEIpRCNd!t59Z3NB611FtA*vZ2_B^7DedL0FzH&|cv`RkIlr1xvT&EL zHeKRcU2ZevxUfE#x5At%(xw44i3kMLKWz?flcl;m-Da1klVZ6|io2C7?7?{Px!ktg z$Ku5&xQ#}~;)VIS2n+B7uYlQ4r$#EkYeZ%N!+Dd6oTgE;$ST-5ClXm>uT?9q=HLRlw|dW~czih^zwU zm$3q@2y3jP6@~>z)9m*bNB(u;2a(@U7d4xS&;f^t^l1Zdg2)_sscPiY;kqa?5zs5n=6l}IjqGmzLoB$gmboL7AG}$W)>3) z9_0KcQ|1@5h+^=sp%~au*GC#DU&2AvrHn7hL4v!P* ziew^XwGEys!g8kY!pL7M^zD%y@rF35?h*R#$R;=`D|fKf0R~tM5WJw`-pGF2oMxm&{BG1{Ie+pzuDT z19al$Rz$6@qeQUk#4__}M64@59>*AC27rvigPe!>^v-uh%6*$lKhe zuyVN*N{SGV5y=4H@;#~bz9dDy%9A2r>`9TY`J~8~ep2K+KvLunCX%9@CPlL-De`S0 zDe{4NQ{4_X895f~p(33IiRTX@v8)PKLvnKbST>*0c`-T3i^)k|OiuD* za*`L5lf0OmF*(VL$w^*JPV!=Mk{6ScyqH{?7i|mS0qtH|jGAyjd`z*l z)stgNo*5H7EhczQOz?!5;Mp+2Q(=PV!30l&37!EHy!$42-%aq2o8Y}R!Mkii+TRbg zM%aWoL$g-keVxF2cj3La@ZMQ??<>4_72bOa?;VBruEBfH;Jst;-YhRBjo~ z1cpuACwLc6;ftT$_)d=UnsP>N(CI2QlzV32yIZxM3VljA^V5Z7V9`}BDF38ucvL)Z zDl16`qbg}qg{nego6aBY&G214s~G5O#` zk**Pe8OG*---~D^od>0@zc}Bz18{DT6DGl!WbdC5@0LN%15!!H+jB!mlVgKmt4ONA z-Nx1|7j!i>tCEvoX?Vm$7g*SbTH`gfg2{pPIBwFod`G1A&eTbUyK1rSD+%~pQu?Jx zZ+EzD=FwQDGq{(Prn;-B)6w;od`QWrR^xT;o>nS)T3r8$M*Vu}f8DN5$Adq$*1a8T zBT?Kw&XvqYMz;LpeE9C>uMbzM>t*<6E7Ixi{};DW#oX=N&bGYzlpWILIiPQ5-?iF> zSmwd^;AC6|C%y+K{st$rey}a#a3xuMl|GF%T~ceaGw!FDszqApOqJ8a^7ol=mTFet zjMluNVDpT5%%RBEmplfd<~LTG1=wa)%lbY_lqh~#HP={eH9+1pAD6XyM@{g3!30`k zgEOJH(^a$Kkvc0+d*Y4tZ0u$gZ*S>SwQtNAQHc*^1_ zd?cSOes-QsKK)KUwe~c0{W8RwZLU&y{t-#~5|R6)KE74aMT@to_63ppOYI$^r0cIn z-&)dgMiW=>wgdNcOx4!3WDpAV;cZ zjMZiVo*J7&?(2>dnLy&PH38;LkwOP}vBJt>g7Yj8KdJ6$O+JS1XiYwQ)+^S!n~5JR zcNE^=GG8A1mlRTqMOVXz;?IcmF(mM^NVERFH^Qy|NIkq&O={PRuKY*ioNRIC07BO9 z2zIpUcLa(1XBKx3Aa1YXnFWEn?9uys5=zB#dmV#&Lla6hG?2-s>R$VZn&%@tGvSk@ z)$CnE_FkXNi6yfCjYuO5L{}ZHuG(pcK8zYtrv8T_u^!43s(n+Wjco-rHqWcQme|`x zo%-g5NkDU@b0y|Q$Kxfogd*T%LBEm%}o~gv9WcYs)bT|#T0Y6;X)wkGtqF0=k$&rs^Q(*pKRNFJ5e_`d6Dda z_+n*8`ub!?`tYx#)n5wfG+l9Xp}DEy?TLd$+BbM%VtHWG#@iH}<{WU3vAJ){l-Gb% z>Muid@2!bIP2b|$lrNQ;EGy?7ZXSufkDW{A~hfxNLf-s<6v9_61NV<#4vVQd!Q zy)l&n!D$xYB_EYCWL!Ro^?nn?XU%^dFhZo$Hyk_HAOdt{@|v!5%(Mr zQD}21_OhBLhgjr=&5W#^Zi+czrbzKs>VlW|Ab1n23xIaf4@#F zia#{P8qZWwvAU>OT~sUt#@kpAn#Y{KfTc)y|BA&VmeF95i)9+IuEcsf{xX+MeRp7j zyD-6>nBZZUp7l#FiT!4OBD;RH?G!rcmu5(;GG%m>C0OEO;{7$%`Iw=H*>T@UbAp;kDK|ukX~;`(?|UVw%4IuBS`j zdxqMi*dFYFZyH<35TEniD^llxrQu`0>!lQq^qZiiWqSVl=ev?0E^%Fz&+Do@{jrkF z1!_~ox9bf9U*1>PFYpy$S>OkN>jr)x_@byEKUxLzyI27(4g3J`<-k{fuLQmv>>*zh9r0URho1DtNfIpCUD48E+MC=h^7mB#$j7;|@h`b?|`>qYvyAds4Q z|L93w>9~^{%E2@-WQ6jrGDA73p_ilvq??p?)!jAqBAtWx zSh(3V6q+ZIH1qGc#-}!jqwdvQN&VAh+VHxxJ=&#Bulsk}4_&KHn@*eR&h-e5KV3gv zI3w~PJAfA5J%V(4^ovuXRd}!scvU;|fw`bv!KVZs$@}6^Oi){hDE54CKz5{NjQu-EmwRZyR+m}jx>WU@gN|9JMKS=t= znoSl68LFeXKUryA(NkT~Qyrc*HcwfAJgD!$9-$Oq*HEc9)hdUiJ#Ic1+u|#1Eh;5# zq)e>aTrGWuOY0nX#MnCauGwau1RFNUuvfgxtUnE66;1u zk5?+bu(I1uVIgj$o^n0dGdDcj86AU9b>n$Iaq6`>Szjzt52!7-X6R8|{;<{K4 z^J|gHfs?L}FC^FnuiAs`lH2XI~M<`CZ`(1;m(xgDsXi z;GZJJzGyDYp4SAO`)<_Bs3P?LDQy2*;KAd*5e-fkGh2kx1Hwlm4=xdz*CCo?UlEz` zpqS@e_=}iz7si?$#jFzHYpa`NB7z6s7n%8uH|s%y$b^T*9C=&NnkPKun}G+97n#y7 zcj!0cM4D&7@glr}r-)2vy*rf;kqI}8S?t2q8ta(iMZHS#%9vtsD@$<=u#K`R?~CWc ztVN0!&-E0WbvHR)JU7Yl;<-tV7tc*{ym)Rea=dtMlHek|JU7Ym z;<-td7tc+yym+m%e4H|>ZKL)lyq`9$TF3e@29EdAxMPbZw z?wc35iAW1K-N)F^t`(`6EiK)ms?}}QHaJD3)`2sOtpP4Dwhs7)2xagAE6xJX8CwU0 ztW~vx%nY>%kVFhUnJQ)vE8Tol%pOE)(FV5?DJFp3Mj8MKM+1By6a#EQQU*v98tD+M zo~7#2EL~<WPfOr0M0!obcu87LEqOke0K|* zCCo_$oiz_uZP#6`U7N1@{rcMU)@{7YF8?ojtsUU8xn1?!D%PgwX0SHhHUsao3IFL1 z-*~zH4}nMtt^B>NmVPe&Sy8epfB7q!%nwAmi~Gkd`qvJ(8VhV>Y<7g;q)<9ZaCTsQ zB4K{Fnb%^zj@8x{ZEA})wQh5X^uJ*?btoQgHg&)#QQyprGK^+M-mM7ok7kwonp(O` zq?mzwjm^F$AO@8ZFFwSk<}aIhE#|kIVr|i;wrEob^dag0%52Q}U(6A^H`1I1%dV0i0f=q%sqU&ViOUY;AvyC{dBV0N~F@g1f0&2*f5`F=Czpr%xr3l zHnl~YLTtxLzus)j`KIPEi{gQS_1K8(CR5Di4J*A~qSVa}83m1bUz;`hv^8pU0#ox*MRF<0tMOp(sY`|3DxJU6c1=#&H92Y5|61ZfMqF=Ej~&0`kDw@fjM;%&Cu6s9nW=b2(1 ziZ7aC9e_>W%(OB$g7@y+tGZrA=>{)fqkddVv~@4(GV!l=Az24xG&}5lK$wk0g&yuJ z;TVx@&J%EtA~yB7LS9*!syW*wqzlii$Nw#Tr+9r?-K*!BTaouRYPpF%spL z*&MKm$c7DOXHlV3=Sm=>8Y>=eu$Gcx!{d9FrYwqATWuD_?*%q(dM9hTb~CNpokZFn zh++#Ix_XHO?sYV1+}tqk z$@mSCw>tBfMe%D^Yj;7v32fSQuM`h0c&sUUtfA@Pu`tkwtEg8!@DTRbbGiHM5nb*} z+TfSpLInWh&B{06ycjbrM_=W z{C`rrLlXc05`T@_pdCMYs((Z=bcj}nhJN0y^kL?Iu>6JSKO_JBMC+8av!?nn(j70F zD!Mqa`%jhspL{M7y(k*{g<}7^EB~GJR*ANfZk6Z&(TK#Zr}|5zd%fs((a#gR?#llv zoo$EdEF#Jd*H^ei^F@A8|98>N!}Jv&l^-hVO7B*c|48)V2;Ea2>ejk|?xy@hmDfu5 zKG7mkhiJLTj}h{b6HO6)J@MCF`QN4UPtnGQ>7zN(fuiF?7l^JA`O#awXJxa|;d;?o zbhF5h?#g#cbni^`yDMKRowr37AE76DB0qXl{;h8G)AEgu)aPZQDp9M*kM7EEmd@Wq ze?3a`PqgdNdXg{tk|-~lD7sMO$J*+DB-`v4bxCxL?gd4DbXUGYI)4`ZU9{auUC`C& z8bfsc3A$nz-8D*ki0C=d3XvcG3A@eJUT^%bNpFaJd{%U@Xqd>4?#k~xR_|+y?ial% zdU&)xb~sVblSG$`{P-k#OXP2$eDvgRO?v;3k9CjJEw5-pkssZaKPjE3MbC*o5?!t_ zN^|-*T`1=YS5-RK{~P)rbm8CQOZ~1%Z|mdrK7(iv(IAl@-IYI~M;X5m{YvzF;jxC+ zkNA&}HCIm&F<0x=_i>_$$vo|?-u}wdL83!Mhl~6;S$tkJQFOX!n&=79b;@Z@SIA!y zDf30-?hW^R=_@&;h^q8-ka{d|m&Z6B; z)fXj1pA#J-@}sAEvz0yn`-{wwd^qJ2dCTW>#l zs((ecuZrFjeJnbAjIQ@Z{@=IVPjB_sIYoP?i2q}q7ac2K6Qj=ug^NW?MX!iDM1Fiy zJO5wTqrarTo^qqlner)d7q^AFSp{}vvcFH^uM|5&wE{plAyb|8vp*%cR@)R*(Ng$iEQ$ zhp6#1od-nCB0qYn=iiu(pRDyP;1lSX=#n$^Ym^t*s`F zi-@08!>|9-GQJ7tKO^hE9h;jUelYfIp&y&b$EKp*+PfWXAFIC6FOT8+GxQRgXgBq9 zn8^E!Z~x(2|LLkV#g^vff7Q;{)t_5M{zJjTl+%$SKYFU?=XLv^9{yv;Uo{RNiarwg z(Np~h+45_QsjQ#s=^ng`8v5D|4qOAjA>8t zu1%c(X@5s3K7Q6PC*t>!_{|{V%H;T!VIuZ5B4DWd738A-l-tH*EB z@T2Vho8ul&cjc!`cb15so8brC`3aeCi5?d5!!dsJRu3QiYz;pG!~Z|<-)-?d!u|DD zk6(7--^;MBFA#lM#1FIh(NjIY!t$Z$mU)Ut^oWRGKlfi(aXCE}+`-WI(p;^#{I=&c?;_$d{BmSmQQ-}b;KKjbk=5%FUZ{LH@p5XBCf%gky22@3!H32)~=VRu&-?RDjUO?vzw1ivf6 zk3oD|>uqNdKRw|`Pxbyw3jB%!ztXVhnOespzMTC>(R(8P`3k>Lz?k{*N$vQF1%3#C z?}5K3T1UPsMSk>D&(AZI&DJvk5&uwz@8q8;x=eIM;-|NI_}E>z}j_-aA6m2Hr8()6(R*&z2-6Z1sTAvpU6Y(uAKYFSs{$(Qn?iSy; z<0~=#Z9w)(31>tdbTM1J&E?{WFy%S}yR4qqj8d%k7cRXJq` zOP4;pB;w0E#Ngi*a(n+`67_t6X>IG>KeqVyqq}mx7j&bD9PD?A_7D+m`f*HBzx^ku z=UX&~i+D@>4zlq0?o0zwY{M}1`@zOowuQz)5;qA=s{Pa{$ z47?G_`ll^i~f)gV*4vr+Q-G1x9=I9}#&>9#3!e@N?A~{Pa|xuGPER!W)LUo5EX@{)QcE*N?T; z-{(s0+oB^xV@3WJr@zAKeyO`aX8s3K@`o4?KCH^uU zZ_;sY@#EjoUm^d!@w+BH-pb31_(IME5wE@R#+|=z=W(u$UQYhjbMCbI>8E7|ji1vbm4GeHnL!hqW(=Cy z&^*0yYEvg6ue#=j$>;}W+T@nZpvI;~{cUNOt-li_sA}r?`j-04poY`(6PoL%G~`bk zFH4t#MZUhdxqeQtaQ^ghQj_!gDUIXQ@Kia}pF!42@Hlq*^vs}fQ>RR6Xj0|)hOsjy z%DBF1VuQ+q*w{2-s`K?@$2K?2bZK&9Q-kwLfU}dQsr(1b#i%kr=m+$$$o2jyy?;t?8U^uiy~icH-h3^P`HyLgeXvwl z8TFqO(mwIsw@f76gAwB4CQBqI&6u8^gcJ_1d#OZk@8>d^F$JxnkL4wLmrL(~UlbMH z-^vob;S2j@-l3E6aJ{}_oTqBgZGAG^Yuon2>o$sdRk7mur}|_*9`0Jf2fCk$dR{Yf zqrRDKNLD=1;n=A}ukoe6nH9T)I{v!er^F{|&73G{h*u_h6fu|mSlYi|X3Q3Pbf<## zR7uwv6Q+3T@8IqFW$s5Q9{B0*V87((7o%fO4033h{V&L&1@^fh2SxU>AcqZuJuAq} z^sqMtSsSem_8|^^E!L2|hC{!OX~>?!(J!;UA$tc$Kij#(9ueda82dqx!_LOK4>BuU zb6x9Du}Vpumpj)@4O+D~^t z;?Y1RN59Nx5{ddPOJvS+#iL(Fn|^Zi%WRWK*l$~yZ&Z|J-d{zFTkILs`YOM>1=jvj zKSUgtJ=H?$n}v%cpB3eMg~RsNs|itlO;|a|&#CKYcGg6zO5}RU!zAmDBKVWsA^ET< zUx@xb#rm&GULv_M)<2J|e3nV>li4h@9C;^QV#WG@NFJuedwi5P)s*E@?R=G6|0Hv{ z_Lva)FyR8}4~zQeOI{**$0+|uGAH%QXuneO5o(N)?W4aNYYChznM@-OmONWBBZZum zT&W~Zl1zJFk-R|i=qNuUc|{^`sE%d#)yIRe{xHd0T5_Jn{#40aUhW^|GbMLO|E(zh zK=NT~pRj5FQOQg8(<=k9{|NPnb(WsF;4Qc%Zl<0$qNtBW9jJc9?4^L@uLvT-6m1v)%{un(T-8kr9Bze&rMg6Zz zK0mR)SMtK7{z=IT68U$M=j&qcD8)hh1GMGNPwaP-oPD$C|3JwLllr42uSoozBza7t z-za%OqCZFS%0&M<$=O7{SMrj2eM}hp`?};snoPT|DKX}OXSZ8g0?GW&z(`F<_LFO|PvXB#@`^4j@}i`EmgHec{iTw}B=Sv? z=O^-yCI29i-;#WOB5$~n&LxR_kmSRX@i^-Rjzr_A` zl7}YpKO`TV$lGh83`=D0A+m`)Lh`6Yu9JLgB2SWhM7p% zTsN^Eo|T+grZI@}x^gr|ayH7Jm3*bz?;qu(BwsICX*B!17zvY|Q>~$uCL{F*Nte=Ye9$sX@3lHZl=`FmUPO3B*h%>OFMt0a3qHd06W>*B@rx0ZZS(*B;3D^$Nu zv>z(@Q<6O&$4Rb~?D3x}dG|zrlH@^>y}dIfUzYg4MDqTs_x7)s{JBK`o03OJ-YmBN zsN~U-`$hSel21; zdXN7D$(u^{{;s1$RZ8~xu&LzTB>VX7AbD@e?!QX%zLLvgJ`a|Bpk$BlILX5$YuelV zIZg5jk~NJ?K2P#|$%klyGXEcuyhsl%2FLopNzVLMkBp<9N#w@dc>%RZS;W$u?ejLk>~*Bgr^&rjsvNnVo3?@Q)>($^0g5znDG`sl2^tK`bP zf{ed?CHwtuAB}QpJTyk(|aCYQkUQpR9TwV{_pDT>L*9Wb*YD$vns6 z=%XxOFWK*ZslQdS-!J#kuJc35JW}Vt-xA4wFh(yYvbOTf@)EgUa*Is;rX}+BC301X z{KXP^bRt*EUrQq6|J+0-zROGGuO>43ca_MC5}8xSuM-*lKb6RTMZQ!y(le1wl%Kxb zSjGeWElT9w6Pfr9N@Vo2C31a<+)^T6S|YcX$ahQj@g1P?y}zXXsS^1G$^QIi6Rq-> zOX~ktBCnG?;voJ_OXS@Xnf@M-$mkzgBIiovGfL$7CGr&|@@P$D-ZGXBplk*_Y1??`0)J&?%QKbpvulAlRr z>R&FA-!GB-aHA0q^ams|?d_1r)K`_rBN7??+C)abxkNrEkPkVH!rzgi-HP$I7?kvFcClX&2-veG5-Vn3V6w0~qGqn|60 zCzQyuBtMYk`@xd>UzErlCGtCx{rUMOx=Q+UQcpbVY_C7@K;9&giEq0SdG8W=c!``V zkta%ClEi;!QcruCeP&E=-e+>-*nI{KG8os~(l}^pW?cQ`$@z&>rZ(lLx70VcWTrGs zpI$$)VbHitK0j^F?0n0#d`ojZA9Xk6_dRpU8TkXp){mRi&@?`Oz_>Xrr^)WXXp%oR zn2u^jp}A;3ZgN9?^MBR&2tGoO4Nh!mnbtgYT2JlmZ#MLeVDk+#`M5lE`4f4NZC2?z zyt%oiVS3BdX2P+8+2b0fwdgg06O_c#GO0Frt4efJ!>pdd?lQ*>Q>L}d$+ygyHrZRq z&N*(zl(Fj9(bg*h$<8@`?CA~TTJlFWvEnW5NVYU!OCR@*`p!**Qlyjc=H(_D`7JcxFSM<3kZ4%JX53i~ooa6Wwecy_f0wmub2Q_;Ao z;~Vnh>c^et`_A}S5fa>%$_m)Dc5N%72shc*ZzImcvc50YDXmHiw1ARQga3&))gegeM z#zw?ZqYZj2m?C5-JI~Q#;jvT4&zRhBnAgNV@+u3h~}woU)V;OE5|oA3~%;* zrpN6mZi@_SnBFn8UMFwxL7nV++u(%y=`A)~-d>B=K~MWty5ei<8>cr6YMkC&KWOma zH0!>&yNyK4W89?XahfeK`DVYWV0cbCwpwS)seYkA5&LsPN!g)On|N_2k@8d>v6Nkdao5H0pk z>eHn)X_{O#%$}xG3}=^?=Dc3p)60T!)`nd(&jyv|r1z&6A15)* ze$s=P^^<3Kk2@{J{cP`CtHuTowvD~Hp?-YH<~}y|{)9QxTNOYq>`8@kHZT0RF zDNV&pz05gH$?oCgoSKk`iRnD`t2rXDVQkKipV}}z-=qQ5_B^vuCxZHX?32!kN&XH` zt}5}X`JL2uc`X;!@-tc*Co7Qp=CQgO_x@Wt5)V3;*-NGAEFIs_Jb6xIlkZBMhOO!# z-zR%LM+WPB%yjiLG4YLWNGATIeAThle(j&vyRWR#{J6>W)2A2CfKwWDO;)&olsmYvB^h~mr$FgMqykhN$Jh|#T$IOK&KS<0)h-XcRHJVo~>SkKG(#JV`sE< zT7YiSWhGXepBtK6=EP`SzoZz=(zQ+5>NB3wBo$g2|nEr>!*)vY>f8N-2th)<0rE*&e4JojmMtN)CGC{Si7^aJs@le?zlIn zvM$$|?wEQ$33h4O8^d%%VGmNL)^ZD?ufa0rC4A)od#R86U$HjQPqdQDuHX+_*z*Jgrg-21+f3?Wi=MRFRz4};%RPBg z=|!*Yqxl019ZA?;Zp@RCMIk=fV<)Y?CRLO!I*G|`Dhq7fY4v_hI;m9P0>1NAvQ#=< zfJ{nnAMqOU=c%YE()e4ep zh)JCmQ?m8NeBa>ndTIIrsha?k-o4rGVvLMhLe(ZW~D^1AA4 zo|BniUq%~0W6Bh+BNHh+wy|%dMb&)%h??QY9-cq^xWnx3fXJPnJ@kM*@*p z4Ks@Au2ANX4JLlJ-%#q88%5!c*_LCDp!5v{L4jT^>5;G~<-6|Ts}dfix{aFe+g zBC?ZSl`qTz-FzM9h6?M{4o1h53}2d!i{cZPXbT~$Qd{aZ5YlsWU2W(>DLG#LuEdft zJZRy=@kh4o^LSyPznG6Hgr+;Uk=cgQyDYXTX_ke$XJyCagF1O-TxDysR`!T6Qhvd1 zc~I<#w8tG664Ze)nv0oMB7};6S#Og6{P4>|3&v6?JgdjIo9Mn^i;C&_#Z`gs{YAw@EY| z_KELV4^s)n;+J05tX!0bTf#TQ=6KsKHRxlBrZCDx7&l-6+XW~Yuq;k6N`j!+Jn80% zHrw!k-4sV79I`hOd!e3;7xt!&=^-4>{gPH_gd3=4?qNyF+Irh%)0N6^tjkJn=u_M> zrnu!Bm_X%$5pWX1`23T%hlMQKuKC{9kB8!t2aM&idvtK@8MuI#VA#~@s24x&mGL`^ z)a|GTDsL72a^z68`M2sN3cjKEatj#O_!{&CM_Ii?kPsM)i{Q(!Si{=@;_~YYzT$DY zh%T3-!hT;VN0x9Kf8bTklof6Rk${`byxhhD#wOJnct8wut{Gylo;r9asvjLwiwJyX z?~`t}{kD<61iM)mvL_8TvUfNzX&xd6_c-=$6w72P6&vK%>$o2@GnM0ZFu-fYEq19a z`QNoRl<9DpJu8QbeIP7oUsQ%-!q;nqq$AG?GT|m)izs;|!ixjQR0%b{3d#3zqJLnc lptKWS>Ip&iL!xF_w26sGg!qVh{^$Ss?VAgt5tY*b{R0wRxrYD% literal 0 HcmV?d00001 diff --git a/scripts/external_libs/platform/cel59/32bit/zmq/backend/cython/socket.pxd b/scripts/external_libs/platform/cel59/32bit/zmq/backend/cython/socket.pxd new file mode 100644 index 00000000..b8a331e2 --- /dev/null +++ b/scripts/external_libs/platform/cel59/32bit/zmq/backend/cython/socket.pxd @@ -0,0 +1,47 @@ +"""0MQ Socket class declaration.""" + +# +# Copyright (c) 2010-2011 Brian E. Granger & Min Ragan-Kelley +# +# This file is part of pyzmq. +# +# pyzmq is free software; you can redistribute it and/or modify it under +# the terms of the Lesser GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# pyzmq is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# Lesser GNU General Public License for more details. +# +# You should have received a copy of the Lesser GNU General Public License +# along with this program. If not, see . +# + +#----------------------------------------------------------------------------- +# Imports +#----------------------------------------------------------------------------- + +from context cimport Context + +#----------------------------------------------------------------------------- +# Code +#----------------------------------------------------------------------------- + + +cdef class Socket: + + cdef object __weakref__ # enable weakref + cdef void *handle # The C handle for the underlying zmq object. + cdef bint _shadow # whether the Socket is a shadow wrapper of another + # Hold on to a reference to the context to make sure it is not garbage + # collected until the socket it done with it. + cdef public Context context # The zmq Context object that owns this. + cdef public bint _closed # bool property for a closed socket. + cdef int _pid # the pid of the process which created me (for fork safety) + + # cpdef methods for direct-cython access: + cpdef object send(self, object data, int flags=*, copy=*, track=*) + cpdef object recv(self, int flags=*, copy=*, track=*) + diff --git a/scripts/external_libs/platform/cel59/32bit/zmq/backend/cython/socket.so b/scripts/external_libs/platform/cel59/32bit/zmq/backend/cython/socket.so new file mode 100644 index 0000000000000000000000000000000000000000..00c87d638571722831dab0b81bd5b1319358aa5e GIT binary patch literal 354893 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⁢=k?e<}xuTVR;8E#+8(2*JL!|S^qS2x$ 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. +# + +#----------------------------------------------------------------------------- +# Code +#----------------------------------------------------------------------------- + + +cdef class Stopwatch: + cdef void *watch # The C handle for the underlying zmq object + diff --git a/scripts/external_libs/platform/cel59/32bit/zmq/backend/cython/utils.so b/scripts/external_libs/platform/cel59/32bit/zmq/backend/cython/utils.so new file mode 100644 index 0000000000000000000000000000000000000000..99d0b8399d0698cc9736c9574e497d3cdcfa85a3 GIT binary patch literal 90506 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 timeout): + time.sleep(.001) + toc = time.time() + + +class BackgroundDevice(Device): + """Base class for launching Devices in background processes and threads.""" + + launcher=None + _launch_class=None + + def start(self): + self.launcher = self._launch_class(target=self.run) + self.launcher.daemon = self.daemon + return self.launcher.start() + + def join(self, timeout=None): + return self.launcher.join(timeout=timeout) + + +class ThreadDevice(BackgroundDevice): + """A Device that will be run in a background Thread. + + See Device for details. + """ + _launch_class=Thread + +class ProcessDevice(BackgroundDevice): + """A Device that will be run in a background Process. + + See Device for details. + """ + _launch_class=Process + context_factory = Context + """Callable that returns a context. Typically either Context.instance or Context, + depending on whether the device should share the global instance or not. + """ + + +__all__ = ['Device', 'ThreadDevice', 'ProcessDevice'] diff --git a/scripts/external_libs/platform/cel59/32bit/zmq/devices/monitoredqueue.pxd b/scripts/external_libs/platform/cel59/32bit/zmq/devices/monitoredqueue.pxd new file mode 100644 index 00000000..1e26ed86 --- /dev/null +++ b/scripts/external_libs/platform/cel59/32bit/zmq/devices/monitoredqueue.pxd @@ -0,0 +1,177 @@ +"""MonitoredQueue class declarations. + +Authors +------- +* MinRK +* Brian Granger +""" + +# +# Copyright (c) 2010 Min Ragan-Kelley, Brian Granger +# +# This file is part of pyzmq, but is derived and adapted from zmq_queue.cpp +# originally from libzmq-2.1.6, used under LGPLv3 +# +# pyzmq is free software; you can redistribute it and/or modify it under +# the terms of the Lesser GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# pyzmq is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# Lesser GNU General Public License for more details. +# +# You should have received a copy of the Lesser GNU General Public License +# along with this program. If not, see . +# + +#----------------------------------------------------------------------------- +# Imports +#----------------------------------------------------------------------------- + +from libzmq cimport * + +#----------------------------------------------------------------------------- +# MonitoredQueue C functions +#----------------------------------------------------------------------------- + +cdef inline int _relay(void *insocket_, void *outsocket_, void *sidesocket_, + zmq_msg_t msg, zmq_msg_t side_msg, zmq_msg_t id_msg, + bint swap_ids) nogil: + cdef int rc + cdef int64_t flag_2 + cdef int flag_3 + cdef int flags + cdef bint more + cdef size_t flagsz + cdef void * flag_ptr + + if ZMQ_VERSION_MAJOR < 3: + flagsz = sizeof (int64_t) + flag_ptr = &flag_2 + else: + flagsz = sizeof (int) + flag_ptr = &flag_3 + + if swap_ids:# both router, must send second identity first + # recv two ids into msg, id_msg + rc = zmq_msg_recv(&msg, insocket_, 0) + if rc < 0: return rc + + rc = zmq_msg_recv(&id_msg, insocket_, 0) + if rc < 0: return rc + + # send second id (id_msg) first + #!!!! always send a copy before the original !!!! + rc = zmq_msg_copy(&side_msg, &id_msg) + if rc < 0: return rc + rc = zmq_msg_send(&side_msg, outsocket_, ZMQ_SNDMORE) + if rc < 0: return rc + rc = zmq_msg_send(&id_msg, sidesocket_, ZMQ_SNDMORE) + if rc < 0: return rc + # send first id (msg) second + rc = zmq_msg_copy(&side_msg, &msg) + if rc < 0: return rc + rc = zmq_msg_send(&side_msg, outsocket_, ZMQ_SNDMORE) + if rc < 0: return rc + rc = zmq_msg_send(&msg, sidesocket_, ZMQ_SNDMORE) + if rc < 0: return rc + while (True): + rc = zmq_msg_recv(&msg, insocket_, 0) + if rc < 0: return rc + # assert (rc == 0) + rc = zmq_getsockopt (insocket_, ZMQ_RCVMORE, flag_ptr, &flagsz) + if rc < 0: return rc + flags = 0 + if ZMQ_VERSION_MAJOR < 3: + if flag_2: + flags |= ZMQ_SNDMORE + else: + if flag_3: + flags |= ZMQ_SNDMORE + # LABEL has been removed: + # rc = zmq_getsockopt (insocket_, ZMQ_RCVLABEL, flag_ptr, &flagsz) + # if flag_3: + # flags |= ZMQ_SNDLABEL + # assert (rc == 0) + + rc = zmq_msg_copy(&side_msg, &msg) + if rc < 0: return rc + if flags: + rc = zmq_msg_send(&side_msg, outsocket_, flags) + if rc < 0: return rc + # only SNDMORE for side-socket + rc = zmq_msg_send(&msg, sidesocket_, ZMQ_SNDMORE) + if rc < 0: return rc + else: + rc = zmq_msg_send(&side_msg, outsocket_, 0) + if rc < 0: return rc + rc = zmq_msg_send(&msg, sidesocket_, 0) + if rc < 0: return rc + break + return rc + +# the MonitoredQueue C function, adapted from zmq::queue.cpp : +cdef inline int c_monitored_queue (void *insocket_, void *outsocket_, + void *sidesocket_, zmq_msg_t *in_msg_ptr, + zmq_msg_t *out_msg_ptr, int swap_ids) nogil: + """The actual C function for a monitored queue device. + + See ``monitored_queue()`` for details. + """ + + cdef zmq_msg_t msg + cdef int rc = zmq_msg_init (&msg) + cdef zmq_msg_t id_msg + rc = zmq_msg_init (&id_msg) + if rc < 0: return rc + cdef zmq_msg_t side_msg + rc = zmq_msg_init (&side_msg) + if rc < 0: return rc + + cdef zmq_pollitem_t items [2] + items [0].socket = insocket_ + items [0].fd = 0 + items [0].events = ZMQ_POLLIN + items [0].revents = 0 + items [1].socket = outsocket_ + items [1].fd = 0 + items [1].events = ZMQ_POLLIN + items [1].revents = 0 + # I don't think sidesocket should be polled? + # items [2].socket = sidesocket_ + # items [2].fd = 0 + # items [2].events = ZMQ_POLLIN + # items [2].revents = 0 + + while (True): + + # // Wait while there are either requests or replies to process. + rc = zmq_poll (&items [0], 2, -1) + if rc < 0: return rc + # // The algorithm below asumes ratio of request and replies processed + # // under full load to be 1:1. Although processing requests replies + # // first is tempting it is suspectible to DoS attacks (overloading + # // the system with unsolicited replies). + # + # // Process a request. + if (items [0].revents & ZMQ_POLLIN): + # send in_prefix to side socket + rc = zmq_msg_copy(&side_msg, in_msg_ptr) + if rc < 0: return rc + rc = zmq_msg_send(&side_msg, sidesocket_, ZMQ_SNDMORE) + if rc < 0: return rc + # relay the rest of the message + rc = _relay(insocket_, outsocket_, sidesocket_, msg, side_msg, id_msg, swap_ids) + if rc < 0: return rc + if (items [1].revents & ZMQ_POLLIN): + # send out_prefix to side socket + rc = zmq_msg_copy(&side_msg, out_msg_ptr) + if rc < 0: return rc + rc = zmq_msg_send(&side_msg, sidesocket_, ZMQ_SNDMORE) + if rc < 0: return rc + # relay the rest of the message + rc = _relay(outsocket_, insocket_, sidesocket_, msg, side_msg, id_msg, swap_ids) + if rc < 0: return rc + return rc diff --git a/scripts/external_libs/platform/cel59/32bit/zmq/devices/monitoredqueue.py b/scripts/external_libs/platform/cel59/32bit/zmq/devices/monitoredqueue.py new file mode 100644 index 00000000..c6d91429 --- /dev/null +++ b/scripts/external_libs/platform/cel59/32bit/zmq/devices/monitoredqueue.py @@ -0,0 +1,37 @@ +"""pure Python monitored_queue function + +For use when Cython extension is unavailable (PyPy). + +Authors +------- +* MinRK +""" + +# Copyright (C) PyZMQ Developers +# Distributed under the terms of the Modified BSD License. + +import zmq + +def _relay(ins, outs, sides, prefix, swap_ids): + msg = ins.recv_multipart() + if swap_ids: + msg[:2] = msg[:2][::-1] + outs.send_multipart(msg) + sides.send_multipart([prefix] + msg) + +def monitored_queue(in_socket, out_socket, mon_socket, + in_prefix=b'in', out_prefix=b'out'): + + swap_ids = in_socket.type == zmq.ROUTER and out_socket.type == zmq.ROUTER + + poller = zmq.Poller() + poller.register(in_socket, zmq.POLLIN) + poller.register(out_socket, zmq.POLLIN) + while True: + events = dict(poller.poll()) + if in_socket in events: + _relay(in_socket, out_socket, mon_socket, in_prefix, swap_ids) + if out_socket in events: + _relay(out_socket, in_socket, mon_socket, out_prefix, swap_ids) + +__all__ = ['monitored_queue'] diff --git a/scripts/external_libs/platform/cel59/32bit/zmq/devices/monitoredqueue.so b/scripts/external_libs/platform/cel59/32bit/zmq/devices/monitoredqueue.so new file mode 100644 index 0000000000000000000000000000000000000000..46b057fd8024f759a30ecfc096774a769353e58f GIT binary patch literal 135659 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 z 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 literal 0 HcmV?d00001 diff --git a/scripts/external_libs/platform/cel59/32bit/zmq/devices/monitoredqueuedevice.py b/scripts/external_libs/platform/cel59/32bit/zmq/devices/monitoredqueuedevice.py new file mode 100644 index 00000000..9723f866 --- /dev/null +++ b/scripts/external_libs/platform/cel59/32bit/zmq/devices/monitoredqueuedevice.py @@ -0,0 +1,66 @@ +"""MonitoredQueue classes and functions.""" + +# Copyright (C) PyZMQ Developers +# Distributed under the terms of the Modified BSD License. + + +from zmq import ZMQError, PUB +from zmq.devices.proxydevice import ProxyBase, Proxy, ThreadProxy, ProcessProxy +from zmq.devices.monitoredqueue import monitored_queue + + +class MonitoredQueueBase(ProxyBase): + """Base class for overriding methods.""" + + _in_prefix = b'' + _out_prefix = b'' + + def __init__(self, in_type, out_type, mon_type=PUB, in_prefix=b'in', out_prefix=b'out'): + + ProxyBase.__init__(self, in_type=in_type, out_type=out_type, mon_type=mon_type) + + self._in_prefix = in_prefix + self._out_prefix = out_prefix + + def run_device(self): + ins,outs,mons = self._setup_sockets() + monitored_queue(ins, outs, mons, self._in_prefix, self._out_prefix) + + +class MonitoredQueue(MonitoredQueueBase, Proxy): + """Class for running monitored_queue in the background. + + See zmq.devices.Device for most of the spec. MonitoredQueue differs from Proxy, + only in that it adds a ``prefix`` to messages sent on the monitor socket, + with a different prefix for each direction. + + MQ also supports ROUTER on both sides, which zmq.proxy does not. + + If a message arrives on `in_sock`, it will be prefixed with `in_prefix` on the monitor socket. + If it arrives on out_sock, it will be prefixed with `out_prefix`. + + A PUB socket is the most logical choice for the mon_socket, but it is not required. + """ + pass + + +class ThreadMonitoredQueue(MonitoredQueueBase, ThreadProxy): + """Run zmq.monitored_queue in a background thread. + + See MonitoredQueue and Proxy for details. + """ + pass + + +class ProcessMonitoredQueue(MonitoredQueueBase, ProcessProxy): + """Run zmq.monitored_queue in a background thread. + + See MonitoredQueue and Proxy for details. + """ + + +__all__ = [ + 'MonitoredQueue', + 'ThreadMonitoredQueue', + 'ProcessMonitoredQueue' +] diff --git a/scripts/external_libs/platform/cel59/32bit/zmq/devices/proxydevice.py b/scripts/external_libs/platform/cel59/32bit/zmq/devices/proxydevice.py new file mode 100644 index 00000000..68be3f15 --- /dev/null +++ b/scripts/external_libs/platform/cel59/32bit/zmq/devices/proxydevice.py @@ -0,0 +1,90 @@ +"""Proxy classes and functions.""" + +# Copyright (C) PyZMQ Developers +# Distributed under the terms of the Modified BSD License. + +import zmq +from zmq.devices.basedevice import Device, ThreadDevice, ProcessDevice + + +class ProxyBase(object): + """Base class for overriding methods.""" + + def __init__(self, in_type, out_type, mon_type=zmq.PUB): + + Device.__init__(self, in_type=in_type, out_type=out_type) + self.mon_type = mon_type + self._mon_binds = [] + self._mon_connects = [] + self._mon_sockopts = [] + + def bind_mon(self, addr): + """Enqueue ZMQ address for binding on mon_socket. + + See zmq.Socket.bind for details. + """ + self._mon_binds.append(addr) + + def connect_mon(self, addr): + """Enqueue ZMQ address for connecting on mon_socket. + + See zmq.Socket.bind for details. + """ + self._mon_connects.append(addr) + + def setsockopt_mon(self, opt, value): + """Enqueue setsockopt(opt, value) for mon_socket + + See zmq.Socket.setsockopt for details. + """ + self._mon_sockopts.append((opt, value)) + + def _setup_sockets(self): + ins,outs = Device._setup_sockets(self) + ctx = self._context + mons = ctx.socket(self.mon_type) + + # set sockopts (must be done first, in case of zmq.IDENTITY) + for opt,value in self._mon_sockopts: + mons.setsockopt(opt, value) + + for iface in self._mon_binds: + mons.bind(iface) + + for iface in self._mon_connects: + mons.connect(iface) + + return ins,outs,mons + + def run_device(self): + ins,outs,mons = self._setup_sockets() + zmq.proxy(ins, outs, mons) + +class Proxy(ProxyBase, Device): + """Threadsafe Proxy object. + + See zmq.devices.Device for most of the spec. This subclass adds a + _mon version of each _{in|out} method, for configuring the + monitor socket. + + A Proxy is a 3-socket ZMQ Device that functions just like a + QUEUE, except each message is also sent out on the monitor socket. + + A PUB socket is the most logical choice for the mon_socket, but it is not required. + """ + pass + +class ThreadProxy(ProxyBase, ThreadDevice): + """Proxy in a Thread. See Proxy for more.""" + pass + +class ProcessProxy(ProxyBase, ProcessDevice): + """Proxy in a Process. See Proxy for more.""" + pass + + +__all__ = [ + 'Proxy', + 'ThreadProxy', + 'ProcessProxy', +] diff --git a/scripts/external_libs/platform/cel59/32bit/zmq/error.py b/scripts/external_libs/platform/cel59/32bit/zmq/error.py new file mode 100644 index 00000000..48cdaafa --- /dev/null +++ b/scripts/external_libs/platform/cel59/32bit/zmq/error.py @@ -0,0 +1,164 @@ +"""0MQ Error classes and functions.""" + +# Copyright (C) PyZMQ Developers +# Distributed under the terms of the Modified BSD License. + + +class ZMQBaseError(Exception): + """Base exception class for 0MQ errors in Python.""" + pass + +class ZMQError(ZMQBaseError): + """Wrap an errno style error. + + Parameters + ---------- + errno : int + The ZMQ errno or None. If None, then ``zmq_errno()`` is called and + used. + msg : string + Description of the error or None. + """ + errno = None + + def __init__(self, errno=None, msg=None): + """Wrap an errno style error. + + Parameters + ---------- + errno : int + The ZMQ errno or None. If None, then ``zmq_errno()`` is called and + used. + msg : string + Description of the error or None. + """ + from zmq.backend import strerror, zmq_errno + if errno is None: + errno = zmq_errno() + if isinstance(errno, int): + self.errno = errno + if msg is None: + self.strerror = strerror(errno) + else: + self.strerror = msg + else: + if msg is None: + self.strerror = str(errno) + else: + self.strerror = msg + # flush signals, because there could be a SIGINT + # waiting to pounce, resulting in uncaught exceptions. + # Doing this here means getting SIGINT during a blocking + # libzmq call will raise a *catchable* KeyboardInterrupt + # PyErr_CheckSignals() + + def __str__(self): + return self.strerror + + def __repr__(self): + return "ZMQError('%s')"%self.strerror + + +class ZMQBindError(ZMQBaseError): + """An error for ``Socket.bind_to_random_port()``. + + See Also + -------- + .Socket.bind_to_random_port + """ + pass + + +class NotDone(ZMQBaseError): + """Raised when timeout is reached while waiting for 0MQ to finish with a Message + + See Also + -------- + .MessageTracker.wait : object for tracking when ZeroMQ is done + """ + pass + + +class ContextTerminated(ZMQError): + """Wrapper for zmq.ETERM + + .. versionadded:: 13.0 + """ + pass + + +class Again(ZMQError): + """Wrapper for zmq.EAGAIN + + .. versionadded:: 13.0 + """ + pass + + +def _check_rc(rc, errno=None): + """internal utility for checking zmq return condition + + and raising the appropriate Exception class + """ + if rc < 0: + from zmq.backend import zmq_errno + if errno is None: + errno = zmq_errno() + from zmq import EAGAIN, ETERM + if errno == EAGAIN: + raise Again(errno) + elif errno == ETERM: + raise ContextTerminated(errno) + else: + raise ZMQError(errno) + +_zmq_version_info = None +_zmq_version = None + +class ZMQVersionError(NotImplementedError): + """Raised when a feature is not provided by the linked version of libzmq. + + .. versionadded:: 14.2 + """ + min_version = None + def __init__(self, min_version, msg='Feature'): + global _zmq_version + if _zmq_version is None: + from zmq import zmq_version + _zmq_version = zmq_version() + self.msg = msg + self.min_version = min_version + self.version = _zmq_version + + def __repr__(self): + return "ZMQVersionError('%s')" % str(self) + + def __str__(self): + return "%s requires libzmq >= %s, have %s" % (self.msg, self.min_version, self.version) + + +def _check_version(min_version_info, msg='Feature'): + """Check for libzmq + + raises ZMQVersionError if current zmq version is not at least min_version + + min_version_info is a tuple of integers, and will be compared against zmq.zmq_version_info(). + """ + global _zmq_version_info + if _zmq_version_info is None: + from zmq import zmq_version_info + _zmq_version_info = zmq_version_info() + if _zmq_version_info < min_version_info: + min_version = '.'.join(str(v) for v in min_version_info) + raise ZMQVersionError(min_version, msg) + + +__all__ = [ + 'ZMQBaseError', + 'ZMQBindError', + 'ZMQError', + 'NotDone', + 'ContextTerminated', + 'Again', + 'ZMQVersionError', +] diff --git a/scripts/external_libs/platform/cel59/32bit/zmq/eventloop/__init__.py b/scripts/external_libs/platform/cel59/32bit/zmq/eventloop/__init__.py new file mode 100644 index 00000000..568e8e8d --- /dev/null +++ b/scripts/external_libs/platform/cel59/32bit/zmq/eventloop/__init__.py @@ -0,0 +1,5 @@ +"""A Tornado based event loop for PyZMQ.""" + +from zmq.eventloop.ioloop import IOLoop + +__all__ = ['IOLoop'] \ No newline at end of file diff --git a/scripts/external_libs/platform/cel59/32bit/zmq/eventloop/ioloop.py b/scripts/external_libs/platform/cel59/32bit/zmq/eventloop/ioloop.py new file mode 100644 index 00000000..35f4c418 --- /dev/null +++ b/scripts/external_libs/platform/cel59/32bit/zmq/eventloop/ioloop.py @@ -0,0 +1,193 @@ +# coding: utf-8 +"""tornado IOLoop API with zmq compatibility + +If you have tornado ≥ 3.0, this is a subclass of tornado's IOLoop, +otherwise we ship a minimal subset of tornado in zmq.eventloop.minitornado. + +The minimal shipped version of tornado's IOLoop does not include +support for concurrent futures - this will only be available if you +have tornado ≥ 3.0. +""" + +# Copyright (C) PyZMQ Developers +# Distributed under the terms of the Modified BSD License. + +from __future__ import absolute_import, division, with_statement + +import os +import time +import warnings + +from zmq import ( + Poller, + POLLIN, POLLOUT, POLLERR, + ZMQError, ETERM, +) + +try: + import tornado + tornado_version = tornado.version_info +except (ImportError, AttributeError): + tornado_version = () + +try: + # tornado ≥ 3 + from tornado.ioloop import PollIOLoop, PeriodicCallback + from tornado.log import gen_log +except ImportError: + from .minitornado.ioloop import PollIOLoop, PeriodicCallback + from .minitornado.log import gen_log + + +class DelayedCallback(PeriodicCallback): + """Schedules the given callback to be called once. + + The callback is called once, after callback_time milliseconds. + + `start` must be called after the DelayedCallback is created. + + The timeout is calculated from when `start` is called. + """ + def __init__(self, callback, callback_time, io_loop=None): + # PeriodicCallback require callback_time to be positive + warnings.warn("""DelayedCallback is deprecated. + Use loop.add_timeout instead.""", DeprecationWarning) + callback_time = max(callback_time, 1e-3) + super(DelayedCallback, self).__init__(callback, callback_time, io_loop) + + def start(self): + """Starts the timer.""" + self._running = True + self._firstrun = True + self._next_timeout = time.time() + self.callback_time / 1000.0 + self.io_loop.add_timeout(self._next_timeout, self._run) + + def _run(self): + if not self._running: return + self._running = False + try: + self.callback() + except Exception: + gen_log.error("Error in delayed callback", exc_info=True) + + +class ZMQPoller(object): + """A poller that can be used in the tornado IOLoop. + + This simply wraps a regular zmq.Poller, scaling the timeout + by 1000, so that it is in seconds rather than milliseconds. + """ + + def __init__(self): + self._poller = Poller() + + @staticmethod + def _map_events(events): + """translate IOLoop.READ/WRITE/ERROR event masks into zmq.POLLIN/OUT/ERR""" + z_events = 0 + if events & IOLoop.READ: + z_events |= POLLIN + if events & IOLoop.WRITE: + z_events |= POLLOUT + if events & IOLoop.ERROR: + z_events |= POLLERR + return z_events + + @staticmethod + def _remap_events(z_events): + """translate zmq.POLLIN/OUT/ERR event masks into IOLoop.READ/WRITE/ERROR""" + events = 0 + if z_events & POLLIN: + events |= IOLoop.READ + if z_events & POLLOUT: + events |= IOLoop.WRITE + if z_events & POLLERR: + events |= IOLoop.ERROR + return events + + def register(self, fd, events): + return self._poller.register(fd, self._map_events(events)) + + def modify(self, fd, events): + return self._poller.modify(fd, self._map_events(events)) + + def unregister(self, fd): + return self._poller.unregister(fd) + + def poll(self, timeout): + """poll in seconds rather than milliseconds. + + Event masks will be IOLoop.READ/WRITE/ERROR + """ + z_events = self._poller.poll(1000*timeout) + return [ (fd,self._remap_events(evt)) for (fd,evt) in z_events ] + + def close(self): + pass + + +class ZMQIOLoop(PollIOLoop): + """ZMQ subclass of tornado's IOLoop""" + def initialize(self, impl=None, **kwargs): + impl = ZMQPoller() if impl is None else impl + super(ZMQIOLoop, self).initialize(impl=impl, **kwargs) + + @staticmethod + def instance(): + """Returns a global `IOLoop` instance. + + Most applications have a single, global `IOLoop` running on the + main thread. Use this method to get this instance from + another thread. To get the current thread's `IOLoop`, use `current()`. + """ + # install ZMQIOLoop as the active IOLoop implementation + # when using tornado 3 + if tornado_version >= (3,): + PollIOLoop.configure(ZMQIOLoop) + return PollIOLoop.instance() + + def start(self): + try: + super(ZMQIOLoop, self).start() + except ZMQError as e: + if e.errno == ETERM: + # quietly return on ETERM + pass + else: + raise e + + +if tornado_version >= (3,0) and tornado_version < (3,1): + def backport_close(self, all_fds=False): + """backport IOLoop.close to 3.0 from 3.1 (supports fd.close() method)""" + from zmq.eventloop.minitornado.ioloop import PollIOLoop as mini_loop + return mini_loop.close.__get__(self)(all_fds) + ZMQIOLoop.close = backport_close + + +# public API name +IOLoop = ZMQIOLoop + + +def install(): + """set the tornado IOLoop instance with the pyzmq IOLoop. + + After calling this function, tornado's IOLoop.instance() and pyzmq's + IOLoop.instance() will return the same object. + + An assertion error will be raised if tornado's IOLoop has been initialized + prior to calling this function. + """ + from tornado import ioloop + # check if tornado's IOLoop is already initialized to something other + # than the pyzmq IOLoop instance: + assert (not ioloop.IOLoop.initialized()) or \ + ioloop.IOLoop.instance() is IOLoop.instance(), "tornado IOLoop already initialized" + + if tornado_version >= (3,): + # tornado 3 has an official API for registering new defaults, yay! + ioloop.IOLoop.configure(ZMQIOLoop) + else: + # we have to set the global instance explicitly + ioloop.IOLoop._instance = IOLoop.instance() + diff --git a/scripts/external_libs/platform/cel59/32bit/zmq/eventloop/minitornado/__init__.py b/scripts/external_libs/platform/cel59/32bit/zmq/eventloop/minitornado/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/scripts/external_libs/platform/cel59/32bit/zmq/eventloop/minitornado/concurrent.py b/scripts/external_libs/platform/cel59/32bit/zmq/eventloop/minitornado/concurrent.py new file mode 100644 index 00000000..519b23d5 --- /dev/null +++ b/scripts/external_libs/platform/cel59/32bit/zmq/eventloop/minitornado/concurrent.py @@ -0,0 +1,11 @@ +"""pyzmq does not ship tornado's futures, +this just raises informative NotImplementedErrors to avoid having to change too much code. +""" + +class NotImplementedFuture(object): + def __init__(self, *args, **kwargs): + raise NotImplementedError("pyzmq does not ship tornado's Futures, " + "install tornado >= 3.0 for future support." + ) + +Future = TracebackFuture = NotImplementedFuture diff --git a/scripts/external_libs/platform/cel59/32bit/zmq/eventloop/minitornado/ioloop.py b/scripts/external_libs/platform/cel59/32bit/zmq/eventloop/minitornado/ioloop.py new file mode 100644 index 00000000..710a3ecb --- /dev/null +++ b/scripts/external_libs/platform/cel59/32bit/zmq/eventloop/minitornado/ioloop.py @@ -0,0 +1,829 @@ +#!/usr/bin/env python +# +# Copyright 2009 Facebook +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +"""An I/O event loop for non-blocking sockets. + +Typical applications will use a single `IOLoop` object, in the +`IOLoop.instance` singleton. The `IOLoop.start` method should usually +be called at the end of the ``main()`` function. Atypical applications may +use more than one `IOLoop`, such as one `IOLoop` per thread, or per `unittest` +case. + +In addition to I/O events, the `IOLoop` can also schedule time-based events. +`IOLoop.add_timeout` is a non-blocking alternative to `time.sleep`. +""" + +from __future__ import absolute_import, division, print_function, with_statement + +import datetime +import errno +import functools +import heapq +import logging +import numbers +import os +import select +import sys +import threading +import time +import traceback + +from .concurrent import Future, TracebackFuture +from .log import app_log, gen_log +from . import stack_context +from .util import Configurable + +try: + import signal +except ImportError: + signal = None + +try: + import thread # py2 +except ImportError: + import _thread as thread # py3 + +from .platform.auto import set_close_exec, Waker + + +class TimeoutError(Exception): + pass + + +class IOLoop(Configurable): + """A level-triggered I/O loop. + + We use ``epoll`` (Linux) or ``kqueue`` (BSD and Mac OS X) if they + are available, or else we fall back on select(). If you are + implementing a system that needs to handle thousands of + simultaneous connections, you should use a system that supports + either ``epoll`` or ``kqueue``. + + Example usage for a simple TCP server:: + + import errno + import functools + import ioloop + import socket + + def connection_ready(sock, fd, events): + while True: + try: + connection, address = sock.accept() + except socket.error, e: + if e.args[0] not in (errno.EWOULDBLOCK, errno.EAGAIN): + raise + return + connection.setblocking(0) + handle_connection(connection, address) + + sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0) + sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) + sock.setblocking(0) + sock.bind(("", port)) + sock.listen(128) + + io_loop = ioloop.IOLoop.instance() + callback = functools.partial(connection_ready, sock) + io_loop.add_handler(sock.fileno(), callback, io_loop.READ) + io_loop.start() + + """ + # Constants from the epoll module + _EPOLLIN = 0x001 + _EPOLLPRI = 0x002 + _EPOLLOUT = 0x004 + _EPOLLERR = 0x008 + _EPOLLHUP = 0x010 + _EPOLLRDHUP = 0x2000 + _EPOLLONESHOT = (1 << 30) + _EPOLLET = (1 << 31) + + # Our events map exactly to the epoll events + NONE = 0 + READ = _EPOLLIN + WRITE = _EPOLLOUT + ERROR = _EPOLLERR | _EPOLLHUP + + # Global lock for creating global IOLoop instance + _instance_lock = threading.Lock() + + _current = threading.local() + + @staticmethod + def instance(): + """Returns a global `IOLoop` instance. + + Most applications have a single, global `IOLoop` running on the + main thread. Use this method to get this instance from + another thread. To get the current thread's `IOLoop`, use `current()`. + """ + if not hasattr(IOLoop, "_instance"): + with IOLoop._instance_lock: + if not hasattr(IOLoop, "_instance"): + # New instance after double check + IOLoop._instance = IOLoop() + return IOLoop._instance + + @staticmethod + def initialized(): + """Returns true if the singleton instance has been created.""" + return hasattr(IOLoop, "_instance") + + def install(self): + """Installs this `IOLoop` object as the singleton instance. + + This is normally not necessary as `instance()` will create + an `IOLoop` on demand, but you may want to call `install` to use + a custom subclass of `IOLoop`. + """ + assert not IOLoop.initialized() + IOLoop._instance = self + + @staticmethod + def current(): + """Returns the current thread's `IOLoop`. + + If an `IOLoop` is currently running or has been marked as current + by `make_current`, returns that instance. Otherwise returns + `IOLoop.instance()`, i.e. the main thread's `IOLoop`. + + A common pattern for classes that depend on ``IOLoops`` is to use + a default argument to enable programs with multiple ``IOLoops`` + but not require the argument for simpler applications:: + + class MyClass(object): + def __init__(self, io_loop=None): + self.io_loop = io_loop or IOLoop.current() + + In general you should use `IOLoop.current` as the default when + constructing an asynchronous object, and use `IOLoop.instance` + when you mean to communicate to the main thread from a different + one. + """ + current = getattr(IOLoop._current, "instance", None) + if current is None: + return IOLoop.instance() + return current + + def make_current(self): + """Makes this the `IOLoop` for the current thread. + + An `IOLoop` automatically becomes current for its thread + when it is started, but it is sometimes useful to call + `make_current` explictly before starting the `IOLoop`, + so that code run at startup time can find the right + instance. + """ + IOLoop._current.instance = self + + @staticmethod + def clear_current(): + IOLoop._current.instance = None + + @classmethod + def configurable_base(cls): + return IOLoop + + @classmethod + def configurable_default(cls): + # this is the only patch to IOLoop: + from zmq.eventloop.ioloop import ZMQIOLoop + return ZMQIOLoop + # the remainder of this method is unused, + # but left for preservation reasons + if hasattr(select, "epoll"): + from tornado.platform.epoll import EPollIOLoop + return EPollIOLoop + if hasattr(select, "kqueue"): + # Python 2.6+ on BSD or Mac + from tornado.platform.kqueue import KQueueIOLoop + return KQueueIOLoop + from tornado.platform.select import SelectIOLoop + return SelectIOLoop + + def initialize(self): + pass + + def close(self, all_fds=False): + """Closes the `IOLoop`, freeing any resources used. + + If ``all_fds`` is true, all file descriptors registered on the + IOLoop will be closed (not just the ones created by the + `IOLoop` itself). + + Many applications will only use a single `IOLoop` that runs for the + entire lifetime of the process. In that case closing the `IOLoop` + is not necessary since everything will be cleaned up when the + process exits. `IOLoop.close` is provided mainly for scenarios + such as unit tests, which create and destroy a large number of + ``IOLoops``. + + An `IOLoop` must be completely stopped before it can be closed. This + means that `IOLoop.stop()` must be called *and* `IOLoop.start()` must + be allowed to return before attempting to call `IOLoop.close()`. + Therefore the call to `close` will usually appear just after + the call to `start` rather than near the call to `stop`. + + .. versionchanged:: 3.1 + If the `IOLoop` implementation supports non-integer objects + for "file descriptors", those objects will have their + ``close`` method when ``all_fds`` is true. + """ + raise NotImplementedError() + + def add_handler(self, fd, handler, events): + """Registers the given handler to receive the given events for fd. + + The ``events`` argument is a bitwise or of the constants + ``IOLoop.READ``, ``IOLoop.WRITE``, and ``IOLoop.ERROR``. + + When an event occurs, ``handler(fd, events)`` will be run. + """ + raise NotImplementedError() + + def update_handler(self, fd, events): + """Changes the events we listen for fd.""" + raise NotImplementedError() + + def remove_handler(self, fd): + """Stop listening for events on fd.""" + raise NotImplementedError() + + def set_blocking_signal_threshold(self, seconds, action): + """Sends a signal if the `IOLoop` is blocked for more than + ``s`` seconds. + + Pass ``seconds=None`` to disable. Requires Python 2.6 on a unixy + platform. + + The action parameter is a Python signal handler. Read the + documentation for the `signal` module for more information. + If ``action`` is None, the process will be killed if it is + blocked for too long. + """ + raise NotImplementedError() + + def set_blocking_log_threshold(self, seconds): + """Logs a stack trace if the `IOLoop` is blocked for more than + ``s`` seconds. + + Equivalent to ``set_blocking_signal_threshold(seconds, + self.log_stack)`` + """ + self.set_blocking_signal_threshold(seconds, self.log_stack) + + def log_stack(self, signal, frame): + """Signal handler to log the stack trace of the current thread. + + For use with `set_blocking_signal_threshold`. + """ + gen_log.warning('IOLoop blocked for %f seconds in\n%s', + self._blocking_signal_threshold, + ''.join(traceback.format_stack(frame))) + + def start(self): + """Starts the I/O loop. + + The loop will run until one of the callbacks calls `stop()`, which + will make the loop stop after the current event iteration completes. + """ + raise NotImplementedError() + + def stop(self): + """Stop the I/O loop. + + If the event loop is not currently running, the next call to `start()` + will return immediately. + + To use asynchronous methods from otherwise-synchronous code (such as + unit tests), you can start and stop the event loop like this:: + + ioloop = IOLoop() + async_method(ioloop=ioloop, callback=ioloop.stop) + ioloop.start() + + ``ioloop.start()`` will return after ``async_method`` has run + its callback, whether that callback was invoked before or + after ``ioloop.start``. + + Note that even after `stop` has been called, the `IOLoop` is not + completely stopped until `IOLoop.start` has also returned. + Some work that was scheduled before the call to `stop` may still + be run before the `IOLoop` shuts down. + """ + raise NotImplementedError() + + def run_sync(self, func, timeout=None): + """Starts the `IOLoop`, runs the given function, and stops the loop. + + If the function returns a `.Future`, the `IOLoop` will run + until the future is resolved. If it raises an exception, the + `IOLoop` will stop and the exception will be re-raised to the + caller. + + The keyword-only argument ``timeout`` may be used to set + a maximum duration for the function. If the timeout expires, + a `TimeoutError` is raised. + + This method is useful in conjunction with `tornado.gen.coroutine` + to allow asynchronous calls in a ``main()`` function:: + + @gen.coroutine + def main(): + # do stuff... + + if __name__ == '__main__': + IOLoop.instance().run_sync(main) + """ + future_cell = [None] + + def run(): + try: + result = func() + except Exception: + future_cell[0] = TracebackFuture() + future_cell[0].set_exc_info(sys.exc_info()) + else: + if isinstance(result, Future): + future_cell[0] = result + else: + future_cell[0] = Future() + future_cell[0].set_result(result) + self.add_future(future_cell[0], lambda future: self.stop()) + self.add_callback(run) + if timeout is not None: + timeout_handle = self.add_timeout(self.time() + timeout, self.stop) + self.start() + if timeout is not None: + self.remove_timeout(timeout_handle) + if not future_cell[0].done(): + raise TimeoutError('Operation timed out after %s seconds' % timeout) + return future_cell[0].result() + + def time(self): + """Returns the current time according to the `IOLoop`'s clock. + + The return value is a floating-point number relative to an + unspecified time in the past. + + By default, the `IOLoop`'s time function is `time.time`. However, + it may be configured to use e.g. `time.monotonic` instead. + Calls to `add_timeout` that pass a number instead of a + `datetime.timedelta` should use this function to compute the + appropriate time, so they can work no matter what time function + is chosen. + """ + return time.time() + + def add_timeout(self, deadline, callback): + """Runs the ``callback`` at the time ``deadline`` from the I/O loop. + + Returns an opaque handle that may be passed to + `remove_timeout` to cancel. + + ``deadline`` may be a number denoting a time (on the same + scale as `IOLoop.time`, normally `time.time`), or a + `datetime.timedelta` object for a deadline relative to the + current time. + + Note that it is not safe to call `add_timeout` from other threads. + Instead, you must use `add_callback` to transfer control to the + `IOLoop`'s thread, and then call `add_timeout` from there. + """ + raise NotImplementedError() + + def remove_timeout(self, timeout): + """Cancels a pending timeout. + + The argument is a handle as returned by `add_timeout`. It is + safe to call `remove_timeout` even if the callback has already + been run. + """ + raise NotImplementedError() + + def add_callback(self, callback, *args, **kwargs): + """Calls the given callback on the next I/O loop iteration. + + It is safe to call this method from any thread at any time, + except from a signal handler. Note that this is the **only** + method in `IOLoop` that makes this thread-safety guarantee; all + other interaction with the `IOLoop` must be done from that + `IOLoop`'s thread. `add_callback()` may be used to transfer + control from other threads to the `IOLoop`'s thread. + + To add a callback from a signal handler, see + `add_callback_from_signal`. + """ + raise NotImplementedError() + + def add_callback_from_signal(self, callback, *args, **kwargs): + """Calls the given callback on the next I/O loop iteration. + + Safe for use from a Python signal handler; should not be used + otherwise. + + Callbacks added with this method will be run without any + `.stack_context`, to avoid picking up the context of the function + that was interrupted by the signal. + """ + raise NotImplementedError() + + def add_future(self, future, callback): + """Schedules a callback on the ``IOLoop`` when the given + `.Future` is finished. + + The callback is invoked with one argument, the + `.Future`. + """ + assert isinstance(future, Future) + callback = stack_context.wrap(callback) + future.add_done_callback( + lambda future: self.add_callback(callback, future)) + + def _run_callback(self, callback): + """Runs a callback with error handling. + + For use in subclasses. + """ + try: + callback() + except Exception: + self.handle_callback_exception(callback) + + def handle_callback_exception(self, callback): + """This method is called whenever a callback run by the `IOLoop` + throws an exception. + + By default simply logs the exception as an error. Subclasses + may override this method to customize reporting of exceptions. + + The exception itself is not passed explicitly, but is available + in `sys.exc_info`. + """ + app_log.error("Exception in callback %r", callback, exc_info=True) + + +class PollIOLoop(IOLoop): + """Base class for IOLoops built around a select-like function. + + For concrete implementations, see `tornado.platform.epoll.EPollIOLoop` + (Linux), `tornado.platform.kqueue.KQueueIOLoop` (BSD and Mac), or + `tornado.platform.select.SelectIOLoop` (all platforms). + """ + def initialize(self, impl, time_func=None): + super(PollIOLoop, self).initialize() + self._impl = impl + if hasattr(self._impl, 'fileno'): + set_close_exec(self._impl.fileno()) + self.time_func = time_func or time.time + self._handlers = {} + self._events = {} + self._callbacks = [] + self._callback_lock = threading.Lock() + self._timeouts = [] + self._cancellations = 0 + self._running = False + self._stopped = False + self._closing = False + self._thread_ident = None + self._blocking_signal_threshold = None + + # Create a pipe that we send bogus data to when we want to wake + # the I/O loop when it is idle + self._waker = Waker() + self.add_handler(self._waker.fileno(), + lambda fd, events: self._waker.consume(), + self.READ) + + def close(self, all_fds=False): + with self._callback_lock: + self._closing = True + self.remove_handler(self._waker.fileno()) + if all_fds: + for fd in self._handlers.keys(): + try: + close_method = getattr(fd, 'close', None) + if close_method is not None: + close_method() + else: + os.close(fd) + except Exception: + gen_log.debug("error closing fd %s", fd, exc_info=True) + self._waker.close() + self._impl.close() + + def add_handler(self, fd, handler, events): + self._handlers[fd] = stack_context.wrap(handler) + self._impl.register(fd, events | self.ERROR) + + def update_handler(self, fd, events): + self._impl.modify(fd, events | self.ERROR) + + def remove_handler(self, fd): + self._handlers.pop(fd, None) + self._events.pop(fd, None) + try: + self._impl.unregister(fd) + except Exception: + gen_log.debug("Error deleting fd from IOLoop", exc_info=True) + + def set_blocking_signal_threshold(self, seconds, action): + if not hasattr(signal, "setitimer"): + gen_log.error("set_blocking_signal_threshold requires a signal module " + "with the setitimer method") + return + self._blocking_signal_threshold = seconds + if seconds is not None: + signal.signal(signal.SIGALRM, + action if action is not None else signal.SIG_DFL) + + def start(self): + if not logging.getLogger().handlers: + # The IOLoop catches and logs exceptions, so it's + # important that log output be visible. However, python's + # default behavior for non-root loggers (prior to python + # 3.2) is to print an unhelpful "no handlers could be + # found" message rather than the actual log entry, so we + # must explicitly configure logging if we've made it this + # far without anything. + logging.basicConfig() + if self._stopped: + self._stopped = False + return + old_current = getattr(IOLoop._current, "instance", None) + IOLoop._current.instance = self + self._thread_ident = thread.get_ident() + self._running = True + + # signal.set_wakeup_fd closes a race condition in event loops: + # a signal may arrive at the beginning of select/poll/etc + # before it goes into its interruptible sleep, so the signal + # will be consumed without waking the select. The solution is + # for the (C, synchronous) signal handler to write to a pipe, + # which will then be seen by select. + # + # In python's signal handling semantics, this only matters on the + # main thread (fortunately, set_wakeup_fd only works on the main + # thread and will raise a ValueError otherwise). + # + # If someone has already set a wakeup fd, we don't want to + # disturb it. This is an issue for twisted, which does its + # SIGCHILD processing in response to its own wakeup fd being + # written to. As long as the wakeup fd is registered on the IOLoop, + # the loop will still wake up and everything should work. + old_wakeup_fd = None + if hasattr(signal, 'set_wakeup_fd') and os.name == 'posix': + # requires python 2.6+, unix. set_wakeup_fd exists but crashes + # the python process on windows. + try: + old_wakeup_fd = signal.set_wakeup_fd(self._waker.write_fileno()) + if old_wakeup_fd != -1: + # Already set, restore previous value. This is a little racy, + # but there's no clean get_wakeup_fd and in real use the + # IOLoop is just started once at the beginning. + signal.set_wakeup_fd(old_wakeup_fd) + old_wakeup_fd = None + except ValueError: # non-main thread + pass + + while True: + poll_timeout = 3600.0 + + # Prevent IO event starvation by delaying new callbacks + # to the next iteration of the event loop. + with self._callback_lock: + callbacks = self._callbacks + self._callbacks = [] + for callback in callbacks: + self._run_callback(callback) + + if self._timeouts: + now = self.time() + while self._timeouts: + if self._timeouts[0].callback is None: + # the timeout was cancelled + heapq.heappop(self._timeouts) + self._cancellations -= 1 + elif self._timeouts[0].deadline <= now: + timeout = heapq.heappop(self._timeouts) + self._run_callback(timeout.callback) + else: + seconds = self._timeouts[0].deadline - now + poll_timeout = min(seconds, poll_timeout) + break + if (self._cancellations > 512 + and self._cancellations > (len(self._timeouts) >> 1)): + # Clean up the timeout queue when it gets large and it's + # more than half cancellations. + self._cancellations = 0 + self._timeouts = [x for x in self._timeouts + if x.callback is not None] + heapq.heapify(self._timeouts) + + if self._callbacks: + # If any callbacks or timeouts called add_callback, + # we don't want to wait in poll() before we run them. + poll_timeout = 0.0 + + if not self._running: + break + + if self._blocking_signal_threshold is not None: + # clear alarm so it doesn't fire while poll is waiting for + # events. + signal.setitimer(signal.ITIMER_REAL, 0, 0) + + try: + event_pairs = self._impl.poll(poll_timeout) + except Exception as e: + # Depending on python version and IOLoop implementation, + # different exception types may be thrown and there are + # two ways EINTR might be signaled: + # * e.errno == errno.EINTR + # * e.args is like (errno.EINTR, 'Interrupted system call') + if (getattr(e, 'errno', None) == errno.EINTR or + (isinstance(getattr(e, 'args', None), tuple) and + len(e.args) == 2 and e.args[0] == errno.EINTR)): + continue + else: + raise + + if self._blocking_signal_threshold is not None: + signal.setitimer(signal.ITIMER_REAL, + self._blocking_signal_threshold, 0) + + # Pop one fd at a time from the set of pending fds and run + # its handler. Since that handler may perform actions on + # other file descriptors, there may be reentrant calls to + # this IOLoop that update self._events + self._events.update(event_pairs) + while self._events: + fd, events = self._events.popitem() + try: + self._handlers[fd](fd, events) + except (OSError, IOError) as e: + if e.args[0] == errno.EPIPE: + # Happens when the client closes the connection + pass + else: + app_log.error("Exception in I/O handler for fd %s", + fd, exc_info=True) + except Exception: + app_log.error("Exception in I/O handler for fd %s", + fd, exc_info=True) + # reset the stopped flag so another start/stop pair can be issued + self._stopped = False + if self._blocking_signal_threshold is not None: + signal.setitimer(signal.ITIMER_REAL, 0, 0) + IOLoop._current.instance = old_current + if old_wakeup_fd is not None: + signal.set_wakeup_fd(old_wakeup_fd) + + def stop(self): + self._running = False + self._stopped = True + self._waker.wake() + + def time(self): + return self.time_func() + + def add_timeout(self, deadline, callback): + timeout = _Timeout(deadline, stack_context.wrap(callback), self) + heapq.heappush(self._timeouts, timeout) + return timeout + + def remove_timeout(self, timeout): + # Removing from a heap is complicated, so just leave the defunct + # timeout object in the queue (see discussion in + # http://docs.python.org/library/heapq.html). + # If this turns out to be a problem, we could add a garbage + # collection pass whenever there are too many dead timeouts. + timeout.callback = None + self._cancellations += 1 + + def add_callback(self, callback, *args, **kwargs): + with self._callback_lock: + if self._closing: + raise RuntimeError("IOLoop is closing") + list_empty = not self._callbacks + self._callbacks.append(functools.partial( + stack_context.wrap(callback), *args, **kwargs)) + if list_empty and thread.get_ident() != self._thread_ident: + # If we're in the IOLoop's thread, we know it's not currently + # polling. If we're not, and we added the first callback to an + # empty list, we may need to wake it up (it may wake up on its + # own, but an occasional extra wake is harmless). Waking + # up a polling IOLoop is relatively expensive, so we try to + # avoid it when we can. + self._waker.wake() + + def add_callback_from_signal(self, callback, *args, **kwargs): + with stack_context.NullContext(): + if thread.get_ident() != self._thread_ident: + # if the signal is handled on another thread, we can add + # it normally (modulo the NullContext) + self.add_callback(callback, *args, **kwargs) + else: + # If we're on the IOLoop's thread, we cannot use + # the regular add_callback because it may deadlock on + # _callback_lock. Blindly insert into self._callbacks. + # This is safe because the GIL makes list.append atomic. + # One subtlety is that if the signal interrupted the + # _callback_lock block in IOLoop.start, we may modify + # either the old or new version of self._callbacks, + # but either way will work. + self._callbacks.append(functools.partial( + stack_context.wrap(callback), *args, **kwargs)) + + +class _Timeout(object): + """An IOLoop timeout, a UNIX timestamp and a callback""" + + # Reduce memory overhead when there are lots of pending callbacks + __slots__ = ['deadline', 'callback'] + + def __init__(self, deadline, callback, io_loop): + if isinstance(deadline, numbers.Real): + self.deadline = deadline + elif isinstance(deadline, datetime.timedelta): + self.deadline = io_loop.time() + _Timeout.timedelta_to_seconds(deadline) + else: + raise TypeError("Unsupported deadline %r" % deadline) + self.callback = callback + + @staticmethod + def timedelta_to_seconds(td): + """Equivalent to td.total_seconds() (introduced in python 2.7).""" + return (td.microseconds + (td.seconds + td.days * 24 * 3600) * 10 ** 6) / float(10 ** 6) + + # Comparison methods to sort by deadline, with object id as a tiebreaker + # to guarantee a consistent ordering. The heapq module uses __le__ + # in python2.5, and __lt__ in 2.6+ (sort() and most other comparisons + # use __lt__). + def __lt__(self, other): + return ((self.deadline, id(self)) < + (other.deadline, id(other))) + + def __le__(self, other): + return ((self.deadline, id(self)) <= + (other.deadline, id(other))) + + +class PeriodicCallback(object): + """Schedules the given callback to be called periodically. + + The callback is called every ``callback_time`` milliseconds. + + `start` must be called after the `PeriodicCallback` is created. + """ + def __init__(self, callback, callback_time, io_loop=None): + self.callback = callback + if callback_time <= 0: + raise ValueError("Periodic callback must have a positive callback_time") + self.callback_time = callback_time + self.io_loop = io_loop or IOLoop.current() + self._running = False + self._timeout = None + + def start(self): + """Starts the timer.""" + self._running = True + self._next_timeout = self.io_loop.time() + self._schedule_next() + + def stop(self): + """Stops the timer.""" + self._running = False + if self._timeout is not None: + self.io_loop.remove_timeout(self._timeout) + self._timeout = None + + def _run(self): + if not self._running: + return + try: + self.callback() + except Exception: + app_log.error("Error in periodic callback", exc_info=True) + self._schedule_next() + + def _schedule_next(self): + if self._running: + current_time = self.io_loop.time() + while self._next_timeout <= current_time: + self._next_timeout += self.callback_time / 1000.0 + self._timeout = self.io_loop.add_timeout(self._next_timeout, self._run) diff --git a/scripts/external_libs/platform/cel59/32bit/zmq/eventloop/minitornado/log.py b/scripts/external_libs/platform/cel59/32bit/zmq/eventloop/minitornado/log.py new file mode 100644 index 00000000..49051e89 --- /dev/null +++ b/scripts/external_libs/platform/cel59/32bit/zmq/eventloop/minitornado/log.py @@ -0,0 +1,6 @@ +"""minimal subset of tornado.log for zmq.eventloop.minitornado""" + +import logging + +app_log = logging.getLogger("tornado.application") +gen_log = logging.getLogger("tornado.general") diff --git a/scripts/external_libs/platform/cel59/32bit/zmq/eventloop/minitornado/platform/__init__.py b/scripts/external_libs/platform/cel59/32bit/zmq/eventloop/minitornado/platform/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/scripts/external_libs/platform/cel59/32bit/zmq/eventloop/minitornado/platform/auto.py b/scripts/external_libs/platform/cel59/32bit/zmq/eventloop/minitornado/platform/auto.py new file mode 100644 index 00000000..b40ccd94 --- /dev/null +++ b/scripts/external_libs/platform/cel59/32bit/zmq/eventloop/minitornado/platform/auto.py @@ -0,0 +1,45 @@ +#!/usr/bin/env python +# +# Copyright 2011 Facebook +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +"""Implementation of platform-specific functionality. + +For each function or class described in `tornado.platform.interface`, +the appropriate platform-specific implementation exists in this module. +Most code that needs access to this functionality should do e.g.:: + + from tornado.platform.auto import set_close_exec +""" + +from __future__ import absolute_import, division, print_function, with_statement + +import os + +if os.name == 'nt': + from .common import Waker + from .windows import set_close_exec +else: + from .posix import set_close_exec, Waker + +try: + # monotime monkey-patches the time module to have a monotonic function + # in versions of python before 3.3. + import monotime +except ImportError: + pass +try: + from time import monotonic as monotonic_time +except ImportError: + monotonic_time = None diff --git a/scripts/external_libs/platform/cel59/32bit/zmq/eventloop/minitornado/platform/common.py b/scripts/external_libs/platform/cel59/32bit/zmq/eventloop/minitornado/platform/common.py new file mode 100644 index 00000000..2d75dc1e --- /dev/null +++ b/scripts/external_libs/platform/cel59/32bit/zmq/eventloop/minitornado/platform/common.py @@ -0,0 +1,91 @@ +"""Lowest-common-denominator implementations of platform functionality.""" +from __future__ import absolute_import, division, print_function, with_statement + +import errno +import socket + +from . import interface + + +class Waker(interface.Waker): + """Create an OS independent asynchronous pipe. + + For use on platforms that don't have os.pipe() (or where pipes cannot + be passed to select()), but do have sockets. This includes Windows + and Jython. + """ + def __init__(self): + # Based on Zope async.py: http://svn.zope.org/zc.ngi/trunk/src/zc/ngi/async.py + + self.writer = socket.socket() + # Disable buffering -- pulling the trigger sends 1 byte, + # and we want that sent immediately, to wake up ASAP. + self.writer.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1) + + count = 0 + while 1: + count += 1 + # Bind to a local port; for efficiency, let the OS pick + # a free port for us. + # Unfortunately, stress tests showed that we may not + # be able to connect to that port ("Address already in + # use") despite that the OS picked it. This appears + # to be a race bug in the Windows socket implementation. + # So we loop until a connect() succeeds (almost always + # on the first try). See the long thread at + # http://mail.zope.org/pipermail/zope/2005-July/160433.html + # for hideous details. + a = socket.socket() + a.bind(("127.0.0.1", 0)) + a.listen(1) + connect_address = a.getsockname() # assigned (host, port) pair + try: + self.writer.connect(connect_address) + break # success + except socket.error as detail: + if (not hasattr(errno, 'WSAEADDRINUSE') or + detail[0] != errno.WSAEADDRINUSE): + # "Address already in use" is the only error + # I've seen on two WinXP Pro SP2 boxes, under + # Pythons 2.3.5 and 2.4.1. + raise + # (10048, 'Address already in use') + # assert count <= 2 # never triggered in Tim's tests + if count >= 10: # I've never seen it go above 2 + a.close() + self.writer.close() + raise socket.error("Cannot bind trigger!") + # Close `a` and try again. Note: I originally put a short + # sleep() here, but it didn't appear to help or hurt. + a.close() + + self.reader, addr = a.accept() + self.reader.setblocking(0) + self.writer.setblocking(0) + a.close() + self.reader_fd = self.reader.fileno() + + def fileno(self): + return self.reader.fileno() + + def write_fileno(self): + return self.writer.fileno() + + def wake(self): + try: + self.writer.send(b"x") + except (IOError, socket.error): + pass + + def consume(self): + try: + while True: + result = self.reader.recv(1024) + if not result: + break + except (IOError, socket.error): + pass + + def close(self): + self.reader.close() + self.writer.close() diff --git a/scripts/external_libs/platform/cel59/32bit/zmq/eventloop/minitornado/platform/interface.py b/scripts/external_libs/platform/cel59/32bit/zmq/eventloop/minitornado/platform/interface.py new file mode 100644 index 00000000..07da6bab --- /dev/null +++ b/scripts/external_libs/platform/cel59/32bit/zmq/eventloop/minitornado/platform/interface.py @@ -0,0 +1,63 @@ +#!/usr/bin/env python +# +# Copyright 2011 Facebook +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +"""Interfaces for platform-specific functionality. + +This module exists primarily for documentation purposes and as base classes +for other tornado.platform modules. Most code should import the appropriate +implementation from `tornado.platform.auto`. +""" + +from __future__ import absolute_import, division, print_function, with_statement + + +def set_close_exec(fd): + """Sets the close-on-exec bit (``FD_CLOEXEC``)for a file descriptor.""" + raise NotImplementedError() + + +class Waker(object): + """A socket-like object that can wake another thread from ``select()``. + + The `~tornado.ioloop.IOLoop` will add the Waker's `fileno()` to + its ``select`` (or ``epoll`` or ``kqueue``) calls. When another + thread wants to wake up the loop, it calls `wake`. Once it has woken + up, it will call `consume` to do any necessary per-wake cleanup. When + the ``IOLoop`` is closed, it closes its waker too. + """ + def fileno(self): + """Returns the read file descriptor for this waker. + + Must be suitable for use with ``select()`` or equivalent on the + local platform. + """ + raise NotImplementedError() + + def write_fileno(self): + """Returns the write file descriptor for this waker.""" + raise NotImplementedError() + + def wake(self): + """Triggers activity on the waker's file descriptor.""" + raise NotImplementedError() + + def consume(self): + """Called after the listen has woken up to do any necessary cleanup.""" + raise NotImplementedError() + + def close(self): + """Closes the waker's file descriptor(s).""" + raise NotImplementedError() diff --git a/scripts/external_libs/platform/cel59/32bit/zmq/eventloop/minitornado/platform/posix.py b/scripts/external_libs/platform/cel59/32bit/zmq/eventloop/minitornado/platform/posix.py new file mode 100644 index 00000000..ccffbb66 --- /dev/null +++ b/scripts/external_libs/platform/cel59/32bit/zmq/eventloop/minitornado/platform/posix.py @@ -0,0 +1,70 @@ +#!/usr/bin/env python +# +# Copyright 2011 Facebook +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +"""Posix implementations of platform-specific functionality.""" + +from __future__ import absolute_import, division, print_function, with_statement + +import fcntl +import os + +from . import interface + + +def set_close_exec(fd): + flags = fcntl.fcntl(fd, fcntl.F_GETFD) + fcntl.fcntl(fd, fcntl.F_SETFD, flags | fcntl.FD_CLOEXEC) + + +def _set_nonblocking(fd): + flags = fcntl.fcntl(fd, fcntl.F_GETFL) + fcntl.fcntl(fd, fcntl.F_SETFL, flags | os.O_NONBLOCK) + + +class Waker(interface.Waker): + def __init__(self): + r, w = os.pipe() + _set_nonblocking(r) + _set_nonblocking(w) + set_close_exec(r) + set_close_exec(w) + self.reader = os.fdopen(r, "rb", 0) + self.writer = os.fdopen(w, "wb", 0) + + def fileno(self): + return self.reader.fileno() + + def write_fileno(self): + return self.writer.fileno() + + def wake(self): + try: + self.writer.write(b"x") + except IOError: + pass + + def consume(self): + try: + while True: + result = self.reader.read() + if not result: + break + except IOError: + pass + + def close(self): + self.reader.close() + self.writer.close() diff --git a/scripts/external_libs/platform/cel59/32bit/zmq/eventloop/minitornado/platform/windows.py b/scripts/external_libs/platform/cel59/32bit/zmq/eventloop/minitornado/platform/windows.py new file mode 100644 index 00000000..817bdca1 --- /dev/null +++ b/scripts/external_libs/platform/cel59/32bit/zmq/eventloop/minitornado/platform/windows.py @@ -0,0 +1,20 @@ +# NOTE: win32 support is currently experimental, and not recommended +# for production use. + + +from __future__ import absolute_import, division, print_function, with_statement +import ctypes +import ctypes.wintypes + +# See: http://msdn.microsoft.com/en-us/library/ms724935(VS.85).aspx +SetHandleInformation = ctypes.windll.kernel32.SetHandleInformation +SetHandleInformation.argtypes = (ctypes.wintypes.HANDLE, ctypes.wintypes.DWORD, ctypes.wintypes.DWORD) +SetHandleInformation.restype = ctypes.wintypes.BOOL + +HANDLE_FLAG_INHERIT = 0x00000001 + + +def set_close_exec(fd): + success = SetHandleInformation(fd, HANDLE_FLAG_INHERIT, 0) + if not success: + raise ctypes.GetLastError() diff --git a/scripts/external_libs/platform/cel59/32bit/zmq/eventloop/minitornado/stack_context.py b/scripts/external_libs/platform/cel59/32bit/zmq/eventloop/minitornado/stack_context.py new file mode 100644 index 00000000..226d8042 --- /dev/null +++ b/scripts/external_libs/platform/cel59/32bit/zmq/eventloop/minitornado/stack_context.py @@ -0,0 +1,376 @@ +#!/usr/bin/env python +# +# Copyright 2010 Facebook +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +"""`StackContext` allows applications to maintain threadlocal-like state +that follows execution as it moves to other execution contexts. + +The motivating examples are to eliminate the need for explicit +``async_callback`` wrappers (as in `tornado.web.RequestHandler`), and to +allow some additional context to be kept for logging. + +This is slightly magic, but it's an extension of the idea that an +exception handler is a kind of stack-local state and when that stack +is suspended and resumed in a new context that state needs to be +preserved. `StackContext` shifts the burden of restoring that state +from each call site (e.g. wrapping each `.AsyncHTTPClient` callback +in ``async_callback``) to the mechanisms that transfer control from +one context to another (e.g. `.AsyncHTTPClient` itself, `.IOLoop`, +thread pools, etc). + +Example usage:: + + @contextlib.contextmanager + def die_on_error(): + try: + yield + except Exception: + logging.error("exception in asynchronous operation",exc_info=True) + sys.exit(1) + + with StackContext(die_on_error): + # Any exception thrown here *or in callback and its desendents* + # will cause the process to exit instead of spinning endlessly + # in the ioloop. + http_client.fetch(url, callback) + ioloop.start() + +Most applications shouln't have to work with `StackContext` directly. +Here are a few rules of thumb for when it's necessary: + +* If you're writing an asynchronous library that doesn't rely on a + stack_context-aware library like `tornado.ioloop` or `tornado.iostream` + (for example, if you're writing a thread pool), use + `.stack_context.wrap()` before any asynchronous operations to capture the + stack context from where the operation was started. + +* If you're writing an asynchronous library that has some shared + resources (such as a connection pool), create those shared resources + within a ``with stack_context.NullContext():`` block. This will prevent + ``StackContexts`` from leaking from one request to another. + +* If you want to write something like an exception handler that will + persist across asynchronous calls, create a new `StackContext` (or + `ExceptionStackContext`), and make your asynchronous calls in a ``with`` + block that references your `StackContext`. +""" + +from __future__ import absolute_import, division, print_function, with_statement + +import sys +import threading + +from .util import raise_exc_info + + +class StackContextInconsistentError(Exception): + pass + + +class _State(threading.local): + def __init__(self): + self.contexts = (tuple(), None) +_state = _State() + + +class StackContext(object): + """Establishes the given context as a StackContext that will be transferred. + + Note that the parameter is a callable that returns a context + manager, not the context itself. That is, where for a + non-transferable context manager you would say:: + + with my_context(): + + StackContext takes the function itself rather than its result:: + + with StackContext(my_context): + + The result of ``with StackContext() as cb:`` is a deactivation + callback. Run this callback when the StackContext is no longer + needed to ensure that it is not propagated any further (note that + deactivating a context does not affect any instances of that + context that are currently pending). This is an advanced feature + and not necessary in most applications. + """ + def __init__(self, context_factory): + self.context_factory = context_factory + self.contexts = [] + self.active = True + + def _deactivate(self): + self.active = False + + # StackContext protocol + def enter(self): + context = self.context_factory() + self.contexts.append(context) + context.__enter__() + + def exit(self, type, value, traceback): + context = self.contexts.pop() + context.__exit__(type, value, traceback) + + # Note that some of this code is duplicated in ExceptionStackContext + # below. ExceptionStackContext is more common and doesn't need + # the full generality of this class. + def __enter__(self): + self.old_contexts = _state.contexts + self.new_contexts = (self.old_contexts[0] + (self,), self) + _state.contexts = self.new_contexts + + try: + self.enter() + except: + _state.contexts = self.old_contexts + raise + + return self._deactivate + + def __exit__(self, type, value, traceback): + try: + self.exit(type, value, traceback) + finally: + final_contexts = _state.contexts + _state.contexts = self.old_contexts + + # Generator coroutines and with-statements with non-local + # effects interact badly. Check here for signs of + # the stack getting out of sync. + # Note that this check comes after restoring _state.context + # so that if it fails things are left in a (relatively) + # consistent state. + if final_contexts is not self.new_contexts: + raise StackContextInconsistentError( + 'stack_context inconsistency (may be caused by yield ' + 'within a "with StackContext" block)') + + # Break up a reference to itself to allow for faster GC on CPython. + self.new_contexts = None + + +class ExceptionStackContext(object): + """Specialization of StackContext for exception handling. + + The supplied ``exception_handler`` function will be called in the + event of an uncaught exception in this context. The semantics are + similar to a try/finally clause, and intended use cases are to log + an error, close a socket, or similar cleanup actions. The + ``exc_info`` triple ``(type, value, traceback)`` will be passed to the + exception_handler function. + + If the exception handler returns true, the exception will be + consumed and will not be propagated to other exception handlers. + """ + def __init__(self, exception_handler): + self.exception_handler = exception_handler + self.active = True + + def _deactivate(self): + self.active = False + + def exit(self, type, value, traceback): + if type is not None: + return self.exception_handler(type, value, traceback) + + def __enter__(self): + self.old_contexts = _state.contexts + self.new_contexts = (self.old_contexts[0], self) + _state.contexts = self.new_contexts + + return self._deactivate + + def __exit__(self, type, value, traceback): + try: + if type is not None: + return self.exception_handler(type, value, traceback) + finally: + final_contexts = _state.contexts + _state.contexts = self.old_contexts + + if final_contexts is not self.new_contexts: + raise StackContextInconsistentError( + 'stack_context inconsistency (may be caused by yield ' + 'within a "with StackContext" block)') + + # Break up a reference to itself to allow for faster GC on CPython. + self.new_contexts = None + + +class NullContext(object): + """Resets the `StackContext`. + + Useful when creating a shared resource on demand (e.g. an + `.AsyncHTTPClient`) where the stack that caused the creating is + not relevant to future operations. + """ + def __enter__(self): + self.old_contexts = _state.contexts + _state.contexts = (tuple(), None) + + def __exit__(self, type, value, traceback): + _state.contexts = self.old_contexts + + +def _remove_deactivated(contexts): + """Remove deactivated handlers from the chain""" + # Clean ctx handlers + stack_contexts = tuple([h for h in contexts[0] if h.active]) + + # Find new head + head = contexts[1] + while head is not None and not head.active: + head = head.old_contexts[1] + + # Process chain + ctx = head + while ctx is not None: + parent = ctx.old_contexts[1] + + while parent is not None: + if parent.active: + break + ctx.old_contexts = parent.old_contexts + parent = parent.old_contexts[1] + + ctx = parent + + return (stack_contexts, head) + + +def wrap(fn): + """Returns a callable object that will restore the current `StackContext` + when executed. + + Use this whenever saving a callback to be executed later in a + different execution context (either in a different thread or + asynchronously in the same thread). + """ + # Check if function is already wrapped + if fn is None or hasattr(fn, '_wrapped'): + return fn + + # Capture current stack head + # TODO: Any other better way to store contexts and update them in wrapped function? + cap_contexts = [_state.contexts] + + def wrapped(*args, **kwargs): + ret = None + try: + # Capture old state + current_state = _state.contexts + + # Remove deactivated items + cap_contexts[0] = contexts = _remove_deactivated(cap_contexts[0]) + + # Force new state + _state.contexts = contexts + + # Current exception + exc = (None, None, None) + top = None + + # Apply stack contexts + last_ctx = 0 + stack = contexts[0] + + # Apply state + for n in stack: + try: + n.enter() + last_ctx += 1 + except: + # Exception happened. Record exception info and store top-most handler + exc = sys.exc_info() + top = n.old_contexts[1] + + # Execute callback if no exception happened while restoring state + if top is None: + try: + ret = fn(*args, **kwargs) + except: + exc = sys.exc_info() + top = contexts[1] + + # If there was exception, try to handle it by going through the exception chain + if top is not None: + exc = _handle_exception(top, exc) + else: + # Otherwise take shorter path and run stack contexts in reverse order + while last_ctx > 0: + last_ctx -= 1 + c = stack[last_ctx] + + try: + c.exit(*exc) + except: + exc = sys.exc_info() + top = c.old_contexts[1] + break + else: + top = None + + # If if exception happened while unrolling, take longer exception handler path + if top is not None: + exc = _handle_exception(top, exc) + + # If exception was not handled, raise it + if exc != (None, None, None): + raise_exc_info(exc) + finally: + _state.contexts = current_state + return ret + + wrapped._wrapped = True + return wrapped + + +def _handle_exception(tail, exc): + while tail is not None: + try: + if tail.exit(*exc): + exc = (None, None, None) + except: + exc = sys.exc_info() + + tail = tail.old_contexts[1] + + return exc + + +def run_with_stack_context(context, func): + """Run a coroutine ``func`` in the given `StackContext`. + + It is not safe to have a ``yield`` statement within a ``with StackContext`` + block, so it is difficult to use stack context with `.gen.coroutine`. + This helper function runs the function in the correct context while + keeping the ``yield`` and ``with`` statements syntactically separate. + + Example:: + + @gen.coroutine + def incorrect(): + with StackContext(ctx): + # ERROR: this will raise StackContextInconsistentError + yield other_coroutine() + + @gen.coroutine + def correct(): + yield run_with_stack_context(StackContext(ctx), other_coroutine) + + .. versionadded:: 3.1 + """ + with context: + return func() diff --git a/scripts/external_libs/platform/cel59/32bit/zmq/eventloop/minitornado/util.py b/scripts/external_libs/platform/cel59/32bit/zmq/eventloop/minitornado/util.py new file mode 100644 index 00000000..c1e2eb95 --- /dev/null +++ b/scripts/external_libs/platform/cel59/32bit/zmq/eventloop/minitornado/util.py @@ -0,0 +1,184 @@ +"""Miscellaneous utility functions and classes. + +This module is used internally by Tornado. It is not necessarily expected +that the functions and classes defined here will be useful to other +applications, but they are documented here in case they are. + +The one public-facing part of this module is the `Configurable` class +and its `~Configurable.configure` method, which becomes a part of the +interface of its subclasses, including `.AsyncHTTPClient`, `.IOLoop`, +and `.Resolver`. +""" + +from __future__ import absolute_import, division, print_function, with_statement + +import sys + + +def import_object(name): + """Imports an object by name. + + import_object('x') is equivalent to 'import x'. + import_object('x.y.z') is equivalent to 'from x.y import z'. + + >>> import tornado.escape + >>> import_object('tornado.escape') is tornado.escape + True + >>> import_object('tornado.escape.utf8') is tornado.escape.utf8 + True + >>> import_object('tornado') is tornado + True + >>> import_object('tornado.missing_module') + Traceback (most recent call last): + ... + ImportError: No module named missing_module + """ + if name.count('.') == 0: + return __import__(name, None, None) + + parts = name.split('.') + obj = __import__('.'.join(parts[:-1]), None, None, [parts[-1]], 0) + try: + return getattr(obj, parts[-1]) + except AttributeError: + raise ImportError("No module named %s" % parts[-1]) + + +# Fake unicode literal support: Python 3.2 doesn't have the u'' marker for +# literal strings, and alternative solutions like "from __future__ import +# unicode_literals" have other problems (see PEP 414). u() can be applied +# to ascii strings that include \u escapes (but they must not contain +# literal non-ascii characters). +if type('') is not type(b''): + def u(s): + return s + bytes_type = bytes + unicode_type = str + basestring_type = str +else: + def u(s): + return s.decode('unicode_escape') + bytes_type = str + unicode_type = unicode + basestring_type = basestring + + +if sys.version_info > (3,): + exec(""" +def raise_exc_info(exc_info): + raise exc_info[1].with_traceback(exc_info[2]) + +def exec_in(code, glob, loc=None): + if isinstance(code, str): + code = compile(code, '', 'exec', dont_inherit=True) + exec(code, glob, loc) +""") +else: + exec(""" +def raise_exc_info(exc_info): + raise exc_info[0], exc_info[1], exc_info[2] + +def exec_in(code, glob, loc=None): + if isinstance(code, basestring): + # exec(string) inherits the caller's future imports; compile + # the string first to prevent that. + code = compile(code, '', 'exec', dont_inherit=True) + exec code in glob, loc +""") + + +class Configurable(object): + """Base class for configurable interfaces. + + A configurable interface is an (abstract) class whose constructor + acts as a factory function for one of its implementation subclasses. + The implementation subclass as well as optional keyword arguments to + its initializer can be set globally at runtime with `configure`. + + By using the constructor as the factory method, the interface + looks like a normal class, `isinstance` works as usual, etc. This + pattern is most useful when the choice of implementation is likely + to be a global decision (e.g. when `~select.epoll` is available, + always use it instead of `~select.select`), or when a + previously-monolithic class has been split into specialized + subclasses. + + Configurable subclasses must define the class methods + `configurable_base` and `configurable_default`, and use the instance + method `initialize` instead of ``__init__``. + """ + __impl_class = None + __impl_kwargs = None + + def __new__(cls, **kwargs): + base = cls.configurable_base() + args = {} + if cls is base: + impl = cls.configured_class() + if base.__impl_kwargs: + args.update(base.__impl_kwargs) + else: + impl = cls + args.update(kwargs) + instance = super(Configurable, cls).__new__(impl) + # initialize vs __init__ chosen for compatiblity with AsyncHTTPClient + # singleton magic. If we get rid of that we can switch to __init__ + # here too. + instance.initialize(**args) + return instance + + @classmethod + def configurable_base(cls): + """Returns the base class of a configurable hierarchy. + + This will normally return the class in which it is defined. + (which is *not* necessarily the same as the cls classmethod parameter). + """ + raise NotImplementedError() + + @classmethod + def configurable_default(cls): + """Returns the implementation class to be used if none is configured.""" + raise NotImplementedError() + + def initialize(self): + """Initialize a `Configurable` subclass instance. + + Configurable classes should use `initialize` instead of ``__init__``. + """ + + @classmethod + def configure(cls, impl, **kwargs): + """Sets the class to use when the base class is instantiated. + + Keyword arguments will be saved and added to the arguments passed + to the constructor. This can be used to set global defaults for + some parameters. + """ + base = cls.configurable_base() + if isinstance(impl, (unicode_type, bytes_type)): + impl = import_object(impl) + if impl is not None and not issubclass(impl, cls): + raise ValueError("Invalid subclass of %s" % cls) + base.__impl_class = impl + base.__impl_kwargs = kwargs + + @classmethod + def configured_class(cls): + """Returns the currently configured class.""" + base = cls.configurable_base() + if cls.__impl_class is None: + base.__impl_class = cls.configurable_default() + return base.__impl_class + + @classmethod + def _save_configuration(cls): + base = cls.configurable_base() + return (base.__impl_class, base.__impl_kwargs) + + @classmethod + def _restore_configuration(cls, saved): + base = cls.configurable_base() + base.__impl_class = saved[0] + base.__impl_kwargs = saved[1] + diff --git a/scripts/external_libs/platform/cel59/32bit/zmq/eventloop/zmqstream.py b/scripts/external_libs/platform/cel59/32bit/zmq/eventloop/zmqstream.py new file mode 100644 index 00000000..86a97e44 --- /dev/null +++ b/scripts/external_libs/platform/cel59/32bit/zmq/eventloop/zmqstream.py @@ -0,0 +1,529 @@ +# +# Copyright 2009 Facebook +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +"""A utility class to send to and recv from a non-blocking socket.""" + +from __future__ import with_statement + +import sys + +import zmq +from zmq.utils import jsonapi + +try: + import cPickle as pickle +except ImportError: + import pickle + +from .ioloop import IOLoop + +try: + # gen_log will only import from >= 3.0 + from tornado.log import gen_log + from tornado import stack_context +except ImportError: + from .minitornado.log import gen_log + from .minitornado import stack_context + +try: + from queue import Queue +except ImportError: + from Queue import Queue + +from zmq.utils.strtypes import bytes, unicode, basestring + +try: + callable +except NameError: + callable = lambda obj: hasattr(obj, '__call__') + + +class ZMQStream(object): + """A utility class to register callbacks when a zmq socket sends and receives + + For use with zmq.eventloop.ioloop + + There are three main methods + + Methods: + + * **on_recv(callback, copy=True):** + register a callback to be run every time the socket has something to receive + * **on_send(callback):** + register a callback to be run every time you call send + * **send(self, msg, flags=0, copy=False, callback=None):** + perform a send that will trigger the callback + if callback is passed, on_send is also called. + + There are also send_multipart(), send_json(), send_pyobj() + + Three other methods for deactivating the callbacks: + + * **stop_on_recv():** + turn off the recv callback + * **stop_on_send():** + turn off the send callback + + which simply call ``on_(None)``. + + The entire socket interface, excluding direct recv methods, is also + provided, primarily through direct-linking the methods. + e.g. + + >>> stream.bind is stream.socket.bind + True + + """ + + socket = None + io_loop = None + poller = None + + def __init__(self, socket, io_loop=None): + self.socket = socket + self.io_loop = io_loop or IOLoop.instance() + self.poller = zmq.Poller() + + self._send_queue = Queue() + self._recv_callback = None + self._send_callback = None + self._close_callback = None + self._recv_copy = False + self._flushed = False + + self._state = self.io_loop.ERROR + self._init_io_state() + + # shortcircuit some socket methods + self.bind = self.socket.bind + self.bind_to_random_port = self.socket.bind_to_random_port + self.connect = self.socket.connect + self.setsockopt = self.socket.setsockopt + self.getsockopt = self.socket.getsockopt + self.setsockopt_string = self.socket.setsockopt_string + self.getsockopt_string = self.socket.getsockopt_string + self.setsockopt_unicode = self.socket.setsockopt_unicode + self.getsockopt_unicode = self.socket.getsockopt_unicode + + + def stop_on_recv(self): + """Disable callback and automatic receiving.""" + return self.on_recv(None) + + def stop_on_send(self): + """Disable callback on sending.""" + return self.on_send(None) + + def stop_on_err(self): + """DEPRECATED, does nothing""" + gen_log.warn("on_err does nothing, and will be removed") + + def on_err(self, callback): + """DEPRECATED, does nothing""" + gen_log.warn("on_err does nothing, and will be removed") + + def on_recv(self, callback, copy=True): + """Register a callback for when a message is ready to recv. + + There can be only one callback registered at a time, so each + call to `on_recv` replaces previously registered callbacks. + + on_recv(None) disables recv event polling. + + Use on_recv_stream(callback) instead, to register a callback that will receive + both this ZMQStream and the message, instead of just the message. + + Parameters + ---------- + + callback : callable + callback must take exactly one argument, which will be a + list, as returned by socket.recv_multipart() + if callback is None, recv callbacks are disabled. + copy : bool + copy is passed directly to recv, so if copy is False, + callback will receive Message objects. If copy is True, + then callback will receive bytes/str objects. + + Returns : None + """ + + self._check_closed() + assert callback is None or callable(callback) + self._recv_callback = stack_context.wrap(callback) + self._recv_copy = copy + if callback is None: + self._drop_io_state(self.io_loop.READ) + else: + self._add_io_state(self.io_loop.READ) + + def on_recv_stream(self, callback, copy=True): + """Same as on_recv, but callback will get this stream as first argument + + callback must take exactly two arguments, as it will be called as:: + + callback(stream, msg) + + Useful when a single callback should be used with multiple streams. + """ + if callback is None: + self.stop_on_recv() + else: + self.on_recv(lambda msg: callback(self, msg), copy=copy) + + def on_send(self, callback): + """Register a callback to be called on each send + + There will be two arguments:: + + callback(msg, status) + + * `msg` will be the list of sendable objects that was just sent + * `status` will be the return result of socket.send_multipart(msg) - + MessageTracker or None. + + Non-copying sends return a MessageTracker object whose + `done` attribute will be True when the send is complete. + This allows users to track when an object is safe to write to + again. + + The second argument will always be None if copy=True + on the send. + + Use on_send_stream(callback) to register a callback that will be passed + this ZMQStream as the first argument, in addition to the other two. + + on_send(None) disables recv event polling. + + Parameters + ---------- + + callback : callable + callback must take exactly two arguments, which will be + the message being sent (always a list), + and the return result of socket.send_multipart(msg) - + MessageTracker or None. + + if callback is None, send callbacks are disabled. + """ + + self._check_closed() + assert callback is None or callable(callback) + self._send_callback = stack_context.wrap(callback) + + + def on_send_stream(self, callback): + """Same as on_send, but callback will get this stream as first argument + + Callback will be passed three arguments:: + + callback(stream, msg, status) + + Useful when a single callback should be used with multiple streams. + """ + if callback is None: + self.stop_on_send() + else: + self.on_send(lambda msg, status: callback(self, msg, status)) + + + def send(self, msg, flags=0, copy=True, track=False, callback=None): + """Send a message, optionally also register a new callback for sends. + See zmq.socket.send for details. + """ + return self.send_multipart([msg], flags=flags, copy=copy, track=track, callback=callback) + + def send_multipart(self, msg, flags=0, copy=True, track=False, callback=None): + """Send a multipart message, optionally also register a new callback for sends. + See zmq.socket.send_multipart for details. + """ + kwargs = dict(flags=flags, copy=copy, track=track) + self._send_queue.put((msg, kwargs)) + callback = callback or self._send_callback + if callback is not None: + self.on_send(callback) + else: + # noop callback + self.on_send(lambda *args: None) + self._add_io_state(self.io_loop.WRITE) + + def send_string(self, u, flags=0, encoding='utf-8', callback=None): + """Send a unicode message with an encoding. + See zmq.socket.send_unicode for details. + """ + if not isinstance(u, basestring): + raise TypeError("unicode/str objects only") + return self.send(u.encode(encoding), flags=flags, callback=callback) + + send_unicode = send_string + + def send_json(self, obj, flags=0, callback=None): + """Send json-serialized version of an object. + See zmq.socket.send_json for details. + """ + if jsonapi is None: + raise ImportError('jsonlib{1,2}, json or simplejson library is required.') + else: + msg = jsonapi.dumps(obj) + return self.send(msg, flags=flags, callback=callback) + + def send_pyobj(self, obj, flags=0, protocol=-1, callback=None): + """Send a Python object as a message using pickle to serialize. + + See zmq.socket.send_json for details. + """ + msg = pickle.dumps(obj, protocol) + return self.send(msg, flags, callback=callback) + + def _finish_flush(self): + """callback for unsetting _flushed flag.""" + self._flushed = False + + def flush(self, flag=zmq.POLLIN|zmq.POLLOUT, limit=None): + """Flush pending messages. + + This method safely handles all pending incoming and/or outgoing messages, + bypassing the inner loop, passing them to the registered callbacks. + + A limit can be specified, to prevent blocking under high load. + + flush will return the first time ANY of these conditions are met: + * No more events matching the flag are pending. + * the total number of events handled reaches the limit. + + Note that if ``flag|POLLIN != 0``, recv events will be flushed even if no callback + is registered, unlike normal IOLoop operation. This allows flush to be + used to remove *and ignore* incoming messages. + + Parameters + ---------- + flag : int, default=POLLIN|POLLOUT + 0MQ poll flags. + If flag|POLLIN, recv events will be flushed. + If flag|POLLOUT, send events will be flushed. + Both flags can be set at once, which is the default. + limit : None or int, optional + The maximum number of messages to send or receive. + Both send and recv count against this limit. + + Returns + ------- + int : count of events handled (both send and recv) + """ + self._check_closed() + # unset self._flushed, so callbacks will execute, in case flush has + # already been called this iteration + already_flushed = self._flushed + self._flushed = False + # initialize counters + count = 0 + def update_flag(): + """Update the poll flag, to prevent registering POLLOUT events + if we don't have pending sends.""" + return flag & zmq.POLLIN | (self.sending() and flag & zmq.POLLOUT) + flag = update_flag() + if not flag: + # nothing to do + return 0 + self.poller.register(self.socket, flag) + events = self.poller.poll(0) + while events and (not limit or count < limit): + s,event = events[0] + if event & zmq.POLLIN: # receiving + self._handle_recv() + count += 1 + if self.socket is None: + # break if socket was closed during callback + break + if event & zmq.POLLOUT and self.sending(): + self._handle_send() + count += 1 + if self.socket is None: + # break if socket was closed during callback + break + + flag = update_flag() + if flag: + self.poller.register(self.socket, flag) + events = self.poller.poll(0) + else: + events = [] + if count: # only bypass loop if we actually flushed something + # skip send/recv callbacks this iteration + self._flushed = True + # reregister them at the end of the loop + if not already_flushed: # don't need to do it again + self.io_loop.add_callback(self._finish_flush) + elif already_flushed: + self._flushed = True + + # update ioloop poll state, which may have changed + self._rebuild_io_state() + return count + + def set_close_callback(self, callback): + """Call the given callback when the stream is closed.""" + self._close_callback = stack_context.wrap(callback) + + def close(self, linger=None): + """Close this stream.""" + if self.socket is not None: + self.io_loop.remove_handler(self.socket) + self.socket.close(linger) + self.socket = None + if self._close_callback: + self._run_callback(self._close_callback) + + def receiving(self): + """Returns True if we are currently receiving from the stream.""" + return self._recv_callback is not None + + def sending(self): + """Returns True if we are currently sending to the stream.""" + return not self._send_queue.empty() + + def closed(self): + return self.socket is None + + def _run_callback(self, callback, *args, **kwargs): + """Wrap running callbacks in try/except to allow us to + close our socket.""" + try: + # Use a NullContext to ensure that all StackContexts are run + # inside our blanket exception handler rather than outside. + with stack_context.NullContext(): + callback(*args, **kwargs) + except: + gen_log.error("Uncaught exception, closing connection.", + exc_info=True) + # Close the socket on an uncaught exception from a user callback + # (It would eventually get closed when the socket object is + # gc'd, but we don't want to rely on gc happening before we + # run out of file descriptors) + self.close() + # Re-raise the exception so that IOLoop.handle_callback_exception + # can see it and log the error + raise + + def _handle_events(self, fd, events): + """This method is the actual handler for IOLoop, that gets called whenever + an event on my socket is posted. It dispatches to _handle_recv, etc.""" + # print "handling events" + if not self.socket: + gen_log.warning("Got events for closed stream %s", fd) + return + try: + # dispatch events: + if events & IOLoop.ERROR: + gen_log.error("got POLLERR event on ZMQStream, which doesn't make sense") + return + if events & IOLoop.READ: + self._handle_recv() + if not self.socket: + return + if events & IOLoop.WRITE: + self._handle_send() + if not self.socket: + return + + # rebuild the poll state + self._rebuild_io_state() + except: + gen_log.error("Uncaught exception, closing connection.", + exc_info=True) + self.close() + raise + + def _handle_recv(self): + """Handle a recv event.""" + if self._flushed: + return + try: + msg = self.socket.recv_multipart(zmq.NOBLOCK, copy=self._recv_copy) + except zmq.ZMQError as e: + if e.errno == zmq.EAGAIN: + # state changed since poll event + pass + else: + gen_log.error("RECV Error: %s"%zmq.strerror(e.errno)) + else: + if self._recv_callback: + callback = self._recv_callback + # self._recv_callback = None + self._run_callback(callback, msg) + + # self.update_state() + + + def _handle_send(self): + """Handle a send event.""" + if self._flushed: + return + if not self.sending(): + gen_log.error("Shouldn't have handled a send event") + return + + msg, kwargs = self._send_queue.get() + try: + status = self.socket.send_multipart(msg, **kwargs) + except zmq.ZMQError as e: + gen_log.error("SEND Error: %s", e) + status = e + if self._send_callback: + callback = self._send_callback + self._run_callback(callback, msg, status) + + # self.update_state() + + def _check_closed(self): + if not self.socket: + raise IOError("Stream is closed") + + def _rebuild_io_state(self): + """rebuild io state based on self.sending() and receiving()""" + if self.socket is None: + return + state = self.io_loop.ERROR + if self.receiving(): + state |= self.io_loop.READ + if self.sending(): + state |= self.io_loop.WRITE + if state != self._state: + self._state = state + self._update_handler(state) + + def _add_io_state(self, state): + """Add io_state to poller.""" + if not self._state & state: + self._state = self._state | state + self._update_handler(self._state) + + def _drop_io_state(self, state): + """Stop poller from watching an io_state.""" + if self._state & state: + self._state = self._state & (~state) + self._update_handler(self._state) + + def _update_handler(self, state): + """Update IOLoop handler with state.""" + if self.socket is None: + return + self.io_loop.update_handler(self.socket, state) + + def _init_io_state(self): + """initialize the ioloop event handler""" + with stack_context.NullContext(): + self.io_loop.add_handler(self.socket, self._handle_events, self._state) + diff --git a/scripts/external_libs/platform/cel59/32bit/zmq/green/__init__.py b/scripts/external_libs/platform/cel59/32bit/zmq/green/__init__.py new file mode 100644 index 00000000..ff7e5965 --- /dev/null +++ b/scripts/external_libs/platform/cel59/32bit/zmq/green/__init__.py @@ -0,0 +1,40 @@ +# -*- coding: utf-8 -*- +#----------------------------------------------------------------------------- +# Copyright (C) 2011-2012 Travis Cline +# +# This file is part of pyzmq +# It is adapted from upstream project zeromq_gevent under the New BSD License +# +# Distributed under the terms of the New BSD License. The full license is in +# the file COPYING.BSD, distributed as part of this software. +#----------------------------------------------------------------------------- + +"""zmq.green - gevent compatibility with zeromq. + +Usage +----- + +Instead of importing zmq directly, do so in the following manner: + +.. + + import zmq.green as zmq + + +Any calls that would have blocked the current thread will now only block the +current green thread. + +This compatibility is accomplished by ensuring the nonblocking flag is set +before any blocking operation and the ØMQ file descriptor is polled internally +to trigger needed events. +""" + +from zmq import * +from zmq.green.core import _Context, _Socket +from zmq.green.poll import _Poller +Context = _Context +Socket = _Socket +Poller = _Poller + +from zmq.green.device import device + diff --git a/scripts/external_libs/platform/cel59/32bit/zmq/green/core.py b/scripts/external_libs/platform/cel59/32bit/zmq/green/core.py new file mode 100644 index 00000000..9fc73e32 --- /dev/null +++ b/scripts/external_libs/platform/cel59/32bit/zmq/green/core.py @@ -0,0 +1,287 @@ +#----------------------------------------------------------------------------- +# Copyright (C) 2011-2012 Travis Cline +# +# This file is part of pyzmq +# It is adapted from upstream project zeromq_gevent under the New BSD License +# +# Distributed under the terms of the New BSD License. The full license is in +# the file COPYING.BSD, distributed as part of this software. +#----------------------------------------------------------------------------- + +"""This module wraps the :class:`Socket` and :class:`Context` found in :mod:`pyzmq ` to be non blocking +""" + +from __future__ import print_function + +import sys +import time +import warnings + +import zmq + +from zmq import Context as _original_Context +from zmq import Socket as _original_Socket +from .poll import _Poller + +import gevent +from gevent.event import AsyncResult +from gevent.hub import get_hub + +if hasattr(zmq, 'RCVTIMEO'): + TIMEOS = (zmq.RCVTIMEO, zmq.SNDTIMEO) +else: + TIMEOS = () + +def _stop(evt): + """simple wrapper for stopping an Event, allowing for method rename in gevent 1.0""" + try: + evt.stop() + except AttributeError as e: + # gevent<1.0 compat + evt.cancel() + +class _Socket(_original_Socket): + """Green version of :class:`zmq.Socket` + + The following methods are overridden: + + * send + * recv + + To ensure that the ``zmq.NOBLOCK`` flag is set and that sending or receiving + is deferred to the hub if a ``zmq.EAGAIN`` (retry) error is raised. + + The `__state_changed` method is triggered when the zmq.FD for the socket is + marked as readable and triggers the necessary read and write events (which + are waited for in the recv and send methods). + + Some double underscore prefixes are used to minimize pollution of + :class:`zmq.Socket`'s namespace. + """ + __in_send_multipart = False + __in_recv_multipart = False + __writable = None + __readable = None + _state_event = None + _gevent_bug_timeout = 11.6 # timeout for not trusting gevent + _debug_gevent = False # turn on if you think gevent is missing events + _poller_class = _Poller + + def __init__(self, context, socket_type): + _original_Socket.__init__(self, context, socket_type) + self.__in_send_multipart = False + self.__in_recv_multipart = False + self.__setup_events() + + + def __del__(self): + self.close() + + def close(self, linger=None): + super(_Socket, self).close(linger) + self.__cleanup_events() + + def __cleanup_events(self): + # close the _state_event event, keeps the number of active file descriptors down + if getattr(self, '_state_event', None): + _stop(self._state_event) + self._state_event = None + # if the socket has entered a close state resume any waiting greenlets + self.__writable.set() + self.__readable.set() + + def __setup_events(self): + self.__readable = AsyncResult() + self.__writable = AsyncResult() + self.__readable.set() + self.__writable.set() + + try: + self._state_event = get_hub().loop.io(self.getsockopt(zmq.FD), 1) # read state watcher + self._state_event.start(self.__state_changed) + except AttributeError: + # for gevent<1.0 compatibility + from gevent.core import read_event + self._state_event = read_event(self.getsockopt(zmq.FD), self.__state_changed, persist=True) + + def __state_changed(self, event=None, _evtype=None): + if self.closed: + self.__cleanup_events() + return + try: + # avoid triggering __state_changed from inside __state_changed + events = super(_Socket, self).getsockopt(zmq.EVENTS) + except zmq.ZMQError as exc: + self.__writable.set_exception(exc) + self.__readable.set_exception(exc) + else: + if events & zmq.POLLOUT: + self.__writable.set() + if events & zmq.POLLIN: + self.__readable.set() + + def _wait_write(self): + assert self.__writable.ready(), "Only one greenlet can be waiting on this event" + self.__writable = AsyncResult() + # timeout is because libzmq cannot be trusted to properly signal a new send event: + # this is effectively a maximum poll interval of 1s + tic = time.time() + dt = self._gevent_bug_timeout + if dt: + timeout = gevent.Timeout(seconds=dt) + else: + timeout = None + try: + if timeout: + timeout.start() + self.__writable.get(block=True) + except gevent.Timeout as t: + if t is not timeout: + raise + toc = time.time() + # gevent bug: get can raise timeout even on clean return + # don't display zmq bug warning for gevent bug (this is getting ridiculous) + if self._debug_gevent and timeout and toc-tic > dt and \ + self.getsockopt(zmq.EVENTS) & zmq.POLLOUT: + print("BUG: gevent may have missed a libzmq send event on %i!" % self.FD, file=sys.stderr) + finally: + if timeout: + timeout.cancel() + self.__writable.set() + + def _wait_read(self): + assert self.__readable.ready(), "Only one greenlet can be waiting on this event" + self.__readable = AsyncResult() + # timeout is because libzmq cannot always be trusted to play nice with libevent. + # I can only confirm that this actually happens for send, but lets be symmetrical + # with our dirty hacks. + # this is effectively a maximum poll interval of 1s + tic = time.time() + dt = self._gevent_bug_timeout + if dt: + timeout = gevent.Timeout(seconds=dt) + else: + timeout = None + try: + if timeout: + timeout.start() + self.__readable.get(block=True) + except gevent.Timeout as t: + if t is not timeout: + raise + toc = time.time() + # gevent bug: get can raise timeout even on clean return + # don't display zmq bug warning for gevent bug (this is getting ridiculous) + if self._debug_gevent and timeout and toc-tic > dt and \ + self.getsockopt(zmq.EVENTS) & zmq.POLLIN: + print("BUG: gevent may have missed a libzmq recv event on %i!" % self.FD, file=sys.stderr) + finally: + if timeout: + timeout.cancel() + self.__readable.set() + + def send(self, data, flags=0, copy=True, track=False): + """send, which will only block current greenlet + + state_changed always fires exactly once (success or fail) at the + end of this method. + """ + + # if we're given the NOBLOCK flag act as normal and let the EAGAIN get raised + if flags & zmq.NOBLOCK: + try: + msg = super(_Socket, self).send(data, flags, copy, track) + finally: + if not self.__in_send_multipart: + self.__state_changed() + return msg + # ensure the zmq.NOBLOCK flag is part of flags + flags |= zmq.NOBLOCK + while True: # Attempt to complete this operation indefinitely, blocking the current greenlet + try: + # attempt the actual call + msg = super(_Socket, self).send(data, flags, copy, track) + except zmq.ZMQError as e: + # if the raised ZMQError is not EAGAIN, reraise + if e.errno != zmq.EAGAIN: + if not self.__in_send_multipart: + self.__state_changed() + raise + else: + if not self.__in_send_multipart: + self.__state_changed() + return msg + # defer to the event loop until we're notified the socket is writable + self._wait_write() + + def recv(self, flags=0, copy=True, track=False): + """recv, which will only block current greenlet + + state_changed always fires exactly once (success or fail) at the + end of this method. + """ + if flags & zmq.NOBLOCK: + try: + msg = super(_Socket, self).recv(flags, copy, track) + finally: + if not self.__in_recv_multipart: + self.__state_changed() + return msg + + flags |= zmq.NOBLOCK + while True: + try: + msg = super(_Socket, self).recv(flags, copy, track) + except zmq.ZMQError as e: + if e.errno != zmq.EAGAIN: + if not self.__in_recv_multipart: + self.__state_changed() + raise + else: + if not self.__in_recv_multipart: + self.__state_changed() + return msg + self._wait_read() + + def send_multipart(self, *args, **kwargs): + """wrap send_multipart to prevent state_changed on each partial send""" + self.__in_send_multipart = True + try: + msg = super(_Socket, self).send_multipart(*args, **kwargs) + finally: + self.__in_send_multipart = False + self.__state_changed() + return msg + + def recv_multipart(self, *args, **kwargs): + """wrap recv_multipart to prevent state_changed on each partial recv""" + self.__in_recv_multipart = True + try: + msg = super(_Socket, self).recv_multipart(*args, **kwargs) + finally: + self.__in_recv_multipart = False + self.__state_changed() + return msg + + def get(self, opt): + """trigger state_changed on getsockopt(EVENTS)""" + if opt in TIMEOS: + warnings.warn("TIMEO socket options have no effect in zmq.green", UserWarning) + optval = super(_Socket, self).get(opt) + if opt == zmq.EVENTS: + self.__state_changed() + return optval + + def set(self, opt, val): + """set socket option""" + if opt in TIMEOS: + warnings.warn("TIMEO socket options have no effect in zmq.green", UserWarning) + return super(_Socket, self).set(opt, val) + + +class _Context(_original_Context): + """Replacement for :class:`zmq.Context` + + Ensures that the greened Socket above is used in calls to `socket`. + """ + _socket_class = _Socket diff --git a/scripts/external_libs/platform/cel59/32bit/zmq/green/device.py b/scripts/external_libs/platform/cel59/32bit/zmq/green/device.py new file mode 100644 index 00000000..4b070237 --- /dev/null +++ b/scripts/external_libs/platform/cel59/32bit/zmq/green/device.py @@ -0,0 +1,32 @@ +# Copyright (C) PyZMQ Developers +# Distributed under the terms of the Modified BSD License. + +import zmq +from zmq.green import Poller + +def device(device_type, isocket, osocket): + """Start a zeromq device (gevent-compatible). + + Unlike the true zmq.device, this does not release the GIL. + + Parameters + ---------- + device_type : (QUEUE, FORWARDER, STREAMER) + The type of device to start (ignored). + isocket : Socket + The Socket instance for the incoming traffic. + osocket : Socket + The Socket instance for the outbound traffic. + """ + p = Poller() + if osocket == -1: + osocket = isocket + p.register(isocket, zmq.POLLIN) + p.register(osocket, zmq.POLLIN) + + while True: + events = dict(p.poll()) + if isocket in events: + osocket.send_multipart(isocket.recv_multipart()) + if osocket in events: + isocket.send_multipart(osocket.recv_multipart()) diff --git a/scripts/external_libs/platform/cel59/32bit/zmq/green/eventloop/__init__.py b/scripts/external_libs/platform/cel59/32bit/zmq/green/eventloop/__init__.py new file mode 100644 index 00000000..c5150efe --- /dev/null +++ b/scripts/external_libs/platform/cel59/32bit/zmq/green/eventloop/__init__.py @@ -0,0 +1,3 @@ +from zmq.green.eventloop.ioloop import IOLoop + +__all__ = ['IOLoop'] \ No newline at end of file diff --git a/scripts/external_libs/platform/cel59/32bit/zmq/green/eventloop/ioloop.py b/scripts/external_libs/platform/cel59/32bit/zmq/green/eventloop/ioloop.py new file mode 100644 index 00000000..e12fd5e9 --- /dev/null +++ b/scripts/external_libs/platform/cel59/32bit/zmq/green/eventloop/ioloop.py @@ -0,0 +1,33 @@ +from zmq.eventloop.ioloop import * +from zmq.green import Poller + +RealIOLoop = IOLoop +RealZMQPoller = ZMQPoller + +class IOLoop(RealIOLoop): + + def initialize(self, impl=None): + impl = _poll() if impl is None else impl + super(IOLoop, self).initialize(impl) + + @staticmethod + def instance(): + """Returns a global `IOLoop` instance. + + Most applications have a single, global `IOLoop` running on the + main thread. Use this method to get this instance from + another thread. To get the current thread's `IOLoop`, use `current()`. + """ + # install this class as the active IOLoop implementation + # when using tornado 3 + if tornado_version >= (3,): + PollIOLoop.configure(IOLoop) + return PollIOLoop.instance() + + +class ZMQPoller(RealZMQPoller): + """gevent-compatible version of ioloop.ZMQPoller""" + def __init__(self): + self._poller = Poller() + +_poll = ZMQPoller diff --git a/scripts/external_libs/platform/cel59/32bit/zmq/green/eventloop/zmqstream.py b/scripts/external_libs/platform/cel59/32bit/zmq/green/eventloop/zmqstream.py new file mode 100644 index 00000000..90fbd1f5 --- /dev/null +++ b/scripts/external_libs/platform/cel59/32bit/zmq/green/eventloop/zmqstream.py @@ -0,0 +1,11 @@ +from zmq.eventloop.zmqstream import * + +from zmq.green.eventloop.ioloop import IOLoop + +RealZMQStream = ZMQStream + +class ZMQStream(RealZMQStream): + + def __init__(self, socket, io_loop=None): + io_loop = io_loop or IOLoop.instance() + super(ZMQStream, self).__init__(socket, io_loop=io_loop) diff --git a/scripts/external_libs/platform/cel59/32bit/zmq/green/poll.py b/scripts/external_libs/platform/cel59/32bit/zmq/green/poll.py new file mode 100644 index 00000000..8f016129 --- /dev/null +++ b/scripts/external_libs/platform/cel59/32bit/zmq/green/poll.py @@ -0,0 +1,95 @@ +import zmq +import gevent +from gevent import select + +from zmq import Poller as _original_Poller + + +class _Poller(_original_Poller): + """Replacement for :class:`zmq.Poller` + + Ensures that the greened Poller below is used in calls to + :meth:`zmq.Poller.poll`. + """ + _gevent_bug_timeout = 1.33 # minimum poll interval, for working around gevent bug + + def _get_descriptors(self): + """Returns three elements tuple with socket descriptors ready + for gevent.select.select + """ + rlist = [] + wlist = [] + xlist = [] + + for socket, flags in self.sockets: + if isinstance(socket, zmq.Socket): + rlist.append(socket.getsockopt(zmq.FD)) + continue + elif isinstance(socket, int): + fd = socket + elif hasattr(socket, 'fileno'): + try: + fd = int(socket.fileno()) + except: + raise ValueError('fileno() must return an valid integer fd') + else: + raise TypeError('Socket must be a 0MQ socket, an integer fd ' + 'or have a fileno() method: %r' % socket) + + if flags & zmq.POLLIN: + rlist.append(fd) + if flags & zmq.POLLOUT: + wlist.append(fd) + if flags & zmq.POLLERR: + xlist.append(fd) + + return (rlist, wlist, xlist) + + def poll(self, timeout=-1): + """Overridden method to ensure that the green version of + Poller is used. + + Behaves the same as :meth:`zmq.core.Poller.poll` + """ + + if timeout is None: + timeout = -1 + + if timeout < 0: + timeout = -1 + + rlist = None + wlist = None + xlist = None + + if timeout > 0: + tout = gevent.Timeout.start_new(timeout/1000.0) + + try: + # Loop until timeout or events available + rlist, wlist, xlist = self._get_descriptors() + while True: + events = super(_Poller, self).poll(0) + if events or timeout == 0: + return events + + # wait for activity on sockets in a green way + # set a minimum poll frequency, + # because gevent < 1.0 cannot be trusted to catch edge-triggered FD events + _bug_timeout = gevent.Timeout.start_new(self._gevent_bug_timeout) + try: + select.select(rlist, wlist, xlist) + except gevent.Timeout as t: + if t is not _bug_timeout: + raise + finally: + _bug_timeout.cancel() + + except gevent.Timeout as t: + if t is not tout: + raise + return [] + finally: + if timeout > 0: + tout.cancel() + diff --git a/scripts/external_libs/platform/cel59/32bit/zmq/libzmq.so.3 b/scripts/external_libs/platform/cel59/32bit/zmq/libzmq.so.3 new file mode 100644 index 0000000000000000000000000000000000000000..ed940931310627058d4ab52f8c2aec437a78354c GIT binary patch literal 604489 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 z zW9MIn@!q6?w1!{vWqD5Bcfw5rOxO|pe57gin>%-glCq*)4@8;@Aw_O0!1vKT&kT=` z)b0#76(Z3o8?QdNsbgHogq=BkLoI>TI#HHxBe7b+jKb8#^aKMYuR6 z($x0mCp$wkvywvTS@;N|KXuB)PkDgr4q+*#-tO@rg`|I&`Sui#`;M-tB; zAAf$Ijmu6%*5mpoxChR}$L++@j)_Y@4_%v3r4&?mQ&LtMYh8rWu-K7hxkzU1gYieo zm*wCbbN3^lzKoNKF*>v%($o=GuMBub_;#iU6~SzX^%gWmiif0Hw)`iiH@H_MFhs31 z8e$e;&gU5%PKBEO!$Qj@Gwa9rtpMr|*@^zlO=cXF--(rbG8Ffpk&w`@Q!2vTv|&@s zjGA#y*+>3&=T288vfCLp<&pAX`j~l0(?Di)Gm6;Q`SJgb;T~UxPohPq!&2rR6PGri zWS$hvaF6ILN#QhCKmm5Xgu_jFYz(LW{84W5EIKHZp5m)HUMT|uO^XMd;1|Pz0aoL_ zzcVX4ybRTd>BJEoBrq5b3^L-@f0Iwn5e(bScW;kkulvzyZW z{?3I>0~r&i!kcBp_p&nNpbU|~HX0Q}A-u_Hm^di z>c0nfv*24o8=m>_u*%=%oj%dIa?ly~&!>3w!CT{A4E-)VYinp$Tj=>`J~=E@*B-8G z3omXTw{ibhLv`Ju#hd%f!>Cc9Bedz6ori@McU8{nG9`5#o|bT+d|2qkqn`*LY1`1!gSR%KE_#SaUUYw!RBXeFch{*mAjWH@QrX&qbZY(|5e-E2X{{ zIjwp6_TG)YtsFmJ+c@Hc3$#?F8I1HGteHrkUN z;Fu%vW`A2;dF8s(Vs#@{C@_qE+q8IiT-|Ani;*>!hbP0JZU^&K{4on{-&Btd#GVoh z-y6dwv*>(>scKy3eyF4ZM0s ziTY2)xp6wjD|nte2Ir2cI{@(}KHk8D=;=IvK=ei|W;faUeW4MVq2CU>g+ZR^1C0aR zC5b+OhHC75`5kwVL!rNlSE*~Iu`oQ&32g`m(!&kBLhx2f6*%3rIAdJhv`v9_nj{v3 zoi8H%TaXxL z;~ej0Sk=yhy=_&?1GI^qXb!x# zDS%NE^$c)_$Z1&oniEXjw5*KHgMa<|gabVx6T|k6A_AjoS7d3TzG+ zcZX+fwldI)XeZx#8(%{MU=*CyZNX|rKlmXA2hv~!z95&&?yrN0I`Q#5d^*^Uk-$ni zbJ0vVLttCe;%)I0O6K3;Sk|8&#}Ou^_z4Bd(c!lF6H1>uq4dQ~D4FllG5eUov(F^t zysQef4cDbNZTx~tuWLIbt+TLJsaeq%aT5$zd+3DW;w_;-Z>YFW>CT38_kR)HF$>|7Ql5Xnc#DM`y2$o_utbV$<#`feh>NudOV@6t+s4Bq4?~W;?%5m(e83ZV z7WP3x$?byZRd%%El*SEfS#)cD8)5gyjU;G5XGnv|+1F7cj2CWkV{m9$FC+O1&P4C*KRmRo z8)w6h@jDiF48lTouK$u)iMrTiUY57_P^YT>jVa2=PA(fTW&CD@h-J(wy*i0TtUGag zE}AwmXRp?!^g_!yY$ao|Ip&F&`N}Orkg1v-* zSX}eH8ai)HVq6QjkS;vJ66dqVzB#Wu1XZX_iJhp#2`nDicThVxB0EfKCOG&c02!Y0q(K8N)DdDBb$Mxn>){+3;ihR=_<72-%7L^Obq7HL>!zeUN(O zi;o;F<#sYKq`fYUaz%Ka0xp=noeP%GviPj5QoV0`S%oc-72RfCE!DTdMR1Sk2Y=;q z6nCqg$nCso)MhIc*n-nItUY^esJ%w6Wkd4$%aH+$E$Iu7a2kwNCyWu-%488_#T+Y> zmt@De@c-iy%;l@=McBv!{nT0~#U1%JB-t);(?C`<87|YUIn88$p z;>m79Vx|iW^`EPa$YmLboR>5$kculL>|`Cwy_UeBLSLC}b#Z4EcTwT4+wqt}|9*

3ww)bU>Ig@l$n6#u*Rg&)*YkY@hi_-| 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%0DFhp)_fJm+0`LB5ALos;e|nI9)!hE+yGPL= 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%0Ax3>fe!HqWxXbt5QU! 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 z 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 literal 0 HcmV?d00001 diff --git a/scripts/external_libs/platform/cel59/32bit/zmq/log/__init__.py b/scripts/external_libs/platform/cel59/32bit/zmq/log/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/scripts/external_libs/platform/cel59/32bit/zmq/log/handlers.py b/scripts/external_libs/platform/cel59/32bit/zmq/log/handlers.py new file mode 100644 index 00000000..5ff21bf3 --- /dev/null +++ b/scripts/external_libs/platform/cel59/32bit/zmq/log/handlers.py @@ -0,0 +1,146 @@ +"""pyzmq logging handlers. + +This mainly defines the PUBHandler object for publishing logging messages over +a zmq.PUB socket. + +The PUBHandler can be used with the regular logging module, as in:: + + >>> import logging + >>> handler = PUBHandler('tcp://127.0.0.1:12345') + >>> handler.root_topic = 'foo' + >>> logger = logging.getLogger('foobar') + >>> logger.setLevel(logging.DEBUG) + >>> logger.addHandler(handler) + +After this point, all messages logged by ``logger`` will be published on the +PUB socket. + +Code adapted from StarCluster: + + http://github.com/jtriley/StarCluster/blob/master/starcluster/logger.py +""" + +# Copyright (C) PyZMQ Developers +# Distributed under the terms of the Modified BSD License. + + +import logging +from logging import INFO, DEBUG, WARN, ERROR, FATAL + +import zmq +from zmq.utils.strtypes import bytes, unicode, cast_bytes + + +TOPIC_DELIM="::" # delimiter for splitting topics on the receiving end. + + +class PUBHandler(logging.Handler): + """A basic logging handler that emits log messages through a PUB socket. + + Takes a PUB socket already bound to interfaces or an interface to bind to. + + Example:: + + sock = context.socket(zmq.PUB) + sock.bind('inproc://log') + handler = PUBHandler(sock) + + Or:: + + handler = PUBHandler('inproc://loc') + + These are equivalent. + + Log messages handled by this handler are broadcast with ZMQ topics + ``this.root_topic`` comes first, followed by the log level + (DEBUG,INFO,etc.), followed by any additional subtopics specified in the + message by: log.debug("subtopic.subsub::the real message") + """ + root_topic="" + socket = None + + formatters = { + logging.DEBUG: logging.Formatter( + "%(levelname)s %(filename)s:%(lineno)d - %(message)s\n"), + logging.INFO: logging.Formatter("%(message)s\n"), + logging.WARN: logging.Formatter( + "%(levelname)s %(filename)s:%(lineno)d - %(message)s\n"), + logging.ERROR: logging.Formatter( + "%(levelname)s %(filename)s:%(lineno)d - %(message)s - %(exc_info)s\n"), + logging.CRITICAL: logging.Formatter( + "%(levelname)s %(filename)s:%(lineno)d - %(message)s\n")} + + def __init__(self, interface_or_socket, context=None): + logging.Handler.__init__(self) + if isinstance(interface_or_socket, zmq.Socket): + self.socket = interface_or_socket + self.ctx = self.socket.context + else: + self.ctx = context or zmq.Context() + self.socket = self.ctx.socket(zmq.PUB) + self.socket.bind(interface_or_socket) + + def format(self,record): + """Format a record.""" + return self.formatters[record.levelno].format(record) + + def emit(self, record): + """Emit a log message on my socket.""" + try: + topic, record.msg = record.msg.split(TOPIC_DELIM,1) + except Exception: + topic = "" + try: + bmsg = cast_bytes(self.format(record)) + except Exception: + self.handleError(record) + return + + topic_list = [] + + if self.root_topic: + topic_list.append(self.root_topic) + + topic_list.append(record.levelname) + + if topic: + topic_list.append(topic) + + btopic = b'.'.join(cast_bytes(t) for t in topic_list) + + self.socket.send_multipart([btopic, bmsg]) + + +class TopicLogger(logging.Logger): + """A simple wrapper that takes an additional argument to log methods. + + All the regular methods exist, but instead of one msg argument, two + arguments: topic, msg are passed. + + That is:: + + logger.debug('msg') + + Would become:: + + logger.debug('topic.sub', 'msg') + """ + def log(self, level, topic, msg, *args, **kwargs): + """Log 'msg % args' with level and topic. + + To pass exception information, use the keyword argument exc_info + with a True value:: + + logger.log(level, "zmq.fun", "We have a %s", + "mysterious problem", exc_info=1) + """ + logging.Logger.log(self, level, '%s::%s'%(topic,msg), *args, **kwargs) + +# Generate the methods of TopicLogger, since they are just adding a +# topic prefix to a message. +for name in "debug warn warning error critical fatal".split(): + meth = getattr(logging.Logger,name) + setattr(TopicLogger, name, + lambda self, level, topic, msg, *args, **kwargs: + meth(self, level, topic+TOPIC_DELIM+msg,*args, **kwargs)) + diff --git a/scripts/external_libs/platform/cel59/32bit/zmq/ssh/__init__.py b/scripts/external_libs/platform/cel59/32bit/zmq/ssh/__init__.py new file mode 100644 index 00000000..57f09568 --- /dev/null +++ b/scripts/external_libs/platform/cel59/32bit/zmq/ssh/__init__.py @@ -0,0 +1 @@ +from zmq.ssh.tunnel import * diff --git a/scripts/external_libs/platform/cel59/32bit/zmq/ssh/forward.py b/scripts/external_libs/platform/cel59/32bit/zmq/ssh/forward.py new file mode 100644 index 00000000..2d619462 --- /dev/null +++ b/scripts/external_libs/platform/cel59/32bit/zmq/ssh/forward.py @@ -0,0 +1,91 @@ +# +# This file is adapted from a paramiko demo, and thus licensed under LGPL 2.1. +# Original Copyright (C) 2003-2007 Robey Pointer +# Edits Copyright (C) 2010 The IPython Team +# +# Paramiko is free software; you can redistribute it and/or modify it under the +# terms of the GNU Lesser General Public License as published by the Free +# Software Foundation; either version 2.1 of the License, or (at your option) +# any later version. +# +# Paramiko is distrubuted in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +# A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +# details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with Paramiko; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA. + +""" +Sample script showing how to do local port forwarding over paramiko. + +This script connects to the requested SSH server and sets up local port +forwarding (the openssh -L option) from a local port through a tunneled +connection to a destination reachable from the SSH server machine. +""" + +from __future__ import print_function + +import logging +import select +try: # Python 3 + import socketserver +except ImportError: # Python 2 + import SocketServer as socketserver + +logger = logging.getLogger('ssh') + +class ForwardServer (socketserver.ThreadingTCPServer): + daemon_threads = True + allow_reuse_address = True + + +class Handler (socketserver.BaseRequestHandler): + + def handle(self): + try: + chan = self.ssh_transport.open_channel('direct-tcpip', + (self.chain_host, self.chain_port), + self.request.getpeername()) + except Exception as e: + logger.debug('Incoming request to %s:%d failed: %s' % (self.chain_host, + self.chain_port, + repr(e))) + return + if chan is None: + logger.debug('Incoming request to %s:%d was rejected by the SSH server.' % + (self.chain_host, self.chain_port)) + return + + logger.debug('Connected! Tunnel open %r -> %r -> %r' % (self.request.getpeername(), + chan.getpeername(), (self.chain_host, self.chain_port))) + while True: + r, w, x = select.select([self.request, chan], [], []) + if self.request in r: + data = self.request.recv(1024) + if len(data) == 0: + break + chan.send(data) + if chan in r: + data = chan.recv(1024) + if len(data) == 0: + break + self.request.send(data) + chan.close() + self.request.close() + logger.debug('Tunnel closed ') + + +def forward_tunnel(local_port, remote_host, remote_port, transport): + # this is a little convoluted, but lets me configure things for the Handler + # object. (SocketServer doesn't give Handlers any way to access the outer + # server normally.) + class SubHander (Handler): + chain_host = remote_host + chain_port = remote_port + ssh_transport = transport + ForwardServer(('127.0.0.1', local_port), SubHander).serve_forever() + + +__all__ = ['forward_tunnel'] diff --git a/scripts/external_libs/platform/cel59/32bit/zmq/ssh/tunnel.py b/scripts/external_libs/platform/cel59/32bit/zmq/ssh/tunnel.py new file mode 100644 index 00000000..5a0c5433 --- /dev/null +++ b/scripts/external_libs/platform/cel59/32bit/zmq/ssh/tunnel.py @@ -0,0 +1,376 @@ +"""Basic ssh tunnel utilities, and convenience functions for tunneling +zeromq connections. +""" + +# Copyright (C) 2010-2011 IPython Development Team +# Copyright (C) 2011- PyZMQ Developers +# +# Redistributed from IPython under the terms of the BSD License. + + +from __future__ import print_function + +import atexit +import os +import signal +import socket +import sys +import warnings +from getpass import getpass, getuser +from multiprocessing import Process + +try: + with warnings.catch_warnings(): + warnings.simplefilter('ignore', DeprecationWarning) + import paramiko + SSHException = paramiko.ssh_exception.SSHException +except ImportError: + paramiko = None + class SSHException(Exception): + pass +else: + from .forward import forward_tunnel + +try: + import pexpect +except ImportError: + pexpect = None + + +_random_ports = set() + +def select_random_ports(n): + """Selects and return n random ports that are available.""" + ports = [] + for i in range(n): + sock = socket.socket() + sock.bind(('', 0)) + while sock.getsockname()[1] in _random_ports: + sock.close() + sock = socket.socket() + sock.bind(('', 0)) + ports.append(sock) + for i, sock in enumerate(ports): + port = sock.getsockname()[1] + sock.close() + ports[i] = port + _random_ports.add(port) + return ports + + +#----------------------------------------------------------------------------- +# Check for passwordless login +#----------------------------------------------------------------------------- + +def try_passwordless_ssh(server, keyfile, paramiko=None): + """Attempt to make an ssh connection without a password. + This is mainly used for requiring password input only once + when many tunnels may be connected to the same server. + + If paramiko is None, the default for the platform is chosen. + """ + if paramiko is None: + paramiko = sys.platform == 'win32' + if not paramiko: + f = _try_passwordless_openssh + else: + f = _try_passwordless_paramiko + return f(server, keyfile) + +def _try_passwordless_openssh(server, keyfile): + """Try passwordless login with shell ssh command.""" + if pexpect is None: + raise ImportError("pexpect unavailable, use paramiko") + cmd = 'ssh -f '+ server + if keyfile: + cmd += ' -i ' + keyfile + cmd += ' exit' + + # pop SSH_ASKPASS from env + env = os.environ.copy() + env.pop('SSH_ASKPASS', None) + + ssh_newkey = 'Are you sure you want to continue connecting' + p = pexpect.spawn(cmd, env=env) + while True: + try: + i = p.expect([ssh_newkey, '[Pp]assword:'], timeout=.1) + if i==0: + raise SSHException('The authenticity of the host can\'t be established.') + except pexpect.TIMEOUT: + continue + except pexpect.EOF: + return True + else: + return False + +def _try_passwordless_paramiko(server, keyfile): + """Try passwordless login with paramiko.""" + if paramiko is None: + msg = "Paramiko unavaliable, " + if sys.platform == 'win32': + msg += "Paramiko is required for ssh tunneled connections on Windows." + else: + msg += "use OpenSSH." + raise ImportError(msg) + username, server, port = _split_server(server) + client = paramiko.SSHClient() + client.load_system_host_keys() + client.set_missing_host_key_policy(paramiko.WarningPolicy()) + try: + client.connect(server, port, username=username, key_filename=keyfile, + look_for_keys=True) + except paramiko.AuthenticationException: + return False + else: + client.close() + return True + + +def tunnel_connection(socket, addr, server, keyfile=None, password=None, paramiko=None, timeout=60): + """Connect a socket to an address via an ssh tunnel. + + This is a wrapper for socket.connect(addr), when addr is not accessible + from the local machine. It simply creates an ssh tunnel using the remaining args, + and calls socket.connect('tcp://localhost:lport') where lport is the randomly + selected local port of the tunnel. + + """ + new_url, tunnel = open_tunnel(addr, server, keyfile=keyfile, password=password, paramiko=paramiko, timeout=timeout) + socket.connect(new_url) + return tunnel + + +def open_tunnel(addr, server, keyfile=None, password=None, paramiko=None, timeout=60): + """Open a tunneled connection from a 0MQ url. + + For use inside tunnel_connection. + + Returns + ------- + + (url, tunnel) : (str, object) + The 0MQ url that has been forwarded, and the tunnel object + """ + + lport = select_random_ports(1)[0] + transport, addr = addr.split('://') + ip,rport = addr.split(':') + rport = int(rport) + if paramiko is None: + paramiko = sys.platform == 'win32' + if paramiko: + tunnelf = paramiko_tunnel + else: + tunnelf = openssh_tunnel + + tunnel = tunnelf(lport, rport, server, remoteip=ip, keyfile=keyfile, password=password, timeout=timeout) + return 'tcp://127.0.0.1:%i'%lport, tunnel + +def openssh_tunnel(lport, rport, server, remoteip='127.0.0.1', keyfile=None, password=None, timeout=60): + """Create an ssh tunnel using command-line ssh that connects port lport + on this machine to localhost:rport on server. The tunnel + will automatically close when not in use, remaining open + for a minimum of timeout seconds for an initial connection. + + This creates a tunnel redirecting `localhost:lport` to `remoteip:rport`, + as seen from `server`. + + keyfile and password may be specified, but ssh config is checked for defaults. + + Parameters + ---------- + + lport : int + local port for connecting to the tunnel from this machine. + rport : int + port on the remote machine to connect to. + server : str + The ssh server to connect to. The full ssh server string will be parsed. + user@server:port + remoteip : str [Default: 127.0.0.1] + The remote ip, specifying the destination of the tunnel. + Default is localhost, which means that the tunnel would redirect + localhost:lport on this machine to localhost:rport on the *server*. + + keyfile : str; path to public key file + This specifies a key to be used in ssh login, default None. + Regular default ssh keys will be used without specifying this argument. + password : str; + Your ssh password to the ssh server. Note that if this is left None, + you will be prompted for it if passwordless key based login is unavailable. + timeout : int [default: 60] + The time (in seconds) after which no activity will result in the tunnel + closing. This prevents orphaned tunnels from running forever. + """ + if pexpect is None: + raise ImportError("pexpect unavailable, use paramiko_tunnel") + ssh="ssh " + if keyfile: + ssh += "-i " + keyfile + + if ':' in server: + server, port = server.split(':') + ssh += " -p %s" % port + + cmd = "%s -O check %s" % (ssh, server) + (output, exitstatus) = pexpect.run(cmd, withexitstatus=True) + if not exitstatus: + pid = int(output[output.find("(pid=")+5:output.find(")")]) + cmd = "%s -O forward -L 127.0.0.1:%i:%s:%i %s" % ( + ssh, lport, remoteip, rport, server) + (output, exitstatus) = pexpect.run(cmd, withexitstatus=True) + if not exitstatus: + atexit.register(_stop_tunnel, cmd.replace("-O forward", "-O cancel", 1)) + return pid + cmd = "%s -f -S none -L 127.0.0.1:%i:%s:%i %s sleep %i" % ( + ssh, lport, remoteip, rport, server, timeout) + + # pop SSH_ASKPASS from env + env = os.environ.copy() + env.pop('SSH_ASKPASS', None) + + ssh_newkey = 'Are you sure you want to continue connecting' + tunnel = pexpect.spawn(cmd, env=env) + failed = False + while True: + try: + i = tunnel.expect([ssh_newkey, '[Pp]assword:'], timeout=.1) + if i==0: + raise SSHException('The authenticity of the host can\'t be established.') + except pexpect.TIMEOUT: + continue + except pexpect.EOF: + if tunnel.exitstatus: + print(tunnel.exitstatus) + print(tunnel.before) + print(tunnel.after) + raise RuntimeError("tunnel '%s' failed to start"%(cmd)) + else: + return tunnel.pid + else: + if failed: + print("Password rejected, try again") + password=None + if password is None: + password = getpass("%s's password: "%(server)) + tunnel.sendline(password) + failed = True + +def _stop_tunnel(cmd): + pexpect.run(cmd) + +def _split_server(server): + if '@' in server: + username,server = server.split('@', 1) + else: + username = getuser() + if ':' in server: + server, port = server.split(':') + port = int(port) + else: + port = 22 + return username, server, port + +def paramiko_tunnel(lport, rport, server, remoteip='127.0.0.1', keyfile=None, password=None, timeout=60): + """launch a tunner with paramiko in a subprocess. This should only be used + when shell ssh is unavailable (e.g. Windows). + + This creates a tunnel redirecting `localhost:lport` to `remoteip:rport`, + as seen from `server`. + + If you are familiar with ssh tunnels, this creates the tunnel: + + ssh server -L localhost:lport:remoteip:rport + + keyfile and password may be specified, but ssh config is checked for defaults. + + + Parameters + ---------- + + lport : int + local port for connecting to the tunnel from this machine. + rport : int + port on the remote machine to connect to. + server : str + The ssh server to connect to. The full ssh server string will be parsed. + user@server:port + remoteip : str [Default: 127.0.0.1] + The remote ip, specifying the destination of the tunnel. + Default is localhost, which means that the tunnel would redirect + localhost:lport on this machine to localhost:rport on the *server*. + + keyfile : str; path to public key file + This specifies a key to be used in ssh login, default None. + Regular default ssh keys will be used without specifying this argument. + password : str; + Your ssh password to the ssh server. Note that if this is left None, + you will be prompted for it if passwordless key based login is unavailable. + timeout : int [default: 60] + The time (in seconds) after which no activity will result in the tunnel + closing. This prevents orphaned tunnels from running forever. + + """ + if paramiko is None: + raise ImportError("Paramiko not available") + + if password is None: + if not _try_passwordless_paramiko(server, keyfile): + password = getpass("%s's password: "%(server)) + + p = Process(target=_paramiko_tunnel, + args=(lport, rport, server, remoteip), + kwargs=dict(keyfile=keyfile, password=password)) + p.daemon=False + p.start() + atexit.register(_shutdown_process, p) + return p + +def _shutdown_process(p): + if p.is_alive(): + p.terminate() + +def _paramiko_tunnel(lport, rport, server, remoteip, keyfile=None, password=None): + """Function for actually starting a paramiko tunnel, to be passed + to multiprocessing.Process(target=this), and not called directly. + """ + username, server, port = _split_server(server) + client = paramiko.SSHClient() + client.load_system_host_keys() + client.set_missing_host_key_policy(paramiko.WarningPolicy()) + + try: + client.connect(server, port, username=username, key_filename=keyfile, + look_for_keys=True, password=password) +# except paramiko.AuthenticationException: +# if password is None: +# password = getpass("%s@%s's password: "%(username, server)) +# client.connect(server, port, username=username, password=password) +# else: +# raise + except Exception as e: + print('*** Failed to connect to %s:%d: %r' % (server, port, e)) + sys.exit(1) + + # Don't let SIGINT kill the tunnel subprocess + signal.signal(signal.SIGINT, signal.SIG_IGN) + + try: + forward_tunnel(lport, remoteip, rport, client.get_transport()) + except KeyboardInterrupt: + print('SIGINT: Port forwarding stopped cleanly') + sys.exit(0) + except Exception as e: + print("Port forwarding stopped uncleanly: %s"%e) + sys.exit(255) + +if sys.platform == 'win32': + ssh_tunnel = paramiko_tunnel +else: + ssh_tunnel = openssh_tunnel + + +__all__ = ['tunnel_connection', 'ssh_tunnel', 'openssh_tunnel', 'paramiko_tunnel', 'try_passwordless_ssh'] + + diff --git a/scripts/external_libs/platform/cel59/32bit/zmq/sugar/__init__.py b/scripts/external_libs/platform/cel59/32bit/zmq/sugar/__init__.py new file mode 100644 index 00000000..d0510a44 --- /dev/null +++ b/scripts/external_libs/platform/cel59/32bit/zmq/sugar/__init__.py @@ -0,0 +1,27 @@ +"""pure-Python sugar wrappers for core 0MQ objects.""" + +# Copyright (C) PyZMQ Developers +# Distributed under the terms of the Modified BSD License. + + +from zmq.sugar import ( + constants, context, frame, poll, socket, tracker, version +) +from zmq import error + +__all__ = ['constants'] +for submod in ( + constants, context, error, frame, poll, socket, tracker, version +): + __all__.extend(submod.__all__) + +from zmq.error import * +from zmq.sugar.context import * +from zmq.sugar.tracker import * +from zmq.sugar.socket import * +from zmq.sugar.constants import * +from zmq.sugar.frame import * +from zmq.sugar.poll import * +# from zmq.sugar.stopwatch import * +# from zmq.sugar._device import * +from zmq.sugar.version import * diff --git a/scripts/external_libs/platform/cel59/32bit/zmq/sugar/attrsettr.py b/scripts/external_libs/platform/cel59/32bit/zmq/sugar/attrsettr.py new file mode 100644 index 00000000..4bbd36d6 --- /dev/null +++ b/scripts/external_libs/platform/cel59/32bit/zmq/sugar/attrsettr.py @@ -0,0 +1,52 @@ +# coding: utf-8 +"""Mixin for mapping set/getattr to self.set/get""" + +# Copyright (C) PyZMQ Developers +# Distributed under the terms of the Modified BSD License. + + +from . import constants + +class AttributeSetter(object): + + def __setattr__(self, key, value): + """set zmq options by attribute""" + + # regular setattr only allowed for class-defined attributes + for obj in [self] + self.__class__.mro(): + if key in obj.__dict__: + object.__setattr__(self, key, value) + return + + upper_key = key.upper() + try: + opt = getattr(constants, upper_key) + except AttributeError: + raise AttributeError("%s has no such option: %s" % ( + self.__class__.__name__, upper_key) + ) + else: + self._set_attr_opt(upper_key, opt, value) + + def _set_attr_opt(self, name, opt, value): + """override if setattr should do something other than call self.set""" + self.set(opt, value) + + def __getattr__(self, key): + """get zmq options by attribute""" + upper_key = key.upper() + try: + opt = getattr(constants, upper_key) + except AttributeError: + raise AttributeError("%s has no such option: %s" % ( + self.__class__.__name__, upper_key) + ) + else: + return self._get_attr_opt(upper_key, opt) + + def _get_attr_opt(self, name, opt): + """override if getattr should do something other than call self.get""" + return self.get(opt) + + +__all__ = ['AttributeSetter'] diff --git a/scripts/external_libs/platform/cel59/32bit/zmq/sugar/constants.py b/scripts/external_libs/platform/cel59/32bit/zmq/sugar/constants.py new file mode 100644 index 00000000..88281176 --- /dev/null +++ b/scripts/external_libs/platform/cel59/32bit/zmq/sugar/constants.py @@ -0,0 +1,98 @@ +"""0MQ Constants.""" + +# Copyright (c) PyZMQ Developers. +# Distributed under the terms of the Modified BSD License. + +from zmq.backend import constants +from zmq.utils.constant_names import ( + base_names, + switched_sockopt_names, + int_sockopt_names, + int64_sockopt_names, + bytes_sockopt_names, + fd_sockopt_names, + ctx_opt_names, + msg_opt_names, +) + +#----------------------------------------------------------------------------- +# Python module level constants +#----------------------------------------------------------------------------- + +__all__ = [ + 'int_sockopts', + 'int64_sockopts', + 'bytes_sockopts', + 'ctx_opts', + 'ctx_opt_names', + ] + +int_sockopts = set() +int64_sockopts = set() +bytes_sockopts = set() +fd_sockopts = set() +ctx_opts = set() +msg_opts = set() + + +if constants.VERSION < 30000: + int64_sockopt_names.extend(switched_sockopt_names) +else: + int_sockopt_names.extend(switched_sockopt_names) + +_UNDEFINED = -9999 + +def _add_constant(name, container=None): + """add a constant to be defined + + optionally add it to one of the sets for use in get/setopt checkers + """ + c = getattr(constants, name, _UNDEFINED) + if c == _UNDEFINED: + return + globals()[name] = c + __all__.append(name) + if container is not None: + container.add(c) + return c + +for name in base_names: + _add_constant(name) + +for name in int_sockopt_names: + _add_constant(name, int_sockopts) + +for name in int64_sockopt_names: + _add_constant(name, int64_sockopts) + +for name in bytes_sockopt_names: + _add_constant(name, bytes_sockopts) + +for name in fd_sockopt_names: + _add_constant(name, fd_sockopts) + +for name in ctx_opt_names: + _add_constant(name, ctx_opts) + +for name in msg_opt_names: + _add_constant(name, msg_opts) + +# ensure some aliases are always defined +aliases = [ + ('DONTWAIT', 'NOBLOCK'), + ('XREQ', 'DEALER'), + ('XREP', 'ROUTER'), +] +for group in aliases: + undefined = set() + found = None + for name in group: + value = getattr(constants, name, -1) + if value != -1: + found = value + else: + undefined.add(name) + if found is not None: + for name in undefined: + globals()[name] = found + __all__.append(name) diff --git a/scripts/external_libs/platform/cel59/32bit/zmq/sugar/context.py b/scripts/external_libs/platform/cel59/32bit/zmq/sugar/context.py new file mode 100644 index 00000000..86a9c5dc --- /dev/null +++ b/scripts/external_libs/platform/cel59/32bit/zmq/sugar/context.py @@ -0,0 +1,192 @@ +# coding: utf-8 +"""Python bindings for 0MQ.""" + +# Copyright (C) PyZMQ Developers +# Distributed under the terms of the Modified BSD License. + +import atexit +import weakref + +from zmq.backend import Context as ContextBase +from . import constants +from .attrsettr import AttributeSetter +from .constants import ENOTSUP, ctx_opt_names +from .socket import Socket +from zmq.error import ZMQError + +from zmq.utils.interop import cast_int_addr + + +class Context(ContextBase, AttributeSetter): + """Create a zmq Context + + A zmq Context creates sockets via its ``ctx.socket`` method. + """ + sockopts = None + _instance = None + _shadow = False + _exiting = False + + def __init__(self, io_threads=1, **kwargs): + super(Context, self).__init__(io_threads=io_threads, **kwargs) + if kwargs.get('shadow', False): + self._shadow = True + else: + self._shadow = False + self.sockopts = {} + + self._exiting = False + if not self._shadow: + ctx_ref = weakref.ref(self) + def _notify_atexit(): + ctx = ctx_ref() + if ctx is not None: + ctx._exiting = True + atexit.register(_notify_atexit) + + def __del__(self): + """deleting a Context should terminate it, without trying non-threadsafe destroy""" + if not self._shadow and not self._exiting: + self.term() + + def __enter__(self): + return self + + def __exit__(self, *args, **kwargs): + self.term() + + @classmethod + def shadow(cls, address): + """Shadow an existing libzmq context + + address is the integer address of the libzmq context + or an FFI pointer to it. + + .. versionadded:: 14.1 + """ + address = cast_int_addr(address) + return cls(shadow=address) + + @classmethod + def shadow_pyczmq(cls, ctx): + """Shadow an existing pyczmq context + + ctx is the FFI `zctx_t *` pointer + + .. versionadded:: 14.1 + """ + from pyczmq import zctx + + underlying = zctx.underlying(ctx) + address = cast_int_addr(underlying) + return cls(shadow=address) + + # static method copied from tornado IOLoop.instance + @classmethod + def instance(cls, io_threads=1): + """Returns a global Context instance. + + Most single-threaded applications have a single, global Context. + Use this method instead of passing around Context instances + throughout your code. + + A common pattern for classes that depend on Contexts is to use + a default argument to enable programs with multiple Contexts + but not require the argument for simpler applications: + + class MyClass(object): + def __init__(self, context=None): + self.context = context or Context.instance() + """ + if cls._instance is None or cls._instance.closed: + cls._instance = cls(io_threads=io_threads) + return cls._instance + + #------------------------------------------------------------------------- + # Hooks for ctxopt completion + #------------------------------------------------------------------------- + + def __dir__(self): + keys = dir(self.__class__) + + for collection in ( + ctx_opt_names, + ): + keys.extend(collection) + return keys + + #------------------------------------------------------------------------- + # Creating Sockets + #------------------------------------------------------------------------- + + @property + def _socket_class(self): + return Socket + + def socket(self, socket_type): + """Create a Socket associated with this Context. + + Parameters + ---------- + socket_type : int + The socket type, which can be any of the 0MQ socket types: + REQ, REP, PUB, SUB, PAIR, DEALER, ROUTER, PULL, PUSH, etc. + """ + if self.closed: + raise ZMQError(ENOTSUP) + s = self._socket_class(self, socket_type) + for opt, value in self.sockopts.items(): + try: + s.setsockopt(opt, value) + except ZMQError: + # ignore ZMQErrors, which are likely for socket options + # that do not apply to a particular socket type, e.g. + # SUBSCRIBE for non-SUB sockets. + pass + return s + + def setsockopt(self, opt, value): + """set default socket options for new sockets created by this Context + + .. versionadded:: 13.0 + """ + self.sockopts[opt] = value + + def getsockopt(self, opt): + """get default socket options for new sockets created by this Context + + .. versionadded:: 13.0 + """ + return self.sockopts[opt] + + def _set_attr_opt(self, name, opt, value): + """set default sockopts as attributes""" + if name in constants.ctx_opt_names: + return self.set(opt, value) + else: + self.sockopts[opt] = value + + def _get_attr_opt(self, name, opt): + """get default sockopts as attributes""" + if name in constants.ctx_opt_names: + return self.get(opt) + else: + if opt not in self.sockopts: + raise AttributeError(name) + else: + return self.sockopts[opt] + + def __delattr__(self, key): + """delete default sockopts as attributes""" + key = key.upper() + try: + opt = getattr(constants, key) + except AttributeError: + raise AttributeError("no such socket option: %s" % key) + else: + if opt not in self.sockopts: + raise AttributeError(key) + else: + del self.sockopts[opt] + +__all__ = ['Context'] diff --git a/scripts/external_libs/platform/cel59/32bit/zmq/sugar/frame.py b/scripts/external_libs/platform/cel59/32bit/zmq/sugar/frame.py new file mode 100644 index 00000000..9f556c86 --- /dev/null +++ b/scripts/external_libs/platform/cel59/32bit/zmq/sugar/frame.py @@ -0,0 +1,19 @@ +# coding: utf-8 +"""0MQ Frame pure Python methods.""" + +# Copyright (C) PyZMQ Developers +# Distributed under the terms of the Modified BSD License. + + +from .attrsettr import AttributeSetter +from zmq.backend import Frame as FrameBase + + +class Frame(FrameBase, AttributeSetter): + def __getitem__(self, key): + # map Frame['User-Id'] to Frame.get('User-Id') + return self.get(key) + +# keep deprecated alias +Message = Frame +__all__ = ['Frame', 'Message'] \ No newline at end of file diff --git a/scripts/external_libs/platform/cel59/32bit/zmq/sugar/poll.py b/scripts/external_libs/platform/cel59/32bit/zmq/sugar/poll.py new file mode 100644 index 00000000..c7b1d1bb --- /dev/null +++ b/scripts/external_libs/platform/cel59/32bit/zmq/sugar/poll.py @@ -0,0 +1,161 @@ +"""0MQ polling related functions and classes.""" + +# Copyright (C) PyZMQ Developers +# Distributed under the terms of the Modified BSD License. + + +import zmq +from zmq.backend import zmq_poll +from .constants import POLLIN, POLLOUT, POLLERR + +#----------------------------------------------------------------------------- +# Polling related methods +#----------------------------------------------------------------------------- + + +class Poller(object): + """A stateful poll interface that mirrors Python's built-in poll.""" + sockets = None + _map = {} + + def __init__(self): + self.sockets = [] + self._map = {} + + def __contains__(self, socket): + return socket in self._map + + def register(self, socket, flags=POLLIN|POLLOUT): + """p.register(socket, flags=POLLIN|POLLOUT) + + Register a 0MQ socket or native fd for I/O monitoring. + + register(s,0) is equivalent to unregister(s). + + Parameters + ---------- + socket : zmq.Socket or native socket + A zmq.Socket or any Python object having a ``fileno()`` + method that returns a valid file descriptor. + flags : int + The events to watch for. Can be POLLIN, POLLOUT or POLLIN|POLLOUT. + If `flags=0`, socket will be unregistered. + """ + if flags: + if socket in self._map: + idx = self._map[socket] + self.sockets[idx] = (socket, flags) + else: + idx = len(self.sockets) + self.sockets.append((socket, flags)) + self._map[socket] = idx + elif socket in self._map: + # uregister sockets registered with no events + self.unregister(socket) + else: + # ignore new sockets with no events + pass + + def modify(self, socket, flags=POLLIN|POLLOUT): + """Modify the flags for an already registered 0MQ socket or native fd.""" + self.register(socket, flags) + + def unregister(self, socket): + """Remove a 0MQ socket or native fd for I/O monitoring. + + Parameters + ---------- + socket : Socket + The socket instance to stop polling. + """ + idx = self._map.pop(socket) + self.sockets.pop(idx) + # shift indices after deletion + for socket, flags in self.sockets[idx:]: + self._map[socket] -= 1 + + def poll(self, timeout=None): + """Poll the registered 0MQ or native fds for I/O. + + Parameters + ---------- + timeout : float, int + The timeout in milliseconds. If None, no `timeout` (infinite). This + is in milliseconds to be compatible with ``select.poll()``. The + underlying zmq_poll uses microseconds and we convert to that in + this function. + + Returns + ------- + events : list of tuples + The list of events that are ready to be processed. + This is a list of tuples of the form ``(socket, event)``, where the 0MQ Socket + or integer fd is the first element, and the poll event mask (POLLIN, POLLOUT) is the second. + It is common to call ``events = dict(poller.poll())``, + which turns the list of tuples into a mapping of ``socket : event``. + """ + if timeout is None or timeout < 0: + timeout = -1 + elif isinstance(timeout, float): + timeout = int(timeout) + return zmq_poll(self.sockets, timeout=timeout) + + +def select(rlist, wlist, xlist, timeout=None): + """select(rlist, wlist, xlist, timeout=None) -> (rlist, wlist, xlist) + + Return the result of poll as a lists of sockets ready for r/w/exception. + + This has the same interface as Python's built-in ``select.select()`` function. + + Parameters + ---------- + timeout : float, int, optional + The timeout in seconds. If None, no timeout (infinite). This is in seconds to be + compatible with ``select.select()``. The underlying zmq_poll uses microseconds + and we convert to that in this function. + rlist : list of sockets/FDs + sockets/FDs to be polled for read events + wlist : list of sockets/FDs + sockets/FDs to be polled for write events + xlist : list of sockets/FDs + sockets/FDs to be polled for error events + + Returns + ------- + (rlist, wlist, xlist) : tuple of lists of sockets (length 3) + Lists correspond to sockets available for read/write/error events respectively. + """ + if timeout is None: + timeout = -1 + # Convert from sec -> us for zmq_poll. + # zmq_poll accepts 3.x style timeout in ms + timeout = int(timeout*1000.0) + if timeout < 0: + timeout = -1 + sockets = [] + for s in set(rlist + wlist + xlist): + flags = 0 + if s in rlist: + flags |= POLLIN + if s in wlist: + flags |= POLLOUT + if s in xlist: + flags |= POLLERR + sockets.append((s, flags)) + return_sockets = zmq_poll(sockets, timeout) + rlist, wlist, xlist = [], [], [] + for s, flags in return_sockets: + if flags & POLLIN: + rlist.append(s) + if flags & POLLOUT: + wlist.append(s) + if flags & POLLERR: + xlist.append(s) + return rlist, wlist, xlist + +#----------------------------------------------------------------------------- +# Symbols to export +#----------------------------------------------------------------------------- + +__all__ = [ 'Poller', 'select' ] diff --git a/scripts/external_libs/platform/cel59/32bit/zmq/sugar/socket.py b/scripts/external_libs/platform/cel59/32bit/zmq/sugar/socket.py new file mode 100644 index 00000000..c91589d7 --- /dev/null +++ b/scripts/external_libs/platform/cel59/32bit/zmq/sugar/socket.py @@ -0,0 +1,495 @@ +# coding: utf-8 +"""0MQ Socket pure Python methods.""" + +# Copyright (C) PyZMQ Developers +# Distributed under the terms of the Modified BSD License. + + +import codecs +import random +import warnings + +import zmq +from zmq.backend import Socket as SocketBase +from .poll import Poller +from . import constants +from .attrsettr import AttributeSetter +from zmq.error import ZMQError, ZMQBindError +from zmq.utils import jsonapi +from zmq.utils.strtypes import bytes,unicode,basestring +from zmq.utils.interop import cast_int_addr + +from .constants import ( + SNDMORE, ENOTSUP, POLLIN, + int64_sockopt_names, + int_sockopt_names, + bytes_sockopt_names, + fd_sockopt_names, +) +try: + import cPickle + pickle = cPickle +except: + cPickle = None + import pickle + +try: + DEFAULT_PROTOCOL = pickle.DEFAULT_PROTOCOL +except AttributeError: + DEFAULT_PROTOCOL = pickle.HIGHEST_PROTOCOL + + +class Socket(SocketBase, AttributeSetter): + """The ZMQ socket object + + To create a Socket, first create a Context:: + + ctx = zmq.Context.instance() + + then call ``ctx.socket(socket_type)``:: + + s = ctx.socket(zmq.ROUTER) + + """ + _shadow = False + + def __del__(self): + if not self._shadow: + self.close() + + # socket as context manager: + def __enter__(self): + """Sockets are context managers + + .. versionadded:: 14.4 + """ + return self + + def __exit__(self, *args, **kwargs): + self.close() + + #------------------------------------------------------------------------- + # Socket creation + #------------------------------------------------------------------------- + + @classmethod + def shadow(cls, address): + """Shadow an existing libzmq socket + + address is the integer address of the libzmq socket + or an FFI pointer to it. + + .. versionadded:: 14.1 + """ + address = cast_int_addr(address) + return cls(shadow=address) + + #------------------------------------------------------------------------- + # Deprecated aliases + #------------------------------------------------------------------------- + + @property + def socket_type(self): + warnings.warn("Socket.socket_type is deprecated, use Socket.type", + DeprecationWarning + ) + return self.type + + #------------------------------------------------------------------------- + # Hooks for sockopt completion + #------------------------------------------------------------------------- + + def __dir__(self): + keys = dir(self.__class__) + for collection in ( + bytes_sockopt_names, + int_sockopt_names, + int64_sockopt_names, + fd_sockopt_names, + ): + keys.extend(collection) + return keys + + #------------------------------------------------------------------------- + # Getting/Setting options + #------------------------------------------------------------------------- + setsockopt = SocketBase.set + getsockopt = SocketBase.get + + def set_string(self, option, optval, encoding='utf-8'): + """set socket options with a unicode object + + This is simply a wrapper for setsockopt to protect from encoding ambiguity. + + See the 0MQ documentation for details on specific options. + + Parameters + ---------- + option : int + The name of the option to set. Can be any of: SUBSCRIBE, + UNSUBSCRIBE, IDENTITY + optval : unicode string (unicode on py2, str on py3) + The value of the option to set. + encoding : str + The encoding to be used, default is utf8 + """ + if not isinstance(optval, unicode): + raise TypeError("unicode strings only") + return self.set(option, optval.encode(encoding)) + + setsockopt_unicode = setsockopt_string = set_string + + def get_string(self, option, encoding='utf-8'): + """get the value of a socket option + + See the 0MQ documentation for details on specific options. + + Parameters + ---------- + option : int + The option to retrieve. + + Returns + ------- + optval : unicode string (unicode on py2, str on py3) + The value of the option as a unicode string. + """ + + if option not in constants.bytes_sockopts: + raise TypeError("option %i will not return a string to be decoded"%option) + return self.getsockopt(option).decode(encoding) + + getsockopt_unicode = getsockopt_string = get_string + + def bind_to_random_port(self, addr, min_port=49152, max_port=65536, max_tries=100): + """bind this socket to a random port in a range + + Parameters + ---------- + addr : str + The address string without the port to pass to ``Socket.bind()``. + min_port : int, optional + The minimum port in the range of ports to try (inclusive). + max_port : int, optional + The maximum port in the range of ports to try (exclusive). + max_tries : int, optional + The maximum number of bind attempts to make. + + Returns + ------- + port : int + The port the socket was bound to. + + Raises + ------ + ZMQBindError + if `max_tries` reached before successful bind + """ + for i in range(max_tries): + try: + port = random.randrange(min_port, max_port) + self.bind('%s:%s' % (addr, port)) + except ZMQError as exception: + if not exception.errno == zmq.EADDRINUSE: + raise + else: + return port + raise ZMQBindError("Could not bind socket to random port.") + + def get_hwm(self): + """get the High Water Mark + + On libzmq ≥ 3, this gets SNDHWM if available, otherwise RCVHWM + """ + major = zmq.zmq_version_info()[0] + if major >= 3: + # return sndhwm, fallback on rcvhwm + try: + return self.getsockopt(zmq.SNDHWM) + except zmq.ZMQError as e: + pass + + return self.getsockopt(zmq.RCVHWM) + else: + return self.getsockopt(zmq.HWM) + + def set_hwm(self, value): + """set the High Water Mark + + On libzmq ≥ 3, this sets both SNDHWM and RCVHWM + """ + major = zmq.zmq_version_info()[0] + if major >= 3: + raised = None + try: + self.sndhwm = value + except Exception as e: + raised = e + try: + self.rcvhwm = value + except Exception: + raised = e + + if raised: + raise raised + else: + return self.setsockopt(zmq.HWM, value) + + hwm = property(get_hwm, set_hwm, + """property for High Water Mark + + Setting hwm sets both SNDHWM and RCVHWM as appropriate. + It gets SNDHWM if available, otherwise RCVHWM. + """ + ) + + #------------------------------------------------------------------------- + # Sending and receiving messages + #------------------------------------------------------------------------- + + def send_multipart(self, msg_parts, flags=0, copy=True, track=False): + """send a sequence of buffers as a multipart message + + The zmq.SNDMORE flag is added to all msg parts before the last. + + Parameters + ---------- + msg_parts : iterable + A sequence of objects to send as a multipart message. Each element + can be any sendable object (Frame, bytes, buffer-providers) + flags : int, optional + SNDMORE is handled automatically for frames before the last. + copy : bool, optional + Should the frame(s) be sent in a copying or non-copying manner. + track : bool, optional + Should the frame(s) be tracked for notification that ZMQ has + finished with it (ignored if copy=True). + + Returns + ------- + None : if copy or not track + MessageTracker : if track and not copy + a MessageTracker object, whose `pending` property will + be True until the last send is completed. + """ + for msg in msg_parts[:-1]: + self.send(msg, SNDMORE|flags, copy=copy, track=track) + # Send the last part without the extra SNDMORE flag. + return self.send(msg_parts[-1], flags, copy=copy, track=track) + + def recv_multipart(self, flags=0, copy=True, track=False): + """receive a multipart message as a list of bytes or Frame objects + + Parameters + ---------- + flags : int, optional + Any supported flag: NOBLOCK. If NOBLOCK is set, this method + will raise a ZMQError with EAGAIN if a message is not ready. + If NOBLOCK is not set, then this method will block until a + message arrives. + copy : bool, optional + Should the message frame(s) be received in a copying or non-copying manner? + If False a Frame object is returned for each part, if True a copy of + the bytes is made for each frame. + track : bool, optional + Should the message frame(s) be tracked for notification that ZMQ has + finished with it? (ignored if copy=True) + + Returns + ------- + msg_parts : list + A list of frames in the multipart message; either Frames or bytes, + depending on `copy`. + + """ + parts = [self.recv(flags, copy=copy, track=track)] + # have first part already, only loop while more to receive + while self.getsockopt(zmq.RCVMORE): + part = self.recv(flags, copy=copy, track=track) + parts.append(part) + + return parts + + def send_string(self, u, flags=0, copy=True, encoding='utf-8'): + """send a Python unicode string as a message with an encoding + + 0MQ communicates with raw bytes, so you must encode/decode + text (unicode on py2, str on py3) around 0MQ. + + Parameters + ---------- + u : Python unicode string (unicode on py2, str on py3) + The unicode string to send. + flags : int, optional + Any valid send flag. + encoding : str [default: 'utf-8'] + The encoding to be used + """ + if not isinstance(u, basestring): + raise TypeError("unicode/str objects only") + return self.send(u.encode(encoding), flags=flags, copy=copy) + + send_unicode = send_string + + def recv_string(self, flags=0, encoding='utf-8'): + """receive a unicode string, as sent by send_string + + Parameters + ---------- + flags : int + Any valid recv flag. + encoding : str [default: 'utf-8'] + The encoding to be used + + Returns + ------- + s : unicode string (unicode on py2, str on py3) + The Python unicode string that arrives as encoded bytes. + """ + b = self.recv(flags=flags) + return b.decode(encoding) + + recv_unicode = recv_string + + def send_pyobj(self, obj, flags=0, protocol=DEFAULT_PROTOCOL): + """send a Python object as a message using pickle to serialize + + Parameters + ---------- + obj : Python object + The Python object to send. + flags : int + Any valid send flag. + protocol : int + The pickle protocol number to use. The default is pickle.DEFAULT_PROTOCOl + where defined, and pickle.HIGHEST_PROTOCOL elsewhere. + """ + msg = pickle.dumps(obj, protocol) + return self.send(msg, flags) + + def recv_pyobj(self, flags=0): + """receive a Python object as a message using pickle to serialize + + Parameters + ---------- + flags : int + Any valid recv flag. + + Returns + ------- + obj : Python object + The Python object that arrives as a message. + """ + s = self.recv(flags) + return pickle.loads(s) + + def send_json(self, obj, flags=0, **kwargs): + """send a Python object as a message using json to serialize + + Keyword arguments are passed on to json.dumps + + Parameters + ---------- + obj : Python object + The Python object to send + flags : int + Any valid send flag + """ + msg = jsonapi.dumps(obj, **kwargs) + return self.send(msg, flags) + + def recv_json(self, flags=0, **kwargs): + """receive a Python object as a message using json to serialize + + Keyword arguments are passed on to json.loads + + Parameters + ---------- + flags : int + Any valid recv flag. + + Returns + ------- + obj : Python object + The Python object that arrives as a message. + """ + msg = self.recv(flags) + return jsonapi.loads(msg, **kwargs) + + _poller_class = Poller + + def poll(self, timeout=None, flags=POLLIN): + """poll the socket for events + + The default is to poll forever for incoming + events. Timeout is in milliseconds, if specified. + + Parameters + ---------- + timeout : int [default: None] + The timeout (in milliseconds) to wait for an event. If unspecified + (or specified None), will wait forever for an event. + flags : bitfield (int) [default: POLLIN] + The event flags to poll for (any combination of POLLIN|POLLOUT). + The default is to check for incoming events (POLLIN). + + Returns + ------- + events : bitfield (int) + The events that are ready and waiting. Will be 0 if no events were ready + by the time timeout was reached. + """ + + if self.closed: + raise ZMQError(ENOTSUP) + + p = self._poller_class() + p.register(self, flags) + evts = dict(p.poll(timeout)) + # return 0 if no events, otherwise return event bitfield + return evts.get(self, 0) + + def get_monitor_socket(self, events=None, addr=None): + """Return a connected PAIR socket ready to receive the event notifications. + + .. versionadded:: libzmq-4.0 + .. versionadded:: 14.0 + + Parameters + ---------- + events : bitfield (int) [default: ZMQ_EVENTS_ALL] + The bitmask defining which events are wanted. + addr : string [default: None] + The optional endpoint for the monitoring sockets. + + Returns + ------- + socket : (PAIR) + The socket is already connected and ready to receive messages. + """ + # safe-guard, method only available on libzmq >= 4 + if zmq.zmq_version_info() < (4,): + raise NotImplementedError("get_monitor_socket requires libzmq >= 4, have %s" % zmq.zmq_version()) + if addr is None: + # create endpoint name from internal fd + addr = "inproc://monitor.s-%d" % self.FD + if events is None: + # use all events + events = zmq.EVENT_ALL + # attach monitoring socket + self.monitor(addr, events) + # create new PAIR socket and connect it + ret = self.context.socket(zmq.PAIR) + ret.connect(addr) + return ret + + def disable_monitor(self): + """Shutdown the PAIR socket (created using get_monitor_socket) + that is serving socket events. + + .. versionadded:: 14.4 + """ + self.monitor(None, 0) + + +__all__ = ['Socket'] diff --git a/scripts/external_libs/platform/cel59/32bit/zmq/sugar/tracker.py b/scripts/external_libs/platform/cel59/32bit/zmq/sugar/tracker.py new file mode 100644 index 00000000..fb8c007f --- /dev/null +++ b/scripts/external_libs/platform/cel59/32bit/zmq/sugar/tracker.py @@ -0,0 +1,120 @@ +"""Tracker for zero-copy messages with 0MQ.""" + +# Copyright (C) PyZMQ Developers +# Distributed under the terms of the Modified BSD License. + +import time + +try: + # below 3.3 + from threading import _Event as Event +except (ImportError, AttributeError): + # python throws ImportError, cython throws AttributeError + from threading import Event + +from zmq.error import NotDone +from zmq.backend import Frame + +class MessageTracker(object): + """MessageTracker(*towatch) + + A class for tracking if 0MQ is done using one or more messages. + + When you send a 0MQ message, it is not sent immediately. The 0MQ IO thread + sends the message at some later time. Often you want to know when 0MQ has + actually sent the message though. This is complicated by the fact that + a single 0MQ message can be sent multiple times using different sockets. + This class allows you to track all of the 0MQ usages of a message. + + Parameters + ---------- + *towatch : tuple of Event, MessageTracker, Message instances. + This list of objects to track. This class can track the low-level + Events used by the Message class, other MessageTrackers or + actual Messages. + """ + events = None + peers = None + + def __init__(self, *towatch): + """MessageTracker(*towatch) + + Create a message tracker to track a set of mesages. + + Parameters + ---------- + *towatch : tuple of Event, MessageTracker, Message instances. + This list of objects to track. This class can track the low-level + Events used by the Message class, other MessageTrackers or + actual Messages. + """ + self.events = set() + self.peers = set() + for obj in towatch: + if isinstance(obj, Event): + self.events.add(obj) + elif isinstance(obj, MessageTracker): + self.peers.add(obj) + elif isinstance(obj, Frame): + if not obj.tracker: + raise ValueError("Not a tracked message") + self.peers.add(obj.tracker) + else: + raise TypeError("Require Events or Message Frames, not %s"%type(obj)) + + @property + def done(self): + """Is 0MQ completely done with the message(s) being tracked?""" + for evt in self.events: + if not evt.is_set(): + return False + for pm in self.peers: + if not pm.done: + return False + return True + + def wait(self, timeout=-1): + """mt.wait(timeout=-1) + + Wait for 0MQ to be done with the message or until `timeout`. + + Parameters + ---------- + timeout : float [default: -1, wait forever] + Maximum time in (s) to wait before raising NotDone. + + Returns + ------- + None + if done before `timeout` + + Raises + ------ + NotDone + if `timeout` reached before I am done. + """ + tic = time.time() + if timeout is False or timeout < 0: + remaining = 3600*24*7 # a week + else: + remaining = timeout + done = False + for evt in self.events: + if remaining < 0: + raise NotDone + evt.wait(timeout=remaining) + if not evt.is_set(): + raise NotDone + toc = time.time() + remaining -= (toc-tic) + tic = toc + + for peer in self.peers: + if remaining < 0: + raise NotDone + peer.wait(timeout=remaining) + toc = time.time() + remaining -= (toc-tic) + tic = toc + +__all__ = ['MessageTracker'] \ No newline at end of file diff --git a/scripts/external_libs/platform/cel59/32bit/zmq/sugar/version.py b/scripts/external_libs/platform/cel59/32bit/zmq/sugar/version.py new file mode 100644 index 00000000..ea8fbbc4 --- /dev/null +++ b/scripts/external_libs/platform/cel59/32bit/zmq/sugar/version.py @@ -0,0 +1,48 @@ +"""PyZMQ and 0MQ version functions.""" + +# Copyright (C) PyZMQ Developers +# Distributed under the terms of the Modified BSD License. + + +from zmq.backend import zmq_version_info + + +VERSION_MAJOR = 14 +VERSION_MINOR = 5 +VERSION_PATCH = 0 +VERSION_EXTRA = "" +__version__ = '%i.%i.%i' % (VERSION_MAJOR, VERSION_MINOR, VERSION_PATCH) + +if VERSION_EXTRA: + __version__ = "%s-%s" % (__version__, VERSION_EXTRA) + version_info = (VERSION_MAJOR, VERSION_MINOR, VERSION_PATCH, float('inf')) +else: + version_info = (VERSION_MAJOR, VERSION_MINOR, VERSION_PATCH) + +__revision__ = '' + +def pyzmq_version(): + """return the version of pyzmq as a string""" + if __revision__: + return '@'.join([__version__,__revision__[:6]]) + else: + return __version__ + +def pyzmq_version_info(): + """return the pyzmq version as a tuple of at least three numbers + + If pyzmq is a development version, `inf` will be appended after the third integer. + """ + return version_info + + +def zmq_version(): + """return the version of libzmq as a string""" + return "%i.%i.%i" % zmq_version_info() + + +__all__ = ['zmq_version', 'zmq_version_info', + 'pyzmq_version','pyzmq_version_info', + '__version__', '__revision__' +] + diff --git a/scripts/external_libs/platform/cel59/32bit/zmq/tests/__init__.py b/scripts/external_libs/platform/cel59/32bit/zmq/tests/__init__.py new file mode 100644 index 00000000..325a3f19 --- /dev/null +++ b/scripts/external_libs/platform/cel59/32bit/zmq/tests/__init__.py @@ -0,0 +1,211 @@ +# Copyright (c) PyZMQ Developers. +# Distributed under the terms of the Modified BSD License. + +import functools +import sys +import time +from threading import Thread + +from unittest import TestCase + +import zmq +from zmq.utils import jsonapi + +try: + import gevent + from zmq import green as gzmq + have_gevent = True +except ImportError: + have_gevent = False + +try: + from unittest import SkipTest +except ImportError: + try: + from nose import SkipTest + except ImportError: + class SkipTest(Exception): + pass + +PYPY = 'PyPy' in sys.version + +#----------------------------------------------------------------------------- +# skip decorators (directly from unittest) +#----------------------------------------------------------------------------- + +_id = lambda x: x + +def skip(reason): + """ + Unconditionally skip a test. + """ + def decorator(test_item): + if not (isinstance(test_item, type) and issubclass(test_item, TestCase)): + @functools.wraps(test_item) + def skip_wrapper(*args, **kwargs): + raise SkipTest(reason) + test_item = skip_wrapper + + test_item.__unittest_skip__ = True + test_item.__unittest_skip_why__ = reason + return test_item + return decorator + +def skip_if(condition, reason="Skipped"): + """ + Skip a test if the condition is true. + """ + if condition: + return skip(reason) + return _id + +skip_pypy = skip_if(PYPY, "Doesn't work on PyPy") + +#----------------------------------------------------------------------------- +# Base test class +#----------------------------------------------------------------------------- + +class BaseZMQTestCase(TestCase): + green = False + + @property + def Context(self): + if self.green: + return gzmq.Context + else: + return zmq.Context + + def socket(self, socket_type): + s = self.context.socket(socket_type) + self.sockets.append(s) + return s + + def setUp(self): + if self.green and not have_gevent: + raise SkipTest("requires gevent") + self.context = self.Context.instance() + self.sockets = [] + + def tearDown(self): + contexts = set([self.context]) + while self.sockets: + sock = self.sockets.pop() + contexts.add(sock.context) # in case additional contexts are created + sock.close(0) + for ctx in contexts: + t = Thread(target=ctx.term) + t.daemon = True + t.start() + t.join(timeout=2) + if t.is_alive(): + # reset Context.instance, so the failure to term doesn't corrupt subsequent tests + zmq.sugar.context.Context._instance = None + raise RuntimeError("context could not terminate, open sockets likely remain in test") + + def create_bound_pair(self, type1=zmq.PAIR, type2=zmq.PAIR, interface='tcp://127.0.0.1'): + """Create a bound socket pair using a random port.""" + s1 = self.context.socket(type1) + s1.setsockopt(zmq.LINGER, 0) + port = s1.bind_to_random_port(interface) + s2 = self.context.socket(type2) + s2.setsockopt(zmq.LINGER, 0) + s2.connect('%s:%s' % (interface, port)) + self.sockets.extend([s1,s2]) + return s1, s2 + + def ping_pong(self, s1, s2, msg): + s1.send(msg) + msg2 = s2.recv() + s2.send(msg2) + msg3 = s1.recv() + return msg3 + + def ping_pong_json(self, s1, s2, o): + if jsonapi.jsonmod is None: + raise SkipTest("No json library") + s1.send_json(o) + o2 = s2.recv_json() + s2.send_json(o2) + o3 = s1.recv_json() + return o3 + + def ping_pong_pyobj(self, s1, s2, o): + s1.send_pyobj(o) + o2 = s2.recv_pyobj() + s2.send_pyobj(o2) + o3 = s1.recv_pyobj() + return o3 + + def assertRaisesErrno(self, errno, func, *args, **kwargs): + try: + func(*args, **kwargs) + except zmq.ZMQError as e: + self.assertEqual(e.errno, errno, "wrong error raised, expected '%s' \ +got '%s'" % (zmq.ZMQError(errno), zmq.ZMQError(e.errno))) + else: + self.fail("Function did not raise any error") + + def _select_recv(self, multipart, socket, **kwargs): + """call recv[_multipart] in a way that raises if there is nothing to receive""" + if zmq.zmq_version_info() >= (3,1,0): + # zmq 3.1 has a bug, where poll can return false positives, + # so we wait a little bit just in case + # See LIBZMQ-280 on JIRA + time.sleep(0.1) + + r,w,x = zmq.select([socket], [], [], timeout=5) + assert len(r) > 0, "Should have received a message" + kwargs['flags'] = zmq.DONTWAIT | kwargs.get('flags', 0) + + recv = socket.recv_multipart if multipart else socket.recv + return recv(**kwargs) + + def recv(self, socket, **kwargs): + """call recv in a way that raises if there is nothing to receive""" + return self._select_recv(False, socket, **kwargs) + + def recv_multipart(self, socket, **kwargs): + """call recv_multipart in a way that raises if there is nothing to receive""" + return self._select_recv(True, socket, **kwargs) + + +class PollZMQTestCase(BaseZMQTestCase): + pass + +class GreenTest: + """Mixin for making green versions of test classes""" + green = True + + def assertRaisesErrno(self, errno, func, *args, **kwargs): + if errno == zmq.EAGAIN: + raise SkipTest("Skipping because we're green.") + try: + func(*args, **kwargs) + except zmq.ZMQError: + e = sys.exc_info()[1] + self.assertEqual(e.errno, errno, "wrong error raised, expected '%s' \ +got '%s'" % (zmq.ZMQError(errno), zmq.ZMQError(e.errno))) + else: + self.fail("Function did not raise any error") + + def tearDown(self): + contexts = set([self.context]) + while self.sockets: + sock = self.sockets.pop() + contexts.add(sock.context) # in case additional contexts are created + sock.close() + try: + gevent.joinall([gevent.spawn(ctx.term) for ctx in contexts], timeout=2, raise_error=True) + except gevent.Timeout: + raise RuntimeError("context could not terminate, open sockets likely remain in test") + + def skip_green(self): + raise SkipTest("Skipping because we are green") + +def skip_green(f): + def skipping_test(self, *args, **kwargs): + if self.green: + raise SkipTest("Skipping because we are green") + else: + return f(self, *args, **kwargs) + return skipping_test diff --git a/scripts/external_libs/platform/cel59/32bit/zmq/tests/test_auth.py b/scripts/external_libs/platform/cel59/32bit/zmq/tests/test_auth.py new file mode 100644 index 00000000..d350f61f --- /dev/null +++ b/scripts/external_libs/platform/cel59/32bit/zmq/tests/test_auth.py @@ -0,0 +1,431 @@ +# -*- coding: utf8 -*- + +# Copyright (C) PyZMQ Developers +# Distributed under the terms of the Modified BSD License. + +import logging +import os +import shutil +import sys +import tempfile + +import zmq.auth +from zmq.auth.ioloop import IOLoopAuthenticator +from zmq.auth.thread import ThreadAuthenticator + +from zmq.eventloop import ioloop, zmqstream +from zmq.tests import (BaseZMQTestCase, SkipTest) + +class BaseAuthTestCase(BaseZMQTestCase): + def setUp(self): + if zmq.zmq_version_info() < (4,0): + raise SkipTest("security is new in libzmq 4.0") + try: + zmq.curve_keypair() + except zmq.ZMQError: + raise SkipTest("security requires libzmq to be linked against libsodium") + super(BaseAuthTestCase, self).setUp() + # enable debug logging while we run tests + logging.getLogger('zmq.auth').setLevel(logging.DEBUG) + self.auth = self.make_auth() + self.auth.start() + self.base_dir, self.public_keys_dir, self.secret_keys_dir = self.create_certs() + + def make_auth(self): + raise NotImplementedError() + + def tearDown(self): + if self.auth: + self.auth.stop() + self.auth = None + self.remove_certs(self.base_dir) + super(BaseAuthTestCase, self).tearDown() + + def create_certs(self): + """Create CURVE certificates for a test""" + + # Create temporary CURVE keypairs for this test run. We create all keys in a + # temp directory and then move them into the appropriate private or public + # directory. + + base_dir = tempfile.mkdtemp() + keys_dir = os.path.join(base_dir, 'certificates') + public_keys_dir = os.path.join(base_dir, 'public_keys') + secret_keys_dir = os.path.join(base_dir, 'private_keys') + + os.mkdir(keys_dir) + os.mkdir(public_keys_dir) + os.mkdir(secret_keys_dir) + + server_public_file, server_secret_file = zmq.auth.create_certificates(keys_dir, "server") + client_public_file, client_secret_file = zmq.auth.create_certificates(keys_dir, "client") + + for key_file in os.listdir(keys_dir): + if key_file.endswith(".key"): + shutil.move(os.path.join(keys_dir, key_file), + os.path.join(public_keys_dir, '.')) + + for key_file in os.listdir(keys_dir): + if key_file.endswith(".key_secret"): + shutil.move(os.path.join(keys_dir, key_file), + os.path.join(secret_keys_dir, '.')) + + return (base_dir, public_keys_dir, secret_keys_dir) + + def remove_certs(self, base_dir): + """Remove certificates for a test""" + shutil.rmtree(base_dir) + + def load_certs(self, secret_keys_dir): + """Return server and client certificate keys""" + server_secret_file = os.path.join(secret_keys_dir, "server.key_secret") + client_secret_file = os.path.join(secret_keys_dir, "client.key_secret") + + server_public, server_secret = zmq.auth.load_certificate(server_secret_file) + client_public, client_secret = zmq.auth.load_certificate(client_secret_file) + + return server_public, server_secret, client_public, client_secret + + +class TestThreadAuthentication(BaseAuthTestCase): + """Test authentication running in a thread""" + + def make_auth(self): + return ThreadAuthenticator(self.context) + + def can_connect(self, server, client): + """Check if client can connect to server using tcp transport""" + result = False + iface = 'tcp://127.0.0.1' + port = server.bind_to_random_port(iface) + client.connect("%s:%i" % (iface, port)) + msg = [b"Hello World"] + server.send_multipart(msg) + if client.poll(1000): + rcvd_msg = client.recv_multipart() + self.assertEqual(rcvd_msg, msg) + result = True + return result + + def test_null(self): + """threaded auth - NULL""" + # A default NULL connection should always succeed, and not + # go through our authentication infrastructure at all. + self.auth.stop() + self.auth = None + + server = self.socket(zmq.PUSH) + client = self.socket(zmq.PULL) + self.assertTrue(self.can_connect(server, client)) + + # By setting a domain we switch on authentication for NULL sockets, + # though no policies are configured yet. The client connection + # should still be allowed. + server = self.socket(zmq.PUSH) + server.zap_domain = b'global' + client = self.socket(zmq.PULL) + self.assertTrue(self.can_connect(server, client)) + + def test_blacklist(self): + """threaded auth - Blacklist""" + # Blacklist 127.0.0.1, connection should fail + self.auth.deny('127.0.0.1') + server = self.socket(zmq.PUSH) + # By setting a domain we switch on authentication for NULL sockets, + # though no policies are configured yet. + server.zap_domain = b'global' + client = self.socket(zmq.PULL) + self.assertFalse(self.can_connect(server, client)) + + def test_whitelist(self): + """threaded auth - Whitelist""" + # Whitelist 127.0.0.1, connection should pass" + self.auth.allow('127.0.0.1') + server = self.socket(zmq.PUSH) + # By setting a domain we switch on authentication for NULL sockets, + # though no policies are configured yet. + server.zap_domain = b'global' + client = self.socket(zmq.PULL) + self.assertTrue(self.can_connect(server, client)) + + def test_plain(self): + """threaded auth - PLAIN""" + + # Try PLAIN authentication - without configuring server, connection should fail + server = self.socket(zmq.PUSH) + server.plain_server = True + client = self.socket(zmq.PULL) + client.plain_username = b'admin' + client.plain_password = b'Password' + self.assertFalse(self.can_connect(server, client)) + + # Try PLAIN authentication - with server configured, connection should pass + server = self.socket(zmq.PUSH) + server.plain_server = True + client = self.socket(zmq.PULL) + client.plain_username = b'admin' + client.plain_password = b'Password' + self.auth.configure_plain(domain='*', passwords={'admin': 'Password'}) + self.assertTrue(self.can_connect(server, client)) + + # Try PLAIN authentication - with bogus credentials, connection should fail + server = self.socket(zmq.PUSH) + server.plain_server = True + client = self.socket(zmq.PULL) + client.plain_username = b'admin' + client.plain_password = b'Bogus' + self.assertFalse(self.can_connect(server, client)) + + # Remove authenticator and check that a normal connection works + self.auth.stop() + self.auth = None + + server = self.socket(zmq.PUSH) + client = self.socket(zmq.PULL) + self.assertTrue(self.can_connect(server, client)) + client.close() + server.close() + + def test_curve(self): + """threaded auth - CURVE""" + self.auth.allow('127.0.0.1') + certs = self.load_certs(self.secret_keys_dir) + server_public, server_secret, client_public, client_secret = certs + + #Try CURVE authentication - without configuring server, connection should fail + server = self.socket(zmq.PUSH) + server.curve_publickey = server_public + server.curve_secretkey = server_secret + server.curve_server = True + client = self.socket(zmq.PULL) + client.curve_publickey = client_public + client.curve_secretkey = client_secret + client.curve_serverkey = server_public + self.assertFalse(self.can_connect(server, client)) + + #Try CURVE authentication - with server configured to CURVE_ALLOW_ANY, connection should pass + self.auth.configure_curve(domain='*', location=zmq.auth.CURVE_ALLOW_ANY) + server = self.socket(zmq.PUSH) + server.curve_publickey = server_public + server.curve_secretkey = server_secret + server.curve_server = True + client = self.socket(zmq.PULL) + client.curve_publickey = client_public + client.curve_secretkey = client_secret + client.curve_serverkey = server_public + self.assertTrue(self.can_connect(server, client)) + + # Try CURVE authentication - with server configured, connection should pass + self.auth.configure_curve(domain='*', location=self.public_keys_dir) + server = self.socket(zmq.PUSH) + server.curve_publickey = server_public + server.curve_secretkey = server_secret + server.curve_server = True + client = self.socket(zmq.PULL) + client.curve_publickey = client_public + client.curve_secretkey = client_secret + client.curve_serverkey = server_public + self.assertTrue(self.can_connect(server, client)) + + # Remove authenticator and check that a normal connection works + self.auth.stop() + self.auth = None + + # Try connecting using NULL and no authentication enabled, connection should pass + server = self.socket(zmq.PUSH) + client = self.socket(zmq.PULL) + self.assertTrue(self.can_connect(server, client)) + + +def with_ioloop(method, expect_success=True): + """decorator for running tests with an IOLoop""" + def test_method(self): + r = method(self) + + loop = self.io_loop + if expect_success: + self.pullstream.on_recv(self.on_message_succeed) + else: + self.pullstream.on_recv(self.on_message_fail) + + t = loop.time() + loop.add_callback(self.attempt_connection) + loop.add_callback(self.send_msg) + if expect_success: + loop.add_timeout(t + 1, self.on_test_timeout_fail) + else: + loop.add_timeout(t + 1, self.on_test_timeout_succeed) + + loop.start() + if self.fail_msg: + self.fail(self.fail_msg) + + return r + return test_method + +def should_auth(method): + return with_ioloop(method, True) + +def should_not_auth(method): + return with_ioloop(method, False) + +class TestIOLoopAuthentication(BaseAuthTestCase): + """Test authentication running in ioloop""" + + def setUp(self): + self.fail_msg = None + self.io_loop = ioloop.IOLoop() + super(TestIOLoopAuthentication, self).setUp() + self.server = self.socket(zmq.PUSH) + self.client = self.socket(zmq.PULL) + self.pushstream = zmqstream.ZMQStream(self.server, self.io_loop) + self.pullstream = zmqstream.ZMQStream(self.client, self.io_loop) + + def make_auth(self): + return IOLoopAuthenticator(self.context, io_loop=self.io_loop) + + def tearDown(self): + if self.auth: + self.auth.stop() + self.auth = None + self.io_loop.close(all_fds=True) + super(TestIOLoopAuthentication, self).tearDown() + + def attempt_connection(self): + """Check if client can connect to server using tcp transport""" + iface = 'tcp://127.0.0.1' + port = self.server.bind_to_random_port(iface) + self.client.connect("%s:%i" % (iface, port)) + + def send_msg(self): + """Send a message from server to a client""" + msg = [b"Hello World"] + self.pushstream.send_multipart(msg) + + def on_message_succeed(self, frames): + """A message was received, as expected.""" + if frames != [b"Hello World"]: + self.fail_msg = "Unexpected message received" + self.io_loop.stop() + + def on_message_fail(self, frames): + """A message was received, unexpectedly.""" + self.fail_msg = 'Received messaged unexpectedly, security failed' + self.io_loop.stop() + + def on_test_timeout_succeed(self): + """Test timer expired, indicates test success""" + self.io_loop.stop() + + def on_test_timeout_fail(self): + """Test timer expired, indicates test failure""" + self.fail_msg = 'Test timed out' + self.io_loop.stop() + + @should_auth + def test_none(self): + """ioloop auth - NONE""" + # A default NULL connection should always succeed, and not + # go through our authentication infrastructure at all. + # no auth should be running + self.auth.stop() + self.auth = None + + @should_auth + def test_null(self): + """ioloop auth - NULL""" + # By setting a domain we switch on authentication for NULL sockets, + # though no policies are configured yet. The client connection + # should still be allowed. + self.server.zap_domain = b'global' + + @should_not_auth + def test_blacklist(self): + """ioloop auth - Blacklist""" + # Blacklist 127.0.0.1, connection should fail + self.auth.deny('127.0.0.1') + self.server.zap_domain = b'global' + + @should_auth + def test_whitelist(self): + """ioloop auth - Whitelist""" + # Whitelist 127.0.0.1, which overrides the blacklist, connection should pass" + self.auth.allow('127.0.0.1') + + self.server.setsockopt(zmq.ZAP_DOMAIN, b'global') + + @should_not_auth + def test_plain_unconfigured_server(self): + """ioloop auth - PLAIN, unconfigured server""" + self.client.plain_username = b'admin' + self.client.plain_password = b'Password' + # Try PLAIN authentication - without configuring server, connection should fail + self.server.plain_server = True + + @should_auth + def test_plain_configured_server(self): + """ioloop auth - PLAIN, configured server""" + self.client.plain_username = b'admin' + self.client.plain_password = b'Password' + # Try PLAIN authentication - with server configured, connection should pass + self.server.plain_server = True + self.auth.configure_plain(domain='*', passwords={'admin': 'Password'}) + + @should_not_auth + def test_plain_bogus_credentials(self): + """ioloop auth - PLAIN, bogus credentials""" + self.client.plain_username = b'admin' + self.client.plain_password = b'Bogus' + self.server.plain_server = True + + self.auth.configure_plain(domain='*', passwords={'admin': 'Password'}) + + @should_not_auth + def test_curve_unconfigured_server(self): + """ioloop auth - CURVE, unconfigured server""" + certs = self.load_certs(self.secret_keys_dir) + server_public, server_secret, client_public, client_secret = certs + + self.auth.allow('127.0.0.1') + + self.server.curve_publickey = server_public + self.server.curve_secretkey = server_secret + self.server.curve_server = True + + self.client.curve_publickey = client_public + self.client.curve_secretkey = client_secret + self.client.curve_serverkey = server_public + + @should_auth + def test_curve_allow_any(self): + """ioloop auth - CURVE, CURVE_ALLOW_ANY""" + certs = self.load_certs(self.secret_keys_dir) + server_public, server_secret, client_public, client_secret = certs + + self.auth.allow('127.0.0.1') + self.auth.configure_curve(domain='*', location=zmq.auth.CURVE_ALLOW_ANY) + + self.server.curve_publickey = server_public + self.server.curve_secretkey = server_secret + self.server.curve_server = True + + self.client.curve_publickey = client_public + self.client.curve_secretkey = client_secret + self.client.curve_serverkey = server_public + + @should_auth + def test_curve_configured_server(self): + """ioloop auth - CURVE, configured server""" + self.auth.allow('127.0.0.1') + certs = self.load_certs(self.secret_keys_dir) + server_public, server_secret, client_public, client_secret = certs + + self.auth.configure_curve(domain='*', location=self.public_keys_dir) + + self.server.curve_publickey = server_public + self.server.curve_secretkey = server_secret + self.server.curve_server = True + + self.client.curve_publickey = client_public + self.client.curve_secretkey = client_secret + self.client.curve_serverkey = server_public diff --git a/scripts/external_libs/platform/cel59/32bit/zmq/tests/test_cffi_backend.py b/scripts/external_libs/platform/cel59/32bit/zmq/tests/test_cffi_backend.py new file mode 100644 index 00000000..1f85eebf --- /dev/null +++ b/scripts/external_libs/platform/cel59/32bit/zmq/tests/test_cffi_backend.py @@ -0,0 +1,310 @@ +# -*- coding: utf8 -*- + +import sys +import time + +from unittest import TestCase + +from zmq.tests import BaseZMQTestCase, SkipTest + +try: + from zmq.backend.cffi import ( + zmq_version_info, + PUSH, PULL, IDENTITY, + REQ, REP, POLLIN, POLLOUT, + ) + from zmq.backend.cffi._cffi import ffi, C + have_ffi_backend = True +except ImportError: + have_ffi_backend = False + + +class TestCFFIBackend(TestCase): + + def setUp(self): + if not have_ffi_backend or not 'PyPy' in sys.version: + raise SkipTest('PyPy Tests Only') + + def test_zmq_version_info(self): + version = zmq_version_info() + + assert version[0] in range(2,11) + + def test_zmq_ctx_new_destroy(self): + ctx = C.zmq_ctx_new() + + assert ctx != ffi.NULL + assert 0 == C.zmq_ctx_destroy(ctx) + + def test_zmq_socket_open_close(self): + ctx = C.zmq_ctx_new() + socket = C.zmq_socket(ctx, PUSH) + + assert ctx != ffi.NULL + assert ffi.NULL != socket + assert 0 == C.zmq_close(socket) + assert 0 == C.zmq_ctx_destroy(ctx) + + def test_zmq_setsockopt(self): + ctx = C.zmq_ctx_new() + socket = C.zmq_socket(ctx, PUSH) + + identity = ffi.new('char[3]', 'zmq') + ret = C.zmq_setsockopt(socket, IDENTITY, ffi.cast('void*', identity), 3) + + assert ret == 0 + assert ctx != ffi.NULL + assert ffi.NULL != socket + assert 0 == C.zmq_close(socket) + assert 0 == C.zmq_ctx_destroy(ctx) + + def test_zmq_getsockopt(self): + ctx = C.zmq_ctx_new() + socket = C.zmq_socket(ctx, PUSH) + + identity = ffi.new('char[]', 'zmq') + ret = C.zmq_setsockopt(socket, IDENTITY, ffi.cast('void*', identity), 3) + assert ret == 0 + + option_len = ffi.new('size_t*', 3) + option = ffi.new('char*') + ret = C.zmq_getsockopt(socket, + IDENTITY, + ffi.cast('void*', option), + option_len) + + assert ret == 0 + assert ffi.string(ffi.cast('char*', option))[0] == "z" + assert ffi.string(ffi.cast('char*', option))[1] == "m" + assert ffi.string(ffi.cast('char*', option))[2] == "q" + assert ctx != ffi.NULL + assert ffi.NULL != socket + assert 0 == C.zmq_close(socket) + assert 0 == C.zmq_ctx_destroy(ctx) + + def test_zmq_bind(self): + ctx = C.zmq_ctx_new() + socket = C.zmq_socket(ctx, 8) + + assert 0 == C.zmq_bind(socket, 'tcp://*:4444') + assert ctx != ffi.NULL + assert ffi.NULL != socket + assert 0 == C.zmq_close(socket) + assert 0 == C.zmq_ctx_destroy(ctx) + + def test_zmq_bind_connect(self): + ctx = C.zmq_ctx_new() + + socket1 = C.zmq_socket(ctx, PUSH) + socket2 = C.zmq_socket(ctx, PULL) + + assert 0 == C.zmq_bind(socket1, 'tcp://*:4444') + assert 0 == C.zmq_connect(socket2, 'tcp://127.0.0.1:4444') + assert ctx != ffi.NULL + assert ffi.NULL != socket1 + assert ffi.NULL != socket2 + assert 0 == C.zmq_close(socket1) + assert 0 == C.zmq_close(socket2) + assert 0 == C.zmq_ctx_destroy(ctx) + + def test_zmq_msg_init_close(self): + zmq_msg = ffi.new('zmq_msg_t*') + + assert ffi.NULL != zmq_msg + assert 0 == C.zmq_msg_init(zmq_msg) + assert 0 == C.zmq_msg_close(zmq_msg) + + def test_zmq_msg_init_size(self): + zmq_msg = ffi.new('zmq_msg_t*') + + assert ffi.NULL != zmq_msg + assert 0 == C.zmq_msg_init_size(zmq_msg, 10) + assert 0 == C.zmq_msg_close(zmq_msg) + + def test_zmq_msg_init_data(self): + zmq_msg = ffi.new('zmq_msg_t*') + message = ffi.new('char[5]', 'Hello') + + assert 0 == C.zmq_msg_init_data(zmq_msg, + ffi.cast('void*', message), + 5, + ffi.NULL, + ffi.NULL) + + assert ffi.NULL != zmq_msg + assert 0 == C.zmq_msg_close(zmq_msg) + + def test_zmq_msg_data(self): + zmq_msg = ffi.new('zmq_msg_t*') + message = ffi.new('char[]', 'Hello') + assert 0 == C.zmq_msg_init_data(zmq_msg, + ffi.cast('void*', message), + 5, + ffi.NULL, + ffi.NULL) + + data = C.zmq_msg_data(zmq_msg) + + assert ffi.NULL != zmq_msg + assert ffi.string(ffi.cast("char*", data)) == 'Hello' + assert 0 == C.zmq_msg_close(zmq_msg) + + + def test_zmq_send(self): + ctx = C.zmq_ctx_new() + + sender = C.zmq_socket(ctx, REQ) + receiver = C.zmq_socket(ctx, REP) + + assert 0 == C.zmq_bind(receiver, 'tcp://*:7777') + assert 0 == C.zmq_connect(sender, 'tcp://127.0.0.1:7777') + + time.sleep(0.1) + + zmq_msg = ffi.new('zmq_msg_t*') + message = ffi.new('char[5]', 'Hello') + + C.zmq_msg_init_data(zmq_msg, + ffi.cast('void*', message), + ffi.cast('size_t', 5), + ffi.NULL, + ffi.NULL) + + assert 5 == C.zmq_msg_send(zmq_msg, sender, 0) + assert 0 == C.zmq_msg_close(zmq_msg) + assert C.zmq_close(sender) == 0 + assert C.zmq_close(receiver) == 0 + assert C.zmq_ctx_destroy(ctx) == 0 + + def test_zmq_recv(self): + ctx = C.zmq_ctx_new() + + sender = C.zmq_socket(ctx, REQ) + receiver = C.zmq_socket(ctx, REP) + + assert 0 == C.zmq_bind(receiver, 'tcp://*:2222') + assert 0 == C.zmq_connect(sender, 'tcp://127.0.0.1:2222') + + time.sleep(0.1) + + zmq_msg = ffi.new('zmq_msg_t*') + message = ffi.new('char[5]', 'Hello') + + C.zmq_msg_init_data(zmq_msg, + ffi.cast('void*', message), + ffi.cast('size_t', 5), + ffi.NULL, + ffi.NULL) + + zmq_msg2 = ffi.new('zmq_msg_t*') + C.zmq_msg_init(zmq_msg2) + + assert 5 == C.zmq_msg_send(zmq_msg, sender, 0) + assert 5 == C.zmq_msg_recv(zmq_msg2, receiver, 0) + assert 5 == C.zmq_msg_size(zmq_msg2) + assert b"Hello" == ffi.buffer(C.zmq_msg_data(zmq_msg2), + C.zmq_msg_size(zmq_msg2))[:] + assert C.zmq_close(sender) == 0 + assert C.zmq_close(receiver) == 0 + assert C.zmq_ctx_destroy(ctx) == 0 + + def test_zmq_poll(self): + ctx = C.zmq_ctx_new() + + sender = C.zmq_socket(ctx, REQ) + receiver = C.zmq_socket(ctx, REP) + + r1 = C.zmq_bind(receiver, 'tcp://*:3333') + r2 = C.zmq_connect(sender, 'tcp://127.0.0.1:3333') + + zmq_msg = ffi.new('zmq_msg_t*') + message = ffi.new('char[5]', 'Hello') + + C.zmq_msg_init_data(zmq_msg, + ffi.cast('void*', message), + ffi.cast('size_t', 5), + ffi.NULL, + ffi.NULL) + + receiver_pollitem = ffi.new('zmq_pollitem_t*') + receiver_pollitem.socket = receiver + receiver_pollitem.fd = 0 + receiver_pollitem.events = POLLIN | POLLOUT + receiver_pollitem.revents = 0 + + ret = C.zmq_poll(ffi.NULL, 0, 0) + assert ret == 0 + + ret = C.zmq_poll(receiver_pollitem, 1, 0) + assert ret == 0 + + ret = C.zmq_msg_send(zmq_msg, sender, 0) + print(ffi.string(C.zmq_strerror(C.zmq_errno()))) + assert ret == 5 + + time.sleep(0.2) + + ret = C.zmq_poll(receiver_pollitem, 1, 0) + assert ret == 1 + + assert int(receiver_pollitem.revents) & POLLIN + assert not int(receiver_pollitem.revents) & POLLOUT + + zmq_msg2 = ffi.new('zmq_msg_t*') + C.zmq_msg_init(zmq_msg2) + + ret_recv = C.zmq_msg_recv(zmq_msg2, receiver, 0) + assert ret_recv == 5 + + assert 5 == C.zmq_msg_size(zmq_msg2) + assert b"Hello" == ffi.buffer(C.zmq_msg_data(zmq_msg2), + C.zmq_msg_size(zmq_msg2))[:] + + sender_pollitem = ffi.new('zmq_pollitem_t*') + sender_pollitem.socket = sender + sender_pollitem.fd = 0 + sender_pollitem.events = POLLIN | POLLOUT + sender_pollitem.revents = 0 + + ret = C.zmq_poll(sender_pollitem, 1, 0) + assert ret == 0 + + zmq_msg_again = ffi.new('zmq_msg_t*') + message_again = ffi.new('char[11]', 'Hello Again') + + C.zmq_msg_init_data(zmq_msg_again, + ffi.cast('void*', message_again), + ffi.cast('size_t', 11), + ffi.NULL, + ffi.NULL) + + assert 11 == C.zmq_msg_send(zmq_msg_again, receiver, 0) + + time.sleep(0.2) + + assert 0 <= C.zmq_poll(sender_pollitem, 1, 0) + assert int(sender_pollitem.revents) & POLLIN + assert 11 == C.zmq_msg_recv(zmq_msg2, sender, 0) + assert 11 == C.zmq_msg_size(zmq_msg2) + assert b"Hello Again" == ffi.buffer(C.zmq_msg_data(zmq_msg2), + int(C.zmq_msg_size(zmq_msg2)))[:] + assert 0 == C.zmq_close(sender) + assert 0 == C.zmq_close(receiver) + assert 0 == C.zmq_ctx_destroy(ctx) + assert 0 == C.zmq_msg_close(zmq_msg) + assert 0 == C.zmq_msg_close(zmq_msg2) + assert 0 == C.zmq_msg_close(zmq_msg_again) + + def test_zmq_stopwatch_functions(self): + stopwatch = C.zmq_stopwatch_start() + ret = C.zmq_stopwatch_stop(stopwatch) + + assert ffi.NULL != stopwatch + assert 0 < int(ret) + + def test_zmq_sleep(self): + try: + C.zmq_sleep(1) + except Exception as e: + raise AssertionError("Error executing zmq_sleep(int)") + diff --git a/scripts/external_libs/platform/cel59/32bit/zmq/tests/test_constants.py b/scripts/external_libs/platform/cel59/32bit/zmq/tests/test_constants.py new file mode 100644 index 00000000..d32b2b48 --- /dev/null +++ b/scripts/external_libs/platform/cel59/32bit/zmq/tests/test_constants.py @@ -0,0 +1,104 @@ +# Copyright (C) PyZMQ Developers +# Distributed under the terms of the Modified BSD License. + +import json +from unittest import TestCase + +import zmq + +from zmq.utils import constant_names +from zmq.sugar import constants as sugar_constants +from zmq.backend import constants as backend_constants + +all_set = set(constant_names.all_names) + +class TestConstants(TestCase): + + def _duplicate_test(self, namelist, listname): + """test that a given list has no duplicates""" + dupes = {} + for name in set(namelist): + cnt = namelist.count(name) + if cnt > 1: + dupes[name] = cnt + if dupes: + self.fail("The following names occur more than once in %s: %s" % (listname, json.dumps(dupes, indent=2))) + + def test_duplicate_all(self): + return self._duplicate_test(constant_names.all_names, "all_names") + + def _change_key(self, change, version): + """return changed-in key""" + return "%s-in %d.%d.%d" % tuple([change] + list(version)) + + def test_duplicate_changed(self): + all_changed = [] + for change in ("new", "removed"): + d = getattr(constant_names, change + "_in") + for version, namelist in d.items(): + all_changed.extend(namelist) + self._duplicate_test(namelist, self._change_key(change, version)) + + self._duplicate_test(all_changed, "all-changed") + + def test_changed_in_all(self): + missing = {} + for change in ("new", "removed"): + d = getattr(constant_names, change + "_in") + for version, namelist in d.items(): + key = self._change_key(change, version) + for name in namelist: + if name not in all_set: + if key not in missing: + missing[key] = [] + missing[key].append(name) + + if missing: + self.fail( + "The following names are missing in `all_names`: %s" % json.dumps(missing, indent=2) + ) + + def test_no_negative_constants(self): + for name in sugar_constants.__all__: + self.assertNotEqual(getattr(zmq, name), sugar_constants._UNDEFINED) + + def test_undefined_constants(self): + all_aliases = [] + for alias_group in sugar_constants.aliases: + all_aliases.extend(alias_group) + + for name in all_set.difference(all_aliases): + raw = getattr(backend_constants, name) + if raw == sugar_constants._UNDEFINED: + self.assertRaises(AttributeError, getattr, zmq, name) + else: + self.assertEqual(getattr(zmq, name), raw) + + def test_new(self): + zmq_version = zmq.zmq_version_info() + for version, new_names in constant_names.new_in.items(): + should_have = zmq_version >= version + for name in new_names: + try: + value = getattr(zmq, name) + except AttributeError: + if should_have: + self.fail("AttributeError: zmq.%s" % name) + else: + if not should_have: + self.fail("Shouldn't have: zmq.%s=%s" % (name, value)) + + def test_removed(self): + zmq_version = zmq.zmq_version_info() + for version, new_names in constant_names.removed_in.items(): + should_have = zmq_version < version + for name in new_names: + try: + value = getattr(zmq, name) + except AttributeError: + if should_have: + self.fail("AttributeError: zmq.%s" % name) + else: + if not should_have: + self.fail("Shouldn't have: zmq.%s=%s" % (name, value)) + diff --git a/scripts/external_libs/platform/cel59/32bit/zmq/tests/test_context.py b/scripts/external_libs/platform/cel59/32bit/zmq/tests/test_context.py new file mode 100644 index 00000000..e3280778 --- /dev/null +++ b/scripts/external_libs/platform/cel59/32bit/zmq/tests/test_context.py @@ -0,0 +1,257 @@ +# Copyright (C) PyZMQ Developers +# Distributed under the terms of the Modified BSD License. + +import gc +import sys +import time +from threading import Thread, Event + +import zmq +from zmq.tests import ( + BaseZMQTestCase, have_gevent, GreenTest, skip_green, PYPY, SkipTest, +) + + +class TestContext(BaseZMQTestCase): + + def test_init(self): + c1 = self.Context() + self.assert_(isinstance(c1, self.Context)) + del c1 + c2 = self.Context() + self.assert_(isinstance(c2, self.Context)) + del c2 + c3 = self.Context() + self.assert_(isinstance(c3, self.Context)) + del c3 + + def test_dir(self): + ctx = self.Context() + self.assertTrue('socket' in dir(ctx)) + if zmq.zmq_version_info() > (3,): + self.assertTrue('IO_THREADS' in dir(ctx)) + ctx.term() + + def test_term(self): + c = self.Context() + c.term() + self.assert_(c.closed) + + def test_context_manager(self): + with self.Context() as c: + pass + self.assert_(c.closed) + + def test_fail_init(self): + self.assertRaisesErrno(zmq.EINVAL, self.Context, -1) + + def test_term_hang(self): + rep,req = self.create_bound_pair(zmq.ROUTER, zmq.DEALER) + req.setsockopt(zmq.LINGER, 0) + req.send(b'hello', copy=False) + req.close() + rep.close() + self.context.term() + + def test_instance(self): + ctx = self.Context.instance() + c2 = self.Context.instance(io_threads=2) + self.assertTrue(c2 is ctx) + c2.term() + c3 = self.Context.instance() + c4 = self.Context.instance() + self.assertFalse(c3 is c2) + self.assertFalse(c3.closed) + self.assertTrue(c3 is c4) + + def test_many_sockets(self): + """opening and closing many sockets shouldn't cause problems""" + ctx = self.Context() + for i in range(16): + sockets = [ ctx.socket(zmq.REP) for i in range(65) ] + [ s.close() for s in sockets ] + # give the reaper a chance + time.sleep(1e-2) + ctx.term() + + def test_sockopts(self): + """setting socket options with ctx attributes""" + ctx = self.Context() + ctx.linger = 5 + self.assertEqual(ctx.linger, 5) + s = ctx.socket(zmq.REQ) + self.assertEqual(s.linger, 5) + self.assertEqual(s.getsockopt(zmq.LINGER), 5) + s.close() + # check that subscribe doesn't get set on sockets that don't subscribe: + ctx.subscribe = b'' + s = ctx.socket(zmq.REQ) + s.close() + + ctx.term() + + + def test_destroy(self): + """Context.destroy should close sockets""" + ctx = self.Context() + sockets = [ ctx.socket(zmq.REP) for i in range(65) ] + + # close half of the sockets + [ s.close() for s in sockets[::2] ] + + ctx.destroy() + # reaper is not instantaneous + time.sleep(1e-2) + for s in sockets: + self.assertTrue(s.closed) + + def test_destroy_linger(self): + """Context.destroy should set linger on closing sockets""" + req,rep = self.create_bound_pair(zmq.REQ, zmq.REP) + req.send(b'hi') + time.sleep(1e-2) + self.context.destroy(linger=0) + # reaper is not instantaneous + time.sleep(1e-2) + for s in (req,rep): + self.assertTrue(s.closed) + + def test_term_noclose(self): + """Context.term won't close sockets""" + ctx = self.Context() + s = ctx.socket(zmq.REQ) + self.assertFalse(s.closed) + t = Thread(target=ctx.term) + t.start() + t.join(timeout=0.1) + self.assertTrue(t.is_alive(), "Context should be waiting") + s.close() + t.join(timeout=0.1) + self.assertFalse(t.is_alive(), "Context should have closed") + + def test_gc(self): + """test close&term by garbage collection alone""" + if PYPY: + raise SkipTest("GC doesn't work ") + + # test credit @dln (GH #137): + def gcf(): + def inner(): + ctx = self.Context() + s = ctx.socket(zmq.PUSH) + inner() + gc.collect() + t = Thread(target=gcf) + t.start() + t.join(timeout=1) + self.assertFalse(t.is_alive(), "Garbage collection should have cleaned up context") + + def test_cyclic_destroy(self): + """ctx.destroy should succeed when cyclic ref prevents gc""" + # test credit @dln (GH #137): + class CyclicReference(object): + def __init__(self, parent=None): + self.parent = parent + + def crash(self, sock): + self.sock = sock + self.child = CyclicReference(self) + + def crash_zmq(): + ctx = self.Context() + sock = ctx.socket(zmq.PULL) + c = CyclicReference() + c.crash(sock) + ctx.destroy() + + crash_zmq() + + def test_term_thread(self): + """ctx.term should not crash active threads (#139)""" + ctx = self.Context() + evt = Event() + evt.clear() + + def block(): + s = ctx.socket(zmq.REP) + s.bind_to_random_port('tcp://127.0.0.1') + evt.set() + try: + s.recv() + except zmq.ZMQError as e: + self.assertEqual(e.errno, zmq.ETERM) + return + finally: + s.close() + self.fail("recv should have been interrupted with ETERM") + t = Thread(target=block) + t.start() + + evt.wait(1) + self.assertTrue(evt.is_set(), "sync event never fired") + time.sleep(0.01) + ctx.term() + t.join(timeout=1) + self.assertFalse(t.is_alive(), "term should have interrupted s.recv()") + + def test_destroy_no_sockets(self): + ctx = self.Context() + s = ctx.socket(zmq.PUB) + s.bind_to_random_port('tcp://127.0.0.1') + s.close() + ctx.destroy() + assert s.closed + assert ctx.closed + + def test_ctx_opts(self): + if zmq.zmq_version_info() < (3,): + raise SkipTest("context options require libzmq 3") + ctx = self.Context() + ctx.set(zmq.MAX_SOCKETS, 2) + self.assertEqual(ctx.get(zmq.MAX_SOCKETS), 2) + ctx.max_sockets = 100 + self.assertEqual(ctx.max_sockets, 100) + self.assertEqual(ctx.get(zmq.MAX_SOCKETS), 100) + + def test_shadow(self): + ctx = self.Context() + ctx2 = self.Context.shadow(ctx.underlying) + self.assertEqual(ctx.underlying, ctx2.underlying) + s = ctx.socket(zmq.PUB) + s.close() + del ctx2 + self.assertFalse(ctx.closed) + s = ctx.socket(zmq.PUB) + ctx2 = self.Context.shadow(ctx.underlying) + s2 = ctx2.socket(zmq.PUB) + s.close() + s2.close() + ctx.term() + self.assertRaisesErrno(zmq.EFAULT, ctx2.socket, zmq.PUB) + del ctx2 + + def test_shadow_pyczmq(self): + try: + from pyczmq import zctx, zsocket, zstr + except Exception: + raise SkipTest("Requires pyczmq") + + ctx = zctx.new() + a = zsocket.new(ctx, zmq.PUSH) + zsocket.bind(a, "inproc://a") + ctx2 = self.Context.shadow_pyczmq(ctx) + b = ctx2.socket(zmq.PULL) + b.connect("inproc://a") + zstr.send(a, b'hi') + rcvd = self.recv(b) + self.assertEqual(rcvd, b'hi') + b.close() + + +if False: # disable green context tests + class TestContextGreen(GreenTest, TestContext): + """gevent subclass of context tests""" + # skip tests that use real threads: + test_gc = GreenTest.skip_green + test_term_thread = GreenTest.skip_green + test_destroy_linger = GreenTest.skip_green diff --git a/scripts/external_libs/platform/cel59/32bit/zmq/tests/test_device.py b/scripts/external_libs/platform/cel59/32bit/zmq/tests/test_device.py new file mode 100644 index 00000000..f8305074 --- /dev/null +++ b/scripts/external_libs/platform/cel59/32bit/zmq/tests/test_device.py @@ -0,0 +1,146 @@ +# Copyright (C) PyZMQ Developers +# Distributed under the terms of the Modified BSD License. + +import time + +import zmq +from zmq import devices +from zmq.tests import BaseZMQTestCase, SkipTest, have_gevent, GreenTest, PYPY +from zmq.utils.strtypes import (bytes,unicode,basestring) + +if PYPY: + # cleanup of shared Context doesn't work on PyPy + devices.Device.context_factory = zmq.Context + +class TestDevice(BaseZMQTestCase): + + def test_device_types(self): + for devtype in (zmq.STREAMER, zmq.FORWARDER, zmq.QUEUE): + dev = devices.Device(devtype, zmq.PAIR, zmq.PAIR) + self.assertEqual(dev.device_type, devtype) + del dev + + def test_device_attributes(self): + dev = devices.Device(zmq.QUEUE, zmq.SUB, zmq.PUB) + self.assertEqual(dev.in_type, zmq.SUB) + self.assertEqual(dev.out_type, zmq.PUB) + self.assertEqual(dev.device_type, zmq.QUEUE) + self.assertEqual(dev.daemon, True) + del dev + + def test_tsdevice_attributes(self): + dev = devices.Device(zmq.QUEUE, zmq.SUB, zmq.PUB) + self.assertEqual(dev.in_type, zmq.SUB) + self.assertEqual(dev.out_type, zmq.PUB) + self.assertEqual(dev.device_type, zmq.QUEUE) + self.assertEqual(dev.daemon, True) + del dev + + + def test_single_socket_forwarder_connect(self): + dev = devices.ThreadDevice(zmq.QUEUE, zmq.REP, -1) + req = self.context.socket(zmq.REQ) + port = req.bind_to_random_port('tcp://127.0.0.1') + dev.connect_in('tcp://127.0.0.1:%i'%port) + dev.start() + time.sleep(.25) + msg = b'hello' + req.send(msg) + self.assertEqual(msg, self.recv(req)) + del dev + req.close() + dev = devices.ThreadDevice(zmq.QUEUE, zmq.REP, -1) + req = self.context.socket(zmq.REQ) + port = req.bind_to_random_port('tcp://127.0.0.1') + dev.connect_out('tcp://127.0.0.1:%i'%port) + dev.start() + time.sleep(.25) + msg = b'hello again' + req.send(msg) + self.assertEqual(msg, self.recv(req)) + del dev + req.close() + + def test_single_socket_forwarder_bind(self): + dev = devices.ThreadDevice(zmq.QUEUE, zmq.REP, -1) + # select random port: + binder = self.context.socket(zmq.REQ) + port = binder.bind_to_random_port('tcp://127.0.0.1') + binder.close() + time.sleep(0.1) + req = self.context.socket(zmq.REQ) + req.connect('tcp://127.0.0.1:%i'%port) + dev.bind_in('tcp://127.0.0.1:%i'%port) + dev.start() + time.sleep(.25) + msg = b'hello' + req.send(msg) + self.assertEqual(msg, self.recv(req)) + del dev + req.close() + dev = devices.ThreadDevice(zmq.QUEUE, zmq.REP, -1) + # select random port: + binder = self.context.socket(zmq.REQ) + port = binder.bind_to_random_port('tcp://127.0.0.1') + binder.close() + time.sleep(0.1) + req = self.context.socket(zmq.REQ) + req.connect('tcp://127.0.0.1:%i'%port) + dev.bind_in('tcp://127.0.0.1:%i'%port) + dev.start() + time.sleep(.25) + msg = b'hello again' + req.send(msg) + self.assertEqual(msg, self.recv(req)) + del dev + req.close() + + def test_proxy(self): + if zmq.zmq_version_info() < (3,2): + raise SkipTest("Proxies only in libzmq >= 3") + dev = devices.ThreadProxy(zmq.PULL, zmq.PUSH, zmq.PUSH) + binder = self.context.socket(zmq.REQ) + iface = 'tcp://127.0.0.1' + port = binder.bind_to_random_port(iface) + port2 = binder.bind_to_random_port(iface) + port3 = binder.bind_to_random_port(iface) + binder.close() + time.sleep(0.1) + dev.bind_in("%s:%i" % (iface, port)) + dev.bind_out("%s:%i" % (iface, port2)) + dev.bind_mon("%s:%i" % (iface, port3)) + dev.start() + time.sleep(0.25) + msg = b'hello' + push = self.context.socket(zmq.PUSH) + push.connect("%s:%i" % (iface, port)) + pull = self.context.socket(zmq.PULL) + pull.connect("%s:%i" % (iface, port2)) + mon = self.context.socket(zmq.PULL) + mon.connect("%s:%i" % (iface, port3)) + push.send(msg) + self.sockets.extend([push, pull, mon]) + self.assertEqual(msg, self.recv(pull)) + self.assertEqual(msg, self.recv(mon)) + +if have_gevent: + import gevent + import zmq.green + + class TestDeviceGreen(GreenTest, BaseZMQTestCase): + + def test_green_device(self): + rep = self.context.socket(zmq.REP) + req = self.context.socket(zmq.REQ) + self.sockets.extend([req, rep]) + port = rep.bind_to_random_port('tcp://127.0.0.1') + g = gevent.spawn(zmq.green.device, zmq.QUEUE, rep, rep) + req.connect('tcp://127.0.0.1:%i' % port) + req.send(b'hi') + timeout = gevent.Timeout(3) + timeout.start() + receiver = gevent.spawn(req.recv) + self.assertEqual(receiver.get(2), b'hi') + timeout.cancel() + g.kill(block=True) + diff --git a/scripts/external_libs/platform/cel59/32bit/zmq/tests/test_error.py b/scripts/external_libs/platform/cel59/32bit/zmq/tests/test_error.py new file mode 100644 index 00000000..a2eee14a --- /dev/null +++ b/scripts/external_libs/platform/cel59/32bit/zmq/tests/test_error.py @@ -0,0 +1,43 @@ +# -*- coding: utf8 -*- +# Copyright (C) PyZMQ Developers +# Distributed under the terms of the Modified BSD License. + +import sys +import time + +import zmq +from zmq import ZMQError, strerror, Again, ContextTerminated +from zmq.tests import BaseZMQTestCase + +if sys.version_info[0] >= 3: + long = int + +class TestZMQError(BaseZMQTestCase): + + def test_strerror(self): + """test that strerror gets the right type.""" + for i in range(10): + e = strerror(i) + self.assertTrue(isinstance(e, str)) + + def test_zmqerror(self): + for errno in range(10): + e = ZMQError(errno) + self.assertEqual(e.errno, errno) + self.assertEqual(str(e), strerror(errno)) + + def test_again(self): + s = self.context.socket(zmq.REP) + self.assertRaises(Again, s.recv, zmq.NOBLOCK) + self.assertRaisesErrno(zmq.EAGAIN, s.recv, zmq.NOBLOCK) + s.close() + + def atest_ctxterm(self): + s = self.context.socket(zmq.REP) + t = Thread(target=self.context.term) + t.start() + self.assertRaises(ContextTerminated, s.recv, zmq.NOBLOCK) + self.assertRaisesErrno(zmq.TERM, s.recv, zmq.NOBLOCK) + s.close() + t.join() + diff --git a/scripts/external_libs/platform/cel59/32bit/zmq/tests/test_etc.py b/scripts/external_libs/platform/cel59/32bit/zmq/tests/test_etc.py new file mode 100644 index 00000000..ad224064 --- /dev/null +++ b/scripts/external_libs/platform/cel59/32bit/zmq/tests/test_etc.py @@ -0,0 +1,15 @@ +# Copyright (c) PyZMQ Developers. +# Distributed under the terms of the Modified BSD License. + +import sys + +import zmq + +from . import skip_if + +@skip_if(zmq.zmq_version_info() < (4,1), "libzmq < 4.1") +def test_has(): + assert not zmq.has('something weird') + has_ipc = zmq.has('ipc') + not_windows = not sys.platform.startswith('win') + assert has_ipc == not_windows diff --git a/scripts/external_libs/platform/cel59/32bit/zmq/tests/test_imports.py b/scripts/external_libs/platform/cel59/32bit/zmq/tests/test_imports.py new file mode 100644 index 00000000..c0ddfaac --- /dev/null +++ b/scripts/external_libs/platform/cel59/32bit/zmq/tests/test_imports.py @@ -0,0 +1,62 @@ +# Copyright (C) PyZMQ Developers +# Distributed under the terms of the Modified BSD License. + +import sys +from unittest import TestCase + +class TestImports(TestCase): + """Test Imports - the quickest test to ensure that we haven't + introduced version-incompatible syntax errors.""" + + def test_toplevel(self): + """test toplevel import""" + import zmq + + def test_core(self): + """test core imports""" + from zmq import Context + from zmq import Socket + from zmq import Poller + from zmq import Frame + from zmq import constants + from zmq import device, proxy + from zmq import Stopwatch + from zmq import ( + zmq_version, + zmq_version_info, + pyzmq_version, + pyzmq_version_info, + ) + + def test_devices(self): + """test device imports""" + import zmq.devices + from zmq.devices import basedevice + from zmq.devices import monitoredqueue + from zmq.devices import monitoredqueuedevice + + def test_log(self): + """test log imports""" + import zmq.log + from zmq.log import handlers + + def test_eventloop(self): + """test eventloop imports""" + import zmq.eventloop + from zmq.eventloop import ioloop + from zmq.eventloop import zmqstream + from zmq.eventloop.minitornado.platform import auto + from zmq.eventloop.minitornado import ioloop + + def test_utils(self): + """test util imports""" + import zmq.utils + from zmq.utils import strtypes + from zmq.utils import jsonapi + + def test_ssh(self): + """test ssh imports""" + from zmq.ssh import tunnel + + + diff --git a/scripts/external_libs/platform/cel59/32bit/zmq/tests/test_ioloop.py b/scripts/external_libs/platform/cel59/32bit/zmq/tests/test_ioloop.py new file mode 100644 index 00000000..2a8b1153 --- /dev/null +++ b/scripts/external_libs/platform/cel59/32bit/zmq/tests/test_ioloop.py @@ -0,0 +1,113 @@ +# Copyright (C) PyZMQ Developers +# Distributed under the terms of the Modified BSD License. + +import time +import os +import threading + +import zmq +from zmq.tests import BaseZMQTestCase +from zmq.eventloop import ioloop +from zmq.eventloop.minitornado.ioloop import _Timeout +try: + from tornado.ioloop import PollIOLoop, IOLoop as BaseIOLoop +except ImportError: + from zmq.eventloop.minitornado.ioloop import IOLoop as BaseIOLoop + + +def printer(): + os.system("say hello") + raise Exception + print (time.time()) + + +class Delay(threading.Thread): + def __init__(self, f, delay=1): + self.f=f + self.delay=delay + self.aborted=False + self.cond=threading.Condition() + super(Delay, self).__init__() + + def run(self): + self.cond.acquire() + self.cond.wait(self.delay) + self.cond.release() + if not self.aborted: + self.f() + + def abort(self): + self.aborted=True + self.cond.acquire() + self.cond.notify() + self.cond.release() + + +class TestIOLoop(BaseZMQTestCase): + + def test_simple(self): + """simple IOLoop creation test""" + loop = ioloop.IOLoop() + dc = ioloop.PeriodicCallback(loop.stop, 200, loop) + pc = ioloop.PeriodicCallback(lambda : None, 10, loop) + pc.start() + dc.start() + t = Delay(loop.stop,1) + t.start() + loop.start() + if t.isAlive(): + t.abort() + else: + self.fail("IOLoop failed to exit") + + def test_timeout_compare(self): + """test timeout comparisons""" + loop = ioloop.IOLoop() + t = _Timeout(1, 2, loop) + t2 = _Timeout(1, 3, loop) + self.assertEqual(t < t2, id(t) < id(t2)) + t2 = _Timeout(2,1, loop) + self.assertTrue(t < t2) + + def test_poller_events(self): + """Tornado poller implementation maps events correctly""" + req,rep = self.create_bound_pair(zmq.REQ, zmq.REP) + poller = ioloop.ZMQPoller() + poller.register(req, ioloop.IOLoop.READ) + poller.register(rep, ioloop.IOLoop.READ) + events = dict(poller.poll(0)) + self.assertEqual(events.get(rep), None) + self.assertEqual(events.get(req), None) + + poller.register(req, ioloop.IOLoop.WRITE) + poller.register(rep, ioloop.IOLoop.WRITE) + events = dict(poller.poll(1)) + self.assertEqual(events.get(req), ioloop.IOLoop.WRITE) + self.assertEqual(events.get(rep), None) + + poller.register(rep, ioloop.IOLoop.READ) + req.send(b'hi') + events = dict(poller.poll(1)) + self.assertEqual(events.get(rep), ioloop.IOLoop.READ) + self.assertEqual(events.get(req), None) + + def test_instance(self): + """Test IOLoop.instance returns the right object""" + loop = ioloop.IOLoop.instance() + self.assertEqual(loop.__class__, ioloop.IOLoop) + loop = BaseIOLoop.instance() + self.assertEqual(loop.__class__, ioloop.IOLoop) + + def test_close_all(self): + """Test close(all_fds=True)""" + loop = ioloop.IOLoop.instance() + req,rep = self.create_bound_pair(zmq.REQ, zmq.REP) + loop.add_handler(req, lambda msg: msg, ioloop.IOLoop.READ) + loop.add_handler(rep, lambda msg: msg, ioloop.IOLoop.READ) + self.assertEqual(req.closed, False) + self.assertEqual(rep.closed, False) + loop.close(all_fds=True) + self.assertEqual(req.closed, True) + self.assertEqual(rep.closed, True) + + diff --git a/scripts/external_libs/platform/cel59/32bit/zmq/tests/test_log.py b/scripts/external_libs/platform/cel59/32bit/zmq/tests/test_log.py new file mode 100644 index 00000000..9206f095 --- /dev/null +++ b/scripts/external_libs/platform/cel59/32bit/zmq/tests/test_log.py @@ -0,0 +1,116 @@ +# encoding: utf-8 + +# Copyright (C) PyZMQ Developers +# Distributed under the terms of the Modified BSD License. + + +import logging +import time +from unittest import TestCase + +import zmq +from zmq.log import handlers +from zmq.utils.strtypes import b, u +from zmq.tests import BaseZMQTestCase + + +class TestPubLog(BaseZMQTestCase): + + iface = 'inproc://zmqlog' + topic= 'zmq' + + @property + def logger(self): + # print dir(self) + logger = logging.getLogger('zmqtest') + logger.setLevel(logging.DEBUG) + return logger + + def connect_handler(self, topic=None): + topic = self.topic if topic is None else topic + logger = self.logger + pub,sub = self.create_bound_pair(zmq.PUB, zmq.SUB) + handler = handlers.PUBHandler(pub) + handler.setLevel(logging.DEBUG) + handler.root_topic = topic + logger.addHandler(handler) + sub.setsockopt(zmq.SUBSCRIBE, b(topic)) + time.sleep(0.1) + return logger, handler, sub + + def test_init_iface(self): + logger = self.logger + ctx = self.context + handler = handlers.PUBHandler(self.iface) + self.assertFalse(handler.ctx is ctx) + self.sockets.append(handler.socket) + # handler.ctx.term() + handler = handlers.PUBHandler(self.iface, self.context) + self.sockets.append(handler.socket) + self.assertTrue(handler.ctx is ctx) + handler.setLevel(logging.DEBUG) + handler.root_topic = self.topic + logger.addHandler(handler) + sub = ctx.socket(zmq.SUB) + self.sockets.append(sub) + sub.setsockopt(zmq.SUBSCRIBE, b(self.topic)) + sub.connect(self.iface) + import time; time.sleep(0.25) + msg1 = 'message' + logger.info(msg1) + + (topic, msg2) = sub.recv_multipart() + self.assertEqual(topic, b'zmq.INFO') + self.assertEqual(msg2, b(msg1)+b'\n') + logger.removeHandler(handler) + + def test_init_socket(self): + pub,sub = self.create_bound_pair(zmq.PUB, zmq.SUB) + logger = self.logger + handler = handlers.PUBHandler(pub) + handler.setLevel(logging.DEBUG) + handler.root_topic = self.topic + logger.addHandler(handler) + + self.assertTrue(handler.socket is pub) + self.assertTrue(handler.ctx is pub.context) + self.assertTrue(handler.ctx is self.context) + sub.setsockopt(zmq.SUBSCRIBE, b(self.topic)) + import time; time.sleep(0.1) + msg1 = 'message' + logger.info(msg1) + + (topic, msg2) = sub.recv_multipart() + self.assertEqual(topic, b'zmq.INFO') + self.assertEqual(msg2, b(msg1)+b'\n') + logger.removeHandler(handler) + + def test_root_topic(self): + logger, handler, sub = self.connect_handler() + handler.socket.bind(self.iface) + sub2 = sub.context.socket(zmq.SUB) + self.sockets.append(sub2) + sub2.connect(self.iface) + sub2.setsockopt(zmq.SUBSCRIBE, b'') + handler.root_topic = b'twoonly' + msg1 = 'ignored' + logger.info(msg1) + self.assertRaisesErrno(zmq.EAGAIN, sub.recv, zmq.NOBLOCK) + topic,msg2 = sub2.recv_multipart() + self.assertEqual(topic, b'twoonly.INFO') + self.assertEqual(msg2, b(msg1)+b'\n') + + logger.removeHandler(handler) + + def test_unicode_message(self): + logger, handler, sub = self.connect_handler() + base_topic = b(self.topic + '.INFO') + for msg, expected in [ + (u('hello'), [base_topic, b('hello\n')]), + (u('héllo'), [base_topic, b('héllo\n')]), + (u('tøpic::héllo'), [base_topic + b('.tøpic'), b('héllo\n')]), + ]: + logger.info(msg) + received = sub.recv_multipart() + self.assertEqual(received, expected) + diff --git a/scripts/external_libs/platform/cel59/32bit/zmq/tests/test_message.py b/scripts/external_libs/platform/cel59/32bit/zmq/tests/test_message.py new file mode 100644 index 00000000..d8770bdf --- /dev/null +++ b/scripts/external_libs/platform/cel59/32bit/zmq/tests/test_message.py @@ -0,0 +1,362 @@ +# -*- coding: utf8 -*- +# Copyright (C) PyZMQ Developers +# Distributed under the terms of the Modified BSD License. + + +import copy +import sys +try: + from sys import getrefcount as grc +except ImportError: + grc = None + +import time +from pprint import pprint +from unittest import TestCase + +import zmq +from zmq.tests import BaseZMQTestCase, SkipTest, skip_pypy, PYPY +from zmq.utils.strtypes import unicode, bytes, b, u + + +# some useful constants: + +x = b'x' + +try: + view = memoryview +except NameError: + view = buffer + +if grc: + rc0 = grc(x) + v = view(x) + view_rc = grc(x) - rc0 + +def await_gc(obj, rc): + """wait for refcount on an object to drop to an expected value + + Necessary because of the zero-copy gc thread, + which can take some time to receive its DECREF message. + """ + for i in range(50): + # rc + 2 because of the refs in this function + if grc(obj) <= rc + 2: + return + time.sleep(0.05) + +class TestFrame(BaseZMQTestCase): + + @skip_pypy + def test_above_30(self): + """Message above 30 bytes are never copied by 0MQ.""" + for i in range(5, 16): # 32, 64,..., 65536 + s = (2**i)*x + self.assertEqual(grc(s), 2) + m = zmq.Frame(s) + self.assertEqual(grc(s), 4) + del m + await_gc(s, 2) + self.assertEqual(grc(s), 2) + del s + + def test_str(self): + """Test the str representations of the Frames.""" + for i in range(16): + s = (2**i)*x + m = zmq.Frame(s) + m_str = str(m) + m_str_b = b(m_str) # py3compat + self.assertEqual(s, m_str_b) + + def test_bytes(self): + """Test the Frame.bytes property.""" + for i in range(1,16): + s = (2**i)*x + m = zmq.Frame(s) + b = m.bytes + self.assertEqual(s, m.bytes) + if not PYPY: + # check that it copies + self.assert_(b is not s) + # check that it copies only once + self.assert_(b is m.bytes) + + def test_unicode(self): + """Test the unicode representations of the Frames.""" + s = u('asdf') + self.assertRaises(TypeError, zmq.Frame, s) + for i in range(16): + s = (2**i)*u('§') + m = zmq.Frame(s.encode('utf8')) + self.assertEqual(s, unicode(m.bytes,'utf8')) + + def test_len(self): + """Test the len of the Frames.""" + for i in range(16): + s = (2**i)*x + m = zmq.Frame(s) + self.assertEqual(len(s), len(m)) + + @skip_pypy + def test_lifecycle1(self): + """Run through a ref counting cycle with a copy.""" + for i in range(5, 16): # 32, 64,..., 65536 + s = (2**i)*x + rc = 2 + self.assertEqual(grc(s), rc) + m = zmq.Frame(s) + rc += 2 + self.assertEqual(grc(s), rc) + m2 = copy.copy(m) + rc += 1 + self.assertEqual(grc(s), rc) + buf = m2.buffer + + rc += view_rc + self.assertEqual(grc(s), rc) + + self.assertEqual(s, b(str(m))) + self.assertEqual(s, bytes(m2)) + self.assertEqual(s, m.bytes) + # self.assert_(s is str(m)) + # self.assert_(s is str(m2)) + del m2 + rc -= 1 + self.assertEqual(grc(s), rc) + rc -= view_rc + del buf + self.assertEqual(grc(s), rc) + del m + rc -= 2 + await_gc(s, rc) + self.assertEqual(grc(s), rc) + self.assertEqual(rc, 2) + del s + + @skip_pypy + def test_lifecycle2(self): + """Run through a different ref counting cycle with a copy.""" + for i in range(5, 16): # 32, 64,..., 65536 + s = (2**i)*x + rc = 2 + self.assertEqual(grc(s), rc) + m = zmq.Frame(s) + rc += 2 + self.assertEqual(grc(s), rc) + m2 = copy.copy(m) + rc += 1 + self.assertEqual(grc(s), rc) + buf = m.buffer + rc += view_rc + self.assertEqual(grc(s), rc) + self.assertEqual(s, b(str(m))) + self.assertEqual(s, bytes(m2)) + self.assertEqual(s, m2.bytes) + self.assertEqual(s, m.bytes) + # self.assert_(s is str(m)) + # self.assert_(s is str(m2)) + del buf + self.assertEqual(grc(s), rc) + del m + # m.buffer is kept until m is del'd + rc -= view_rc + rc -= 1 + self.assertEqual(grc(s), rc) + del m2 + rc -= 2 + await_gc(s, rc) + self.assertEqual(grc(s), rc) + self.assertEqual(rc, 2) + del s + + @skip_pypy + def test_tracker(self): + m = zmq.Frame(b'asdf', track=True) + self.assertFalse(m.tracker.done) + pm = zmq.MessageTracker(m) + self.assertFalse(pm.done) + del m + for i in range(10): + if pm.done: + break + time.sleep(0.1) + self.assertTrue(pm.done) + + def test_no_tracker(self): + m = zmq.Frame(b'asdf', track=False) + self.assertEqual(m.tracker, None) + m2 = copy.copy(m) + self.assertEqual(m2.tracker, None) + self.assertRaises(ValueError, zmq.MessageTracker, m) + + @skip_pypy + def test_multi_tracker(self): + m = zmq.Frame(b'asdf', track=True) + m2 = zmq.Frame(b'whoda', track=True) + mt = zmq.MessageTracker(m,m2) + self.assertFalse(m.tracker.done) + self.assertFalse(mt.done) + self.assertRaises(zmq.NotDone, mt.wait, 0.1) + del m + time.sleep(0.1) + self.assertRaises(zmq.NotDone, mt.wait, 0.1) + self.assertFalse(mt.done) + del m2 + self.assertTrue(mt.wait() is None) + self.assertTrue(mt.done) + + + def test_buffer_in(self): + """test using a buffer as input""" + ins = b("§§¶•ªº˜µ¬˚…∆˙åß∂©œ∑´†≈ç√") + m = zmq.Frame(view(ins)) + + def test_bad_buffer_in(self): + """test using a bad object""" + self.assertRaises(TypeError, zmq.Frame, 5) + self.assertRaises(TypeError, zmq.Frame, object()) + + def test_buffer_out(self): + """receiving buffered output""" + ins = b("§§¶•ªº˜µ¬˚…∆˙åß∂©œ∑´†≈ç√") + m = zmq.Frame(ins) + outb = m.buffer + self.assertTrue(isinstance(outb, view)) + self.assert_(outb is m.buffer) + self.assert_(m.buffer is m.buffer) + + def test_multisend(self): + """ensure that a message remains intact after multiple sends""" + a,b = self.create_bound_pair(zmq.PAIR, zmq.PAIR) + s = b"message" + m = zmq.Frame(s) + self.assertEqual(s, m.bytes) + + a.send(m, copy=False) + time.sleep(0.1) + self.assertEqual(s, m.bytes) + a.send(m, copy=False) + time.sleep(0.1) + self.assertEqual(s, m.bytes) + a.send(m, copy=True) + time.sleep(0.1) + self.assertEqual(s, m.bytes) + a.send(m, copy=True) + time.sleep(0.1) + self.assertEqual(s, m.bytes) + for i in range(4): + r = b.recv() + self.assertEqual(s,r) + self.assertEqual(s, m.bytes) + + def test_buffer_numpy(self): + """test non-copying numpy array messages""" + try: + import numpy + except ImportError: + raise SkipTest("numpy required") + rand = numpy.random.randint + shapes = [ rand(2,16) for i in range(5) ] + for i in range(1,len(shapes)+1): + shape = shapes[:i] + A = numpy.random.random(shape) + m = zmq.Frame(A) + if view.__name__ == 'buffer': + self.assertEqual(A.data, m.buffer) + B = numpy.frombuffer(m.buffer,dtype=A.dtype).reshape(A.shape) + else: + self.assertEqual(memoryview(A), m.buffer) + B = numpy.array(m.buffer,dtype=A.dtype).reshape(A.shape) + self.assertEqual((A==B).all(), True) + + def test_memoryview(self): + """test messages from memoryview""" + major,minor = sys.version_info[:2] + if not (major >= 3 or (major == 2 and minor >= 7)): + raise SkipTest("memoryviews only in python >= 2.7") + + s = b'carrotjuice' + v = memoryview(s) + m = zmq.Frame(s) + buf = m.buffer + s2 = buf.tobytes() + self.assertEqual(s2,s) + self.assertEqual(m.bytes,s) + + def test_noncopying_recv(self): + """check for clobbering message buffers""" + null = b'\0'*64 + sa,sb = self.create_bound_pair(zmq.PAIR, zmq.PAIR) + for i in range(32): + # try a few times + sb.send(null, copy=False) + m = sa.recv(copy=False) + mb = m.bytes + # buf = view(m) + buf = m.buffer + del m + for i in range(5): + ff=b'\xff'*(40 + i*10) + sb.send(ff, copy=False) + m2 = sa.recv(copy=False) + if view.__name__ == 'buffer': + b = bytes(buf) + else: + b = buf.tobytes() + self.assertEqual(b, null) + self.assertEqual(mb, null) + self.assertEqual(m2.bytes, ff) + + @skip_pypy + def test_buffer_numpy(self): + """test non-copying numpy array messages""" + try: + import numpy + except ImportError: + raise SkipTest("requires numpy") + if sys.version_info < (2,7): + raise SkipTest("requires new-style buffer interface (py >= 2.7)") + rand = numpy.random.randint + shapes = [ rand(2,5) for i in range(5) ] + a,b = self.create_bound_pair(zmq.PAIR, zmq.PAIR) + dtypes = [int, float, '>i4', 'B'] + for i in range(1,len(shapes)+1): + shape = shapes[:i] + for dt in dtypes: + A = numpy.empty(shape, dtype=dt) + while numpy.isnan(A).any(): + # don't let nan sneak in + A = numpy.ndarray(shape, dtype=dt) + a.send(A, copy=False) + msg = b.recv(copy=False) + + B = numpy.frombuffer(msg, A.dtype).reshape(A.shape) + self.assertEqual(A.shape, B.shape) + self.assertTrue((A==B).all()) + A = numpy.empty(shape, dtype=[('a', int), ('b', float), ('c', 'a32')]) + A['a'] = 1024 + A['b'] = 1e9 + A['c'] = 'hello there' + a.send(A, copy=False) + msg = b.recv(copy=False) + + B = numpy.frombuffer(msg, A.dtype).reshape(A.shape) + self.assertEqual(A.shape, B.shape) + self.assertTrue((A==B).all()) + + def test_frame_more(self): + """test Frame.more attribute""" + frame = zmq.Frame(b"hello") + self.assertFalse(frame.more) + sa,sb = self.create_bound_pair(zmq.PAIR, zmq.PAIR) + sa.send_multipart([b'hi', b'there']) + frame = self.recv(sb, copy=False) + self.assertTrue(frame.more) + if zmq.zmq_version_info()[0] >= 3 and not PYPY: + self.assertTrue(frame.get(zmq.MORE)) + frame = self.recv(sb, copy=False) + self.assertFalse(frame.more) + if zmq.zmq_version_info()[0] >= 3 and not PYPY: + self.assertFalse(frame.get(zmq.MORE)) + diff --git a/scripts/external_libs/platform/cel59/32bit/zmq/tests/test_monitor.py b/scripts/external_libs/platform/cel59/32bit/zmq/tests/test_monitor.py new file mode 100644 index 00000000..4f035388 --- /dev/null +++ b/scripts/external_libs/platform/cel59/32bit/zmq/tests/test_monitor.py @@ -0,0 +1,71 @@ +# -*- coding: utf-8 -*- +# Copyright (C) PyZMQ Developers +# Distributed under the terms of the Modified BSD License. + + +import sys +import time +import struct + +from unittest import TestCase + +import zmq +from zmq.tests import BaseZMQTestCase, skip_if, skip_pypy +from zmq.utils.monitor import recv_monitor_message + +skip_lt_4 = skip_if(zmq.zmq_version_info() < (4,), "requires zmq >= 4") + +class TestSocketMonitor(BaseZMQTestCase): + + @skip_lt_4 + def test_monitor(self): + """Test monitoring interface for sockets.""" + s_rep = self.context.socket(zmq.REP) + s_req = self.context.socket(zmq.REQ) + self.sockets.extend([s_rep, s_req]) + s_req.bind("tcp://127.0.0.1:6666") + # try monitoring the REP socket + + s_rep.monitor("inproc://monitor.rep", zmq.EVENT_ALL) + # create listening socket for monitor + s_event = self.context.socket(zmq.PAIR) + self.sockets.append(s_event) + s_event.connect("inproc://monitor.rep") + s_event.linger = 0 + # test receive event for connect event + s_rep.connect("tcp://127.0.0.1:6666") + m = recv_monitor_message(s_event) + if m['event'] == zmq.EVENT_CONNECT_DELAYED: + self.assertEqual(m['endpoint'], b"tcp://127.0.0.1:6666") + # test receive event for connected event + m = recv_monitor_message(s_event) + self.assertEqual(m['event'], zmq.EVENT_CONNECTED) + self.assertEqual(m['endpoint'], b"tcp://127.0.0.1:6666") + + # test monitor can be disabled. + s_rep.disable_monitor() + m = recv_monitor_message(s_event) + self.assertEqual(m['event'], zmq.EVENT_MONITOR_STOPPED) + + + @skip_lt_4 + def test_monitor_connected(self): + """Test connected monitoring socket.""" + s_rep = self.context.socket(zmq.REP) + s_req = self.context.socket(zmq.REQ) + self.sockets.extend([s_rep, s_req]) + s_req.bind("tcp://127.0.0.1:6667") + # try monitoring the REP socket + # create listening socket for monitor + s_event = s_rep.get_monitor_socket() + s_event.linger = 0 + self.sockets.append(s_event) + # test receive event for connect event + s_rep.connect("tcp://127.0.0.1:6667") + m = recv_monitor_message(s_event) + if m['event'] == zmq.EVENT_CONNECT_DELAYED: + self.assertEqual(m['endpoint'], b"tcp://127.0.0.1:6667") + # test receive event for connected event + m = recv_monitor_message(s_event) + self.assertEqual(m['event'], zmq.EVENT_CONNECTED) + self.assertEqual(m['endpoint'], b"tcp://127.0.0.1:6667") diff --git a/scripts/external_libs/platform/cel59/32bit/zmq/tests/test_monqueue.py b/scripts/external_libs/platform/cel59/32bit/zmq/tests/test_monqueue.py new file mode 100644 index 00000000..e855602e --- /dev/null +++ b/scripts/external_libs/platform/cel59/32bit/zmq/tests/test_monqueue.py @@ -0,0 +1,227 @@ +# Copyright (C) PyZMQ Developers +# Distributed under the terms of the Modified BSD License. + +import time +from unittest import TestCase + +import zmq +from zmq import devices + +from zmq.tests import BaseZMQTestCase, SkipTest, PYPY +from zmq.utils.strtypes import unicode + + +if PYPY or zmq.zmq_version_info() >= (4,1): + # cleanup of shared Context doesn't work on PyPy + # there also seems to be a bug in cleanup in libzmq-4.1 (zeromq/libzmq#1052) + devices.Device.context_factory = zmq.Context + + +class TestMonitoredQueue(BaseZMQTestCase): + + sockets = [] + + def build_device(self, mon_sub=b"", in_prefix=b'in', out_prefix=b'out'): + self.device = devices.ThreadMonitoredQueue(zmq.PAIR, zmq.PAIR, zmq.PUB, + in_prefix, out_prefix) + alice = self.context.socket(zmq.PAIR) + bob = self.context.socket(zmq.PAIR) + mon = self.context.socket(zmq.SUB) + + aport = alice.bind_to_random_port('tcp://127.0.0.1') + bport = bob.bind_to_random_port('tcp://127.0.0.1') + mport = mon.bind_to_random_port('tcp://127.0.0.1') + mon.setsockopt(zmq.SUBSCRIBE, mon_sub) + + self.device.connect_in("tcp://127.0.0.1:%i"%aport) + self.device.connect_out("tcp://127.0.0.1:%i"%bport) + self.device.connect_mon("tcp://127.0.0.1:%i"%mport) + self.device.start() + time.sleep(.2) + try: + # this is currenlty necessary to ensure no dropped monitor messages + # see LIBZMQ-248 for more info + mon.recv_multipart(zmq.NOBLOCK) + except zmq.ZMQError: + pass + self.sockets.extend([alice, bob, mon]) + return alice, bob, mon + + + def teardown_device(self): + for socket in self.sockets: + socket.close() + del socket + del self.device + + def test_reply(self): + alice, bob, mon = self.build_device() + alices = b"hello bob".split() + alice.send_multipart(alices) + bobs = self.recv_multipart(bob) + self.assertEqual(alices, bobs) + bobs = b"hello alice".split() + bob.send_multipart(bobs) + alices = self.recv_multipart(alice) + self.assertEqual(alices, bobs) + self.teardown_device() + + def test_queue(self): + alice, bob, mon = self.build_device() + alices = b"hello bob".split() + alice.send_multipart(alices) + alices2 = b"hello again".split() + alice.send_multipart(alices2) + alices3 = b"hello again and again".split() + alice.send_multipart(alices3) + bobs = self.recv_multipart(bob) + self.assertEqual(alices, bobs) + bobs = self.recv_multipart(bob) + self.assertEqual(alices2, bobs) + bobs = self.recv_multipart(bob) + self.assertEqual(alices3, bobs) + bobs = b"hello alice".split() + bob.send_multipart(bobs) + alices = self.recv_multipart(alice) + self.assertEqual(alices, bobs) + self.teardown_device() + + def test_monitor(self): + alice, bob, mon = self.build_device() + alices = b"hello bob".split() + alice.send_multipart(alices) + alices2 = b"hello again".split() + alice.send_multipart(alices2) + alices3 = b"hello again and again".split() + alice.send_multipart(alices3) + bobs = self.recv_multipart(bob) + self.assertEqual(alices, bobs) + mons = self.recv_multipart(mon) + self.assertEqual([b'in']+bobs, mons) + bobs = self.recv_multipart(bob) + self.assertEqual(alices2, bobs) + bobs = self.recv_multipart(bob) + self.assertEqual(alices3, bobs) + mons = self.recv_multipart(mon) + self.assertEqual([b'in']+alices2, mons) + bobs = b"hello alice".split() + bob.send_multipart(bobs) + alices = self.recv_multipart(alice) + self.assertEqual(alices, bobs) + mons = self.recv_multipart(mon) + self.assertEqual([b'in']+alices3, mons) + mons = self.recv_multipart(mon) + self.assertEqual([b'out']+bobs, mons) + self.teardown_device() + + def test_prefix(self): + alice, bob, mon = self.build_device(b"", b'foo', b'bar') + alices = b"hello bob".split() + alice.send_multipart(alices) + alices2 = b"hello again".split() + alice.send_multipart(alices2) + alices3 = b"hello again and again".split() + alice.send_multipart(alices3) + bobs = self.recv_multipart(bob) + self.assertEqual(alices, bobs) + mons = self.recv_multipart(mon) + self.assertEqual([b'foo']+bobs, mons) + bobs = self.recv_multipart(bob) + self.assertEqual(alices2, bobs) + bobs = self.recv_multipart(bob) + self.assertEqual(alices3, bobs) + mons = self.recv_multipart(mon) + self.assertEqual([b'foo']+alices2, mons) + bobs = b"hello alice".split() + bob.send_multipart(bobs) + alices = self.recv_multipart(alice) + self.assertEqual(alices, bobs) + mons = self.recv_multipart(mon) + self.assertEqual([b'foo']+alices3, mons) + mons = self.recv_multipart(mon) + self.assertEqual([b'bar']+bobs, mons) + self.teardown_device() + + def test_monitor_subscribe(self): + alice, bob, mon = self.build_device(b"out") + alices = b"hello bob".split() + alice.send_multipart(alices) + alices2 = b"hello again".split() + alice.send_multipart(alices2) + alices3 = b"hello again and again".split() + alice.send_multipart(alices3) + bobs = self.recv_multipart(bob) + self.assertEqual(alices, bobs) + bobs = self.recv_multipart(bob) + self.assertEqual(alices2, bobs) + bobs = self.recv_multipart(bob) + self.assertEqual(alices3, bobs) + bobs = b"hello alice".split() + bob.send_multipart(bobs) + alices = self.recv_multipart(alice) + self.assertEqual(alices, bobs) + mons = self.recv_multipart(mon) + self.assertEqual([b'out']+bobs, mons) + self.teardown_device() + + def test_router_router(self): + """test router-router MQ devices""" + dev = devices.ThreadMonitoredQueue(zmq.ROUTER, zmq.ROUTER, zmq.PUB, b'in', b'out') + self.device = dev + dev.setsockopt_in(zmq.LINGER, 0) + dev.setsockopt_out(zmq.LINGER, 0) + dev.setsockopt_mon(zmq.LINGER, 0) + + binder = self.context.socket(zmq.DEALER) + porta = binder.bind_to_random_port('tcp://127.0.0.1') + portb = binder.bind_to_random_port('tcp://127.0.0.1') + binder.close() + time.sleep(0.1) + a = self.context.socket(zmq.DEALER) + a.identity = b'a' + b = self.context.socket(zmq.DEALER) + b.identity = b'b' + self.sockets.extend([a, b]) + + a.connect('tcp://127.0.0.1:%i'%porta) + dev.bind_in('tcp://127.0.0.1:%i'%porta) + b.connect('tcp://127.0.0.1:%i'%portb) + dev.bind_out('tcp://127.0.0.1:%i'%portb) + dev.start() + time.sleep(0.2) + if zmq.zmq_version_info() >= (3,1,0): + # flush erroneous poll state, due to LIBZMQ-280 + ping_msg = [ b'ping', b'pong' ] + for s in (a,b): + s.send_multipart(ping_msg) + try: + s.recv(zmq.NOBLOCK) + except zmq.ZMQError: + pass + msg = [ b'hello', b'there' ] + a.send_multipart([b'b']+msg) + bmsg = self.recv_multipart(b) + self.assertEqual(bmsg, [b'a']+msg) + b.send_multipart(bmsg) + amsg = self.recv_multipart(a) + self.assertEqual(amsg, [b'b']+msg) + self.teardown_device() + + def test_default_mq_args(self): + self.device = dev = devices.ThreadMonitoredQueue(zmq.ROUTER, zmq.DEALER, zmq.PUB) + dev.setsockopt_in(zmq.LINGER, 0) + dev.setsockopt_out(zmq.LINGER, 0) + dev.setsockopt_mon(zmq.LINGER, 0) + # this will raise if default args are wrong + dev.start() + self.teardown_device() + + def test_mq_check_prefix(self): + ins = self.context.socket(zmq.ROUTER) + outs = self.context.socket(zmq.DEALER) + mons = self.context.socket(zmq.PUB) + self.sockets.extend([ins, outs, mons]) + + ins = unicode('in') + outs = unicode('out') + self.assertRaises(TypeError, devices.monitoredqueue, ins, outs, mons) diff --git a/scripts/external_libs/platform/cel59/32bit/zmq/tests/test_multipart.py b/scripts/external_libs/platform/cel59/32bit/zmq/tests/test_multipart.py new file mode 100644 index 00000000..24d41be0 --- /dev/null +++ b/scripts/external_libs/platform/cel59/32bit/zmq/tests/test_multipart.py @@ -0,0 +1,35 @@ +# Copyright (C) PyZMQ Developers +# Distributed under the terms of the Modified BSD License. + + +import zmq + + +from zmq.tests import BaseZMQTestCase, SkipTest, have_gevent, GreenTest + + +class TestMultipart(BaseZMQTestCase): + + def test_router_dealer(self): + router, dealer = self.create_bound_pair(zmq.ROUTER, zmq.DEALER) + + msg1 = b'message1' + dealer.send(msg1) + ident = self.recv(router) + more = router.rcvmore + self.assertEqual(more, True) + msg2 = self.recv(router) + self.assertEqual(msg1, msg2) + more = router.rcvmore + self.assertEqual(more, False) + + def test_basic_multipart(self): + a,b = self.create_bound_pair(zmq.PAIR, zmq.PAIR) + msg = [ b'hi', b'there', b'b'] + a.send_multipart(msg) + recvd = b.recv_multipart() + self.assertEqual(msg, recvd) + +if have_gevent: + class TestMultipartGreen(GreenTest, TestMultipart): + pass diff --git a/scripts/external_libs/platform/cel59/32bit/zmq/tests/test_pair.py b/scripts/external_libs/platform/cel59/32bit/zmq/tests/test_pair.py new file mode 100644 index 00000000..e88c1e8b --- /dev/null +++ b/scripts/external_libs/platform/cel59/32bit/zmq/tests/test_pair.py @@ -0,0 +1,53 @@ +# Copyright (C) PyZMQ Developers +# Distributed under the terms of the Modified BSD License. + + +import zmq + + +from zmq.tests import BaseZMQTestCase, have_gevent, GreenTest + + +x = b' ' +class TestPair(BaseZMQTestCase): + + def test_basic(self): + s1, s2 = self.create_bound_pair(zmq.PAIR, zmq.PAIR) + + msg1 = b'message1' + msg2 = self.ping_pong(s1, s2, msg1) + self.assertEqual(msg1, msg2) + + def test_multiple(self): + s1, s2 = self.create_bound_pair(zmq.PAIR, zmq.PAIR) + + for i in range(10): + msg = i*x + s1.send(msg) + + for i in range(10): + msg = i*x + s2.send(msg) + + for i in range(10): + msg = s1.recv() + self.assertEqual(msg, i*x) + + for i in range(10): + msg = s2.recv() + self.assertEqual(msg, i*x) + + def test_json(self): + s1, s2 = self.create_bound_pair(zmq.PAIR, zmq.PAIR) + o = dict(a=10,b=list(range(10))) + o2 = self.ping_pong_json(s1, s2, o) + + def test_pyobj(self): + s1, s2 = self.create_bound_pair(zmq.PAIR, zmq.PAIR) + o = dict(a=10,b=range(10)) + o2 = self.ping_pong_pyobj(s1, s2, o) + +if have_gevent: + class TestReqRepGreen(GreenTest, TestPair): + pass + diff --git a/scripts/external_libs/platform/cel59/32bit/zmq/tests/test_poll.py b/scripts/external_libs/platform/cel59/32bit/zmq/tests/test_poll.py new file mode 100644 index 00000000..57346c89 --- /dev/null +++ b/scripts/external_libs/platform/cel59/32bit/zmq/tests/test_poll.py @@ -0,0 +1,229 @@ +# Copyright (C) PyZMQ Developers +# Distributed under the terms of the Modified BSD License. + + +import time +from unittest import TestCase + +import zmq + +from zmq.tests import PollZMQTestCase, have_gevent, GreenTest + +def wait(): + time.sleep(.25) + + +class TestPoll(PollZMQTestCase): + + Poller = zmq.Poller + + # This test is failing due to this issue: + # http://github.com/sustrik/zeromq2/issues#issue/26 + def test_pair(self): + s1, s2 = self.create_bound_pair(zmq.PAIR, zmq.PAIR) + + # Sleep to allow sockets to connect. + wait() + + poller = self.Poller() + poller.register(s1, zmq.POLLIN|zmq.POLLOUT) + poller.register(s2, zmq.POLLIN|zmq.POLLOUT) + # Poll result should contain both sockets + socks = dict(poller.poll()) + # Now make sure that both are send ready. + self.assertEqual(socks[s1], zmq.POLLOUT) + self.assertEqual(socks[s2], zmq.POLLOUT) + # Now do a send on both, wait and test for zmq.POLLOUT|zmq.POLLIN + s1.send(b'msg1') + s2.send(b'msg2') + wait() + socks = dict(poller.poll()) + self.assertEqual(socks[s1], zmq.POLLOUT|zmq.POLLIN) + self.assertEqual(socks[s2], zmq.POLLOUT|zmq.POLLIN) + # Make sure that both are in POLLOUT after recv. + s1.recv() + s2.recv() + socks = dict(poller.poll()) + self.assertEqual(socks[s1], zmq.POLLOUT) + self.assertEqual(socks[s2], zmq.POLLOUT) + + poller.unregister(s1) + poller.unregister(s2) + + # Wait for everything to finish. + wait() + + def test_reqrep(self): + s1, s2 = self.create_bound_pair(zmq.REP, zmq.REQ) + + # Sleep to allow sockets to connect. + wait() + + poller = self.Poller() + poller.register(s1, zmq.POLLIN|zmq.POLLOUT) + poller.register(s2, zmq.POLLIN|zmq.POLLOUT) + + # Make sure that s1 is in state 0 and s2 is in POLLOUT + socks = dict(poller.poll()) + self.assertEqual(s1 in socks, 0) + self.assertEqual(socks[s2], zmq.POLLOUT) + + # Make sure that s2 goes immediately into state 0 after send. + s2.send(b'msg1') + socks = dict(poller.poll()) + self.assertEqual(s2 in socks, 0) + + # Make sure that s1 goes into POLLIN state after a time.sleep(). + time.sleep(0.5) + socks = dict(poller.poll()) + self.assertEqual(socks[s1], zmq.POLLIN) + + # Make sure that s1 goes into POLLOUT after recv. + s1.recv() + socks = dict(poller.poll()) + self.assertEqual(socks[s1], zmq.POLLOUT) + + # Make sure s1 goes into state 0 after send. + s1.send(b'msg2') + socks = dict(poller.poll()) + self.assertEqual(s1 in socks, 0) + + # Wait and then see that s2 is in POLLIN. + time.sleep(0.5) + socks = dict(poller.poll()) + self.assertEqual(socks[s2], zmq.POLLIN) + + # Make sure that s2 is in POLLOUT after recv. + s2.recv() + socks = dict(poller.poll()) + self.assertEqual(socks[s2], zmq.POLLOUT) + + poller.unregister(s1) + poller.unregister(s2) + + # Wait for everything to finish. + wait() + + def test_no_events(self): + s1, s2 = self.create_bound_pair(zmq.PAIR, zmq.PAIR) + poller = self.Poller() + poller.register(s1, zmq.POLLIN|zmq.POLLOUT) + poller.register(s2, 0) + self.assertTrue(s1 in poller) + self.assertFalse(s2 in poller) + poller.register(s1, 0) + self.assertFalse(s1 in poller) + + def test_pubsub(self): + s1, s2 = self.create_bound_pair(zmq.PUB, zmq.SUB) + s2.setsockopt(zmq.SUBSCRIBE, b'') + + # Sleep to allow sockets to connect. + wait() + + poller = self.Poller() + poller.register(s1, zmq.POLLIN|zmq.POLLOUT) + poller.register(s2, zmq.POLLIN) + + # Now make sure that both are send ready. + socks = dict(poller.poll()) + self.assertEqual(socks[s1], zmq.POLLOUT) + self.assertEqual(s2 in socks, 0) + # Make sure that s1 stays in POLLOUT after a send. + s1.send(b'msg1') + socks = dict(poller.poll()) + self.assertEqual(socks[s1], zmq.POLLOUT) + + # Make sure that s2 is POLLIN after waiting. + wait() + socks = dict(poller.poll()) + self.assertEqual(socks[s2], zmq.POLLIN) + + # Make sure that s2 goes into 0 after recv. + s2.recv() + socks = dict(poller.poll()) + self.assertEqual(s2 in socks, 0) + + poller.unregister(s1) + poller.unregister(s2) + + # Wait for everything to finish. + wait() + def test_timeout(self): + """make sure Poller.poll timeout has the right units (milliseconds).""" + s1, s2 = self.create_bound_pair(zmq.PAIR, zmq.PAIR) + poller = self.Poller() + poller.register(s1, zmq.POLLIN) + tic = time.time() + evt = poller.poll(.005) + toc = time.time() + self.assertTrue(toc-tic < 0.1) + tic = time.time() + evt = poller.poll(5) + toc = time.time() + self.assertTrue(toc-tic < 0.1) + self.assertTrue(toc-tic > .001) + tic = time.time() + evt = poller.poll(500) + toc = time.time() + self.assertTrue(toc-tic < 1) + self.assertTrue(toc-tic > 0.1) + +class TestSelect(PollZMQTestCase): + + def test_pair(self): + s1, s2 = self.create_bound_pair(zmq.PAIR, zmq.PAIR) + + # Sleep to allow sockets to connect. + wait() + + rlist, wlist, xlist = zmq.select([s1, s2], [s1, s2], [s1, s2]) + self.assert_(s1 in wlist) + self.assert_(s2 in wlist) + self.assert_(s1 not in rlist) + self.assert_(s2 not in rlist) + + def test_timeout(self): + """make sure select timeout has the right units (seconds).""" + s1, s2 = self.create_bound_pair(zmq.PAIR, zmq.PAIR) + tic = time.time() + r,w,x = zmq.select([s1,s2],[],[],.005) + toc = time.time() + self.assertTrue(toc-tic < 1) + self.assertTrue(toc-tic > 0.001) + tic = time.time() + r,w,x = zmq.select([s1,s2],[],[],.25) + toc = time.time() + self.assertTrue(toc-tic < 1) + self.assertTrue(toc-tic > 0.1) + + +if have_gevent: + import gevent + from zmq import green as gzmq + + class TestPollGreen(GreenTest, TestPoll): + Poller = gzmq.Poller + + def test_wakeup(self): + s1, s2 = self.create_bound_pair(zmq.PAIR, zmq.PAIR) + poller = self.Poller() + poller.register(s2, zmq.POLLIN) + + tic = time.time() + r = gevent.spawn(lambda: poller.poll(10000)) + s = gevent.spawn(lambda: s1.send(b'msg1')) + r.join() + toc = time.time() + self.assertTrue(toc-tic < 1) + + def test_socket_poll(self): + s1, s2 = self.create_bound_pair(zmq.PAIR, zmq.PAIR) + + tic = time.time() + r = gevent.spawn(lambda: s2.poll(10000)) + s = gevent.spawn(lambda: s1.send(b'msg1')) + r.join() + toc = time.time() + self.assertTrue(toc-tic < 1) + diff --git a/scripts/external_libs/platform/cel59/32bit/zmq/tests/test_pubsub.py b/scripts/external_libs/platform/cel59/32bit/zmq/tests/test_pubsub.py new file mode 100644 index 00000000..a3ee22aa --- /dev/null +++ b/scripts/external_libs/platform/cel59/32bit/zmq/tests/test_pubsub.py @@ -0,0 +1,41 @@ +# Copyright (C) PyZMQ Developers +# Distributed under the terms of the Modified BSD License. + + +import time +from unittest import TestCase + +import zmq + +from zmq.tests import BaseZMQTestCase, have_gevent, GreenTest + + +class TestPubSub(BaseZMQTestCase): + + pass + + # We are disabling this test while an issue is being resolved. + def test_basic(self): + s1, s2 = self.create_bound_pair(zmq.PUB, zmq.SUB) + s2.setsockopt(zmq.SUBSCRIBE,b'') + time.sleep(0.1) + msg1 = b'message' + s1.send(msg1) + msg2 = s2.recv() # This is blocking! + self.assertEqual(msg1, msg2) + + def test_topic(self): + s1, s2 = self.create_bound_pair(zmq.PUB, zmq.SUB) + s2.setsockopt(zmq.SUBSCRIBE, b'x') + time.sleep(0.1) + msg1 = b'message' + s1.send(msg1) + self.assertRaisesErrno(zmq.EAGAIN, s2.recv, zmq.NOBLOCK) + msg1 = b'xmessage' + s1.send(msg1) + msg2 = s2.recv() + self.assertEqual(msg1, msg2) + +if have_gevent: + class TestPubSubGreen(GreenTest, TestPubSub): + pass diff --git a/scripts/external_libs/platform/cel59/32bit/zmq/tests/test_reqrep.py b/scripts/external_libs/platform/cel59/32bit/zmq/tests/test_reqrep.py new file mode 100644 index 00000000..de17f2b3 --- /dev/null +++ b/scripts/external_libs/platform/cel59/32bit/zmq/tests/test_reqrep.py @@ -0,0 +1,62 @@ +# Copyright (C) PyZMQ Developers +# Distributed under the terms of the Modified BSD License. + + +from unittest import TestCase + +import zmq +from zmq.tests import BaseZMQTestCase, have_gevent, GreenTest + + +class TestReqRep(BaseZMQTestCase): + + def test_basic(self): + s1, s2 = self.create_bound_pair(zmq.REQ, zmq.REP) + + msg1 = b'message 1' + msg2 = self.ping_pong(s1, s2, msg1) + self.assertEqual(msg1, msg2) + + def test_multiple(self): + s1, s2 = self.create_bound_pair(zmq.REQ, zmq.REP) + + for i in range(10): + msg1 = i*b' ' + msg2 = self.ping_pong(s1, s2, msg1) + self.assertEqual(msg1, msg2) + + def test_bad_send_recv(self): + s1, s2 = self.create_bound_pair(zmq.REQ, zmq.REP) + + if zmq.zmq_version() != '2.1.8': + # this doesn't work on 2.1.8 + for copy in (True,False): + self.assertRaisesErrno(zmq.EFSM, s1.recv, copy=copy) + self.assertRaisesErrno(zmq.EFSM, s2.send, b'asdf', copy=copy) + + # I have to have this or we die on an Abort trap. + msg1 = b'asdf' + msg2 = self.ping_pong(s1, s2, msg1) + self.assertEqual(msg1, msg2) + + def test_json(self): + s1, s2 = self.create_bound_pair(zmq.REQ, zmq.REP) + o = dict(a=10,b=list(range(10))) + o2 = self.ping_pong_json(s1, s2, o) + + def test_pyobj(self): + s1, s2 = self.create_bound_pair(zmq.REQ, zmq.REP) + o = dict(a=10,b=range(10)) + o2 = self.ping_pong_pyobj(s1, s2, o) + + def test_large_msg(self): + s1, s2 = self.create_bound_pair(zmq.REQ, zmq.REP) + msg1 = 10000*b'X' + + for i in range(10): + msg2 = self.ping_pong(s1, s2, msg1) + self.assertEqual(msg1, msg2) + +if have_gevent: + class TestReqRepGreen(GreenTest, TestReqRep): + pass diff --git a/scripts/external_libs/platform/cel59/32bit/zmq/tests/test_security.py b/scripts/external_libs/platform/cel59/32bit/zmq/tests/test_security.py new file mode 100644 index 00000000..687b7e0f --- /dev/null +++ b/scripts/external_libs/platform/cel59/32bit/zmq/tests/test_security.py @@ -0,0 +1,212 @@ +"""Test libzmq security (libzmq >= 3.3.0)""" +# -*- coding: utf8 -*- + +# Copyright (C) PyZMQ Developers +# Distributed under the terms of the Modified BSD License. + +import os +from threading import Thread + +import zmq +from zmq.tests import ( + BaseZMQTestCase, SkipTest, PYPY +) +from zmq.utils import z85 + + +USER = b"admin" +PASS = b"password" + +class TestSecurity(BaseZMQTestCase): + + def setUp(self): + if zmq.zmq_version_info() < (4,0): + raise SkipTest("security is new in libzmq 4.0") + try: + zmq.curve_keypair() + except zmq.ZMQError: + raise SkipTest("security requires libzmq to be linked against libsodium") + super(TestSecurity, self).setUp() + + + def zap_handler(self): + socket = self.context.socket(zmq.REP) + socket.bind("inproc://zeromq.zap.01") + try: + msg = self.recv_multipart(socket) + + version, sequence, domain, address, identity, mechanism = msg[:6] + if mechanism == b'PLAIN': + username, password = msg[6:] + elif mechanism == b'CURVE': + key = msg[6] + + self.assertEqual(version, b"1.0") + self.assertEqual(identity, b"IDENT") + reply = [version, sequence] + if mechanism == b'CURVE' or \ + (mechanism == b'PLAIN' and username == USER and password == PASS) or \ + (mechanism == b'NULL'): + reply.extend([ + b"200", + b"OK", + b"anonymous", + b"\5Hello\0\0\0\5World", + ]) + else: + reply.extend([ + b"400", + b"Invalid username or password", + b"", + b"", + ]) + socket.send_multipart(reply) + finally: + socket.close() + + def start_zap(self): + self.zap_thread = Thread(target=self.zap_handler) + self.zap_thread.start() + + def stop_zap(self): + self.zap_thread.join() + + def bounce(self, server, client, test_metadata=True): + msg = [os.urandom(64), os.urandom(64)] + client.send_multipart(msg) + frames = self.recv_multipart(server, copy=False) + recvd = list(map(lambda x: x.bytes, frames)) + + try: + if test_metadata and not PYPY: + for frame in frames: + self.assertEqual(frame.get('User-Id'), 'anonymous') + self.assertEqual(frame.get('Hello'), 'World') + self.assertEqual(frame['Socket-Type'], 'DEALER') + except zmq.ZMQVersionError: + pass + + self.assertEqual(recvd, msg) + server.send_multipart(recvd) + msg2 = self.recv_multipart(client) + self.assertEqual(msg2, msg) + + def test_null(self): + """test NULL (default) security""" + server = self.socket(zmq.DEALER) + client = self.socket(zmq.DEALER) + self.assertEqual(client.MECHANISM, zmq.NULL) + self.assertEqual(server.mechanism, zmq.NULL) + self.assertEqual(client.plain_server, 0) + self.assertEqual(server.plain_server, 0) + iface = 'tcp://127.0.0.1' + port = server.bind_to_random_port(iface) + client.connect("%s:%i" % (iface, port)) + self.bounce(server, client, False) + + def test_plain(self): + """test PLAIN authentication""" + server = self.socket(zmq.DEALER) + server.identity = b'IDENT' + client = self.socket(zmq.DEALER) + self.assertEqual(client.plain_username, b'') + self.assertEqual(client.plain_password, b'') + client.plain_username = USER + client.plain_password = PASS + self.assertEqual(client.getsockopt(zmq.PLAIN_USERNAME), USER) + self.assertEqual(client.getsockopt(zmq.PLAIN_PASSWORD), PASS) + self.assertEqual(client.plain_server, 0) + self.assertEqual(server.plain_server, 0) + server.plain_server = True + self.assertEqual(server.mechanism, zmq.PLAIN) + self.assertEqual(client.mechanism, zmq.PLAIN) + + assert not client.plain_server + assert server.plain_server + + self.start_zap() + + iface = 'tcp://127.0.0.1' + port = server.bind_to_random_port(iface) + client.connect("%s:%i" % (iface, port)) + self.bounce(server, client) + self.stop_zap() + + def skip_plain_inauth(self): + """test PLAIN failed authentication""" + server = self.socket(zmq.DEALER) + server.identity = b'IDENT' + client = self.socket(zmq.DEALER) + self.sockets.extend([server, client]) + client.plain_username = USER + client.plain_password = b'incorrect' + server.plain_server = True + self.assertEqual(server.mechanism, zmq.PLAIN) + self.assertEqual(client.mechanism, zmq.PLAIN) + + self.start_zap() + + iface = 'tcp://127.0.0.1' + port = server.bind_to_random_port(iface) + client.connect("%s:%i" % (iface, port)) + client.send(b'ping') + server.rcvtimeo = 250 + self.assertRaisesErrno(zmq.EAGAIN, server.recv) + self.stop_zap() + + def test_keypair(self): + """test curve_keypair""" + try: + public, secret = zmq.curve_keypair() + except zmq.ZMQError: + raise SkipTest("CURVE unsupported") + + self.assertEqual(type(secret), bytes) + self.assertEqual(type(public), bytes) + self.assertEqual(len(secret), 40) + self.assertEqual(len(public), 40) + + # verify that it is indeed Z85 + bsecret, bpublic = [ z85.decode(key) for key in (public, secret) ] + self.assertEqual(type(bsecret), bytes) + self.assertEqual(type(bpublic), bytes) + self.assertEqual(len(bsecret), 32) + self.assertEqual(len(bpublic), 32) + + + def test_curve(self): + """test CURVE encryption""" + server = self.socket(zmq.DEALER) + server.identity = b'IDENT' + client = self.socket(zmq.DEALER) + self.sockets.extend([server, client]) + try: + server.curve_server = True + except zmq.ZMQError as e: + # will raise EINVAL if not linked against libsodium + if e.errno == zmq.EINVAL: + raise SkipTest("CURVE unsupported") + + server_public, server_secret = zmq.curve_keypair() + client_public, client_secret = zmq.curve_keypair() + + server.curve_secretkey = server_secret + server.curve_publickey = server_public + client.curve_serverkey = server_public + client.curve_publickey = client_public + client.curve_secretkey = client_secret + + self.assertEqual(server.mechanism, zmq.CURVE) + self.assertEqual(client.mechanism, zmq.CURVE) + + self.assertEqual(server.get(zmq.CURVE_SERVER), True) + self.assertEqual(client.get(zmq.CURVE_SERVER), False) + + self.start_zap() + + iface = 'tcp://127.0.0.1' + port = server.bind_to_random_port(iface) + client.connect("%s:%i" % (iface, port)) + self.bounce(server, client) + self.stop_zap() + diff --git a/scripts/external_libs/platform/cel59/32bit/zmq/tests/test_socket.py b/scripts/external_libs/platform/cel59/32bit/zmq/tests/test_socket.py new file mode 100644 index 00000000..5c842edc --- /dev/null +++ b/scripts/external_libs/platform/cel59/32bit/zmq/tests/test_socket.py @@ -0,0 +1,450 @@ +# -*- coding: utf8 -*- +# Copyright (C) PyZMQ Developers +# Distributed under the terms of the Modified BSD License. + +import time +import warnings + +import zmq +from zmq.tests import ( + BaseZMQTestCase, SkipTest, have_gevent, GreenTest, skip_pypy, skip_if +) +from zmq.utils.strtypes import bytes, unicode + + +class TestSocket(BaseZMQTestCase): + + def test_create(self): + ctx = self.Context() + s = ctx.socket(zmq.PUB) + # Superluminal protocol not yet implemented + self.assertRaisesErrno(zmq.EPROTONOSUPPORT, s.bind, 'ftl://a') + self.assertRaisesErrno(zmq.EPROTONOSUPPORT, s.connect, 'ftl://a') + self.assertRaisesErrno(zmq.EINVAL, s.bind, 'tcp://') + s.close() + del ctx + + def test_context_manager(self): + url = 'inproc://a' + with self.Context() as ctx: + with ctx.socket(zmq.PUSH) as a: + a.bind(url) + with ctx.socket(zmq.PULL) as b: + b.connect(url) + msg = b'hi' + a.send(msg) + rcvd = self.recv(b) + self.assertEqual(rcvd, msg) + self.assertEqual(b.closed, True) + self.assertEqual(a.closed, True) + self.assertEqual(ctx.closed, True) + + def test_dir(self): + ctx = self.Context() + s = ctx.socket(zmq.PUB) + self.assertTrue('send' in dir(s)) + self.assertTrue('IDENTITY' in dir(s)) + self.assertTrue('AFFINITY' in dir(s)) + self.assertTrue('FD' in dir(s)) + s.close() + ctx.term() + + def test_bind_unicode(self): + s = self.socket(zmq.PUB) + p = s.bind_to_random_port(unicode("tcp://*")) + + def test_connect_unicode(self): + s = self.socket(zmq.PUB) + s.connect(unicode("tcp://127.0.0.1:5555")) + + def test_bind_to_random_port(self): + # Check that bind_to_random_port do not hide usefull exception + ctx = self.Context() + c = ctx.socket(zmq.PUB) + # Invalid format + try: + c.bind_to_random_port('tcp:*') + except zmq.ZMQError as e: + self.assertEqual(e.errno, zmq.EINVAL) + # Invalid protocol + try: + c.bind_to_random_port('rand://*') + except zmq.ZMQError as e: + self.assertEqual(e.errno, zmq.EPROTONOSUPPORT) + + def test_identity(self): + s = self.context.socket(zmq.PULL) + self.sockets.append(s) + ident = b'identity\0\0' + s.identity = ident + self.assertEqual(s.get(zmq.IDENTITY), ident) + + def test_unicode_sockopts(self): + """test setting/getting sockopts with unicode strings""" + topic = "tést" + if str is not unicode: + topic = topic.decode('utf8') + p,s = self.create_bound_pair(zmq.PUB, zmq.SUB) + self.assertEqual(s.send_unicode, s.send_unicode) + self.assertEqual(p.recv_unicode, p.recv_unicode) + self.assertRaises(TypeError, s.setsockopt, zmq.SUBSCRIBE, topic) + self.assertRaises(TypeError, s.setsockopt, zmq.IDENTITY, topic) + s.setsockopt_unicode(zmq.IDENTITY, topic, 'utf16') + self.assertRaises(TypeError, s.setsockopt, zmq.AFFINITY, topic) + s.setsockopt_unicode(zmq.SUBSCRIBE, topic) + self.assertRaises(TypeError, s.getsockopt_unicode, zmq.AFFINITY) + self.assertRaisesErrno(zmq.EINVAL, s.getsockopt_unicode, zmq.SUBSCRIBE) + + identb = s.getsockopt(zmq.IDENTITY) + identu = identb.decode('utf16') + identu2 = s.getsockopt_unicode(zmq.IDENTITY, 'utf16') + self.assertEqual(identu, identu2) + time.sleep(0.1) # wait for connection/subscription + p.send_unicode(topic,zmq.SNDMORE) + p.send_unicode(topic*2, encoding='latin-1') + self.assertEqual(topic, s.recv_unicode()) + self.assertEqual(topic*2, s.recv_unicode(encoding='latin-1')) + + def test_int_sockopts(self): + "test integer sockopts" + v = zmq.zmq_version_info() + if v < (3,0): + default_hwm = 0 + else: + default_hwm = 1000 + p,s = self.create_bound_pair(zmq.PUB, zmq.SUB) + p.setsockopt(zmq.LINGER, 0) + self.assertEqual(p.getsockopt(zmq.LINGER), 0) + p.setsockopt(zmq.LINGER, -1) + self.assertEqual(p.getsockopt(zmq.LINGER), -1) + self.assertEqual(p.hwm, default_hwm) + p.hwm = 11 + self.assertEqual(p.hwm, 11) + # p.setsockopt(zmq.EVENTS, zmq.POLLIN) + self.assertEqual(p.getsockopt(zmq.EVENTS), zmq.POLLOUT) + self.assertRaisesErrno(zmq.EINVAL, p.setsockopt,zmq.EVENTS, 2**7-1) + self.assertEqual(p.getsockopt(zmq.TYPE), p.socket_type) + self.assertEqual(p.getsockopt(zmq.TYPE), zmq.PUB) + self.assertEqual(s.getsockopt(zmq.TYPE), s.socket_type) + self.assertEqual(s.getsockopt(zmq.TYPE), zmq.SUB) + + # check for overflow / wrong type: + errors = [] + backref = {} + constants = zmq.constants + for name in constants.__all__: + value = getattr(constants, name) + if isinstance(value, int): + backref[value] = name + for opt in zmq.constants.int_sockopts.union(zmq.constants.int64_sockopts): + sopt = backref[opt] + if sopt.startswith(( + 'ROUTER', 'XPUB', 'TCP', 'FAIL', + 'REQ_', 'CURVE_', 'PROBE_ROUTER', + 'IPC_FILTER', 'GSSAPI', + )): + # some sockopts are write-only + continue + try: + n = p.getsockopt(opt) + except zmq.ZMQError as e: + errors.append("getsockopt(zmq.%s) raised '%s'."%(sopt, e)) + else: + if n > 2**31: + errors.append("getsockopt(zmq.%s) returned a ridiculous value." + " It is probably the wrong type."%sopt) + if errors: + self.fail('\n'.join([''] + errors)) + + def test_bad_sockopts(self): + """Test that appropriate errors are raised on bad socket options""" + s = self.context.socket(zmq.PUB) + self.sockets.append(s) + s.setsockopt(zmq.LINGER, 0) + # unrecognized int sockopts pass through to libzmq, and should raise EINVAL + self.assertRaisesErrno(zmq.EINVAL, s.setsockopt, 9999, 5) + self.assertRaisesErrno(zmq.EINVAL, s.getsockopt, 9999) + # but only int sockopts are allowed through this way, otherwise raise a TypeError + self.assertRaises(TypeError, s.setsockopt, 9999, b"5") + # some sockopts are valid in general, but not on every socket: + self.assertRaisesErrno(zmq.EINVAL, s.setsockopt, zmq.SUBSCRIBE, b'hi') + + def test_sockopt_roundtrip(self): + "test set/getsockopt roundtrip." + p = self.context.socket(zmq.PUB) + self.sockets.append(p) + p.setsockopt(zmq.LINGER, 11) + self.assertEqual(p.getsockopt(zmq.LINGER), 11) + + def test_send_unicode(self): + "test sending unicode objects" + a,b = self.create_bound_pair(zmq.PAIR, zmq.PAIR) + self.sockets.extend([a,b]) + u = "çπ§" + if str is not unicode: + u = u.decode('utf8') + self.assertRaises(TypeError, a.send, u,copy=False) + self.assertRaises(TypeError, a.send, u,copy=True) + a.send_unicode(u) + s = b.recv() + self.assertEqual(s,u.encode('utf8')) + self.assertEqual(s.decode('utf8'),u) + a.send_unicode(u,encoding='utf16') + s = b.recv_unicode(encoding='utf16') + self.assertEqual(s,u) + + @skip_pypy + def test_tracker(self): + "test the MessageTracker object for tracking when zmq is done with a buffer" + addr = 'tcp://127.0.0.1' + a = self.context.socket(zmq.PUB) + port = a.bind_to_random_port(addr) + a.close() + iface = "%s:%i"%(addr,port) + a = self.context.socket(zmq.PAIR) + # a.setsockopt(zmq.IDENTITY, b"a") + b = self.context.socket(zmq.PAIR) + self.sockets.extend([a,b]) + a.connect(iface) + time.sleep(0.1) + p1 = a.send(b'something', copy=False, track=True) + self.assertTrue(isinstance(p1, zmq.MessageTracker)) + self.assertFalse(p1.done) + p2 = a.send_multipart([b'something', b'else'], copy=False, track=True) + self.assert_(isinstance(p2, zmq.MessageTracker)) + self.assertEqual(p2.done, False) + self.assertEqual(p1.done, False) + + b.bind(iface) + msg = b.recv_multipart() + for i in range(10): + if p1.done: + break + time.sleep(0.1) + self.assertEqual(p1.done, True) + self.assertEqual(msg, [b'something']) + msg = b.recv_multipart() + for i in range(10): + if p2.done: + break + time.sleep(0.1) + self.assertEqual(p2.done, True) + self.assertEqual(msg, [b'something', b'else']) + m = zmq.Frame(b"again", track=True) + self.assertEqual(m.tracker.done, False) + p1 = a.send(m, copy=False) + p2 = a.send(m, copy=False) + self.assertEqual(m.tracker.done, False) + self.assertEqual(p1.done, False) + self.assertEqual(p2.done, False) + msg = b.recv_multipart() + self.assertEqual(m.tracker.done, False) + self.assertEqual(msg, [b'again']) + msg = b.recv_multipart() + self.assertEqual(m.tracker.done, False) + self.assertEqual(msg, [b'again']) + self.assertEqual(p1.done, False) + self.assertEqual(p2.done, False) + pm = m.tracker + del m + for i in range(10): + if p1.done: + break + time.sleep(0.1) + self.assertEqual(p1.done, True) + self.assertEqual(p2.done, True) + m = zmq.Frame(b'something', track=False) + self.assertRaises(ValueError, a.send, m, copy=False, track=True) + + + def test_close(self): + ctx = self.Context() + s = ctx.socket(zmq.PUB) + s.close() + self.assertRaisesErrno(zmq.ENOTSOCK, s.bind, b'') + self.assertRaisesErrno(zmq.ENOTSOCK, s.connect, b'') + self.assertRaisesErrno(zmq.ENOTSOCK, s.setsockopt, zmq.SUBSCRIBE, b'') + self.assertRaisesErrno(zmq.ENOTSOCK, s.send, b'asdf') + self.assertRaisesErrno(zmq.ENOTSOCK, s.recv) + del ctx + + def test_attr(self): + """set setting/getting sockopts as attributes""" + s = self.context.socket(zmq.DEALER) + self.sockets.append(s) + linger = 10 + s.linger = linger + self.assertEqual(linger, s.linger) + self.assertEqual(linger, s.getsockopt(zmq.LINGER)) + self.assertEqual(s.fd, s.getsockopt(zmq.FD)) + + def test_bad_attr(self): + s = self.context.socket(zmq.DEALER) + self.sockets.append(s) + try: + s.apple='foo' + except AttributeError: + pass + else: + self.fail("bad setattr should have raised AttributeError") + try: + s.apple + except AttributeError: + pass + else: + self.fail("bad getattr should have raised AttributeError") + + def test_subclass(self): + """subclasses can assign attributes""" + class S(zmq.Socket): + a = None + def __init__(self, *a, **kw): + self.a=-1 + super(S, self).__init__(*a, **kw) + + s = S(self.context, zmq.REP) + self.sockets.append(s) + self.assertEqual(s.a, -1) + s.a=1 + self.assertEqual(s.a, 1) + a=s.a + self.assertEqual(a, 1) + + def test_recv_multipart(self): + a,b = self.create_bound_pair() + msg = b'hi' + for i in range(3): + a.send(msg) + time.sleep(0.1) + for i in range(3): + self.assertEqual(b.recv_multipart(), [msg]) + + def test_close_after_destroy(self): + """s.close() after ctx.destroy() should be fine""" + ctx = self.Context() + s = ctx.socket(zmq.REP) + ctx.destroy() + # reaper is not instantaneous + time.sleep(1e-2) + s.close() + self.assertTrue(s.closed) + + def test_poll(self): + a,b = self.create_bound_pair() + tic = time.time() + evt = a.poll(50) + self.assertEqual(evt, 0) + evt = a.poll(50, zmq.POLLOUT) + self.assertEqual(evt, zmq.POLLOUT) + msg = b'hi' + a.send(msg) + evt = b.poll(50) + self.assertEqual(evt, zmq.POLLIN) + msg2 = self.recv(b) + evt = b.poll(50) + self.assertEqual(evt, 0) + self.assertEqual(msg2, msg) + + def test_ipc_path_max_length(self): + """IPC_PATH_MAX_LEN is a sensible value""" + if zmq.IPC_PATH_MAX_LEN == 0: + raise SkipTest("IPC_PATH_MAX_LEN undefined") + + msg = "Surprising value for IPC_PATH_MAX_LEN: %s" % zmq.IPC_PATH_MAX_LEN + self.assertTrue(zmq.IPC_PATH_MAX_LEN > 30, msg) + self.assertTrue(zmq.IPC_PATH_MAX_LEN < 1025, msg) + + def test_ipc_path_max_length_msg(self): + if zmq.IPC_PATH_MAX_LEN == 0: + raise SkipTest("IPC_PATH_MAX_LEN undefined") + + s = self.context.socket(zmq.PUB) + self.sockets.append(s) + try: + s.bind('ipc://{0}'.format('a' * (zmq.IPC_PATH_MAX_LEN + 1))) + except zmq.ZMQError as e: + self.assertTrue(str(zmq.IPC_PATH_MAX_LEN) in e.strerror) + + def test_hwm(self): + zmq3 = zmq.zmq_version_info()[0] >= 3 + for stype in (zmq.PUB, zmq.ROUTER, zmq.SUB, zmq.REQ, zmq.DEALER): + s = self.context.socket(stype) + s.hwm = 100 + self.assertEqual(s.hwm, 100) + if zmq3: + try: + self.assertEqual(s.sndhwm, 100) + except AttributeError: + pass + try: + self.assertEqual(s.rcvhwm, 100) + except AttributeError: + pass + s.close() + + def test_shadow(self): + p = self.socket(zmq.PUSH) + p.bind("tcp://127.0.0.1:5555") + p2 = zmq.Socket.shadow(p.underlying) + self.assertEqual(p.underlying, p2.underlying) + s = self.socket(zmq.PULL) + s2 = zmq.Socket.shadow(s.underlying) + self.assertNotEqual(s.underlying, p.underlying) + self.assertEqual(s.underlying, s2.underlying) + s2.connect("tcp://127.0.0.1:5555") + sent = b'hi' + p2.send(sent) + rcvd = self.recv(s2) + self.assertEqual(rcvd, sent) + + def test_shadow_pyczmq(self): + try: + from pyczmq import zctx, zsocket + except Exception: + raise SkipTest("Requires pyczmq") + + ctx = zctx.new() + ca = zsocket.new(ctx, zmq.PUSH) + cb = zsocket.new(ctx, zmq.PULL) + a = zmq.Socket.shadow(ca) + b = zmq.Socket.shadow(cb) + a.bind("inproc://a") + b.connect("inproc://a") + a.send(b'hi') + rcvd = self.recv(b) + self.assertEqual(rcvd, b'hi') + + +if have_gevent: + import gevent + + class TestSocketGreen(GreenTest, TestSocket): + test_bad_attr = GreenTest.skip_green + test_close_after_destroy = GreenTest.skip_green + + def test_timeout(self): + a,b = self.create_bound_pair() + g = gevent.spawn_later(0.5, lambda: a.send(b'hi')) + timeout = gevent.Timeout(0.1) + timeout.start() + self.assertRaises(gevent.Timeout, b.recv) + g.kill() + + @skip_if(not hasattr(zmq, 'RCVTIMEO')) + def test_warn_set_timeo(self): + s = self.context.socket(zmq.REQ) + with warnings.catch_warnings(record=True) as w: + s.rcvtimeo = 5 + s.close() + self.assertEqual(len(w), 1) + self.assertEqual(w[0].category, UserWarning) + + + @skip_if(not hasattr(zmq, 'SNDTIMEO')) + def test_warn_get_timeo(self): + s = self.context.socket(zmq.REQ) + with warnings.catch_warnings(record=True) as w: + s.sndtimeo + s.close() + self.assertEqual(len(w), 1) + self.assertEqual(w[0].category, UserWarning) diff --git a/scripts/external_libs/platform/cel59/32bit/zmq/tests/test_stopwatch.py b/scripts/external_libs/platform/cel59/32bit/zmq/tests/test_stopwatch.py new file mode 100644 index 00000000..49fb79f2 --- /dev/null +++ b/scripts/external_libs/platform/cel59/32bit/zmq/tests/test_stopwatch.py @@ -0,0 +1,42 @@ +# -*- coding: utf8 -*- +# Copyright (C) PyZMQ Developers +# Distributed under the terms of the Modified BSD License. + + +import sys +import time + +from unittest import TestCase + +from zmq import Stopwatch, ZMQError + +if sys.version_info[0] >= 3: + long = int + +class TestStopWatch(TestCase): + + def test_stop_long(self): + """Ensure stop returns a long int.""" + watch = Stopwatch() + watch.start() + us = watch.stop() + self.assertTrue(isinstance(us, long)) + + def test_stop_microseconds(self): + """Test that stop/sleep have right units.""" + watch = Stopwatch() + watch.start() + tic = time.time() + watch.sleep(1) + us = watch.stop() + toc = time.time() + self.assertAlmostEqual(us/1e6,(toc-tic),places=0) + + def test_double_stop(self): + """Test error raised on multiple calls to stop.""" + watch = Stopwatch() + watch.start() + watch.stop() + self.assertRaises(ZMQError, watch.stop) + self.assertRaises(ZMQError, watch.stop) + diff --git a/scripts/external_libs/platform/cel59/32bit/zmq/tests/test_version.py b/scripts/external_libs/platform/cel59/32bit/zmq/tests/test_version.py new file mode 100644 index 00000000..6ebebf30 --- /dev/null +++ b/scripts/external_libs/platform/cel59/32bit/zmq/tests/test_version.py @@ -0,0 +1,44 @@ +# Copyright (C) PyZMQ Developers +# Distributed under the terms of the Modified BSD License. + + +from unittest import TestCase +import zmq +from zmq.sugar import version + + +class TestVersion(TestCase): + + def test_pyzmq_version(self): + vs = zmq.pyzmq_version() + vs2 = zmq.__version__ + self.assertTrue(isinstance(vs, str)) + if zmq.__revision__: + self.assertEqual(vs, '@'.join(vs2, zmq.__revision__)) + else: + self.assertEqual(vs, vs2) + if version.VERSION_EXTRA: + self.assertTrue(version.VERSION_EXTRA in vs) + self.assertTrue(version.VERSION_EXTRA in vs2) + + def test_pyzmq_version_info(self): + info = zmq.pyzmq_version_info() + self.assertTrue(isinstance(info, tuple)) + for n in info[:3]: + self.assertTrue(isinstance(n, int)) + if version.VERSION_EXTRA: + self.assertEqual(len(info), 4) + self.assertEqual(info[-1], float('inf')) + else: + self.assertEqual(len(info), 3) + + def test_zmq_version_info(self): + info = zmq.zmq_version_info() + self.assertTrue(isinstance(info, tuple)) + for n in info[:3]: + self.assertTrue(isinstance(n, int)) + + def test_zmq_version(self): + v = zmq.zmq_version() + self.assertTrue(isinstance(v, str)) + diff --git a/scripts/external_libs/platform/cel59/32bit/zmq/tests/test_win32_shim.py b/scripts/external_libs/platform/cel59/32bit/zmq/tests/test_win32_shim.py new file mode 100644 index 00000000..55657bda --- /dev/null +++ b/scripts/external_libs/platform/cel59/32bit/zmq/tests/test_win32_shim.py @@ -0,0 +1,56 @@ +from __future__ import print_function + +import os + +from functools import wraps +from zmq.tests import BaseZMQTestCase +from zmq.utils.win32 import allow_interrupt + + +def count_calls(f): + @wraps(f) + def _(*args, **kwds): + try: + return f(*args, **kwds) + finally: + _.__calls__ += 1 + _.__calls__ = 0 + return _ + + +class TestWindowsConsoleControlHandler(BaseZMQTestCase): + + def test_handler(self): + @count_calls + def interrupt_polling(): + print('Caught CTRL-C!') + + if os.name == 'nt': + from ctypes import windll + from ctypes.wintypes import BOOL, DWORD + + kernel32 = windll.LoadLibrary('kernel32') + + # + GenerateConsoleCtrlEvent = kernel32.GenerateConsoleCtrlEvent + GenerateConsoleCtrlEvent.argtypes = (DWORD, DWORD) + GenerateConsoleCtrlEvent.restype = BOOL + + try: + # Simulate CTRL-C event while handler is active. + with allow_interrupt(interrupt_polling): + result = GenerateConsoleCtrlEvent(0, 0) + if result == 0: + raise WindowsError + except KeyboardInterrupt: + pass + else: + self.fail('Expecting `KeyboardInterrupt` exception!') + + # Make sure our handler was called. + self.assertEqual(interrupt_polling.__calls__, 1) + else: + # On non-Windows systems, this utility is just a no-op! + with allow_interrupt(interrupt_polling): + pass + self.assertEqual(interrupt_polling.__calls__, 0) diff --git a/scripts/external_libs/platform/cel59/32bit/zmq/tests/test_z85.py b/scripts/external_libs/platform/cel59/32bit/zmq/tests/test_z85.py new file mode 100644 index 00000000..8a73cb4d --- /dev/null +++ b/scripts/external_libs/platform/cel59/32bit/zmq/tests/test_z85.py @@ -0,0 +1,63 @@ +# -*- coding: utf8 -*- +"""Test Z85 encoding + +confirm values and roundtrip with test values from the reference implementation. +""" + +# Copyright (C) PyZMQ Developers +# Distributed under the terms of the Modified BSD License. + +from unittest import TestCase +from zmq.utils import z85 + + +class TestZ85(TestCase): + + def test_client_public(self): + client_public = \ + b"\xBB\x88\x47\x1D\x65\xE2\x65\x9B" \ + b"\x30\xC5\x5A\x53\x21\xCE\xBB\x5A" \ + b"\xAB\x2B\x70\xA3\x98\x64\x5C\x26" \ + b"\xDC\xA2\xB2\xFC\xB4\x3F\xC5\x18" + encoded = z85.encode(client_public) + + self.assertEqual(encoded, b"Yne@$w-vo}U?@Lns47E1%kR.o@n%FcmmsL/@{H8]yf7") + decoded = z85.decode(encoded) + self.assertEqual(decoded, server_public) + + def test_server_secret(self): + server_secret = \ + b"\x8E\x0B\xDD\x69\x76\x28\xB9\x1D" \ + b"\x8F\x24\x55\x87\xEE\x95\xC5\xB0" \ + b"\x4D\x48\x96\x3F\x79\x25\x98\x77" \ + b"\xB4\x9C\xD9\x06\x3A\xEA\xD3\xB7" + encoded = z85.encode(server_secret) + + self.assertEqual(encoded, b"JTKVSB%%)wK0E.X)V>+}o?pNmC{O&4W4b!Ni{Lh6") + decoded = z85.decode(encoded) + self.assertEqual(decoded, server_secret) + diff --git a/scripts/external_libs/platform/cel59/32bit/zmq/tests/test_zmqstream.py b/scripts/external_libs/platform/cel59/32bit/zmq/tests/test_zmqstream.py new file mode 100644 index 00000000..cdb3a171 --- /dev/null +++ b/scripts/external_libs/platform/cel59/32bit/zmq/tests/test_zmqstream.py @@ -0,0 +1,34 @@ +# -*- coding: utf8 -*- +# Copyright (C) PyZMQ Developers +# Distributed under the terms of the Modified BSD License. + + +import sys +import time + +from unittest import TestCase + +import zmq +from zmq.eventloop import ioloop, zmqstream + +class TestZMQStream(TestCase): + + def setUp(self): + self.context = zmq.Context() + self.socket = self.context.socket(zmq.REP) + self.loop = ioloop.IOLoop.instance() + self.stream = zmqstream.ZMQStream(self.socket) + + def tearDown(self): + self.socket.close() + self.context.term() + + def test_callable_check(self): + """Ensure callable check works (py3k).""" + + self.stream.on_send(lambda *args: None) + self.stream.on_recv(lambda *args: None) + self.assertRaises(AssertionError, self.stream.on_recv, 1) + self.assertRaises(AssertionError, self.stream.on_send, 1) + self.assertRaises(AssertionError, self.stream.on_recv, zmq) + diff --git a/scripts/external_libs/platform/cel59/32bit/zmq/utils/__init__.py b/scripts/external_libs/platform/cel59/32bit/zmq/utils/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/scripts/external_libs/platform/cel59/32bit/zmq/utils/buffers.pxd b/scripts/external_libs/platform/cel59/32bit/zmq/utils/buffers.pxd new file mode 100644 index 00000000..998aa551 --- /dev/null +++ b/scripts/external_libs/platform/cel59/32bit/zmq/utils/buffers.pxd @@ -0,0 +1,313 @@ +"""Python version-independent methods for C/Python buffers. + +This file was copied and adapted from mpi4py. + +Authors +------- +* MinRK +""" + +#----------------------------------------------------------------------------- +# Copyright (c) 2010 Lisandro Dalcin +# All rights reserved. +# Used under BSD License: http://www.opensource.org/licenses/bsd-license.php +# +# Retrieval: +# Jul 23, 2010 18:00 PST (r539) +# http://code.google.com/p/mpi4py/source/browse/trunk/src/MPI/asbuffer.pxi +# +# Modifications from original: +# Copyright (c) 2010-2012 Brian Granger, Min Ragan-Kelley +# +# Distributed under the terms of the New BSD License. The full license is in +# the file COPYING.BSD, distributed as part of this software. +#----------------------------------------------------------------------------- + + +#----------------------------------------------------------------------------- +# Python includes. +#----------------------------------------------------------------------------- + +# get version-independent aliases: +cdef extern from "pyversion_compat.h": + pass + +# Python 3 buffer interface (PEP 3118) +cdef extern from "Python.h": + int PY_MAJOR_VERSION + int PY_MINOR_VERSION + ctypedef int Py_ssize_t + ctypedef struct PyMemoryViewObject: + pass + ctypedef struct Py_buffer: + void *buf + Py_ssize_t len + int readonly + char *format + int ndim + Py_ssize_t *shape + Py_ssize_t *strides + Py_ssize_t *suboffsets + Py_ssize_t itemsize + void *internal + cdef enum: + PyBUF_SIMPLE + PyBUF_WRITABLE + PyBUF_FORMAT + PyBUF_ANY_CONTIGUOUS + int PyObject_CheckBuffer(object) + int PyObject_GetBuffer(object, Py_buffer *, int) except -1 + void PyBuffer_Release(Py_buffer *) + + int PyBuffer_FillInfo(Py_buffer *view, object obj, void *buf, + Py_ssize_t len, int readonly, int infoflags) except -1 + object PyMemoryView_FromBuffer(Py_buffer *info) + + object PyMemoryView_FromObject(object) + +# Python 2 buffer interface (legacy) +cdef extern from "Python.h": + ctypedef void const_void "const void" + Py_ssize_t Py_END_OF_BUFFER + int PyObject_CheckReadBuffer(object) + int PyObject_AsReadBuffer (object, const_void **, Py_ssize_t *) except -1 + int PyObject_AsWriteBuffer(object, void **, Py_ssize_t *) except -1 + + object PyBuffer_FromMemory(void *ptr, Py_ssize_t s) + object PyBuffer_FromReadWriteMemory(void *ptr, Py_ssize_t s) + + object PyBuffer_FromObject(object, Py_ssize_t offset, Py_ssize_t size) + object PyBuffer_FromReadWriteObject(object, Py_ssize_t offset, Py_ssize_t size) + + +#----------------------------------------------------------------------------- +# asbuffer: C buffer from python object +#----------------------------------------------------------------------------- + + +cdef inline int memoryview_available(): + return PY_MAJOR_VERSION >= 3 or (PY_MAJOR_VERSION >=2 and PY_MINOR_VERSION >= 7) + +cdef inline int oldstyle_available(): + return PY_MAJOR_VERSION < 3 + + +cdef inline int check_buffer(object ob): + """Version independent check for whether an object is a buffer. + + Parameters + ---------- + object : object + Any Python object + + Returns + ------- + int : 0 if no buffer interface, 3 if newstyle buffer interface, 2 if oldstyle. + """ + if PyObject_CheckBuffer(ob): + return 3 + if oldstyle_available(): + return PyObject_CheckReadBuffer(ob) and 2 + return 0 + + +cdef inline object asbuffer(object ob, int writable, int format, + void **base, Py_ssize_t *size, + Py_ssize_t *itemsize): + """Turn an object into a C buffer in a Python version-independent way. + + Parameters + ---------- + ob : object + The object to be turned into a buffer. + Must provide a Python Buffer interface + writable : int + Whether the resulting buffer should be allowed to write + to the object. + format : int + The format of the buffer. See Python buffer docs. + base : void ** + The pointer that will be used to store the resulting C buffer. + size : Py_ssize_t * + The size of the buffer(s). + itemsize : Py_ssize_t * + The size of an item, if the buffer is non-contiguous. + + Returns + ------- + An object describing the buffer format. Generally a str, such as 'B'. + """ + + cdef void *bptr = NULL + cdef Py_ssize_t blen = 0, bitemlen = 0 + cdef Py_buffer view + cdef int flags = PyBUF_SIMPLE + cdef int mode = 0 + + bfmt = None + + mode = check_buffer(ob) + if mode == 0: + raise TypeError("%r does not provide a buffer interface."%ob) + + if mode == 3: + flags = PyBUF_ANY_CONTIGUOUS + if writable: + flags |= PyBUF_WRITABLE + if format: + flags |= PyBUF_FORMAT + PyObject_GetBuffer(ob, &view, flags) + bptr = view.buf + blen = view.len + if format: + if view.format != NULL: + bfmt = view.format + bitemlen = view.itemsize + PyBuffer_Release(&view) + else: # oldstyle + if writable: + PyObject_AsWriteBuffer(ob, &bptr, &blen) + else: + PyObject_AsReadBuffer(ob, &bptr, &blen) + if format: + try: # numpy.ndarray + dtype = ob.dtype + bfmt = dtype.char + bitemlen = dtype.itemsize + except AttributeError: + try: # array.array + bfmt = ob.typecode + bitemlen = ob.itemsize + except AttributeError: + if isinstance(ob, bytes): + bfmt = b"B" + bitemlen = 1 + else: + # nothing found + bfmt = None + bitemlen = 0 + if base: base[0] = bptr + if size: size[0] = blen + if itemsize: itemsize[0] = bitemlen + + if PY_MAJOR_VERSION >= 3 and bfmt is not None: + return bfmt.decode('ascii') + return bfmt + + +cdef inline object asbuffer_r(object ob, void **base, Py_ssize_t *size): + """Wrapper for standard calls to asbuffer with a readonly buffer.""" + asbuffer(ob, 0, 0, base, size, NULL) + return ob + + +cdef inline object asbuffer_w(object ob, void **base, Py_ssize_t *size): + """Wrapper for standard calls to asbuffer with a writable buffer.""" + asbuffer(ob, 1, 0, base, size, NULL) + return ob + +#------------------------------------------------------------------------------ +# frombuffer: python buffer/view from C buffer +#------------------------------------------------------------------------------ + + +cdef inline object frombuffer_3(void *ptr, Py_ssize_t s, int readonly): + """Python 3 version of frombuffer. + + This is the Python 3 model, but will work on Python >= 2.6. Currently, + we use it only on >= 3.0. + """ + cdef Py_buffer pybuf + cdef Py_ssize_t *shape = [s] + cdef str astr="" + PyBuffer_FillInfo(&pybuf, astr, ptr, s, readonly, PyBUF_SIMPLE) + pybuf.format = "B" + pybuf.shape = shape + return PyMemoryView_FromBuffer(&pybuf) + + +cdef inline object frombuffer_2(void *ptr, Py_ssize_t s, int readonly): + """Python 2 version of frombuffer. + + This must be used for Python <= 2.6, but we use it for all Python < 3. + """ + + if oldstyle_available(): + if readonly: + return PyBuffer_FromMemory(ptr, s) + else: + return PyBuffer_FromReadWriteMemory(ptr, s) + else: + raise NotImplementedError("Old style buffers not available.") + + +cdef inline object frombuffer(void *ptr, Py_ssize_t s, int readonly): + """Create a Python Buffer/View of a C array. + + Parameters + ---------- + ptr : void * + Pointer to the array to be copied. + s : size_t + Length of the buffer. + readonly : int + whether the resulting object should be allowed to write to the buffer. + + Returns + ------- + Python Buffer/View of the C buffer. + """ + # oldstyle first priority for now + if oldstyle_available(): + return frombuffer_2(ptr, s, readonly) + else: + return frombuffer_3(ptr, s, readonly) + + +cdef inline object frombuffer_r(void *ptr, Py_ssize_t s): + """Wrapper for readonly view frombuffer.""" + return frombuffer(ptr, s, 1) + + +cdef inline object frombuffer_w(void *ptr, Py_ssize_t s): + """Wrapper for writable view frombuffer.""" + return frombuffer(ptr, s, 0) + +#------------------------------------------------------------------------------ +# viewfromobject: python buffer/view from python object, refcounts intact +# frombuffer(asbuffer(obj)) would lose track of refs +#------------------------------------------------------------------------------ + +cdef inline object viewfromobject(object obj, int readonly): + """Construct a Python Buffer/View object from another Python object. + + This work in a Python version independent manner. + + Parameters + ---------- + obj : object + The input object to be cast as a buffer + readonly : int + Whether the result should be prevented from overwriting the original. + + Returns + ------- + Buffer/View of the original object. + """ + if not memoryview_available(): + if readonly: + return PyBuffer_FromObject(obj, 0, Py_END_OF_BUFFER) + else: + return PyBuffer_FromReadWriteObject(obj, 0, Py_END_OF_BUFFER) + else: + return PyMemoryView_FromObject(obj) + + +cdef inline object viewfromobject_r(object obj): + """Wrapper for readonly viewfromobject.""" + return viewfromobject(obj, 1) + + +cdef inline object viewfromobject_w(object obj): + """Wrapper for writable viewfromobject.""" + return viewfromobject(obj, 0) diff --git a/scripts/external_libs/platform/cel59/32bit/zmq/utils/compiler.json b/scripts/external_libs/platform/cel59/32bit/zmq/utils/compiler.json new file mode 100644 index 00000000..773affda --- /dev/null +++ b/scripts/external_libs/platform/cel59/32bit/zmq/utils/compiler.json @@ -0,0 +1,19 @@ +{ + "extra_link_args": [], + "define_macros": [], + "runtime_library_dirs": [ + "$ORIGIN/.." + ], + "libraries": [ + "zmq" + ], + "library_dirs": [ + "zmq" + ], + "include_dirs": [ + "/auto/srg-sce-swinfra-usr/emb/users/imarom/gitwork/zmq/zeromq-bin/include", + "zmq/utils", + "zmq/backend/cython", + "zmq/devices" + ] +} \ No newline at end of file diff --git a/scripts/external_libs/platform/cel59/32bit/zmq/utils/config.json b/scripts/external_libs/platform/cel59/32bit/zmq/utils/config.json new file mode 100644 index 00000000..672d80f0 --- /dev/null +++ b/scripts/external_libs/platform/cel59/32bit/zmq/utils/config.json @@ -0,0 +1,15 @@ +{ + "have_sys_un_h": false, + "zmq_prefix": "/auto/srg-sce-swinfra-usr/emb/users/imarom/gitwork/zmq/zeromq-bin/", + "no_libzmq_extension": true, + "libzmq_extension": false, + "bdist_egg": { + "plat-name": "linux-i686" + }, + "skip_check_zmq": false, + "build_ext": { + "libraries": "python2.7", + "library_dirs": "/auto/srg-sce-swinfra-usr/emb/users/imarom/gitwork/zmq/zeromq-bin/lib/", + "include_dirs": "/auto/earms-sj/public/vkg_platform_test/pyats2_python2/include/python2.7/" + } +} \ No newline at end of file diff --git a/scripts/external_libs/platform/cel59/32bit/zmq/utils/constant_names.py b/scripts/external_libs/platform/cel59/32bit/zmq/utils/constant_names.py new file mode 100644 index 00000000..47da9dc2 --- /dev/null +++ b/scripts/external_libs/platform/cel59/32bit/zmq/utils/constant_names.py @@ -0,0 +1,365 @@ +"""0MQ Constant names""" + +# Copyright (C) PyZMQ Developers +# Distributed under the terms of the Modified BSD License. + +# dictionaries of constants new or removed in particular versions + +new_in = { + (2,2,0) : [ + 'RCVTIMEO', + 'SNDTIMEO', + ], + (3,2,2) : [ + # errnos + 'EMSGSIZE', + 'EAFNOSUPPORT', + 'ENETUNREACH', + 'ECONNABORTED', + 'ECONNRESET', + 'ENOTCONN', + 'ETIMEDOUT', + 'EHOSTUNREACH', + 'ENETRESET', + + # ctx opts + 'IO_THREADS', + 'MAX_SOCKETS', + 'IO_THREADS_DFLT', + 'MAX_SOCKETS_DFLT', + + # socket opts + 'ROUTER_BEHAVIOR', + 'ROUTER_MANDATORY', + 'FAIL_UNROUTABLE', + 'TCP_KEEPALIVE', + 'TCP_KEEPALIVE_CNT', + 'TCP_KEEPALIVE_IDLE', + 'TCP_KEEPALIVE_INTVL', + 'DELAY_ATTACH_ON_CONNECT', + 'XPUB_VERBOSE', + + # msg opts + 'MORE', + + 'EVENT_CONNECTED', + 'EVENT_CONNECT_DELAYED', + 'EVENT_CONNECT_RETRIED', + 'EVENT_LISTENING', + 'EVENT_BIND_FAILED', + 'EVENT_ACCEPTED', + 'EVENT_ACCEPT_FAILED', + 'EVENT_CLOSED', + 'EVENT_CLOSE_FAILED', + 'EVENT_DISCONNECTED', + 'EVENT_ALL', + ], + (4,0,0) : [ + # socket types + 'STREAM', + + # socket opts + 'IMMEDIATE', + 'ROUTER_RAW', + 'IPV6', + 'MECHANISM', + 'PLAIN_SERVER', + 'PLAIN_USERNAME', + 'PLAIN_PASSWORD', + 'CURVE_SERVER', + 'CURVE_PUBLICKEY', + 'CURVE_SECRETKEY', + 'CURVE_SERVERKEY', + 'PROBE_ROUTER', + 'REQ_RELAXED', + 'REQ_CORRELATE', + 'CONFLATE', + 'ZAP_DOMAIN', + + # security + 'NULL', + 'PLAIN', + 'CURVE', + + # events + 'EVENT_MONITOR_STOPPED', + ], + (4,1,0) : [ + # ctx opts + 'SOCKET_LIMIT', + 'THREAD_PRIORITY', + 'THREAD_PRIORITY_DFLT', + 'THREAD_SCHED_POLICY', + 'THREAD_SCHED_POLICY_DFLT', + + # socket opts + 'ROUTER_HANDOVER', + 'TOS', + 'IPC_FILTER_PID', + 'IPC_FILTER_UID', + 'IPC_FILTER_GID', + 'CONNECT_RID', + 'GSSAPI_SERVER', + 'GSSAPI_PRINCIPAL', + 'GSSAPI_SERVICE_PRINCIPAL', + 'GSSAPI_PLAINTEXT', + 'HANDSHAKE_IVL', + 'IDENTITY_FD', + 'XPUB_NODROP', + 'SOCKS_PROXY', + + # msg opts + 'SRCFD', + 'SHARED', + + # security + 'GSSAPI', + + ], +} + + +removed_in = { + (3,2,2) : [ + 'UPSTREAM', + 'DOWNSTREAM', + + 'HWM', + 'SWAP', + 'MCAST_LOOP', + 'RECOVERY_IVL_MSEC', + ] +} + +# collections of zmq constant names based on their role +# base names have no specific use +# opt names are validated in get/set methods of various objects + +base_names = [ + # base + 'VERSION', + 'VERSION_MAJOR', + 'VERSION_MINOR', + 'VERSION_PATCH', + 'NOBLOCK', + 'DONTWAIT', + + 'POLLIN', + 'POLLOUT', + 'POLLERR', + + 'SNDMORE', + + 'STREAMER', + 'FORWARDER', + 'QUEUE', + + 'IO_THREADS_DFLT', + 'MAX_SOCKETS_DFLT', + 'POLLITEMS_DFLT', + 'THREAD_PRIORITY_DFLT', + 'THREAD_SCHED_POLICY_DFLT', + + # socktypes + 'PAIR', + 'PUB', + 'SUB', + 'REQ', + 'REP', + 'DEALER', + 'ROUTER', + 'XREQ', + 'XREP', + 'PULL', + 'PUSH', + 'XPUB', + 'XSUB', + 'UPSTREAM', + 'DOWNSTREAM', + 'STREAM', + + # events + 'EVENT_CONNECTED', + 'EVENT_CONNECT_DELAYED', + 'EVENT_CONNECT_RETRIED', + 'EVENT_LISTENING', + 'EVENT_BIND_FAILED', + 'EVENT_ACCEPTED', + 'EVENT_ACCEPT_FAILED', + 'EVENT_CLOSED', + 'EVENT_CLOSE_FAILED', + 'EVENT_DISCONNECTED', + 'EVENT_ALL', + 'EVENT_MONITOR_STOPPED', + + # security + 'NULL', + 'PLAIN', + 'CURVE', + 'GSSAPI', + + ## ERRNO + # Often used (these are alse in errno.) + 'EAGAIN', + 'EINVAL', + 'EFAULT', + 'ENOMEM', + 'ENODEV', + 'EMSGSIZE', + 'EAFNOSUPPORT', + 'ENETUNREACH', + 'ECONNABORTED', + 'ECONNRESET', + 'ENOTCONN', + 'ETIMEDOUT', + 'EHOSTUNREACH', + 'ENETRESET', + + # For Windows compatability + 'HAUSNUMERO', + 'ENOTSUP', + 'EPROTONOSUPPORT', + 'ENOBUFS', + 'ENETDOWN', + 'EADDRINUSE', + 'EADDRNOTAVAIL', + 'ECONNREFUSED', + 'EINPROGRESS', + 'ENOTSOCK', + + # 0MQ Native + 'EFSM', + 'ENOCOMPATPROTO', + 'ETERM', + 'EMTHREAD', +] + +int64_sockopt_names = [ + 'AFFINITY', + 'MAXMSGSIZE', + + # sockopts removed in 3.0.0 + 'HWM', + 'SWAP', + 'MCAST_LOOP', + 'RECOVERY_IVL_MSEC', +] + +bytes_sockopt_names = [ + 'IDENTITY', + 'SUBSCRIBE', + 'UNSUBSCRIBE', + 'LAST_ENDPOINT', + 'TCP_ACCEPT_FILTER', + + 'PLAIN_USERNAME', + 'PLAIN_PASSWORD', + + 'CURVE_PUBLICKEY', + 'CURVE_SECRETKEY', + 'CURVE_SERVERKEY', + 'ZAP_DOMAIN', + 'CONNECT_RID', + 'GSSAPI_PRINCIPAL', + 'GSSAPI_SERVICE_PRINCIPAL', + 'SOCKS_PROXY', +] + +fd_sockopt_names = [ + 'FD', + 'IDENTITY_FD', +] + +int_sockopt_names = [ + # sockopts + 'RECONNECT_IVL_MAX', + + # sockopts new in 2.2.0 + 'SNDTIMEO', + 'RCVTIMEO', + + # new in 3.x + 'SNDHWM', + 'RCVHWM', + 'MULTICAST_HOPS', + 'IPV4ONLY', + + 'ROUTER_BEHAVIOR', + 'TCP_KEEPALIVE', + 'TCP_KEEPALIVE_CNT', + 'TCP_KEEPALIVE_IDLE', + 'TCP_KEEPALIVE_INTVL', + 'DELAY_ATTACH_ON_CONNECT', + 'XPUB_VERBOSE', + + 'EVENTS', + 'TYPE', + 'LINGER', + 'RECONNECT_IVL', + 'BACKLOG', + + 'ROUTER_MANDATORY', + 'FAIL_UNROUTABLE', + + 'ROUTER_RAW', + 'IMMEDIATE', + 'IPV6', + 'MECHANISM', + 'PLAIN_SERVER', + 'CURVE_SERVER', + 'PROBE_ROUTER', + 'REQ_RELAXED', + 'REQ_CORRELATE', + 'CONFLATE', + 'ROUTER_HANDOVER', + 'TOS', + 'IPC_FILTER_PID', + 'IPC_FILTER_UID', + 'IPC_FILTER_GID', + 'GSSAPI_SERVER', + 'GSSAPI_PLAINTEXT', + 'HANDSHAKE_IVL', + 'XPUB_NODROP', +] + +switched_sockopt_names = [ + 'RATE', + 'RECOVERY_IVL', + 'SNDBUF', + 'RCVBUF', + 'RCVMORE', +] + +ctx_opt_names = [ + 'IO_THREADS', + 'MAX_SOCKETS', + 'SOCKET_LIMIT', + 'THREAD_PRIORITY', + 'THREAD_SCHED_POLICY', +] + +msg_opt_names = [ + 'MORE', + 'SRCFD', + 'SHARED', +] + +from itertools import chain + +all_names = list(chain( + base_names, + ctx_opt_names, + bytes_sockopt_names, + fd_sockopt_names, + int_sockopt_names, + int64_sockopt_names, + switched_sockopt_names, + msg_opt_names, +)) + +del chain + +def no_prefix(name): + """does the given constant have a ZMQ_ prefix?""" + return name.startswith('E') and not name.startswith('EVENT') + diff --git a/scripts/external_libs/platform/cel59/32bit/zmq/utils/garbage.py b/scripts/external_libs/platform/cel59/32bit/zmq/utils/garbage.py new file mode 100644 index 00000000..80a8725a --- /dev/null +++ b/scripts/external_libs/platform/cel59/32bit/zmq/utils/garbage.py @@ -0,0 +1,180 @@ +"""Garbage collection thread for representing zmq refcount of Python objects +used in zero-copy sends. +""" + +# Copyright (C) PyZMQ Developers +# Distributed under the terms of the Modified BSD License. + + +import atexit +import struct + +from os import getpid +from collections import namedtuple +from threading import Thread, Event, Lock +import warnings + +import zmq + + +gcref = namedtuple('gcref', ['obj', 'event']) + +class GarbageCollectorThread(Thread): + """Thread in which garbage collection actually happens.""" + def __init__(self, gc): + super(GarbageCollectorThread, self).__init__() + self.gc = gc + self.daemon = True + self.pid = getpid() + self.ready = Event() + + def run(self): + # detect fork at begining of the thread + if getpid is None or getpid() != self.pid: + self.ready.set() + return + try: + s = self.gc.context.socket(zmq.PULL) + s.linger = 0 + s.bind(self.gc.url) + finally: + self.ready.set() + + while True: + # detect fork + if getpid is None or getpid() != self.pid: + return + msg = s.recv() + if msg == b'DIE': + break + fmt = 'L' if len(msg) == 4 else 'Q' + key = struct.unpack(fmt, msg)[0] + tup = self.gc.refs.pop(key, None) + if tup and tup.event: + tup.event.set() + del tup + s.close() + + +class GarbageCollector(object): + """PyZMQ Garbage Collector + + Used for representing the reference held by libzmq during zero-copy sends. + This object holds a dictionary, keyed by Python id, + of the Python objects whose memory are currently in use by zeromq. + + When zeromq is done with the memory, it sends a message on an inproc PUSH socket + containing the packed size_t (32 or 64-bit unsigned int), + which is the key in the dict. + When the PULL socket in the gc thread receives that message, + the reference is popped from the dict, + and any tracker events that should be signaled fire. + """ + + refs = None + _context = None + _lock = None + url = "inproc://pyzmq.gc.01" + + def __init__(self, context=None): + super(GarbageCollector, self).__init__() + self.refs = {} + self.pid = None + self.thread = None + self._context = context + self._lock = Lock() + self._stay_down = False + atexit.register(self._atexit) + + @property + def context(self): + if self._context is None: + self._context = zmq.Context() + return self._context + + @context.setter + def context(self, ctx): + if self.is_alive(): + if self.refs: + warnings.warn("Replacing gc context while gc is running", RuntimeWarning) + self.stop() + self._context = ctx + + def _atexit(self): + """atexit callback + + sets _stay_down flag so that gc doesn't try to start up again in other atexit handlers + """ + self._stay_down = True + self.stop() + + def stop(self): + """stop the garbage-collection thread""" + if not self.is_alive(): + return + self._stop() + + def _stop(self): + push = self.context.socket(zmq.PUSH) + push.connect(self.url) + push.send(b'DIE') + push.close() + self.thread.join() + self.context.term() + self.refs.clear() + self.context = None + + def start(self): + """Start a new garbage collection thread. + + Creates a new zmq Context used for garbage collection. + Under most circumstances, this will only be called once per process. + """ + if self.thread is not None and self.pid != getpid(): + # It's re-starting, must free earlier thread's context + # since a fork probably broke it + self._stop() + self.pid = getpid() + self.refs = {} + self.thread = GarbageCollectorThread(self) + self.thread.start() + self.thread.ready.wait() + + def is_alive(self): + """Is the garbage collection thread currently running? + + Includes checks for process shutdown or fork. + """ + if (getpid is None or + getpid() != self.pid or + self.thread is None or + not self.thread.is_alive() + ): + return False + return True + + def store(self, obj, event=None): + """store an object and (optionally) event for zero-copy""" + if not self.is_alive(): + if self._stay_down: + return 0 + # safely start the gc thread + # use lock and double check, + # so we don't start multiple threads + with self._lock: + if not self.is_alive(): + self.start() + tup = gcref(obj, event) + theid = id(tup) + self.refs[theid] = tup + return theid + + def __del__(self): + if not self.is_alive(): + return + try: + self.stop() + except Exception as e: + raise (e) + +gc = GarbageCollector() diff --git a/scripts/external_libs/platform/cel59/32bit/zmq/utils/getpid_compat.h b/scripts/external_libs/platform/cel59/32bit/zmq/utils/getpid_compat.h new file mode 100644 index 00000000..47ce90fa --- /dev/null +++ b/scripts/external_libs/platform/cel59/32bit/zmq/utils/getpid_compat.h @@ -0,0 +1,6 @@ +#ifdef _WIN32 + #include + #define getpid _getpid +#else + #include +#endif diff --git a/scripts/external_libs/platform/cel59/32bit/zmq/utils/interop.py b/scripts/external_libs/platform/cel59/32bit/zmq/utils/interop.py new file mode 100644 index 00000000..26c01969 --- /dev/null +++ b/scripts/external_libs/platform/cel59/32bit/zmq/utils/interop.py @@ -0,0 +1,33 @@ +"""Utils for interoperability with other libraries. + +Just CFFI pointer casting for now. +""" + +# Copyright (C) PyZMQ Developers +# Distributed under the terms of the Modified BSD License. + + +try: + long +except NameError: + long = int # Python 3 + + +def cast_int_addr(n): + """Cast an address to a Python int + + This could be a Python integer or a CFFI pointer + """ + if isinstance(n, (int, long)): + return n + try: + import cffi + except ImportError: + pass + else: + # from pyzmq, this is an FFI void * + ffi = cffi.FFI() + if isinstance(n, ffi.CData): + return int(ffi.cast("size_t", n)) + + raise ValueError("Cannot cast %r to int" % n) diff --git a/scripts/external_libs/platform/cel59/32bit/zmq/utils/ipcmaxlen.h b/scripts/external_libs/platform/cel59/32bit/zmq/utils/ipcmaxlen.h new file mode 100644 index 00000000..7218db78 --- /dev/null +++ b/scripts/external_libs/platform/cel59/32bit/zmq/utils/ipcmaxlen.h @@ -0,0 +1,21 @@ +/* + +Platform-independant detection of IPC path max length + +Copyright (c) 2012 Godefroid Chapelle + +Distributed under the terms of the New BSD License. The full license is in +the file COPYING.BSD, distributed as part of this software. + */ + +#if defined(HAVE_SYS_UN_H) +#include "sys/un.h" +int get_ipc_path_max_len(void) { + struct sockaddr_un *dummy; + return sizeof(dummy->sun_path) - 1; +} +#else +int get_ipc_path_max_len(void) { + return 0; +} +#endif diff --git a/scripts/external_libs/platform/cel59/32bit/zmq/utils/jsonapi.py b/scripts/external_libs/platform/cel59/32bit/zmq/utils/jsonapi.py new file mode 100644 index 00000000..865ca6d5 --- /dev/null +++ b/scripts/external_libs/platform/cel59/32bit/zmq/utils/jsonapi.py @@ -0,0 +1,59 @@ +"""Priority based json library imports. + +Always serializes to bytes instead of unicode for zeromq compatibility +on Python 2 and 3. + +Use ``jsonapi.loads()`` and ``jsonapi.dumps()`` for guaranteed symmetry. + +Priority: ``simplejson`` > ``jsonlib2`` > stdlib ``json`` + +``jsonapi.loads/dumps`` provide kwarg-compatibility with stdlib json. + +``jsonapi.jsonmod`` will be the module of the actual underlying implementation. +""" + +# Copyright (C) PyZMQ Developers +# Distributed under the terms of the Modified BSD License. + +from zmq.utils.strtypes import bytes, unicode + +jsonmod = None + +priority = ['simplejson', 'jsonlib2', 'json'] +for mod in priority: + try: + jsonmod = __import__(mod) + except ImportError: + pass + else: + break + +def dumps(o, **kwargs): + """Serialize object to JSON bytes (utf-8). + + See jsonapi.jsonmod.dumps for details on kwargs. + """ + + if 'separators' not in kwargs: + kwargs['separators'] = (',', ':') + + s = jsonmod.dumps(o, **kwargs) + + if isinstance(s, unicode): + s = s.encode('utf8') + + return s + +def loads(s, **kwargs): + """Load object from JSON bytes (utf-8). + + See jsonapi.jsonmod.loads for details on kwargs. + """ + + if str is unicode and isinstance(s, bytes): + s = s.decode('utf8') + + return jsonmod.loads(s, **kwargs) + +__all__ = ['jsonmod', 'dumps', 'loads'] + diff --git a/scripts/external_libs/platform/cel59/32bit/zmq/utils/monitor.py b/scripts/external_libs/platform/cel59/32bit/zmq/utils/monitor.py new file mode 100644 index 00000000..734d54b1 --- /dev/null +++ b/scripts/external_libs/platform/cel59/32bit/zmq/utils/monitor.py @@ -0,0 +1,68 @@ +# -*- coding: utf-8 -*- +"""Module holding utility and convenience functions for zmq event monitoring.""" + +# Copyright (C) PyZMQ Developers +# Distributed under the terms of the Modified BSD License. + +import struct +import zmq +from zmq.error import _check_version + +def parse_monitor_message(msg): + """decode zmq_monitor event messages. + + Parameters + ---------- + msg : list(bytes) + zmq multipart message that has arrived on a monitor PAIR socket. + + First frame is:: + + 16 bit event id + 32 bit event value + no padding + + Second frame is the endpoint as a bytestring + + Returns + ------- + event : dict + event description as dict with the keys `event`, `value`, and `endpoint`. + """ + + if len(msg) != 2 or len(msg[0]) != 6: + raise RuntimeError("Invalid event message format: %s" % msg) + event = {} + event['event'], event['value'] = struct.unpack("=hi", msg[0]) + event['endpoint'] = msg[1] + return event + +def recv_monitor_message(socket, flags=0): + """Receive and decode the given raw message from the monitoring socket and return a dict. + + Requires libzmq ≥ 4.0 + + The returned dict will have the following entries: + event : int, the event id as described in libzmq.zmq_socket_monitor + value : int, the event value associated with the event, see libzmq.zmq_socket_monitor + endpoint : string, the affected endpoint + + Parameters + ---------- + socket : zmq PAIR socket + The PAIR socket (created by other.get_monitor_socket()) on which to recv the message + flags : bitfield (int) + standard zmq recv flags + + Returns + ------- + event : dict + event description as dict with the keys `event`, `value`, and `endpoint`. + """ + _check_version((4,0), 'libzmq event API') + # will always return a list + msg = socket.recv_multipart(flags) + # 4.0-style event API + return parse_monitor_message(msg) + +__all__ = ['parse_monitor_message', 'recv_monitor_message'] diff --git a/scripts/external_libs/platform/cel59/32bit/zmq/utils/pyversion_compat.h b/scripts/external_libs/platform/cel59/32bit/zmq/utils/pyversion_compat.h new file mode 100644 index 00000000..fac09046 --- /dev/null +++ b/scripts/external_libs/platform/cel59/32bit/zmq/utils/pyversion_compat.h @@ -0,0 +1,25 @@ +#include "Python.h" + +#if PY_VERSION_HEX < 0x02070000 + #define PyMemoryView_FromBuffer(info) (PyErr_SetString(PyExc_NotImplementedError, \ + "new buffer interface is not available"), (PyObject *)NULL) + #define PyMemoryView_FromObject(object) (PyErr_SetString(PyExc_NotImplementedError, \ + "new buffer interface is not available"), (PyObject *)NULL) +#endif + +#if PY_VERSION_HEX >= 0x03000000 + // for buffers + #define Py_END_OF_BUFFER ((Py_ssize_t) 0) + + #define PyObject_CheckReadBuffer(object) (0) + + #define PyBuffer_FromMemory(ptr, s) (PyErr_SetString(PyExc_NotImplementedError, \ + "old buffer interface is not available"), (PyObject *)NULL) + #define PyBuffer_FromReadWriteMemory(ptr, s) (PyErr_SetString(PyExc_NotImplementedError, \ + "old buffer interface is not available"), (PyObject *)NULL) + #define PyBuffer_FromObject(object, offset, size) (PyErr_SetString(PyExc_NotImplementedError, \ + "old buffer interface is not available"), (PyObject *)NULL) + #define PyBuffer_FromReadWriteObject(object, offset, size) (PyErr_SetString(PyExc_NotImplementedError, \ + "old buffer interface is not available"), (PyObject *)NULL) + +#endif diff --git a/scripts/external_libs/platform/cel59/32bit/zmq/utils/sixcerpt.py b/scripts/external_libs/platform/cel59/32bit/zmq/utils/sixcerpt.py new file mode 100644 index 00000000..5492fd59 --- /dev/null +++ b/scripts/external_libs/platform/cel59/32bit/zmq/utils/sixcerpt.py @@ -0,0 +1,52 @@ +"""Excerpts of six.py""" + +# Copyright (C) 2010-2014 Benjamin Peterson +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +import sys + +# Useful for very coarse version differentiation. +PY2 = sys.version_info[0] == 2 +PY3 = sys.version_info[0] == 3 + +if PY3: + + def reraise(tp, value, tb=None): + if value.__traceback__ is not tb: + raise value.with_traceback(tb) + raise value + +else: + def exec_(_code_, _globs_=None, _locs_=None): + """Execute code in a namespace.""" + if _globs_ is None: + frame = sys._getframe(1) + _globs_ = frame.f_globals + if _locs_ is None: + _locs_ = frame.f_locals + del frame + elif _locs_ is None: + _locs_ = _globs_ + exec("""exec _code_ in _globs_, _locs_""") + + + exec_("""def reraise(tp, value, tb=None): + raise tp, value, tb +""") diff --git a/scripts/external_libs/platform/cel59/32bit/zmq/utils/strtypes.py b/scripts/external_libs/platform/cel59/32bit/zmq/utils/strtypes.py new file mode 100644 index 00000000..548410dc --- /dev/null +++ b/scripts/external_libs/platform/cel59/32bit/zmq/utils/strtypes.py @@ -0,0 +1,45 @@ +"""Declare basic string types unambiguously for various Python versions. + +Authors +------- +* MinRK +""" + +# Copyright (C) PyZMQ Developers +# Distributed under the terms of the Modified BSD License. + +import sys + +if sys.version_info[0] >= 3: + bytes = bytes + unicode = str + basestring = (bytes, unicode) +else: + unicode = unicode + bytes = str + basestring = basestring + +def cast_bytes(s, encoding='utf8', errors='strict'): + """cast unicode or bytes to bytes""" + if isinstance(s, bytes): + return s + elif isinstance(s, unicode): + return s.encode(encoding, errors) + else: + raise TypeError("Expected unicode or bytes, got %r" % s) + +def cast_unicode(s, encoding='utf8', errors='strict'): + """cast bytes or unicode to unicode""" + if isinstance(s, bytes): + return s.decode(encoding, errors) + elif isinstance(s, unicode): + return s + else: + raise TypeError("Expected unicode or bytes, got %r" % s) + +# give short 'b' alias for cast_bytes, so that we can use fake b('stuff') +# to simulate b'stuff' +b = asbytes = cast_bytes +u = cast_unicode + +__all__ = ['asbytes', 'bytes', 'unicode', 'basestring', 'b', 'u', 'cast_bytes', 'cast_unicode'] diff --git a/scripts/external_libs/platform/cel59/32bit/zmq/utils/win32.py b/scripts/external_libs/platform/cel59/32bit/zmq/utils/win32.py new file mode 100644 index 00000000..ea758299 --- /dev/null +++ b/scripts/external_libs/platform/cel59/32bit/zmq/utils/win32.py @@ -0,0 +1,132 @@ +"""Win32 compatibility utilities.""" + +#----------------------------------------------------------------------------- +# Copyright (C) PyZMQ Developers +# Distributed under the terms of the Modified BSD License. +#----------------------------------------------------------------------------- + +import os + +# No-op implementation for other platforms. +class _allow_interrupt(object): + """Utility for fixing CTRL-C events on Windows. + + On Windows, the Python interpreter intercepts CTRL-C events in order to + translate them into ``KeyboardInterrupt`` exceptions. It (presumably) + does this by setting a flag in its "control control handler" and + checking it later at a convenient location in the interpreter. + + However, when the Python interpreter is blocked waiting for the ZMQ + poll operation to complete, it must wait for ZMQ's ``select()`` + operation to complete before translating the CTRL-C event into the + ``KeyboardInterrupt`` exception. + + The only way to fix this seems to be to add our own "console control + handler" and perform some application-defined operation that will + unblock the ZMQ polling operation in order to force ZMQ to pass control + back to the Python interpreter. + + This context manager performs all that Windows-y stuff, providing you + with a hook that is called when a CTRL-C event is intercepted. This + hook allows you to unblock your ZMQ poll operation immediately, which + will then result in the expected ``KeyboardInterrupt`` exception. + + Without this context manager, your ZMQ-based application will not + respond normally to CTRL-C events on Windows. If a CTRL-C event occurs + while blocked on ZMQ socket polling, the translation to a + ``KeyboardInterrupt`` exception will be delayed until the I/O completes + and control returns to the Python interpreter (this may never happen if + you use an infinite timeout). + + A no-op implementation is provided on non-Win32 systems to avoid the + application from having to conditionally use it. + + Example usage: + + .. sourcecode:: python + + def stop_my_application(): + # ... + + with allow_interrupt(stop_my_application): + # main polling loop. + + In a typical ZMQ application, you would use the "self pipe trick" to + send message to a ``PAIR`` socket in order to interrupt your blocking + socket polling operation. + + In a Tornado event loop, you can use the ``IOLoop.stop`` method to + unblock your I/O loop. + """ + + def __init__(self, action=None): + """Translate ``action`` into a CTRL-C handler. + + ``action`` is a callable that takes no arguments and returns no + value (returned value is ignored). It must *NEVER* raise an + exception. + + If unspecified, a no-op will be used. + """ + self._init_action(action) + + def _init_action(self, action): + pass + + def __enter__(self): + return self + + def __exit__(self, *args): + return + +if os.name == 'nt': + from ctypes import WINFUNCTYPE, windll + from ctypes.wintypes import BOOL, DWORD + + kernel32 = windll.LoadLibrary('kernel32') + + # + PHANDLER_ROUTINE = WINFUNCTYPE(BOOL, DWORD) + SetConsoleCtrlHandler = kernel32.SetConsoleCtrlHandler + SetConsoleCtrlHandler.argtypes = (PHANDLER_ROUTINE, BOOL) + SetConsoleCtrlHandler.restype = BOOL + + class allow_interrupt(_allow_interrupt): + __doc__ = _allow_interrupt.__doc__ + + def _init_action(self, action): + if action is None: + action = lambda: None + self.action = action + @PHANDLER_ROUTINE + def handle(event): + if event == 0: # CTRL_C_EVENT + action() + # Typical C implementations would return 1 to indicate that + # the event was processed and other control handlers in the + # stack should not be executed. However, that would + # prevent the Python interpreter's handler from translating + # CTRL-C to a `KeyboardInterrupt` exception, so we pretend + # that we didn't handle it. + return 0 + self.handle = handle + + def __enter__(self): + """Install the custom CTRL-C handler.""" + result = SetConsoleCtrlHandler(self.handle, 1) + if result == 0: + # Have standard library automatically call `GetLastError()` and + # `FormatMessage()` into a nice exception object :-) + raise WindowsError() + + def __exit__(self, *args): + """Remove the custom CTRL-C handler.""" + result = SetConsoleCtrlHandler(self.handle, 0) + if result == 0: + # Have standard library automatically call `GetLastError()` and + # `FormatMessage()` into a nice exception object :-) + raise WindowsError() +else: + class allow_interrupt(_allow_interrupt): + __doc__ = _allow_interrupt.__doc__ + pass diff --git a/scripts/external_libs/platform/cel59/32bit/zmq/utils/z85.py b/scripts/external_libs/platform/cel59/32bit/zmq/utils/z85.py new file mode 100644 index 00000000..1bb1784e --- /dev/null +++ b/scripts/external_libs/platform/cel59/32bit/zmq/utils/z85.py @@ -0,0 +1,56 @@ +"""Python implementation of Z85 85-bit encoding + +Z85 encoding is a plaintext encoding for a bytestring interpreted as 32bit integers. +Since the chunks are 32bit, a bytestring must be a multiple of 4 bytes. +See ZMQ RFC 32 for details. + + +""" + +# Copyright (C) PyZMQ Developers +# Distributed under the terms of the Modified BSD License. + +import sys +import struct + +PY3 = sys.version_info[0] >= 3 +# Z85CHARS is the base 85 symbol table +Z85CHARS = b"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ.-:+=^!/*?&<>()[]{}@%$#" +# Z85MAP maps integers in [0,84] to the appropriate character in Z85CHARS +Z85MAP = dict([(c, idx) for idx, c in enumerate(Z85CHARS)]) + +_85s = [ 85**i for i in range(5) ][::-1] + +def encode(rawbytes): + """encode raw bytes into Z85""" + # Accepts only byte arrays bounded to 4 bytes + if len(rawbytes) % 4: + raise ValueError("length must be multiple of 4, not %i" % len(rawbytes)) + + nvalues = len(rawbytes) / 4 + + values = struct.unpack('>%dI' % nvalues, rawbytes) + encoded = [] + for v in values: + for offset in _85s: + encoded.append(Z85CHARS[(v // offset) % 85]) + + # In Python 3, encoded is a list of integers (obviously?!) + if PY3: + return bytes(encoded) + else: + return b''.join(encoded) + +def decode(z85bytes): + """decode Z85 bytes to raw bytes""" + if len(z85bytes) % 5: + raise ValueError("Z85 length must be multiple of 5, not %i" % len(z85bytes)) + + nvalues = len(z85bytes) / 5 + values = [] + for i in range(0, len(z85bytes), 5): + value = 0 + for j, offset in enumerate(_85s): + value += Z85MAP[z85bytes[i+j]] * offset + values.append(value) + return struct.pack('>%dI' % nvalues, *values) diff --git a/scripts/external_libs/platform/cel59/32bit/zmq/utils/zmq_compat.h b/scripts/external_libs/platform/cel59/32bit/zmq/utils/zmq_compat.h new file mode 100644 index 00000000..81c57b69 --- /dev/null +++ b/scripts/external_libs/platform/cel59/32bit/zmq/utils/zmq_compat.h @@ -0,0 +1,80 @@ +//----------------------------------------------------------------------------- +// Copyright (c) 2010 Brian Granger, Min Ragan-Kelley +// +// Distributed under the terms of the New BSD License. The full license is in +// the file COPYING.BSD, distributed as part of this software. +//----------------------------------------------------------------------------- + +#if defined(_MSC_VER) +#define pyzmq_int64_t __int64 +#else +#include +#define pyzmq_int64_t int64_t +#endif + + +#include "zmq.h" +// version compatibility for constants: +#include "zmq_constants.h" + +#define _missing (-1) + + +// define fd type (from libzmq's fd.hpp) +#ifdef _WIN32 + #ifdef _MSC_VER && _MSC_VER <= 1400 + #define ZMQ_FD_T UINT_PTR + #else + #define ZMQ_FD_T SOCKET + #endif +#else + #define ZMQ_FD_T int +#endif + +// use unambiguous aliases for zmq_send/recv functions + +#if ZMQ_VERSION_MAJOR >= 4 +// nothing to remove +#else + #define zmq_curve_keypair(z85_public_key, z85_secret_key) _missing +#endif + +#if ZMQ_VERSION_MAJOR >= 4 && ZMQ_VERSION_MINOR >= 1 +// nothing to remove +#else + #define zmq_msg_gets(msg, prop) _missing + #define zmq_has(capability) _missing +#endif + +#if ZMQ_VERSION_MAJOR >= 3 + #define zmq_sendbuf zmq_send + #define zmq_recvbuf zmq_recv + + // 3.x deprecations - these symbols haven't been removed, + // but let's protect against their planned removal + #define zmq_device(device_type, isocket, osocket) _missing + #define zmq_init(io_threads) ((void*)NULL) + #define zmq_term zmq_ctx_destroy +#else + #define zmq_ctx_set(ctx, opt, val) _missing + #define zmq_ctx_get(ctx, opt) _missing + #define zmq_ctx_destroy zmq_term + #define zmq_ctx_new() ((void*)NULL) + + #define zmq_proxy(a,b,c) _missing + + #define zmq_disconnect(s, addr) _missing + #define zmq_unbind(s, addr) _missing + + #define zmq_msg_more(msg) _missing + #define zmq_msg_get(msg, opt) _missing + #define zmq_msg_set(msg, opt, val) _missing + #define zmq_msg_send(msg, s, flags) zmq_send(s, msg, flags) + #define zmq_msg_recv(msg, s, flags) zmq_recv(s, msg, flags) + + #define zmq_sendbuf(s, buf, len, flags) _missing + #define zmq_recvbuf(s, buf, len, flags) _missing + + #define zmq_socket_monitor(s, addr, flags) _missing + +#endif diff --git a/scripts/external_libs/platform/cel59/32bit/zmq/utils/zmq_constants.h b/scripts/external_libs/platform/cel59/32bit/zmq/utils/zmq_constants.h new file mode 100644 index 00000000..97683022 --- /dev/null +++ b/scripts/external_libs/platform/cel59/32bit/zmq/utils/zmq_constants.h @@ -0,0 +1,622 @@ +#ifndef _PYZMQ_CONSTANT_DEFS +#define _PYZMQ_CONSTANT_DEFS + +#define _PYZMQ_UNDEFINED (-9999) +#ifndef ZMQ_VERSION + #define ZMQ_VERSION (_PYZMQ_UNDEFINED) +#endif + +#ifndef ZMQ_VERSION_MAJOR + #define ZMQ_VERSION_MAJOR (_PYZMQ_UNDEFINED) +#endif + +#ifndef ZMQ_VERSION_MINOR + #define ZMQ_VERSION_MINOR (_PYZMQ_UNDEFINED) +#endif + +#ifndef ZMQ_VERSION_PATCH + #define ZMQ_VERSION_PATCH (_PYZMQ_UNDEFINED) +#endif + +#ifndef ZMQ_NOBLOCK + #define ZMQ_NOBLOCK (_PYZMQ_UNDEFINED) +#endif + +#ifndef ZMQ_DONTWAIT + #define ZMQ_DONTWAIT (_PYZMQ_UNDEFINED) +#endif + +#ifndef ZMQ_POLLIN + #define ZMQ_POLLIN (_PYZMQ_UNDEFINED) +#endif + +#ifndef ZMQ_POLLOUT + #define ZMQ_POLLOUT (_PYZMQ_UNDEFINED) +#endif + +#ifndef ZMQ_POLLERR + #define ZMQ_POLLERR (_PYZMQ_UNDEFINED) +#endif + +#ifndef ZMQ_SNDMORE + #define ZMQ_SNDMORE (_PYZMQ_UNDEFINED) +#endif + +#ifndef ZMQ_STREAMER + #define ZMQ_STREAMER (_PYZMQ_UNDEFINED) +#endif + +#ifndef ZMQ_FORWARDER + #define ZMQ_FORWARDER (_PYZMQ_UNDEFINED) +#endif + +#ifndef ZMQ_QUEUE + #define ZMQ_QUEUE (_PYZMQ_UNDEFINED) +#endif + +#ifndef ZMQ_IO_THREADS_DFLT + #define ZMQ_IO_THREADS_DFLT (_PYZMQ_UNDEFINED) +#endif + +#ifndef ZMQ_MAX_SOCKETS_DFLT + #define ZMQ_MAX_SOCKETS_DFLT (_PYZMQ_UNDEFINED) +#endif + +#ifndef ZMQ_POLLITEMS_DFLT + #define ZMQ_POLLITEMS_DFLT (_PYZMQ_UNDEFINED) +#endif + +#ifndef ZMQ_THREAD_PRIORITY_DFLT + #define ZMQ_THREAD_PRIORITY_DFLT (_PYZMQ_UNDEFINED) +#endif + +#ifndef ZMQ_THREAD_SCHED_POLICY_DFLT + #define ZMQ_THREAD_SCHED_POLICY_DFLT (_PYZMQ_UNDEFINED) +#endif + +#ifndef ZMQ_PAIR + #define ZMQ_PAIR (_PYZMQ_UNDEFINED) +#endif + +#ifndef ZMQ_PUB + #define ZMQ_PUB (_PYZMQ_UNDEFINED) +#endif + +#ifndef ZMQ_SUB + #define ZMQ_SUB (_PYZMQ_UNDEFINED) +#endif + +#ifndef ZMQ_REQ + #define ZMQ_REQ (_PYZMQ_UNDEFINED) +#endif + +#ifndef ZMQ_REP + #define ZMQ_REP (_PYZMQ_UNDEFINED) +#endif + +#ifndef ZMQ_DEALER + #define ZMQ_DEALER (_PYZMQ_UNDEFINED) +#endif + +#ifndef ZMQ_ROUTER + #define ZMQ_ROUTER (_PYZMQ_UNDEFINED) +#endif + +#ifndef ZMQ_XREQ + #define ZMQ_XREQ (_PYZMQ_UNDEFINED) +#endif + +#ifndef ZMQ_XREP + #define ZMQ_XREP (_PYZMQ_UNDEFINED) +#endif + +#ifndef ZMQ_PULL + #define ZMQ_PULL (_PYZMQ_UNDEFINED) +#endif + +#ifndef ZMQ_PUSH + #define ZMQ_PUSH (_PYZMQ_UNDEFINED) +#endif + +#ifndef ZMQ_XPUB + #define ZMQ_XPUB (_PYZMQ_UNDEFINED) +#endif + +#ifndef ZMQ_XSUB + #define ZMQ_XSUB (_PYZMQ_UNDEFINED) +#endif + +#ifndef ZMQ_UPSTREAM + #define ZMQ_UPSTREAM (_PYZMQ_UNDEFINED) +#endif + +#ifndef ZMQ_DOWNSTREAM + #define ZMQ_DOWNSTREAM (_PYZMQ_UNDEFINED) +#endif + +#ifndef ZMQ_STREAM + #define ZMQ_STREAM (_PYZMQ_UNDEFINED) +#endif + +#ifndef ZMQ_EVENT_CONNECTED + #define ZMQ_EVENT_CONNECTED (_PYZMQ_UNDEFINED) +#endif + +#ifndef ZMQ_EVENT_CONNECT_DELAYED + #define ZMQ_EVENT_CONNECT_DELAYED (_PYZMQ_UNDEFINED) +#endif + +#ifndef ZMQ_EVENT_CONNECT_RETRIED + #define ZMQ_EVENT_CONNECT_RETRIED (_PYZMQ_UNDEFINED) +#endif + +#ifndef ZMQ_EVENT_LISTENING + #define ZMQ_EVENT_LISTENING (_PYZMQ_UNDEFINED) +#endif + +#ifndef ZMQ_EVENT_BIND_FAILED + #define ZMQ_EVENT_BIND_FAILED (_PYZMQ_UNDEFINED) +#endif + +#ifndef ZMQ_EVENT_ACCEPTED + #define ZMQ_EVENT_ACCEPTED (_PYZMQ_UNDEFINED) +#endif + +#ifndef ZMQ_EVENT_ACCEPT_FAILED + #define ZMQ_EVENT_ACCEPT_FAILED (_PYZMQ_UNDEFINED) +#endif + +#ifndef ZMQ_EVENT_CLOSED + #define ZMQ_EVENT_CLOSED (_PYZMQ_UNDEFINED) +#endif + +#ifndef ZMQ_EVENT_CLOSE_FAILED + #define ZMQ_EVENT_CLOSE_FAILED (_PYZMQ_UNDEFINED) +#endif + +#ifndef ZMQ_EVENT_DISCONNECTED + #define ZMQ_EVENT_DISCONNECTED (_PYZMQ_UNDEFINED) +#endif + +#ifndef ZMQ_EVENT_ALL + #define ZMQ_EVENT_ALL (_PYZMQ_UNDEFINED) +#endif + +#ifndef ZMQ_EVENT_MONITOR_STOPPED + #define ZMQ_EVENT_MONITOR_STOPPED (_PYZMQ_UNDEFINED) +#endif + +#ifndef ZMQ_NULL + #define ZMQ_NULL (_PYZMQ_UNDEFINED) +#endif + +#ifndef ZMQ_PLAIN + #define ZMQ_PLAIN (_PYZMQ_UNDEFINED) +#endif + +#ifndef ZMQ_CURVE + #define ZMQ_CURVE (_PYZMQ_UNDEFINED) +#endif + +#ifndef ZMQ_GSSAPI + #define ZMQ_GSSAPI (_PYZMQ_UNDEFINED) +#endif + +#ifndef EAGAIN + #define EAGAIN (_PYZMQ_UNDEFINED) +#endif + +#ifndef EINVAL + #define EINVAL (_PYZMQ_UNDEFINED) +#endif + +#ifndef EFAULT + #define EFAULT (_PYZMQ_UNDEFINED) +#endif + +#ifndef ENOMEM + #define ENOMEM (_PYZMQ_UNDEFINED) +#endif + +#ifndef ENODEV + #define ENODEV (_PYZMQ_UNDEFINED) +#endif + +#ifndef EMSGSIZE + #define EMSGSIZE (_PYZMQ_UNDEFINED) +#endif + +#ifndef EAFNOSUPPORT + #define EAFNOSUPPORT (_PYZMQ_UNDEFINED) +#endif + +#ifndef ENETUNREACH + #define ENETUNREACH (_PYZMQ_UNDEFINED) +#endif + +#ifndef ECONNABORTED + #define ECONNABORTED (_PYZMQ_UNDEFINED) +#endif + +#ifndef ECONNRESET + #define ECONNRESET (_PYZMQ_UNDEFINED) +#endif + +#ifndef ENOTCONN + #define ENOTCONN (_PYZMQ_UNDEFINED) +#endif + +#ifndef ETIMEDOUT + #define ETIMEDOUT (_PYZMQ_UNDEFINED) +#endif + +#ifndef EHOSTUNREACH + #define EHOSTUNREACH (_PYZMQ_UNDEFINED) +#endif + +#ifndef ENETRESET + #define ENETRESET (_PYZMQ_UNDEFINED) +#endif + +#ifndef ZMQ_HAUSNUMERO + #define ZMQ_HAUSNUMERO (_PYZMQ_UNDEFINED) +#endif + +#ifndef ENOTSUP + #define ENOTSUP (_PYZMQ_UNDEFINED) +#endif + +#ifndef EPROTONOSUPPORT + #define EPROTONOSUPPORT (_PYZMQ_UNDEFINED) +#endif + +#ifndef ENOBUFS + #define ENOBUFS (_PYZMQ_UNDEFINED) +#endif + +#ifndef ENETDOWN + #define ENETDOWN (_PYZMQ_UNDEFINED) +#endif + +#ifndef EADDRINUSE + #define EADDRINUSE (_PYZMQ_UNDEFINED) +#endif + +#ifndef EADDRNOTAVAIL + #define EADDRNOTAVAIL (_PYZMQ_UNDEFINED) +#endif + +#ifndef ECONNREFUSED + #define ECONNREFUSED (_PYZMQ_UNDEFINED) +#endif + +#ifndef EINPROGRESS + #define EINPROGRESS (_PYZMQ_UNDEFINED) +#endif + +#ifndef ENOTSOCK + #define ENOTSOCK (_PYZMQ_UNDEFINED) +#endif + +#ifndef EFSM + #define EFSM (_PYZMQ_UNDEFINED) +#endif + +#ifndef ENOCOMPATPROTO + #define ENOCOMPATPROTO (_PYZMQ_UNDEFINED) +#endif + +#ifndef ETERM + #define ETERM (_PYZMQ_UNDEFINED) +#endif + +#ifndef EMTHREAD + #define EMTHREAD (_PYZMQ_UNDEFINED) +#endif + +#ifndef ZMQ_IO_THREADS + #define ZMQ_IO_THREADS (_PYZMQ_UNDEFINED) +#endif + +#ifndef ZMQ_MAX_SOCKETS + #define ZMQ_MAX_SOCKETS (_PYZMQ_UNDEFINED) +#endif + +#ifndef ZMQ_SOCKET_LIMIT + #define ZMQ_SOCKET_LIMIT (_PYZMQ_UNDEFINED) +#endif + +#ifndef ZMQ_THREAD_PRIORITY + #define ZMQ_THREAD_PRIORITY (_PYZMQ_UNDEFINED) +#endif + +#ifndef ZMQ_THREAD_SCHED_POLICY + #define ZMQ_THREAD_SCHED_POLICY (_PYZMQ_UNDEFINED) +#endif + +#ifndef ZMQ_IDENTITY + #define ZMQ_IDENTITY (_PYZMQ_UNDEFINED) +#endif + +#ifndef ZMQ_SUBSCRIBE + #define ZMQ_SUBSCRIBE (_PYZMQ_UNDEFINED) +#endif + +#ifndef ZMQ_UNSUBSCRIBE + #define ZMQ_UNSUBSCRIBE (_PYZMQ_UNDEFINED) +#endif + +#ifndef ZMQ_LAST_ENDPOINT + #define ZMQ_LAST_ENDPOINT (_PYZMQ_UNDEFINED) +#endif + +#ifndef ZMQ_TCP_ACCEPT_FILTER + #define ZMQ_TCP_ACCEPT_FILTER (_PYZMQ_UNDEFINED) +#endif + +#ifndef ZMQ_PLAIN_USERNAME + #define ZMQ_PLAIN_USERNAME (_PYZMQ_UNDEFINED) +#endif + +#ifndef ZMQ_PLAIN_PASSWORD + #define ZMQ_PLAIN_PASSWORD (_PYZMQ_UNDEFINED) +#endif + +#ifndef ZMQ_CURVE_PUBLICKEY + #define ZMQ_CURVE_PUBLICKEY (_PYZMQ_UNDEFINED) +#endif + +#ifndef ZMQ_CURVE_SECRETKEY + #define ZMQ_CURVE_SECRETKEY (_PYZMQ_UNDEFINED) +#endif + +#ifndef ZMQ_CURVE_SERVERKEY + #define ZMQ_CURVE_SERVERKEY (_PYZMQ_UNDEFINED) +#endif + +#ifndef ZMQ_ZAP_DOMAIN + #define ZMQ_ZAP_DOMAIN (_PYZMQ_UNDEFINED) +#endif + +#ifndef ZMQ_CONNECT_RID + #define ZMQ_CONNECT_RID (_PYZMQ_UNDEFINED) +#endif + +#ifndef ZMQ_GSSAPI_PRINCIPAL + #define ZMQ_GSSAPI_PRINCIPAL (_PYZMQ_UNDEFINED) +#endif + +#ifndef ZMQ_GSSAPI_SERVICE_PRINCIPAL + #define ZMQ_GSSAPI_SERVICE_PRINCIPAL (_PYZMQ_UNDEFINED) +#endif + +#ifndef ZMQ_SOCKS_PROXY + #define ZMQ_SOCKS_PROXY (_PYZMQ_UNDEFINED) +#endif + +#ifndef ZMQ_FD + #define ZMQ_FD (_PYZMQ_UNDEFINED) +#endif + +#ifndef ZMQ_IDENTITY_FD + #define ZMQ_IDENTITY_FD (_PYZMQ_UNDEFINED) +#endif + +#ifndef ZMQ_RECONNECT_IVL_MAX + #define ZMQ_RECONNECT_IVL_MAX (_PYZMQ_UNDEFINED) +#endif + +#ifndef ZMQ_SNDTIMEO + #define ZMQ_SNDTIMEO (_PYZMQ_UNDEFINED) +#endif + +#ifndef ZMQ_RCVTIMEO + #define ZMQ_RCVTIMEO (_PYZMQ_UNDEFINED) +#endif + +#ifndef ZMQ_SNDHWM + #define ZMQ_SNDHWM (_PYZMQ_UNDEFINED) +#endif + +#ifndef ZMQ_RCVHWM + #define ZMQ_RCVHWM (_PYZMQ_UNDEFINED) +#endif + +#ifndef ZMQ_MULTICAST_HOPS + #define ZMQ_MULTICAST_HOPS (_PYZMQ_UNDEFINED) +#endif + +#ifndef ZMQ_IPV4ONLY + #define ZMQ_IPV4ONLY (_PYZMQ_UNDEFINED) +#endif + +#ifndef ZMQ_ROUTER_BEHAVIOR + #define ZMQ_ROUTER_BEHAVIOR (_PYZMQ_UNDEFINED) +#endif + +#ifndef ZMQ_TCP_KEEPALIVE + #define ZMQ_TCP_KEEPALIVE (_PYZMQ_UNDEFINED) +#endif + +#ifndef ZMQ_TCP_KEEPALIVE_CNT + #define ZMQ_TCP_KEEPALIVE_CNT (_PYZMQ_UNDEFINED) +#endif + +#ifndef ZMQ_TCP_KEEPALIVE_IDLE + #define ZMQ_TCP_KEEPALIVE_IDLE (_PYZMQ_UNDEFINED) +#endif + +#ifndef ZMQ_TCP_KEEPALIVE_INTVL + #define ZMQ_TCP_KEEPALIVE_INTVL (_PYZMQ_UNDEFINED) +#endif + +#ifndef ZMQ_DELAY_ATTACH_ON_CONNECT + #define ZMQ_DELAY_ATTACH_ON_CONNECT (_PYZMQ_UNDEFINED) +#endif + +#ifndef ZMQ_XPUB_VERBOSE + #define ZMQ_XPUB_VERBOSE (_PYZMQ_UNDEFINED) +#endif + +#ifndef ZMQ_EVENTS + #define ZMQ_EVENTS (_PYZMQ_UNDEFINED) +#endif + +#ifndef ZMQ_TYPE + #define ZMQ_TYPE (_PYZMQ_UNDEFINED) +#endif + +#ifndef ZMQ_LINGER + #define ZMQ_LINGER (_PYZMQ_UNDEFINED) +#endif + +#ifndef ZMQ_RECONNECT_IVL + #define ZMQ_RECONNECT_IVL (_PYZMQ_UNDEFINED) +#endif + +#ifndef ZMQ_BACKLOG + #define ZMQ_BACKLOG (_PYZMQ_UNDEFINED) +#endif + +#ifndef ZMQ_ROUTER_MANDATORY + #define ZMQ_ROUTER_MANDATORY (_PYZMQ_UNDEFINED) +#endif + +#ifndef ZMQ_FAIL_UNROUTABLE + #define ZMQ_FAIL_UNROUTABLE (_PYZMQ_UNDEFINED) +#endif + +#ifndef ZMQ_ROUTER_RAW + #define ZMQ_ROUTER_RAW (_PYZMQ_UNDEFINED) +#endif + +#ifndef ZMQ_IMMEDIATE + #define ZMQ_IMMEDIATE (_PYZMQ_UNDEFINED) +#endif + +#ifndef ZMQ_IPV6 + #define ZMQ_IPV6 (_PYZMQ_UNDEFINED) +#endif + +#ifndef ZMQ_MECHANISM + #define ZMQ_MECHANISM (_PYZMQ_UNDEFINED) +#endif + +#ifndef ZMQ_PLAIN_SERVER + #define ZMQ_PLAIN_SERVER (_PYZMQ_UNDEFINED) +#endif + +#ifndef ZMQ_CURVE_SERVER + #define ZMQ_CURVE_SERVER (_PYZMQ_UNDEFINED) +#endif + +#ifndef ZMQ_PROBE_ROUTER + #define ZMQ_PROBE_ROUTER (_PYZMQ_UNDEFINED) +#endif + +#ifndef ZMQ_REQ_RELAXED + #define ZMQ_REQ_RELAXED (_PYZMQ_UNDEFINED) +#endif + +#ifndef ZMQ_REQ_CORRELATE + #define ZMQ_REQ_CORRELATE (_PYZMQ_UNDEFINED) +#endif + +#ifndef ZMQ_CONFLATE + #define ZMQ_CONFLATE (_PYZMQ_UNDEFINED) +#endif + +#ifndef ZMQ_ROUTER_HANDOVER + #define ZMQ_ROUTER_HANDOVER (_PYZMQ_UNDEFINED) +#endif + +#ifndef ZMQ_TOS + #define ZMQ_TOS (_PYZMQ_UNDEFINED) +#endif + +#ifndef ZMQ_IPC_FILTER_PID + #define ZMQ_IPC_FILTER_PID (_PYZMQ_UNDEFINED) +#endif + +#ifndef ZMQ_IPC_FILTER_UID + #define ZMQ_IPC_FILTER_UID (_PYZMQ_UNDEFINED) +#endif + +#ifndef ZMQ_IPC_FILTER_GID + #define ZMQ_IPC_FILTER_GID (_PYZMQ_UNDEFINED) +#endif + +#ifndef ZMQ_GSSAPI_SERVER + #define ZMQ_GSSAPI_SERVER (_PYZMQ_UNDEFINED) +#endif + +#ifndef ZMQ_GSSAPI_PLAINTEXT + #define ZMQ_GSSAPI_PLAINTEXT (_PYZMQ_UNDEFINED) +#endif + +#ifndef ZMQ_HANDSHAKE_IVL + #define ZMQ_HANDSHAKE_IVL (_PYZMQ_UNDEFINED) +#endif + +#ifndef ZMQ_XPUB_NODROP + #define ZMQ_XPUB_NODROP (_PYZMQ_UNDEFINED) +#endif + +#ifndef ZMQ_AFFINITY + #define ZMQ_AFFINITY (_PYZMQ_UNDEFINED) +#endif + +#ifndef ZMQ_MAXMSGSIZE + #define ZMQ_MAXMSGSIZE (_PYZMQ_UNDEFINED) +#endif + +#ifndef ZMQ_HWM + #define ZMQ_HWM (_PYZMQ_UNDEFINED) +#endif + +#ifndef ZMQ_SWAP + #define ZMQ_SWAP (_PYZMQ_UNDEFINED) +#endif + +#ifndef ZMQ_MCAST_LOOP + #define ZMQ_MCAST_LOOP (_PYZMQ_UNDEFINED) +#endif + +#ifndef ZMQ_RECOVERY_IVL_MSEC + #define ZMQ_RECOVERY_IVL_MSEC (_PYZMQ_UNDEFINED) +#endif + +#ifndef ZMQ_RATE + #define ZMQ_RATE (_PYZMQ_UNDEFINED) +#endif + +#ifndef ZMQ_RECOVERY_IVL + #define ZMQ_RECOVERY_IVL (_PYZMQ_UNDEFINED) +#endif + +#ifndef ZMQ_SNDBUF + #define ZMQ_SNDBUF (_PYZMQ_UNDEFINED) +#endif + +#ifndef ZMQ_RCVBUF + #define ZMQ_RCVBUF (_PYZMQ_UNDEFINED) +#endif + +#ifndef ZMQ_RCVMORE + #define ZMQ_RCVMORE (_PYZMQ_UNDEFINED) +#endif + +#ifndef ZMQ_MORE + #define ZMQ_MORE (_PYZMQ_UNDEFINED) +#endif + +#ifndef ZMQ_SRCFD + #define ZMQ_SRCFD (_PYZMQ_UNDEFINED) +#endif + +#ifndef ZMQ_SHARED + #define ZMQ_SHARED (_PYZMQ_UNDEFINED) +#endif + + +#endif // ifndef _PYZMQ_CONSTANT_DEFS -- 2.16.6