laag-libzmq 4.2.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (792) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +57 -0
  3. data/LICENSE.txt +181 -0
  4. data/README.org +34 -0
  5. data/ext/laag/libzmq/extconf.rb +22 -0
  6. data/laag-libzmq.gemspec +21 -0
  7. data/lib/laag/libzmq.rb +31 -0
  8. data/vendor/github.com/zeromq/libzmq/.github/PULL_REQUEST_TEMPLATE.md +28 -0
  9. data/vendor/github.com/zeromq/libzmq/.github/issue_template.md +22 -0
  10. data/vendor/github.com/zeromq/libzmq/.gitignore +180 -0
  11. data/vendor/github.com/zeromq/libzmq/.hgeol +2 -0
  12. data/vendor/github.com/zeromq/libzmq/.mailmap +81 -0
  13. data/vendor/github.com/zeromq/libzmq/.travis.yml +115 -0
  14. data/vendor/github.com/zeromq/libzmq/AUTHORS +151 -0
  15. data/vendor/github.com/zeromq/libzmq/CMakeLists.txt +1104 -0
  16. data/vendor/github.com/zeromq/libzmq/COPYING +674 -0
  17. data/vendor/github.com/zeromq/libzmq/COPYING.LESSER +181 -0
  18. data/vendor/github.com/zeromq/libzmq/Dockerfile +11 -0
  19. data/vendor/github.com/zeromq/libzmq/Doxygen.cfg +2320 -0
  20. data/vendor/github.com/zeromq/libzmq/FindSodium.cmake +40 -0
  21. data/vendor/github.com/zeromq/libzmq/INSTALL +311 -0
  22. data/vendor/github.com/zeromq/libzmq/Jenkinsfile +369 -0
  23. data/vendor/github.com/zeromq/libzmq/Makefile.am +908 -0
  24. data/vendor/github.com/zeromq/libzmq/NEWS +1582 -0
  25. data/vendor/github.com/zeromq/libzmq/README.cygwin.md +15 -0
  26. data/vendor/github.com/zeromq/libzmq/README.doxygen.md +48 -0
  27. data/vendor/github.com/zeromq/libzmq/README.md +102 -0
  28. data/vendor/github.com/zeromq/libzmq/RELICENSE/AndreLouisCaron.md +15 -0
  29. data/vendor/github.com/zeromq/libzmq/RELICENSE/Asmod4n.md +13 -0
  30. data/vendor/github.com/zeromq/libzmq/RELICENSE/BerndPrager.md +13 -0
  31. data/vendor/github.com/zeromq/libzmq/RELICENSE/Bklyn.md +15 -0
  32. data/vendor/github.com/zeromq/libzmq/RELICENSE/BrianBuchanan.md +15 -0
  33. data/vendor/github.com/zeromq/libzmq/RELICENSE/ChuckRemes.md +15 -0
  34. data/vendor/github.com/zeromq/libzmq/RELICENSE/FrancoFichtner.md +15 -0
  35. data/vendor/github.com/zeromq/libzmq/RELICENSE/GavinMcNiff.md +15 -0
  36. data/vendor/github.com/zeromq/libzmq/RELICENSE/GhislainPutois.md +15 -0
  37. data/vendor/github.com/zeromq/libzmq/RELICENSE/GiuseppeCorbelli.md +15 -0
  38. data/vendor/github.com/zeromq/libzmq/RELICENSE/HaraldAchitz.md +17 -0
  39. data/vendor/github.com/zeromq/libzmq/RELICENSE/Hugne.md +17 -0
  40. data/vendor/github.com/zeromq/libzmq/RELICENSE/JimHague.md +16 -0
  41. data/vendor/github.com/zeromq/libzmq/RELICENSE/JohanMabille.md +16 -0
  42. data/vendor/github.com/zeromq/libzmq/RELICENSE/LeonardMichelet +14 -0
  43. data/vendor/github.com/zeromq/libzmq/RELICENSE/LeonardoConsoni.md +15 -0
  44. data/vendor/github.com/zeromq/libzmq/RELICENSE/LionelOrry.md +15 -0
  45. data/vendor/github.com/zeromq/libzmq/RELICENSE/OsirisPedroso.md +15 -0
  46. data/vendor/github.com/zeromq/libzmq/RELICENSE/README.md +23 -0
  47. data/vendor/github.com/zeromq/libzmq/RELICENSE/RobGagnon.md +13 -0
  48. data/vendor/github.com/zeromq/libzmq/RELICENSE/SebastienRombauts.md +15 -0
  49. data/vendor/github.com/zeromq/libzmq/RELICENSE/StoianIvanov.md +15 -0
  50. data/vendor/github.com/zeromq/libzmq/RELICENSE/SylvainCorlay.md +16 -0
  51. data/vendor/github.com/zeromq/libzmq/RELICENSE/TimotheeBesset.md +15 -0
  52. data/vendor/github.com/zeromq/libzmq/RELICENSE/VincentTellier.md +15 -0
  53. data/vendor/github.com/zeromq/libzmq/RELICENSE/VolodymyrKorniichuk.md +15 -0
  54. data/vendor/github.com/zeromq/libzmq/RELICENSE/abbradar.md +16 -0
  55. data/vendor/github.com/zeromq/libzmq/RELICENSE/agronholm.md +15 -0
  56. data/vendor/github.com/zeromq/libzmq/RELICENSE/amuraru.md +15 -0
  57. data/vendor/github.com/zeromq/libzmq/RELICENSE/arsenm.md +15 -0
  58. data/vendor/github.com/zeromq/libzmq/RELICENSE/aseering.md +15 -0
  59. data/vendor/github.com/zeromq/libzmq/RELICENSE/bjorntopel.md +16 -0
  60. data/vendor/github.com/zeromq/libzmq/RELICENSE/bjovke.md +16 -0
  61. data/vendor/github.com/zeromq/libzmq/RELICENSE/brocade_communications_systems.md +15 -0
  62. data/vendor/github.com/zeromq/libzmq/RELICENSE/brunobodin.md +13 -0
  63. data/vendor/github.com/zeromq/libzmq/RELICENSE/c-rack.md +15 -0
  64. data/vendor/github.com/zeromq/libzmq/RELICENSE/camachat.md +15 -0
  65. data/vendor/github.com/zeromq/libzmq/RELICENSE/cdolan.md +15 -0
  66. data/vendor/github.com/zeromq/libzmq/RELICENSE/chrisstaite.md +14 -0
  67. data/vendor/github.com/zeromq/libzmq/RELICENSE/chugga_fan.md +15 -0
  68. data/vendor/github.com/zeromq/libzmq/RELICENSE/cjuniet.md +15 -0
  69. data/vendor/github.com/zeromq/libzmq/RELICENSE/ckamm.md +15 -0
  70. data/vendor/github.com/zeromq/libzmq/RELICENSE/clkao.md +15 -0
  71. data/vendor/github.com/zeromq/libzmq/RELICENSE/danielhtshih.md +15 -0
  72. data/vendor/github.com/zeromq/libzmq/RELICENSE/danriegsecker.md +16 -0
  73. data/vendor/github.com/zeromq/libzmq/RELICENSE/dfons.md +16 -0
  74. data/vendor/github.com/zeromq/libzmq/RELICENSE/djelenc.md +15 -0
  75. data/vendor/github.com/zeromq/libzmq/RELICENSE/drodri.md +15 -0
  76. data/vendor/github.com/zeromq/libzmq/RELICENSE/eburkitt.md +15 -0
  77. data/vendor/github.com/zeromq/libzmq/RELICENSE/egomotion.md +16 -0
  78. data/vendor/github.com/zeromq/libzmq/RELICENSE/evoskuil.md +15 -0
  79. data/vendor/github.com/zeromq/libzmq/RELICENSE/febeling.md +16 -0
  80. data/vendor/github.com/zeromq/libzmq/RELICENSE/fidlej.md +15 -0
  81. data/vendor/github.com/zeromq/libzmq/RELICENSE/flub.md +14 -0
  82. data/vendor/github.com/zeromq/libzmq/RELICENSE/gena-moscow.md +15 -0
  83. data/vendor/github.com/zeromq/libzmq/RELICENSE/gonzus.md +15 -0
  84. data/vendor/github.com/zeromq/libzmq/RELICENSE/goodfella_ltd.md +13 -0
  85. data/vendor/github.com/zeromq/libzmq/RELICENSE/google.md +13 -0
  86. data/vendor/github.com/zeromq/libzmq/RELICENSE/ianbarber.md +15 -0
  87. data/vendor/github.com/zeromq/libzmq/RELICENSE/imatix.md +23 -0
  88. data/vendor/github.com/zeromq/libzmq/RELICENSE/jakecobb.md +13 -0
  89. data/vendor/github.com/zeromq/libzmq/RELICENSE/jemc.md +15 -0
  90. data/vendor/github.com/zeromq/libzmq/RELICENSE/jimklimov.md +17 -0
  91. data/vendor/github.com/zeromq/libzmq/RELICENSE/jkryl.md +15 -0
  92. data/vendor/github.com/zeromq/libzmq/RELICENSE/johntconklin.md +15 -0
  93. data/vendor/github.com/zeromq/libzmq/RELICENSE/jruffin.md +14 -0
  94. data/vendor/github.com/zeromq/libzmq/RELICENSE/kentzo.md +15 -0
  95. data/vendor/github.com/zeromq/libzmq/RELICENSE/kevinsapper.md +13 -0
  96. data/vendor/github.com/zeromq/libzmq/RELICENSE/kobolog.md +12 -0
  97. data/vendor/github.com/zeromq/libzmq/RELICENSE/kurdybacha.md +15 -0
  98. data/vendor/github.com/zeromq/libzmq/RELICENSE/linville.md +15 -0
  99. data/vendor/github.com/zeromq/libzmq/RELICENSE/loachfish.md +15 -0
  100. data/vendor/github.com/zeromq/libzmq/RELICENSE/lodagro.md +15 -0
  101. data/vendor/github.com/zeromq/libzmq/RELICENSE/madebr.md +15 -0
  102. data/vendor/github.com/zeromq/libzmq/RELICENSE/mattconnolly.md +15 -0
  103. data/vendor/github.com/zeromq/libzmq/RELICENSE/mauri-melato.md +13 -0
  104. data/vendor/github.com/zeromq/libzmq/RELICENSE/mditzel.md +15 -0
  105. data/vendor/github.com/zeromq/libzmq/RELICENSE/meox.md +15 -0
  106. data/vendor/github.com/zeromq/libzmq/RELICENSE/michael-fox.md +16 -0
  107. data/vendor/github.com/zeromq/libzmq/RELICENSE/michicc.md +15 -0
  108. data/vendor/github.com/zeromq/libzmq/RELICENSE/minrk.md +15 -0
  109. data/vendor/github.com/zeromq/libzmq/RELICENSE/mipaaa.md +15 -0
  110. data/vendor/github.com/zeromq/libzmq/RELICENSE/mkluwe.md +15 -0
  111. data/vendor/github.com/zeromq/libzmq/RELICENSE/montoyaedu.md +15 -0
  112. data/vendor/github.com/zeromq/libzmq/RELICENSE/naos_ltd.md +19 -0
  113. data/vendor/github.com/zeromq/libzmq/RELICENSE/natano.md +15 -0
  114. data/vendor/github.com/zeromq/libzmq/RELICENSE/olafmandel.md +13 -0
  115. data/vendor/github.com/zeromq/libzmq/RELICENSE/pijyoi.md +13 -0
  116. data/vendor/github.com/zeromq/libzmq/RELICENSE/ptroja.md +14 -0
  117. data/vendor/github.com/zeromq/libzmq/RELICENSE/reunanen.md +15 -0
  118. data/vendor/github.com/zeromq/libzmq/RELICENSE/reza-ebrahimi.md +15 -0
  119. data/vendor/github.com/zeromq/libzmq/RELICENSE/rikvdh.md +15 -0
  120. data/vendor/github.com/zeromq/libzmq/RELICENSE/rlenferink.md +15 -0
  121. data/vendor/github.com/zeromq/libzmq/RELICENSE/roalz.md +13 -0
  122. data/vendor/github.com/zeromq/libzmq/RELICENSE/rodgert.md +17 -0
  123. data/vendor/github.com/zeromq/libzmq/RELICENSE/rotty.md +16 -0
  124. data/vendor/github.com/zeromq/libzmq/RELICENSE/sabae.md +15 -0
  125. data/vendor/github.com/zeromq/libzmq/RELICENSE/scemama.md +15 -0
  126. data/vendor/github.com/zeromq/libzmq/RELICENSE/sheremetyev.md +13 -0
  127. data/vendor/github.com/zeromq/libzmq/RELICENSE/shripchenko.md +15 -0
  128. data/vendor/github.com/zeromq/libzmq/RELICENSE/sigiesec.md +17 -0
  129. data/vendor/github.com/zeromq/libzmq/RELICENSE/soulik.md +15 -0
  130. data/vendor/github.com/zeromq/libzmq/RELICENSE/swansontec.md +15 -0
  131. data/vendor/github.com/zeromq/libzmq/RELICENSE/t-b.md +15 -0
  132. data/vendor/github.com/zeromq/libzmq/RELICENSE/tSed.md +15 -0
  133. data/vendor/github.com/zeromq/libzmq/RELICENSE/tabe.md +15 -0
  134. data/vendor/github.com/zeromq/libzmq/RELICENSE/tailhook.md +16 -0
  135. data/vendor/github.com/zeromq/libzmq/RELICENSE/taotetek.md +13 -0
  136. data/vendor/github.com/zeromq/libzmq/RELICENSE/templates/relicense-template-mplv2-any-osi.txt +15 -0
  137. data/vendor/github.com/zeromq/libzmq/RELICENSE/templates/relicense-template-mplv2-share-alike-osi.txt +15 -0
  138. data/vendor/github.com/zeromq/libzmq/RELICENSE/templates/relicense-template-mplv2.txt +13 -0
  139. data/vendor/github.com/zeromq/libzmq/RELICENSE/thompsa.md +15 -0
  140. data/vendor/github.com/zeromq/libzmq/RELICENSE/torehalvorsen.md +15 -0
  141. data/vendor/github.com/zeromq/libzmq/RELICENSE/twhittock.md +15 -0
  142. data/vendor/github.com/zeromq/libzmq/RELICENSE/ulikoehler.md +16 -0
  143. data/vendor/github.com/zeromq/libzmq/RELICENSE/vyskocilm.md +7 -0
  144. data/vendor/github.com/zeromq/libzmq/RELICENSE/willstrang.md +15 -0
  145. data/vendor/github.com/zeromq/libzmq/RELICENSE/xaqq.md +13 -0
  146. data/vendor/github.com/zeromq/libzmq/RELICENSE/yuvallanger.md +15 -0
  147. data/vendor/github.com/zeromq/libzmq/ZeroMQConfig.cmake.in +25 -0
  148. data/vendor/github.com/zeromq/libzmq/acinclude.m4 +1122 -0
  149. data/vendor/github.com/zeromq/libzmq/appveyor.yml +97 -0
  150. data/vendor/github.com/zeromq/libzmq/autogen.sh +49 -0
  151. data/vendor/github.com/zeromq/libzmq/branding.bmp +0 -0
  152. data/vendor/github.com/zeromq/libzmq/builds/Makefile.am +31 -0
  153. data/vendor/github.com/zeromq/libzmq/builds/README +4 -0
  154. data/vendor/github.com/zeromq/libzmq/builds/android/Dockerfile +22 -0
  155. data/vendor/github.com/zeromq/libzmq/builds/android/README.md +78 -0
  156. data/vendor/github.com/zeromq/libzmq/builds/android/android_build_helper.sh +316 -0
  157. data/vendor/github.com/zeromq/libzmq/builds/android/build.sh +70 -0
  158. data/vendor/github.com/zeromq/libzmq/builds/android/ci_build.sh +30 -0
  159. data/vendor/github.com/zeromq/libzmq/builds/cmake/Modules/FindAsciiDoc.cmake +26 -0
  160. data/vendor/github.com/zeromq/libzmq/builds/cmake/Modules/TestZMQVersion.cmake +8 -0
  161. data/vendor/github.com/zeromq/libzmq/builds/cmake/Modules/ZMQSourceRunChecks.cmake +301 -0
  162. data/vendor/github.com/zeromq/libzmq/builds/cmake/NSIS.template32.in +952 -0
  163. data/vendor/github.com/zeromq/libzmq/builds/cmake/NSIS.template64.in +960 -0
  164. data/vendor/github.com/zeromq/libzmq/builds/cmake/ci_build.sh +34 -0
  165. data/vendor/github.com/zeromq/libzmq/builds/cmake/platform.hpp.in +104 -0
  166. data/vendor/github.com/zeromq/libzmq/builds/coverage/ci_build.sh +32 -0
  167. data/vendor/github.com/zeromq/libzmq/builds/cygwin/Makefile.cygwin +48 -0
  168. data/vendor/github.com/zeromq/libzmq/builds/gyp/.gitignore +5 -0
  169. data/vendor/github.com/zeromq/libzmq/builds/gyp/build.bat +4 -0
  170. data/vendor/github.com/zeromq/libzmq/builds/gyp/platform.hpp +80 -0
  171. data/vendor/github.com/zeromq/libzmq/builds/gyp/project-tests.gsl +19 -0
  172. data/vendor/github.com/zeromq/libzmq/builds/gyp/project-tests.gypi +895 -0
  173. data/vendor/github.com/zeromq/libzmq/builds/gyp/project-tests.xml +83 -0
  174. data/vendor/github.com/zeromq/libzmq/builds/gyp/project.gyp +295 -0
  175. data/vendor/github.com/zeromq/libzmq/builds/mingw32/Makefile.mingw32 +49 -0
  176. data/vendor/github.com/zeromq/libzmq/builds/mingw32/platform.hpp +43 -0
  177. data/vendor/github.com/zeromq/libzmq/builds/msvc/.gitignore +256 -0
  178. data/vendor/github.com/zeromq/libzmq/builds/msvc/Makefile.am +94 -0
  179. data/vendor/github.com/zeromq/libzmq/builds/msvc/build/build.bat +33 -0
  180. data/vendor/github.com/zeromq/libzmq/builds/msvc/build/buildall.bat +16 -0
  181. data/vendor/github.com/zeromq/libzmq/builds/msvc/build/buildbase.bat +73 -0
  182. data/vendor/github.com/zeromq/libzmq/builds/msvc/errno.cpp +32 -0
  183. data/vendor/github.com/zeromq/libzmq/builds/msvc/errno.hpp +56 -0
  184. data/vendor/github.com/zeromq/libzmq/builds/msvc/platform.hpp +14 -0
  185. data/vendor/github.com/zeromq/libzmq/builds/msvc/properties/Common.props +21 -0
  186. data/vendor/github.com/zeromq/libzmq/builds/msvc/properties/DLL.props +16 -0
  187. data/vendor/github.com/zeromq/libzmq/builds/msvc/properties/Debug.props +29 -0
  188. data/vendor/github.com/zeromq/libzmq/builds/msvc/properties/DebugDEXE.props +21 -0
  189. data/vendor/github.com/zeromq/libzmq/builds/msvc/properties/DebugDLL.props +20 -0
  190. data/vendor/github.com/zeromq/libzmq/builds/msvc/properties/DebugLEXE.props +20 -0
  191. data/vendor/github.com/zeromq/libzmq/builds/msvc/properties/DebugLIB.props +21 -0
  192. data/vendor/github.com/zeromq/libzmq/builds/msvc/properties/DebugLTCG.props +20 -0
  193. data/vendor/github.com/zeromq/libzmq/builds/msvc/properties/DebugSEXE.props +21 -0
  194. data/vendor/github.com/zeromq/libzmq/builds/msvc/properties/EXE.props +17 -0
  195. data/vendor/github.com/zeromq/libzmq/builds/msvc/properties/LIB.props +16 -0
  196. data/vendor/github.com/zeromq/libzmq/builds/msvc/properties/LTCG.props +13 -0
  197. data/vendor/github.com/zeromq/libzmq/builds/msvc/properties/Link.props +21 -0
  198. data/vendor/github.com/zeromq/libzmq/builds/msvc/properties/Messages.props +15 -0
  199. data/vendor/github.com/zeromq/libzmq/builds/msvc/properties/Output.props +30 -0
  200. data/vendor/github.com/zeromq/libzmq/builds/msvc/properties/Release.props +41 -0
  201. data/vendor/github.com/zeromq/libzmq/builds/msvc/properties/ReleaseDEXE.props +20 -0
  202. data/vendor/github.com/zeromq/libzmq/builds/msvc/properties/ReleaseDLL.props +19 -0
  203. data/vendor/github.com/zeromq/libzmq/builds/msvc/properties/ReleaseLEXE.props +20 -0
  204. data/vendor/github.com/zeromq/libzmq/builds/msvc/properties/ReleaseLIB.props +19 -0
  205. data/vendor/github.com/zeromq/libzmq/builds/msvc/properties/ReleaseLTCG.props +19 -0
  206. data/vendor/github.com/zeromq/libzmq/builds/msvc/properties/ReleaseSEXE.props +20 -0
  207. data/vendor/github.com/zeromq/libzmq/builds/msvc/properties/Win32.props +20 -0
  208. data/vendor/github.com/zeromq/libzmq/builds/msvc/properties/x64.props +23 -0
  209. data/vendor/github.com/zeromq/libzmq/builds/msvc/readme.txt +27 -0
  210. data/vendor/github.com/zeromq/libzmq/builds/msvc/resource.h +14 -0
  211. data/vendor/github.com/zeromq/libzmq/builds/msvc/resource.rc +0 -0
  212. data/vendor/github.com/zeromq/libzmq/builds/msvc/vs2008/inproc_lat/inproc_lat.vcproj +52 -0
  213. data/vendor/github.com/zeromq/libzmq/builds/msvc/vs2008/inproc_thr/inproc_thr.vcproj +52 -0
  214. data/vendor/github.com/zeromq/libzmq/builds/msvc/vs2008/libzmq.sln +95 -0
  215. data/vendor/github.com/zeromq/libzmq/builds/msvc/vs2008/libzmq/libzmq.vcproj +338 -0
  216. data/vendor/github.com/zeromq/libzmq/builds/msvc/vs2008/local_lat/local_lat.vcproj +52 -0
  217. data/vendor/github.com/zeromq/libzmq/builds/msvc/vs2008/local_thr/local_thr.vcproj +52 -0
  218. data/vendor/github.com/zeromq/libzmq/builds/msvc/vs2008/remote_lat/remote_lat.vcproj +52 -0
  219. data/vendor/github.com/zeromq/libzmq/builds/msvc/vs2008/remote_thr/remote_thr.vcproj +52 -0
  220. data/vendor/github.com/zeromq/libzmq/builds/msvc/vs2010/inproc_lat/inproc_lat.props +49 -0
  221. data/vendor/github.com/zeromq/libzmq/builds/msvc/vs2010/inproc_lat/inproc_lat.vcxproj +82 -0
  222. data/vendor/github.com/zeromq/libzmq/builds/msvc/vs2010/inproc_thr/inproc_thr.props +49 -0
  223. data/vendor/github.com/zeromq/libzmq/builds/msvc/vs2010/inproc_thr/inproc_thr.vcxproj +82 -0
  224. data/vendor/github.com/zeromq/libzmq/builds/msvc/vs2010/libsodium.import.props +52 -0
  225. data/vendor/github.com/zeromq/libzmq/builds/msvc/vs2010/libsodium.import.xml +17 -0
  226. data/vendor/github.com/zeromq/libzmq/builds/msvc/vs2010/libzmq.import.props +64 -0
  227. data/vendor/github.com/zeromq/libzmq/builds/msvc/vs2010/libzmq.import.xml +49 -0
  228. data/vendor/github.com/zeromq/libzmq/builds/msvc/vs2010/libzmq.sln +206 -0
  229. data/vendor/github.com/zeromq/libzmq/builds/msvc/vs2010/libzmq/libzmq.props +76 -0
  230. data/vendor/github.com/zeromq/libzmq/builds/msvc/vs2010/libzmq/libzmq.vcxproj +289 -0
  231. data/vendor/github.com/zeromq/libzmq/builds/msvc/vs2010/libzmq/libzmq.vcxproj.filters +627 -0
  232. data/vendor/github.com/zeromq/libzmq/builds/msvc/vs2010/libzmq/libzmq.xml +40 -0
  233. data/vendor/github.com/zeromq/libzmq/builds/msvc/vs2010/local_lat/local_lat.props +49 -0
  234. data/vendor/github.com/zeromq/libzmq/builds/msvc/vs2010/local_lat/local_lat.vcxproj +82 -0
  235. data/vendor/github.com/zeromq/libzmq/builds/msvc/vs2010/local_thr/local_thr.props +49 -0
  236. data/vendor/github.com/zeromq/libzmq/builds/msvc/vs2010/local_thr/local_thr.vcxproj +82 -0
  237. data/vendor/github.com/zeromq/libzmq/builds/msvc/vs2010/remote_lat/remote_lat.props +49 -0
  238. data/vendor/github.com/zeromq/libzmq/builds/msvc/vs2010/remote_lat/remote_lat.vcxproj +82 -0
  239. data/vendor/github.com/zeromq/libzmq/builds/msvc/vs2010/remote_thr/remote_thr.props +49 -0
  240. data/vendor/github.com/zeromq/libzmq/builds/msvc/vs2010/remote_thr/remote_thr.vcxproj +82 -0
  241. data/vendor/github.com/zeromq/libzmq/builds/msvc/vs2012/inproc_lat/inproc_lat.props +49 -0
  242. data/vendor/github.com/zeromq/libzmq/builds/msvc/vs2012/inproc_lat/inproc_lat.vcxproj +82 -0
  243. data/vendor/github.com/zeromq/libzmq/builds/msvc/vs2012/inproc_thr/inproc_thr.props +49 -0
  244. data/vendor/github.com/zeromq/libzmq/builds/msvc/vs2012/inproc_thr/inproc_thr.vcxproj +82 -0
  245. data/vendor/github.com/zeromq/libzmq/builds/msvc/vs2012/libsodium.import.props +52 -0
  246. data/vendor/github.com/zeromq/libzmq/builds/msvc/vs2012/libsodium.import.xml +17 -0
  247. data/vendor/github.com/zeromq/libzmq/builds/msvc/vs2012/libzmq.import.props +64 -0
  248. data/vendor/github.com/zeromq/libzmq/builds/msvc/vs2012/libzmq.import.xml +49 -0
  249. data/vendor/github.com/zeromq/libzmq/builds/msvc/vs2012/libzmq.sln +206 -0
  250. data/vendor/github.com/zeromq/libzmq/builds/msvc/vs2012/libzmq/libzmq.props +76 -0
  251. data/vendor/github.com/zeromq/libzmq/builds/msvc/vs2012/libzmq/libzmq.vcxproj +289 -0
  252. data/vendor/github.com/zeromq/libzmq/builds/msvc/vs2012/libzmq/libzmq.vcxproj.filters +627 -0
  253. data/vendor/github.com/zeromq/libzmq/builds/msvc/vs2012/libzmq/libzmq.xml +40 -0
  254. data/vendor/github.com/zeromq/libzmq/builds/msvc/vs2012/local_lat/local_lat.props +49 -0
  255. data/vendor/github.com/zeromq/libzmq/builds/msvc/vs2012/local_lat/local_lat.vcxproj +82 -0
  256. data/vendor/github.com/zeromq/libzmq/builds/msvc/vs2012/local_thr/local_thr.props +49 -0
  257. data/vendor/github.com/zeromq/libzmq/builds/msvc/vs2012/local_thr/local_thr.vcxproj +82 -0
  258. data/vendor/github.com/zeromq/libzmq/builds/msvc/vs2012/remote_lat/remote_lat.props +49 -0
  259. data/vendor/github.com/zeromq/libzmq/builds/msvc/vs2012/remote_lat/remote_lat.vcxproj +82 -0
  260. data/vendor/github.com/zeromq/libzmq/builds/msvc/vs2012/remote_thr/remote_thr.props +49 -0
  261. data/vendor/github.com/zeromq/libzmq/builds/msvc/vs2012/remote_thr/remote_thr.vcxproj +82 -0
  262. data/vendor/github.com/zeromq/libzmq/builds/msvc/vs2013/inproc_lat/inproc_lat.props +49 -0
  263. data/vendor/github.com/zeromq/libzmq/builds/msvc/vs2013/inproc_lat/inproc_lat.vcxproj +82 -0
  264. data/vendor/github.com/zeromq/libzmq/builds/msvc/vs2013/inproc_thr/inproc_thr.props +49 -0
  265. data/vendor/github.com/zeromq/libzmq/builds/msvc/vs2013/inproc_thr/inproc_thr.vcxproj +82 -0
  266. data/vendor/github.com/zeromq/libzmq/builds/msvc/vs2013/libsodium.import.props +52 -0
  267. data/vendor/github.com/zeromq/libzmq/builds/msvc/vs2013/libsodium.import.xml +17 -0
  268. data/vendor/github.com/zeromq/libzmq/builds/msvc/vs2013/libzmq.import.props +64 -0
  269. data/vendor/github.com/zeromq/libzmq/builds/msvc/vs2013/libzmq.import.xml +49 -0
  270. data/vendor/github.com/zeromq/libzmq/builds/msvc/vs2013/libzmq.sln +208 -0
  271. data/vendor/github.com/zeromq/libzmq/builds/msvc/vs2013/libzmq/libzmq.props +76 -0
  272. data/vendor/github.com/zeromq/libzmq/builds/msvc/vs2013/libzmq/libzmq.vcxproj +289 -0
  273. data/vendor/github.com/zeromq/libzmq/builds/msvc/vs2013/libzmq/libzmq.vcxproj.filters +627 -0
  274. data/vendor/github.com/zeromq/libzmq/builds/msvc/vs2013/libzmq/libzmq.xml +40 -0
  275. data/vendor/github.com/zeromq/libzmq/builds/msvc/vs2013/local_lat/local_lat.props +49 -0
  276. data/vendor/github.com/zeromq/libzmq/builds/msvc/vs2013/local_lat/local_lat.vcxproj +82 -0
  277. data/vendor/github.com/zeromq/libzmq/builds/msvc/vs2013/local_thr/local_thr.props +49 -0
  278. data/vendor/github.com/zeromq/libzmq/builds/msvc/vs2013/local_thr/local_thr.vcxproj +82 -0
  279. data/vendor/github.com/zeromq/libzmq/builds/msvc/vs2013/remote_lat/remote_lat.props +49 -0
  280. data/vendor/github.com/zeromq/libzmq/builds/msvc/vs2013/remote_lat/remote_lat.vcxproj +82 -0
  281. data/vendor/github.com/zeromq/libzmq/builds/msvc/vs2013/remote_thr/remote_thr.props +49 -0
  282. data/vendor/github.com/zeromq/libzmq/builds/msvc/vs2013/remote_thr/remote_thr.vcxproj +82 -0
  283. data/vendor/github.com/zeromq/libzmq/builds/msvc/vs2015/inproc_lat/inproc_lat.props +49 -0
  284. data/vendor/github.com/zeromq/libzmq/builds/msvc/vs2015/inproc_lat/inproc_lat.vcxproj +82 -0
  285. data/vendor/github.com/zeromq/libzmq/builds/msvc/vs2015/inproc_thr/inproc_thr.props +49 -0
  286. data/vendor/github.com/zeromq/libzmq/builds/msvc/vs2015/inproc_thr/inproc_thr.vcxproj +82 -0
  287. data/vendor/github.com/zeromq/libzmq/builds/msvc/vs2015/libsodium.import.props +52 -0
  288. data/vendor/github.com/zeromq/libzmq/builds/msvc/vs2015/libsodium.import.xml +17 -0
  289. data/vendor/github.com/zeromq/libzmq/builds/msvc/vs2015/libzmq.import.props +64 -0
  290. data/vendor/github.com/zeromq/libzmq/builds/msvc/vs2015/libzmq.import.xml +49 -0
  291. data/vendor/github.com/zeromq/libzmq/builds/msvc/vs2015/libzmq.sln +208 -0
  292. data/vendor/github.com/zeromq/libzmq/builds/msvc/vs2015/libzmq/libzmq.props +76 -0
  293. data/vendor/github.com/zeromq/libzmq/builds/msvc/vs2015/libzmq/libzmq.vcxproj +289 -0
  294. data/vendor/github.com/zeromq/libzmq/builds/msvc/vs2015/libzmq/libzmq.vcxproj.filters +627 -0
  295. data/vendor/github.com/zeromq/libzmq/builds/msvc/vs2015/libzmq/libzmq.xml +40 -0
  296. data/vendor/github.com/zeromq/libzmq/builds/msvc/vs2015/local_lat/local_lat.props +49 -0
  297. data/vendor/github.com/zeromq/libzmq/builds/msvc/vs2015/local_lat/local_lat.vcxproj +82 -0
  298. data/vendor/github.com/zeromq/libzmq/builds/msvc/vs2015/local_thr/local_thr.props +49 -0
  299. data/vendor/github.com/zeromq/libzmq/builds/msvc/vs2015/local_thr/local_thr.vcxproj +82 -0
  300. data/vendor/github.com/zeromq/libzmq/builds/msvc/vs2015/remote_lat/remote_lat.props +49 -0
  301. data/vendor/github.com/zeromq/libzmq/builds/msvc/vs2015/remote_lat/remote_lat.vcxproj +82 -0
  302. data/vendor/github.com/zeromq/libzmq/builds/msvc/vs2015/remote_thr/remote_thr.props +49 -0
  303. data/vendor/github.com/zeromq/libzmq/builds/msvc/vs2015/remote_thr/remote_thr.vcxproj +82 -0
  304. data/vendor/github.com/zeromq/libzmq/builds/msvc/vs2015_xp/libzmq.vcxproj +258 -0
  305. data/vendor/github.com/zeromq/libzmq/builds/msvc/vs2015_xp/platform.hpp +15 -0
  306. data/vendor/github.com/zeromq/libzmq/builds/msvc/vs2015_xp/test_zmq/test_multithread.cpp +229 -0
  307. data/vendor/github.com/zeromq/libzmq/builds/msvc/vs2015_xp/test_zmq/test_zmq.vcxproj +155 -0
  308. data/vendor/github.com/zeromq/libzmq/builds/msvc/vs2017/inproc_lat/inproc_lat.props +49 -0
  309. data/vendor/github.com/zeromq/libzmq/builds/msvc/vs2017/inproc_lat/inproc_lat.vcxproj +82 -0
  310. data/vendor/github.com/zeromq/libzmq/builds/msvc/vs2017/inproc_thr/inproc_thr.props +49 -0
  311. data/vendor/github.com/zeromq/libzmq/builds/msvc/vs2017/inproc_thr/inproc_thr.vcxproj +82 -0
  312. data/vendor/github.com/zeromq/libzmq/builds/msvc/vs2017/libsodium.import.props +52 -0
  313. data/vendor/github.com/zeromq/libzmq/builds/msvc/vs2017/libsodium.import.xml +17 -0
  314. data/vendor/github.com/zeromq/libzmq/builds/msvc/vs2017/libzmq.import.props +64 -0
  315. data/vendor/github.com/zeromq/libzmq/builds/msvc/vs2017/libzmq.import.xml +49 -0
  316. data/vendor/github.com/zeromq/libzmq/builds/msvc/vs2017/libzmq.sln +208 -0
  317. data/vendor/github.com/zeromq/libzmq/builds/msvc/vs2017/libzmq/libzmq.props +76 -0
  318. data/vendor/github.com/zeromq/libzmq/builds/msvc/vs2017/libzmq/libzmq.vcxproj +289 -0
  319. data/vendor/github.com/zeromq/libzmq/builds/msvc/vs2017/libzmq/libzmq.vcxproj.filters +627 -0
  320. data/vendor/github.com/zeromq/libzmq/builds/msvc/vs2017/libzmq/libzmq.xml +40 -0
  321. data/vendor/github.com/zeromq/libzmq/builds/msvc/vs2017/local_lat/local_lat.props +49 -0
  322. data/vendor/github.com/zeromq/libzmq/builds/msvc/vs2017/local_lat/local_lat.vcxproj +82 -0
  323. data/vendor/github.com/zeromq/libzmq/builds/msvc/vs2017/local_thr/local_thr.props +49 -0
  324. data/vendor/github.com/zeromq/libzmq/builds/msvc/vs2017/local_thr/local_thr.vcxproj +82 -0
  325. data/vendor/github.com/zeromq/libzmq/builds/msvc/vs2017/remote_lat/remote_lat.props +49 -0
  326. data/vendor/github.com/zeromq/libzmq/builds/msvc/vs2017/remote_lat/remote_lat.vcxproj +82 -0
  327. data/vendor/github.com/zeromq/libzmq/builds/msvc/vs2017/remote_thr/remote_thr.props +49 -0
  328. data/vendor/github.com/zeromq/libzmq/builds/msvc/vs2017/remote_thr/remote_thr.vcxproj +82 -0
  329. data/vendor/github.com/zeromq/libzmq/builds/nuget/libzmq.autopkg +52 -0
  330. data/vendor/github.com/zeromq/libzmq/builds/nuget/readme.nuget +20 -0
  331. data/vendor/github.com/zeromq/libzmq/builds/openwrt/Makefile +70 -0
  332. data/vendor/github.com/zeromq/libzmq/builds/valgrind/ci_build.sh +30 -0
  333. data/vendor/github.com/zeromq/libzmq/builds/valgrind/valgrind.supp +22 -0
  334. data/vendor/github.com/zeromq/libzmq/builds/valgrind/vg +1 -0
  335. data/vendor/github.com/zeromq/libzmq/builds/zos/README.md +463 -0
  336. data/vendor/github.com/zeromq/libzmq/builds/zos/cxxall +62 -0
  337. data/vendor/github.com/zeromq/libzmq/builds/zos/makeclean +36 -0
  338. data/vendor/github.com/zeromq/libzmq/builds/zos/makelibzmq +54 -0
  339. data/vendor/github.com/zeromq/libzmq/builds/zos/maketests +102 -0
  340. data/vendor/github.com/zeromq/libzmq/builds/zos/platform.hpp +300 -0
  341. data/vendor/github.com/zeromq/libzmq/builds/zos/runtests +188 -0
  342. data/vendor/github.com/zeromq/libzmq/builds/zos/test_fork.cpp +95 -0
  343. data/vendor/github.com/zeromq/libzmq/builds/zos/zc++ +42 -0
  344. data/vendor/github.com/zeromq/libzmq/ci_build.sh +66 -0
  345. data/vendor/github.com/zeromq/libzmq/ci_deploy.sh +34 -0
  346. data/vendor/github.com/zeromq/libzmq/configure.ac +827 -0
  347. data/vendor/github.com/zeromq/libzmq/doc/Makefile.am +64 -0
  348. data/vendor/github.com/zeromq/libzmq/doc/asciidoc.conf +56 -0
  349. data/vendor/github.com/zeromq/libzmq/doc/zmq.txt +276 -0
  350. data/vendor/github.com/zeromq/libzmq/doc/zmq_atomic_counter_dec.txt +62 -0
  351. data/vendor/github.com/zeromq/libzmq/doc/zmq_atomic_counter_destroy.txt +62 -0
  352. data/vendor/github.com/zeromq/libzmq/doc/zmq_atomic_counter_inc.txt +61 -0
  353. data/vendor/github.com/zeromq/libzmq/doc/zmq_atomic_counter_new.txt +62 -0
  354. data/vendor/github.com/zeromq/libzmq/doc/zmq_atomic_counter_set.txt +61 -0
  355. data/vendor/github.com/zeromq/libzmq/doc/zmq_atomic_counter_value.txt +62 -0
  356. data/vendor/github.com/zeromq/libzmq/doc/zmq_bind.txt +103 -0
  357. data/vendor/github.com/zeromq/libzmq/doc/zmq_close.txt +56 -0
  358. data/vendor/github.com/zeromq/libzmq/doc/zmq_connect.txt +101 -0
  359. data/vendor/github.com/zeromq/libzmq/doc/zmq_ctx_destroy.txt +67 -0
  360. data/vendor/github.com/zeromq/libzmq/doc/zmq_ctx_get.txt +105 -0
  361. data/vendor/github.com/zeromq/libzmq/doc/zmq_ctx_new.txt +50 -0
  362. data/vendor/github.com/zeromq/libzmq/doc/zmq_ctx_set.txt +184 -0
  363. data/vendor/github.com/zeromq/libzmq/doc/zmq_ctx_shutdown.txt +52 -0
  364. data/vendor/github.com/zeromq/libzmq/doc/zmq_ctx_term.txt +68 -0
  365. data/vendor/github.com/zeromq/libzmq/doc/zmq_curve.txt +92 -0
  366. data/vendor/github.com/zeromq/libzmq/doc/zmq_curve_keypair.txt +56 -0
  367. data/vendor/github.com/zeromq/libzmq/doc/zmq_curve_public.txt +62 -0
  368. data/vendor/github.com/zeromq/libzmq/doc/zmq_disconnect.txt +75 -0
  369. data/vendor/github.com/zeromq/libzmq/doc/zmq_errno.txt +50 -0
  370. data/vendor/github.com/zeromq/libzmq/doc/zmq_getsockopt.txt +944 -0
  371. data/vendor/github.com/zeromq/libzmq/doc/zmq_gssapi.txt +78 -0
  372. data/vendor/github.com/zeromq/libzmq/doc/zmq_has.txt +44 -0
  373. data/vendor/github.com/zeromq/libzmq/doc/zmq_init.txt +52 -0
  374. data/vendor/github.com/zeromq/libzmq/doc/zmq_inproc.txt +88 -0
  375. data/vendor/github.com/zeromq/libzmq/doc/zmq_ipc.txt +106 -0
  376. data/vendor/github.com/zeromq/libzmq/doc/zmq_msg_close.txt +56 -0
  377. data/vendor/github.com/zeromq/libzmq/doc/zmq_msg_copy.txt +72 -0
  378. data/vendor/github.com/zeromq/libzmq/doc/zmq_msg_data.txt +48 -0
  379. data/vendor/github.com/zeromq/libzmq/doc/zmq_msg_get.txt +83 -0
  380. data/vendor/github.com/zeromq/libzmq/doc/zmq_msg_gets.txt +81 -0
  381. data/vendor/github.com/zeromq/libzmq/doc/zmq_msg_init.txt +64 -0
  382. data/vendor/github.com/zeromq/libzmq/doc/zmq_msg_init_data.txt +89 -0
  383. data/vendor/github.com/zeromq/libzmq/doc/zmq_msg_init_size.txt +58 -0
  384. data/vendor/github.com/zeromq/libzmq/doc/zmq_msg_more.txt +65 -0
  385. data/vendor/github.com/zeromq/libzmq/doc/zmq_msg_move.txt +52 -0
  386. data/vendor/github.com/zeromq/libzmq/doc/zmq_msg_recv.txt +124 -0
  387. data/vendor/github.com/zeromq/libzmq/doc/zmq_msg_routing_id.txt +61 -0
  388. data/vendor/github.com/zeromq/libzmq/doc/zmq_msg_send.txt +127 -0
  389. data/vendor/github.com/zeromq/libzmq/doc/zmq_msg_set.txt +46 -0
  390. data/vendor/github.com/zeromq/libzmq/doc/zmq_msg_set_routing_id.txt +46 -0
  391. data/vendor/github.com/zeromq/libzmq/doc/zmq_msg_size.txt +48 -0
  392. data/vendor/github.com/zeromq/libzmq/doc/zmq_null.txt +27 -0
  393. data/vendor/github.com/zeromq/libzmq/doc/zmq_pgm.txt +164 -0
  394. data/vendor/github.com/zeromq/libzmq/doc/zmq_plain.txt +37 -0
  395. data/vendor/github.com/zeromq/libzmq/doc/zmq_poll.txt +135 -0
  396. data/vendor/github.com/zeromq/libzmq/doc/zmq_proxy.txt +99 -0
  397. data/vendor/github.com/zeromq/libzmq/doc/zmq_proxy_steerable.txt +111 -0
  398. data/vendor/github.com/zeromq/libzmq/doc/zmq_recv.txt +91 -0
  399. data/vendor/github.com/zeromq/libzmq/doc/zmq_recvmsg.txt +121 -0
  400. data/vendor/github.com/zeromq/libzmq/doc/zmq_send.txt +104 -0
  401. data/vendor/github.com/zeromq/libzmq/doc/zmq_send_const.txt +103 -0
  402. data/vendor/github.com/zeromq/libzmq/doc/zmq_sendmsg.txt +121 -0
  403. data/vendor/github.com/zeromq/libzmq/doc/zmq_setsockopt.txt +1318 -0
  404. data/vendor/github.com/zeromq/libzmq/doc/zmq_socket.txt +609 -0
  405. data/vendor/github.com/zeromq/libzmq/doc/zmq_socket_monitor.txt +294 -0
  406. data/vendor/github.com/zeromq/libzmq/doc/zmq_strerror.txt +56 -0
  407. data/vendor/github.com/zeromq/libzmq/doc/zmq_tcp.txt +118 -0
  408. data/vendor/github.com/zeromq/libzmq/doc/zmq_term.txt +66 -0
  409. data/vendor/github.com/zeromq/libzmq/doc/zmq_tipc.txt +83 -0
  410. data/vendor/github.com/zeromq/libzmq/doc/zmq_udp.txt +99 -0
  411. data/vendor/github.com/zeromq/libzmq/doc/zmq_unbind.txt +90 -0
  412. data/vendor/github.com/zeromq/libzmq/doc/zmq_version.txt +54 -0
  413. data/vendor/github.com/zeromq/libzmq/doc/zmq_vmci.txt +97 -0
  414. data/vendor/github.com/zeromq/libzmq/doc/zmq_z85_decode.txt +51 -0
  415. data/vendor/github.com/zeromq/libzmq/doc/zmq_z85_encode.txt +58 -0
  416. data/vendor/github.com/zeromq/libzmq/include/zmq.h +708 -0
  417. data/vendor/github.com/zeromq/libzmq/include/zmq_utils.h +48 -0
  418. data/vendor/github.com/zeromq/libzmq/installer.ico +0 -0
  419. data/vendor/github.com/zeromq/libzmq/m4/ax_check_compile_flag.m4 +74 -0
  420. data/vendor/github.com/zeromq/libzmq/m4/ax_code_coverage.m4 +264 -0
  421. data/vendor/github.com/zeromq/libzmq/m4/ax_cxx_compile_stdcxx.m4 +562 -0
  422. data/vendor/github.com/zeromq/libzmq/m4/ax_cxx_compile_stdcxx_11.m4 +40 -0
  423. data/vendor/github.com/zeromq/libzmq/m4/ax_valgrind_check.m4 +233 -0
  424. data/vendor/github.com/zeromq/libzmq/packaging/README +4 -0
  425. data/vendor/github.com/zeromq/libzmq/packaging/debian/changelog +5 -0
  426. data/vendor/github.com/zeromq/libzmq/packaging/debian/compat +1 -0
  427. data/vendor/github.com/zeromq/libzmq/packaging/debian/control +64 -0
  428. data/vendor/github.com/zeromq/libzmq/packaging/debian/copyright +93 -0
  429. data/vendor/github.com/zeromq/libzmq/packaging/debian/libzmq3-dev.install +4 -0
  430. data/vendor/github.com/zeromq/libzmq/packaging/debian/libzmq3-dev.manpages +2 -0
  431. data/vendor/github.com/zeromq/libzmq/packaging/debian/libzmq5.docs +2 -0
  432. data/vendor/github.com/zeromq/libzmq/packaging/debian/libzmq5.install +1 -0
  433. data/vendor/github.com/zeromq/libzmq/packaging/debian/rules +67 -0
  434. data/vendor/github.com/zeromq/libzmq/packaging/debian/source/format +1 -0
  435. data/vendor/github.com/zeromq/libzmq/packaging/debian/zeromq.dsc.obs +15 -0
  436. data/vendor/github.com/zeromq/libzmq/packaging/nuget/package.bat +14 -0
  437. data/vendor/github.com/zeromq/libzmq/packaging/nuget/package.config +6 -0
  438. data/vendor/github.com/zeromq/libzmq/packaging/nuget/package.gsl +264 -0
  439. data/vendor/github.com/zeromq/libzmq/packaging/nuget/package.nuspec +98 -0
  440. data/vendor/github.com/zeromq/libzmq/packaging/nuget/package.targets +129 -0
  441. data/vendor/github.com/zeromq/libzmq/packaging/nuget/package.xml +22 -0
  442. data/vendor/github.com/zeromq/libzmq/packaging/obs/_service +98 -0
  443. data/vendor/github.com/zeromq/libzmq/packaging/redhat/zeromq.spec +234 -0
  444. data/vendor/github.com/zeromq/libzmq/perf/inproc_lat.cpp +240 -0
  445. data/vendor/github.com/zeromq/libzmq/perf/inproc_thr.cpp +250 -0
  446. data/vendor/github.com/zeromq/libzmq/perf/local_lat.cpp +116 -0
  447. data/vendor/github.com/zeromq/libzmq/perf/local_thr.cpp +160 -0
  448. data/vendor/github.com/zeromq/libzmq/perf/remote_lat.cpp +129 -0
  449. data/vendor/github.com/zeromq/libzmq/perf/remote_thr.cpp +135 -0
  450. data/vendor/github.com/zeromq/libzmq/src/address.cpp +134 -0
  451. data/vendor/github.com/zeromq/libzmq/src/address.hpp +77 -0
  452. data/vendor/github.com/zeromq/libzmq/src/array.hpp +167 -0
  453. data/vendor/github.com/zeromq/libzmq/src/atomic_counter.hpp +249 -0
  454. data/vendor/github.com/zeromq/libzmq/src/atomic_ptr.hpp +227 -0
  455. data/vendor/github.com/zeromq/libzmq/src/blob.hpp +186 -0
  456. data/vendor/github.com/zeromq/libzmq/src/client.cpp +116 -0
  457. data/vendor/github.com/zeromq/libzmq/src/client.hpp +81 -0
  458. data/vendor/github.com/zeromq/libzmq/src/clock.cpp +253 -0
  459. data/vendor/github.com/zeromq/libzmq/src/clock.hpp +83 -0
  460. data/vendor/github.com/zeromq/libzmq/src/command.hpp +188 -0
  461. data/vendor/github.com/zeromq/libzmq/src/condition_variable.hpp +279 -0
  462. data/vendor/github.com/zeromq/libzmq/src/config.hpp +98 -0
  463. data/vendor/github.com/zeromq/libzmq/src/ctx.cpp +644 -0
  464. data/vendor/github.com/zeromq/libzmq/src/ctx.hpp +242 -0
  465. data/vendor/github.com/zeromq/libzmq/src/curve_client.cpp +297 -0
  466. data/vendor/github.com/zeromq/libzmq/src/curve_client.hpp +87 -0
  467. data/vendor/github.com/zeromq/libzmq/src/curve_client_tools.hpp +307 -0
  468. data/vendor/github.com/zeromq/libzmq/src/curve_mechanism_base.cpp +181 -0
  469. data/vendor/github.com/zeromq/libzmq/src/curve_mechanism_base.hpp +79 -0
  470. data/vendor/github.com/zeromq/libzmq/src/curve_server.cpp +492 -0
  471. data/vendor/github.com/zeromq/libzmq/src/curve_server.hpp +94 -0
  472. data/vendor/github.com/zeromq/libzmq/src/dbuffer.hpp +144 -0
  473. data/vendor/github.com/zeromq/libzmq/src/dealer.cpp +143 -0
  474. data/vendor/github.com/zeromq/libzmq/src/dealer.hpp +89 -0
  475. data/vendor/github.com/zeromq/libzmq/src/decoder.hpp +198 -0
  476. data/vendor/github.com/zeromq/libzmq/src/decoder_allocators.cpp +144 -0
  477. data/vendor/github.com/zeromq/libzmq/src/decoder_allocators.hpp +155 -0
  478. data/vendor/github.com/zeromq/libzmq/src/devpoll.cpp +205 -0
  479. data/vendor/github.com/zeromq/libzmq/src/devpoll.hpp +119 -0
  480. data/vendor/github.com/zeromq/libzmq/src/dgram.cpp +177 -0
  481. data/vendor/github.com/zeromq/libzmq/src/dgram.hpp +81 -0
  482. data/vendor/github.com/zeromq/libzmq/src/dish.cpp +360 -0
  483. data/vendor/github.com/zeromq/libzmq/src/dish.hpp +125 -0
  484. data/vendor/github.com/zeromq/libzmq/src/dist.cpp +235 -0
  485. data/vendor/github.com/zeromq/libzmq/src/dist.hpp +120 -0
  486. data/vendor/github.com/zeromq/libzmq/src/encoder.hpp +189 -0
  487. data/vendor/github.com/zeromq/libzmq/src/epoll.cpp +206 -0
  488. data/vendor/github.com/zeromq/libzmq/src/epoll.hpp +119 -0
  489. data/vendor/github.com/zeromq/libzmq/src/err.cpp +447 -0
  490. data/vendor/github.com/zeromq/libzmq/src/err.hpp +173 -0
  491. data/vendor/github.com/zeromq/libzmq/src/fd.hpp +52 -0
  492. data/vendor/github.com/zeromq/libzmq/src/fq.cpp +163 -0
  493. data/vendor/github.com/zeromq/libzmq/src/fq.hpp +92 -0
  494. data/vendor/github.com/zeromq/libzmq/src/gather.cpp +94 -0
  495. data/vendor/github.com/zeromq/libzmq/src/gather.hpp +75 -0
  496. data/vendor/github.com/zeromq/libzmq/src/gssapi_client.cpp +237 -0
  497. data/vendor/github.com/zeromq/libzmq/src/gssapi_client.hpp +94 -0
  498. data/vendor/github.com/zeromq/libzmq/src/gssapi_mechanism_base.cpp +402 -0
  499. data/vendor/github.com/zeromq/libzmq/src/gssapi_mechanism_base.hpp +134 -0
  500. data/vendor/github.com/zeromq/libzmq/src/gssapi_server.cpp +249 -0
  501. data/vendor/github.com/zeromq/libzmq/src/gssapi_server.hpp +95 -0
  502. data/vendor/github.com/zeromq/libzmq/src/i_decoder.hpp +64 -0
  503. data/vendor/github.com/zeromq/libzmq/src/i_encoder.hpp +60 -0
  504. data/vendor/github.com/zeromq/libzmq/src/i_engine.hpp +68 -0
  505. data/vendor/github.com/zeromq/libzmq/src/i_mailbox.hpp +60 -0
  506. data/vendor/github.com/zeromq/libzmq/src/i_poll_events.hpp +55 -0
  507. data/vendor/github.com/zeromq/libzmq/src/io_object.cpp +117 -0
  508. data/vendor/github.com/zeromq/libzmq/src/io_object.hpp +89 -0
  509. data/vendor/github.com/zeromq/libzmq/src/io_thread.cpp +114 -0
  510. data/vendor/github.com/zeromq/libzmq/src/io_thread.hpp +99 -0
  511. data/vendor/github.com/zeromq/libzmq/src/ip.cpp +235 -0
  512. data/vendor/github.com/zeromq/libzmq/src/ip.hpp +64 -0
  513. data/vendor/github.com/zeromq/libzmq/src/ipc_address.cpp +106 -0
  514. data/vendor/github.com/zeromq/libzmq/src/ipc_address.hpp +74 -0
  515. data/vendor/github.com/zeromq/libzmq/src/ipc_connecter.cpp +278 -0
  516. data/vendor/github.com/zeromq/libzmq/src/ipc_connecter.hpp +135 -0
  517. data/vendor/github.com/zeromq/libzmq/src/ipc_listener.cpp +427 -0
  518. data/vendor/github.com/zeromq/libzmq/src/ipc_listener.hpp +123 -0
  519. data/vendor/github.com/zeromq/libzmq/src/kqueue.cpp +227 -0
  520. data/vendor/github.com/zeromq/libzmq/src/kqueue.hpp +127 -0
  521. data/vendor/github.com/zeromq/libzmq/src/lb.cpp +173 -0
  522. data/vendor/github.com/zeromq/libzmq/src/lb.hpp +88 -0
  523. data/vendor/github.com/zeromq/libzmq/src/libzmq.pc.cmake.in +11 -0
  524. data/vendor/github.com/zeromq/libzmq/src/libzmq.pc.in +11 -0
  525. data/vendor/github.com/zeromq/libzmq/src/libzmq.vers +4 -0
  526. data/vendor/github.com/zeromq/libzmq/src/likely.hpp +42 -0
  527. data/vendor/github.com/zeromq/libzmq/src/macros.hpp +12 -0
  528. data/vendor/github.com/zeromq/libzmq/src/mailbox.cpp +101 -0
  529. data/vendor/github.com/zeromq/libzmq/src/mailbox.hpp +90 -0
  530. data/vendor/github.com/zeromq/libzmq/src/mailbox_safe.cpp +117 -0
  531. data/vendor/github.com/zeromq/libzmq/src/mailbox_safe.hpp +94 -0
  532. data/vendor/github.com/zeromq/libzmq/src/mechanism.cpp +285 -0
  533. data/vendor/github.com/zeromq/libzmq/src/mechanism.hpp +152 -0
  534. data/vendor/github.com/zeromq/libzmq/src/mechanism_base.cpp +70 -0
  535. data/vendor/github.com/zeromq/libzmq/src/mechanism_base.hpp +53 -0
  536. data/vendor/github.com/zeromq/libzmq/src/metadata.cpp +62 -0
  537. data/vendor/github.com/zeromq/libzmq/src/metadata.hpp +70 -0
  538. data/vendor/github.com/zeromq/libzmq/src/msg.cpp +578 -0
  539. data/vendor/github.com/zeromq/libzmq/src/msg.hpp +268 -0
  540. data/vendor/github.com/zeromq/libzmq/src/mtrie.cpp +434 -0
  541. data/vendor/github.com/zeromq/libzmq/src/mtrie.hpp +102 -0
  542. data/vendor/github.com/zeromq/libzmq/src/mutex.hpp +213 -0
  543. data/vendor/github.com/zeromq/libzmq/src/norm_engine.cpp +736 -0
  544. data/vendor/github.com/zeromq/libzmq/src/norm_engine.hpp +190 -0
  545. data/vendor/github.com/zeromq/libzmq/src/null_mechanism.cpp +220 -0
  546. data/vendor/github.com/zeromq/libzmq/src/null_mechanism.hpp +77 -0
  547. data/vendor/github.com/zeromq/libzmq/src/object.cpp +476 -0
  548. data/vendor/github.com/zeromq/libzmq/src/object.hpp +156 -0
  549. data/vendor/github.com/zeromq/libzmq/src/options.cpp +1089 -0
  550. data/vendor/github.com/zeromq/libzmq/src/options.hpp +251 -0
  551. data/vendor/github.com/zeromq/libzmq/src/own.cpp +216 -0
  552. data/vendor/github.com/zeromq/libzmq/src/own.hpp +154 -0
  553. data/vendor/github.com/zeromq/libzmq/src/pair.cpp +142 -0
  554. data/vendor/github.com/zeromq/libzmq/src/pair.hpp +78 -0
  555. data/vendor/github.com/zeromq/libzmq/src/pgm_receiver.cpp +307 -0
  556. data/vendor/github.com/zeromq/libzmq/src/pgm_receiver.hpp +147 -0
  557. data/vendor/github.com/zeromq/libzmq/src/pgm_sender.cpp +257 -0
  558. data/vendor/github.com/zeromq/libzmq/src/pgm_sender.hpp +124 -0
  559. data/vendor/github.com/zeromq/libzmq/src/pgm_socket.cpp +712 -0
  560. data/vendor/github.com/zeromq/libzmq/src/pgm_socket.hpp +128 -0
  561. data/vendor/github.com/zeromq/libzmq/src/pipe.cpp +547 -0
  562. data/vendor/github.com/zeromq/libzmq/src/pipe.hpp +253 -0
  563. data/vendor/github.com/zeromq/libzmq/src/plain_client.cpp +220 -0
  564. data/vendor/github.com/zeromq/libzmq/src/plain_client.hpp +79 -0
  565. data/vendor/github.com/zeromq/libzmq/src/plain_server.cpp +253 -0
  566. data/vendor/github.com/zeromq/libzmq/src/plain_server.hpp +71 -0
  567. data/vendor/github.com/zeromq/libzmq/src/poll.cpp +193 -0
  568. data/vendor/github.com/zeromq/libzmq/src/poll.hpp +121 -0
  569. data/vendor/github.com/zeromq/libzmq/src/poller.hpp +64 -0
  570. data/vendor/github.com/zeromq/libzmq/src/poller_base.cpp +110 -0
  571. data/vendor/github.com/zeromq/libzmq/src/poller_base.hpp +95 -0
  572. data/vendor/github.com/zeromq/libzmq/src/pollset.cpp +254 -0
  573. data/vendor/github.com/zeromq/libzmq/src/pollset.hpp +121 -0
  574. data/vendor/github.com/zeromq/libzmq/src/precompiled.cpp +30 -0
  575. data/vendor/github.com/zeromq/libzmq/src/precompiled.hpp +120 -0
  576. data/vendor/github.com/zeromq/libzmq/src/proxy.cpp +622 -0
  577. data/vendor/github.com/zeromq/libzmq/src/proxy.hpp +42 -0
  578. data/vendor/github.com/zeromq/libzmq/src/pub.cpp +67 -0
  579. data/vendor/github.com/zeromq/libzmq/src/pub.hpp +63 -0
  580. data/vendor/github.com/zeromq/libzmq/src/pull.cpp +78 -0
  581. data/vendor/github.com/zeromq/libzmq/src/pull.hpp +75 -0
  582. data/vendor/github.com/zeromq/libzmq/src/push.cpp +77 -0
  583. data/vendor/github.com/zeromq/libzmq/src/push.hpp +73 -0
  584. data/vendor/github.com/zeromq/libzmq/src/radio.cpp +252 -0
  585. data/vendor/github.com/zeromq/libzmq/src/radio.hpp +112 -0
  586. data/vendor/github.com/zeromq/libzmq/src/random.cpp +118 -0
  587. data/vendor/github.com/zeromq/libzmq/src/random.hpp +52 -0
  588. data/vendor/github.com/zeromq/libzmq/src/raw_decoder.cpp +74 -0
  589. data/vendor/github.com/zeromq/libzmq/src/raw_decoder.hpp +74 -0
  590. data/vendor/github.com/zeromq/libzmq/src/raw_encoder.cpp +51 -0
  591. data/vendor/github.com/zeromq/libzmq/src/raw_encoder.hpp +64 -0
  592. data/vendor/github.com/zeromq/libzmq/src/reaper.cpp +142 -0
  593. data/vendor/github.com/zeromq/libzmq/src/reaper.hpp +94 -0
  594. data/vendor/github.com/zeromq/libzmq/src/rep.cpp +134 -0
  595. data/vendor/github.com/zeromq/libzmq/src/rep.hpp +73 -0
  596. data/vendor/github.com/zeromq/libzmq/src/req.cpp +323 -0
  597. data/vendor/github.com/zeromq/libzmq/src/req.hpp +121 -0
  598. data/vendor/github.com/zeromq/libzmq/src/router.cpp +551 -0
  599. data/vendor/github.com/zeromq/libzmq/src/router.hpp +147 -0
  600. data/vendor/github.com/zeromq/libzmq/src/scatter.cpp +83 -0
  601. data/vendor/github.com/zeromq/libzmq/src/scatter.hpp +73 -0
  602. data/vendor/github.com/zeromq/libzmq/src/select.cpp +567 -0
  603. data/vendor/github.com/zeromq/libzmq/src/select.hpp +184 -0
  604. data/vendor/github.com/zeromq/libzmq/src/server.cpp +184 -0
  605. data/vendor/github.com/zeromq/libzmq/src/server.hpp +96 -0
  606. data/vendor/github.com/zeromq/libzmq/src/session_base.cpp +716 -0
  607. data/vendor/github.com/zeromq/libzmq/src/session_base.hpp +173 -0
  608. data/vendor/github.com/zeromq/libzmq/src/signaler.cpp +682 -0
  609. data/vendor/github.com/zeromq/libzmq/src/signaler.hpp +91 -0
  610. data/vendor/github.com/zeromq/libzmq/src/socket_base.cpp +1778 -0
  611. data/vendor/github.com/zeromq/libzmq/src/socket_base.hpp +307 -0
  612. data/vendor/github.com/zeromq/libzmq/src/socket_poller.cpp +697 -0
  613. data/vendor/github.com/zeromq/libzmq/src/socket_poller.hpp +145 -0
  614. data/vendor/github.com/zeromq/libzmq/src/socks.cpp +286 -0
  615. data/vendor/github.com/zeromq/libzmq/src/socks.hpp +135 -0
  616. data/vendor/github.com/zeromq/libzmq/src/socks_connecter.cpp +482 -0
  617. data/vendor/github.com/zeromq/libzmq/src/socks_connecter.hpp +163 -0
  618. data/vendor/github.com/zeromq/libzmq/src/stdint.hpp +77 -0
  619. data/vendor/github.com/zeromq/libzmq/src/stream.cpp +321 -0
  620. data/vendor/github.com/zeromq/libzmq/src/stream.hpp +107 -0
  621. data/vendor/github.com/zeromq/libzmq/src/stream_engine.cpp +1110 -0
  622. data/vendor/github.com/zeromq/libzmq/src/stream_engine.hpp +233 -0
  623. data/vendor/github.com/zeromq/libzmq/src/sub.cpp +87 -0
  624. data/vendor/github.com/zeromq/libzmq/src/sub.hpp +64 -0
  625. data/vendor/github.com/zeromq/libzmq/src/tcp.cpp +356 -0
  626. data/vendor/github.com/zeromq/libzmq/src/tcp.hpp +69 -0
  627. data/vendor/github.com/zeromq/libzmq/src/tcp_address.cpp +897 -0
  628. data/vendor/github.com/zeromq/libzmq/src/tcp_address.hpp +117 -0
  629. data/vendor/github.com/zeromq/libzmq/src/tcp_connecter.cpp +426 -0
  630. data/vendor/github.com/zeromq/libzmq/src/tcp_connecter.hpp +134 -0
  631. data/vendor/github.com/zeromq/libzmq/src/tcp_listener.cpp +357 -0
  632. data/vendor/github.com/zeromq/libzmq/src/tcp_listener.hpp +98 -0
  633. data/vendor/github.com/zeromq/libzmq/src/thread.cpp +238 -0
  634. data/vendor/github.com/zeromq/libzmq/src/thread.hpp +102 -0
  635. data/vendor/github.com/zeromq/libzmq/src/timers.cpp +199 -0
  636. data/vendor/github.com/zeromq/libzmq/src/timers.hpp +110 -0
  637. data/vendor/github.com/zeromq/libzmq/src/tipc_address.cpp +124 -0
  638. data/vendor/github.com/zeromq/libzmq/src/tipc_address.hpp +75 -0
  639. data/vendor/github.com/zeromq/libzmq/src/tipc_connecter.cpp +268 -0
  640. data/vendor/github.com/zeromq/libzmq/src/tipc_connecter.hpp +137 -0
  641. data/vendor/github.com/zeromq/libzmq/src/tipc_listener.cpp +190 -0
  642. data/vendor/github.com/zeromq/libzmq/src/tipc_listener.hpp +107 -0
  643. data/vendor/github.com/zeromq/libzmq/src/trie.cpp +340 -0
  644. data/vendor/github.com/zeromq/libzmq/src/trie.hpp +86 -0
  645. data/vendor/github.com/zeromq/libzmq/src/tweetnacl.c +988 -0
  646. data/vendor/github.com/zeromq/libzmq/src/tweetnacl.h +75 -0
  647. data/vendor/github.com/zeromq/libzmq/src/udp_address.cpp +172 -0
  648. data/vendor/github.com/zeromq/libzmq/src/udp_address.hpp +78 -0
  649. data/vendor/github.com/zeromq/libzmq/src/udp_engine.cpp +394 -0
  650. data/vendor/github.com/zeromq/libzmq/src/udp_engine.hpp +73 -0
  651. data/vendor/github.com/zeromq/libzmq/src/v1_decoder.cpp +153 -0
  652. data/vendor/github.com/zeromq/libzmq/src/v1_decoder.hpp +69 -0
  653. data/vendor/github.com/zeromq/libzmq/src/v1_encoder.cpp +76 -0
  654. data/vendor/github.com/zeromq/libzmq/src/v1_encoder.hpp +59 -0
  655. data/vendor/github.com/zeromq/libzmq/src/v2_decoder.cpp +161 -0
  656. data/vendor/github.com/zeromq/libzmq/src/v2_decoder.hpp +74 -0
  657. data/vendor/github.com/zeromq/libzmq/src/v2_encoder.cpp +78 -0
  658. data/vendor/github.com/zeromq/libzmq/src/v2_encoder.hpp +59 -0
  659. data/vendor/github.com/zeromq/libzmq/src/v2_protocol.hpp +49 -0
  660. data/vendor/github.com/zeromq/libzmq/src/version.rc.in +93 -0
  661. data/vendor/github.com/zeromq/libzmq/src/vmci.cpp +88 -0
  662. data/vendor/github.com/zeromq/libzmq/src/vmci.hpp +60 -0
  663. data/vendor/github.com/zeromq/libzmq/src/vmci_address.cpp +170 -0
  664. data/vendor/github.com/zeromq/libzmq/src/vmci_address.hpp +71 -0
  665. data/vendor/github.com/zeromq/libzmq/src/vmci_connecter.cpp +307 -0
  666. data/vendor/github.com/zeromq/libzmq/src/vmci_connecter.hpp +136 -0
  667. data/vendor/github.com/zeromq/libzmq/src/vmci_listener.cpp +262 -0
  668. data/vendor/github.com/zeromq/libzmq/src/vmci_listener.hpp +102 -0
  669. data/vendor/github.com/zeromq/libzmq/src/windows.hpp +93 -0
  670. data/vendor/github.com/zeromq/libzmq/src/wire.hpp +108 -0
  671. data/vendor/github.com/zeromq/libzmq/src/xpub.cpp +340 -0
  672. data/vendor/github.com/zeromq/libzmq/src/xpub.hpp +126 -0
  673. data/vendor/github.com/zeromq/libzmq/src/xsub.cpp +251 -0
  674. data/vendor/github.com/zeromq/libzmq/src/xsub.hpp +103 -0
  675. data/vendor/github.com/zeromq/libzmq/src/ypipe.hpp +218 -0
  676. data/vendor/github.com/zeromq/libzmq/src/ypipe_base.hpp +54 -0
  677. data/vendor/github.com/zeromq/libzmq/src/ypipe_conflate.hpp +137 -0
  678. data/vendor/github.com/zeromq/libzmq/src/yqueue.hpp +225 -0
  679. data/vendor/github.com/zeromq/libzmq/src/zap_client.cpp +305 -0
  680. data/vendor/github.com/zeromq/libzmq/src/zap_client.hpp +100 -0
  681. data/vendor/github.com/zeromq/libzmq/src/zmq.cpp +1527 -0
  682. data/vendor/github.com/zeromq/libzmq/src/zmq_draft.h +178 -0
  683. data/vendor/github.com/zeromq/libzmq/src/zmq_utils.cpp +318 -0
  684. data/vendor/github.com/zeromq/libzmq/tests/CMakeLists.txt +218 -0
  685. data/vendor/github.com/zeromq/libzmq/tests/README.md +28 -0
  686. data/vendor/github.com/zeromq/libzmq/tests/test_abstract_ipc.cpp +67 -0
  687. data/vendor/github.com/zeromq/libzmq/tests/test_ancillaries.cpp +51 -0
  688. data/vendor/github.com/zeromq/libzmq/tests/test_atomics.cpp +48 -0
  689. data/vendor/github.com/zeromq/libzmq/tests/test_base85.cpp +162 -0
  690. data/vendor/github.com/zeromq/libzmq/tests/test_bind_after_connect_tcp.cpp +97 -0
  691. data/vendor/github.com/zeromq/libzmq/tests/test_bind_src_address.cpp +57 -0
  692. data/vendor/github.com/zeromq/libzmq/tests/test_capabilities.cpp +82 -0
  693. data/vendor/github.com/zeromq/libzmq/tests/test_client_server.cpp +106 -0
  694. data/vendor/github.com/zeromq/libzmq/tests/test_conflate.cpp +86 -0
  695. data/vendor/github.com/zeromq/libzmq/tests/test_connect_delay_tipc.cpp +238 -0
  696. data/vendor/github.com/zeromq/libzmq/tests/test_connect_resolve.cpp +70 -0
  697. data/vendor/github.com/zeromq/libzmq/tests/test_connect_rid.cpp +199 -0
  698. data/vendor/github.com/zeromq/libzmq/tests/test_ctx_destroy.cpp +110 -0
  699. data/vendor/github.com/zeromq/libzmq/tests/test_ctx_options.cpp +204 -0
  700. data/vendor/github.com/zeromq/libzmq/tests/test_dgram.cpp +99 -0
  701. data/vendor/github.com/zeromq/libzmq/tests/test_diffserv.cpp +85 -0
  702. data/vendor/github.com/zeromq/libzmq/tests/test_disconnect_inproc.cpp +136 -0
  703. data/vendor/github.com/zeromq/libzmq/tests/test_filter_ipc.cpp +166 -0
  704. data/vendor/github.com/zeromq/libzmq/tests/test_fork.cpp +99 -0
  705. data/vendor/github.com/zeromq/libzmq/tests/test_getsockopt_memset.cpp +64 -0
  706. data/vendor/github.com/zeromq/libzmq/tests/test_heartbeats.cpp +341 -0
  707. data/vendor/github.com/zeromq/libzmq/tests/test_hwm.cpp +312 -0
  708. data/vendor/github.com/zeromq/libzmq/tests/test_hwm_pubsub.cpp +253 -0
  709. data/vendor/github.com/zeromq/libzmq/tests/test_immediate.cpp +250 -0
  710. data/vendor/github.com/zeromq/libzmq/tests/test_inproc_connect.cpp +536 -0
  711. data/vendor/github.com/zeromq/libzmq/tests/test_invalid_rep.cpp +98 -0
  712. data/vendor/github.com/zeromq/libzmq/tests/test_iov.cpp +157 -0
  713. data/vendor/github.com/zeromq/libzmq/tests/test_ipc_wildcard.cpp +65 -0
  714. data/vendor/github.com/zeromq/libzmq/tests/test_issue_566.cpp +99 -0
  715. data/vendor/github.com/zeromq/libzmq/tests/test_last_endpoint.cpp +66 -0
  716. data/vendor/github.com/zeromq/libzmq/tests/test_many_sockets.cpp +100 -0
  717. data/vendor/github.com/zeromq/libzmq/tests/test_metadata.cpp +134 -0
  718. data/vendor/github.com/zeromq/libzmq/tests/test_monitor.cpp +116 -0
  719. data/vendor/github.com/zeromq/libzmq/tests/test_msg_ffn.cpp +145 -0
  720. data/vendor/github.com/zeromq/libzmq/tests/test_msg_flags.cpp +127 -0
  721. data/vendor/github.com/zeromq/libzmq/tests/test_pair_inproc.cpp +81 -0
  722. data/vendor/github.com/zeromq/libzmq/tests/test_pair_ipc.cpp +60 -0
  723. data/vendor/github.com/zeromq/libzmq/tests/test_pair_tcp.cpp +64 -0
  724. data/vendor/github.com/zeromq/libzmq/tests/test_pair_tipc.cpp +62 -0
  725. data/vendor/github.com/zeromq/libzmq/tests/test_pair_vmci.cpp +68 -0
  726. data/vendor/github.com/zeromq/libzmq/tests/test_poller.cpp +404 -0
  727. data/vendor/github.com/zeromq/libzmq/tests/test_probe_router.cpp +86 -0
  728. data/vendor/github.com/zeromq/libzmq/tests/test_proxy.cpp +486 -0
  729. data/vendor/github.com/zeromq/libzmq/tests/test_proxy_single_socket.cpp +121 -0
  730. data/vendor/github.com/zeromq/libzmq/tests/test_proxy_terminate.cpp +132 -0
  731. data/vendor/github.com/zeromq/libzmq/tests/test_pub_invert_matching.cpp +136 -0
  732. data/vendor/github.com/zeromq/libzmq/tests/test_radio_dish.cpp +191 -0
  733. data/vendor/github.com/zeromq/libzmq/tests/test_rebind_ipc.cpp +84 -0
  734. data/vendor/github.com/zeromq/libzmq/tests/test_reconnect_ivl.cpp +149 -0
  735. data/vendor/github.com/zeromq/libzmq/tests/test_req_correlate.cpp +140 -0
  736. data/vendor/github.com/zeromq/libzmq/tests/test_req_relaxed.cpp +220 -0
  737. data/vendor/github.com/zeromq/libzmq/tests/test_reqrep_device.cpp +153 -0
  738. data/vendor/github.com/zeromq/libzmq/tests/test_reqrep_device_tipc.cpp +146 -0
  739. data/vendor/github.com/zeromq/libzmq/tests/test_reqrep_inproc.cpp +60 -0
  740. data/vendor/github.com/zeromq/libzmq/tests/test_reqrep_ipc.cpp +112 -0
  741. data/vendor/github.com/zeromq/libzmq/tests/test_reqrep_tcp.cpp +336 -0
  742. data/vendor/github.com/zeromq/libzmq/tests/test_reqrep_tipc.cpp +61 -0
  743. data/vendor/github.com/zeromq/libzmq/tests/test_reqrep_vmci.cpp +68 -0
  744. data/vendor/github.com/zeromq/libzmq/tests/test_router_handover.cpp +116 -0
  745. data/vendor/github.com/zeromq/libzmq/tests/test_router_mandatory.cpp +292 -0
  746. data/vendor/github.com/zeromq/libzmq/tests/test_router_mandatory_hwm.cpp +129 -0
  747. data/vendor/github.com/zeromq/libzmq/tests/test_router_mandatory_tipc.cpp +70 -0
  748. data/vendor/github.com/zeromq/libzmq/tests/test_scatter_gather.cpp +84 -0
  749. data/vendor/github.com/zeromq/libzmq/tests/test_security_curve.cpp +792 -0
  750. data/vendor/github.com/zeromq/libzmq/tests/test_security_gssapi.cpp +362 -0
  751. data/vendor/github.com/zeromq/libzmq/tests/test_security_null.cpp +209 -0
  752. data/vendor/github.com/zeromq/libzmq/tests/test_security_plain.cpp +212 -0
  753. data/vendor/github.com/zeromq/libzmq/tests/test_security_zap.cpp +417 -0
  754. data/vendor/github.com/zeromq/libzmq/tests/test_setsockopt.cpp +153 -0
  755. data/vendor/github.com/zeromq/libzmq/tests/test_shutdown_stress.cpp +101 -0
  756. data/vendor/github.com/zeromq/libzmq/tests/test_shutdown_stress_tipc.cpp +95 -0
  757. data/vendor/github.com/zeromq/libzmq/tests/test_socket_null.cpp +82 -0
  758. data/vendor/github.com/zeromq/libzmq/tests/test_sockopt_hwm.cpp +190 -0
  759. data/vendor/github.com/zeromq/libzmq/tests/test_sodium.cpp +98 -0
  760. data/vendor/github.com/zeromq/libzmq/tests/test_spec_dealer.cpp +266 -0
  761. data/vendor/github.com/zeromq/libzmq/tests/test_spec_pushpull.cpp +304 -0
  762. data/vendor/github.com/zeromq/libzmq/tests/test_spec_rep.cpp +169 -0
  763. data/vendor/github.com/zeromq/libzmq/tests/test_spec_req.cpp +266 -0
  764. data/vendor/github.com/zeromq/libzmq/tests/test_spec_router.cpp +217 -0
  765. data/vendor/github.com/zeromq/libzmq/tests/test_srcfd.cpp +127 -0
  766. data/vendor/github.com/zeromq/libzmq/tests/test_stream.cpp +342 -0
  767. data/vendor/github.com/zeromq/libzmq/tests/test_stream_disconnect.cpp +295 -0
  768. data/vendor/github.com/zeromq/libzmq/tests/test_stream_empty.cpp +74 -0
  769. data/vendor/github.com/zeromq/libzmq/tests/test_stream_exceeds_buffer.cpp +124 -0
  770. data/vendor/github.com/zeromq/libzmq/tests/test_stream_timeout.cpp +235 -0
  771. data/vendor/github.com/zeromq/libzmq/tests/test_sub_forward.cpp +109 -0
  772. data/vendor/github.com/zeromq/libzmq/tests/test_sub_forward_tipc.cpp +102 -0
  773. data/vendor/github.com/zeromq/libzmq/tests/test_system.cpp +98 -0
  774. data/vendor/github.com/zeromq/libzmq/tests/test_term_endpoint.cpp +226 -0
  775. data/vendor/github.com/zeromq/libzmq/tests/test_term_endpoint_tipc.cpp +120 -0
  776. data/vendor/github.com/zeromq/libzmq/tests/test_thread_safe.cpp +90 -0
  777. data/vendor/github.com/zeromq/libzmq/tests/test_timeo.cpp +85 -0
  778. data/vendor/github.com/zeromq/libzmq/tests/test_timers.cpp +226 -0
  779. data/vendor/github.com/zeromq/libzmq/tests/test_udp.cpp +133 -0
  780. data/vendor/github.com/zeromq/libzmq/tests/test_unbind_inproc.cpp +43 -0
  781. data/vendor/github.com/zeromq/libzmq/tests/test_unbind_wildcard.cpp +216 -0
  782. data/vendor/github.com/zeromq/libzmq/tests/test_use_fd_ipc.cpp +223 -0
  783. data/vendor/github.com/zeromq/libzmq/tests/test_use_fd_tcp.cpp +238 -0
  784. data/vendor/github.com/zeromq/libzmq/tests/test_xpub_manual.cpp +597 -0
  785. data/vendor/github.com/zeromq/libzmq/tests/test_xpub_nodrop.cpp +118 -0
  786. data/vendor/github.com/zeromq/libzmq/tests/test_xpub_welcome_msg.cpp +81 -0
  787. data/vendor/github.com/zeromq/libzmq/tests/test_zmq_poll_fd.cpp +98 -0
  788. data/vendor/github.com/zeromq/libzmq/tests/testutil.hpp +408 -0
  789. data/vendor/github.com/zeromq/libzmq/tests/testutil_security.hpp +684 -0
  790. data/vendor/github.com/zeromq/libzmq/tools/curve_keygen.cpp +58 -0
  791. data/vendor/github.com/zeromq/libzmq/version.sh +21 -0
  792. metadata +875 -0
@@ -0,0 +1,91 @@
1
+ /*
2
+ Copyright (c) 2007-2016 Contributors as noted in the AUTHORS file
3
+
4
+ This file is part of libzmq, the ZeroMQ core engine in C++.
5
+
6
+ libzmq is free software; you can redistribute it and/or modify it under
7
+ the terms of the GNU Lesser General Public License (LGPL) as published
8
+ by the Free Software Foundation; either version 3 of the License, or
9
+ (at your option) any later version.
10
+
11
+ As a special exception, the Contributors give you permission to link
12
+ this library with independent modules to produce an executable,
13
+ regardless of the license terms of these independent modules, and to
14
+ copy and distribute the resulting executable under terms of your choice,
15
+ provided that you also meet, for each linked independent module, the
16
+ terms and conditions of the license of that module. An independent
17
+ module is a module which is not derived from or based on this library.
18
+ If you modify this library, you must extend this exception to your
19
+ version of the library.
20
+
21
+ libzmq is distributed in the hope that it will be useful, but WITHOUT
22
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
23
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
24
+ License for more details.
25
+
26
+ You should have received a copy of the GNU Lesser General Public License
27
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
28
+ */
29
+
30
+ #ifndef __ZMQ_SIGNALER_HPP_INCLUDED__
31
+ #define __ZMQ_SIGNALER_HPP_INCLUDED__
32
+
33
+ #ifdef HAVE_FORK
34
+ #include <unistd.h>
35
+ #endif
36
+
37
+ #include "fd.hpp"
38
+
39
+ namespace zmq
40
+ {
41
+
42
+ // This is a cross-platform equivalent to signal_fd. However, as opposed
43
+ // to signal_fd there can be at most one signal in the signaler at any
44
+ // given moment. Attempt to send a signal before receiving the previous
45
+ // one will result in undefined behaviour.
46
+
47
+ class signaler_t
48
+ {
49
+ public:
50
+
51
+ signaler_t ();
52
+ ~signaler_t ();
53
+
54
+ fd_t get_fd () const;
55
+ void send ();
56
+ int wait (int timeout_);
57
+ void recv ();
58
+ int recv_failable ();
59
+
60
+ #ifdef HAVE_FORK
61
+ // close the file descriptors in a forked child process so that they
62
+ // do not interfere with the context in the parent process.
63
+ void forked ();
64
+ #endif
65
+
66
+ private:
67
+
68
+ // Creates a pair of file descriptors that will be used
69
+ // to pass the signals.
70
+ static int make_fdpair (fd_t *r_, fd_t *w_);
71
+
72
+ // Underlying write & read file descriptor
73
+ // Will be -1 if we exceeded number of available handles
74
+ fd_t w;
75
+ fd_t r;
76
+
77
+ // Disable copying of signaler_t object.
78
+ signaler_t (const signaler_t&);
79
+ const signaler_t &operator = (const signaler_t&);
80
+
81
+ #ifdef HAVE_FORK
82
+ // the process that created this context. Used to detect forking.
83
+ pid_t pid;
84
+ // idempotent close of file descriptors that is safe to use by destructor
85
+ // and forked().
86
+ void close_internal ();
87
+ #endif
88
+ };
89
+ }
90
+
91
+ #endif
@@ -0,0 +1,1778 @@
1
+ /*
2
+ Copyright (c) 2007-2016 Contributors as noted in the AUTHORS file
3
+
4
+ This file is part of libzmq, the ZeroMQ core engine in C++.
5
+
6
+ libzmq is free software; you can redistribute it and/or modify it under
7
+ the terms of the GNU Lesser General Public License (LGPL) as published
8
+ by the Free Software Foundation; either version 3 of the License, or
9
+ (at your option) any later version.
10
+
11
+ As a special exception, the Contributors give you permission to link
12
+ this library with independent modules to produce an executable,
13
+ regardless of the license terms of these independent modules, and to
14
+ copy and distribute the resulting executable under terms of your choice,
15
+ provided that you also meet, for each linked independent module, the
16
+ terms and conditions of the license of that module. An independent
17
+ module is a module which is not derived from or based on this library.
18
+ If you modify this library, you must extend this exception to your
19
+ version of the library.
20
+
21
+ libzmq is distributed in the hope that it will be useful, but WITHOUT
22
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
23
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
24
+ License for more details.
25
+
26
+ You should have received a copy of the GNU Lesser General Public License
27
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
28
+ */
29
+
30
+ #include "precompiled.hpp"
31
+ #include <new>
32
+ #include <string>
33
+ #include <algorithm>
34
+
35
+ #include "macros.hpp"
36
+
37
+ #if defined ZMQ_HAVE_WINDOWS
38
+ #if defined _MSC_VER
39
+ #if defined _WIN32_WCE
40
+ #include <cmnintrin.h>
41
+ #else
42
+ #include <intrin.h>
43
+ #endif
44
+ #endif
45
+ #else
46
+ #include <unistd.h>
47
+ #include <ctype.h>
48
+ #endif
49
+
50
+ #include "socket_base.hpp"
51
+ #include "tcp_listener.hpp"
52
+ #include "ipc_listener.hpp"
53
+ #include "tipc_listener.hpp"
54
+ #include "tcp_connecter.hpp"
55
+ #include "io_thread.hpp"
56
+ #include "session_base.hpp"
57
+ #include "config.hpp"
58
+ #include "pipe.hpp"
59
+ #include "err.hpp"
60
+ #include "ctx.hpp"
61
+ #include "likely.hpp"
62
+ #include "msg.hpp"
63
+ #include "address.hpp"
64
+ #include "ipc_address.hpp"
65
+ #include "tcp_address.hpp"
66
+ #include "udp_address.hpp"
67
+ #include "tipc_address.hpp"
68
+ #include "mailbox.hpp"
69
+ #include "mailbox_safe.hpp"
70
+
71
+ #if defined ZMQ_HAVE_VMCI
72
+ #include "vmci_address.hpp"
73
+ #include "vmci_listener.hpp"
74
+ #endif
75
+
76
+ #ifdef ZMQ_HAVE_OPENPGM
77
+ #include "pgm_socket.hpp"
78
+ #endif
79
+
80
+ #include "pair.hpp"
81
+ #include "pub.hpp"
82
+ #include "sub.hpp"
83
+ #include "req.hpp"
84
+ #include "rep.hpp"
85
+ #include "pull.hpp"
86
+ #include "push.hpp"
87
+ #include "dealer.hpp"
88
+ #include "router.hpp"
89
+ #include "xpub.hpp"
90
+ #include "xsub.hpp"
91
+ #include "stream.hpp"
92
+ #include "server.hpp"
93
+ #include "client.hpp"
94
+ #include "radio.hpp"
95
+ #include "dish.hpp"
96
+ #include "gather.hpp"
97
+ #include "scatter.hpp"
98
+ #include "dgram.hpp"
99
+
100
+
101
+
102
+ bool zmq::socket_base_t::check_tag ()
103
+ {
104
+ return tag == 0xbaddecaf;
105
+ }
106
+
107
+ zmq::socket_base_t *zmq::socket_base_t::create (int type_, class ctx_t *parent_,
108
+ uint32_t tid_, int sid_)
109
+ {
110
+ socket_base_t *s = NULL;
111
+ switch (type_) {
112
+ case ZMQ_PAIR:
113
+ s = new (std::nothrow) pair_t (parent_, tid_, sid_);
114
+ break;
115
+ case ZMQ_PUB:
116
+ s = new (std::nothrow) pub_t (parent_, tid_, sid_);
117
+ break;
118
+ case ZMQ_SUB:
119
+ s = new (std::nothrow) sub_t (parent_, tid_, sid_);
120
+ break;
121
+ case ZMQ_REQ:
122
+ s = new (std::nothrow) req_t (parent_, tid_, sid_);
123
+ break;
124
+ case ZMQ_REP:
125
+ s = new (std::nothrow) rep_t (parent_, tid_, sid_);
126
+ break;
127
+ case ZMQ_DEALER:
128
+ s = new (std::nothrow) dealer_t (parent_, tid_, sid_);
129
+ break;
130
+ case ZMQ_ROUTER:
131
+ s = new (std::nothrow) router_t (parent_, tid_, sid_);
132
+ break;
133
+ case ZMQ_PULL:
134
+ s = new (std::nothrow) pull_t (parent_, tid_, sid_);
135
+ break;
136
+ case ZMQ_PUSH:
137
+ s = new (std::nothrow) push_t (parent_, tid_, sid_);
138
+ break;
139
+ case ZMQ_XPUB:
140
+ s = new (std::nothrow) xpub_t (parent_, tid_, sid_);
141
+ break;
142
+ case ZMQ_XSUB:
143
+ s = new (std::nothrow) xsub_t (parent_, tid_, sid_);
144
+ break;
145
+ case ZMQ_STREAM:
146
+ s = new (std::nothrow) stream_t (parent_, tid_, sid_);
147
+ break;
148
+ case ZMQ_SERVER:
149
+ s = new (std::nothrow) server_t (parent_, tid_, sid_);
150
+ break;
151
+ case ZMQ_CLIENT:
152
+ s = new (std::nothrow) client_t (parent_, tid_, sid_);
153
+ break;
154
+ case ZMQ_RADIO:
155
+ s = new (std::nothrow) radio_t (parent_, tid_, sid_);
156
+ break;
157
+ case ZMQ_DISH:
158
+ s = new (std::nothrow) dish_t (parent_, tid_, sid_);
159
+ break;
160
+ case ZMQ_GATHER:
161
+ s = new (std::nothrow) gather_t (parent_, tid_, sid_);
162
+ break;
163
+ case ZMQ_SCATTER:
164
+ s = new (std::nothrow) scatter_t (parent_, tid_, sid_);
165
+ break;
166
+ case ZMQ_DGRAM:
167
+ s = new (std::nothrow) dgram_t (parent_, tid_, sid_);
168
+ break;
169
+ default:
170
+ errno = EINVAL;
171
+ return NULL;
172
+ }
173
+
174
+ alloc_assert (s);
175
+
176
+ if (s->mailbox == NULL) {
177
+ s->destroyed = true;
178
+ LIBZMQ_DELETE(s);
179
+ return NULL;
180
+ }
181
+
182
+ return s;
183
+ }
184
+
185
+ zmq::socket_base_t::socket_base_t (ctx_t *parent_, uint32_t tid_, int sid_, bool thread_safe_) :
186
+ own_t (parent_, tid_),
187
+ tag (0xbaddecaf),
188
+ ctx_terminated (false),
189
+ destroyed (false),
190
+ poller(NULL),
191
+ handle((poller_t::handle_t)NULL),
192
+ last_tsc (0),
193
+ ticks (0),
194
+ rcvmore (false),
195
+ monitor_socket (NULL),
196
+ monitor_events (0),
197
+ thread_safe (thread_safe_),
198
+ reaper_signaler (NULL),
199
+ sync(),
200
+ monitor_sync()
201
+ {
202
+ options.socket_id = sid_;
203
+ options.ipv6 = (parent_->get (ZMQ_IPV6) != 0);
204
+ options.linger = parent_->get (ZMQ_BLOCKY)? -1: 0;
205
+
206
+ if (thread_safe)
207
+ {
208
+ mailbox = new (std::nothrow) mailbox_safe_t(&sync);
209
+ zmq_assert (mailbox);
210
+ }
211
+ else {
212
+ mailbox_t *m = new (std::nothrow) mailbox_t();
213
+ zmq_assert (m);
214
+
215
+ if (m->get_fd () != retired_fd)
216
+ mailbox = m;
217
+ else {
218
+ LIBZMQ_DELETE (m);
219
+ mailbox = NULL;
220
+ }
221
+ }
222
+ }
223
+
224
+ int zmq::socket_base_t::get_peer_state (const void *routing_id_,
225
+ size_t routing_id_size_) const
226
+ {
227
+ LIBZMQ_UNUSED (routing_id_);
228
+ LIBZMQ_UNUSED (routing_id_size_);
229
+
230
+ // Only ROUTER sockets support this
231
+ errno = ENOTSUP;
232
+ return -1;
233
+ }
234
+
235
+ zmq::socket_base_t::~socket_base_t ()
236
+ {
237
+ if (mailbox)
238
+ LIBZMQ_DELETE(mailbox);
239
+
240
+ if (reaper_signaler)
241
+ LIBZMQ_DELETE(reaper_signaler);
242
+
243
+ scoped_lock_t lock(monitor_sync);
244
+ stop_monitor ();
245
+
246
+ zmq_assert (destroyed);
247
+ }
248
+
249
+ zmq::i_mailbox *zmq::socket_base_t::get_mailbox ()
250
+ {
251
+ return mailbox;
252
+ }
253
+
254
+ void zmq::socket_base_t::stop ()
255
+ {
256
+ // Called by ctx when it is terminated (zmq_ctx_term).
257
+ // 'stop' command is sent from the threads that called zmq_ctx_term to
258
+ // the thread owning the socket. This way, blocking call in the
259
+ // owner thread can be interrupted.
260
+ send_stop ();
261
+ }
262
+
263
+ int zmq::socket_base_t::parse_uri (const char *uri_,
264
+ std::string &protocol_, std::string &address_)
265
+ {
266
+ zmq_assert (uri_ != NULL);
267
+
268
+ std::string uri (uri_);
269
+ std::string::size_type pos = uri.find ("://");
270
+ if (pos == std::string::npos) {
271
+ errno = EINVAL;
272
+ return -1;
273
+ }
274
+ protocol_ = uri.substr (0, pos);
275
+ address_ = uri.substr (pos + 3);
276
+
277
+ if (protocol_.empty () || address_.empty ()) {
278
+ errno = EINVAL;
279
+ return -1;
280
+ }
281
+ return 0;
282
+ }
283
+
284
+ int zmq::socket_base_t::check_protocol (const std::string &protocol_)
285
+ {
286
+ // First check out whether the protocol is something we are aware of.
287
+ if (protocol_ != "inproc"
288
+ #if !defined ZMQ_HAVE_WINDOWS && !defined ZMQ_HAVE_OPENVMS
289
+ && protocol_ != "ipc"
290
+ #endif
291
+ && protocol_ != "tcp"
292
+ #if defined ZMQ_HAVE_OPENPGM
293
+ // pgm/epgm transports only available if 0MQ is compiled with OpenPGM.
294
+ && protocol_ != "pgm"
295
+ && protocol_ != "epgm"
296
+ #endif
297
+ #if defined ZMQ_HAVE_TIPC
298
+ // TIPC transport is only available on Linux.
299
+ && protocol_ != "tipc"
300
+ #endif
301
+ #if defined ZMQ_HAVE_NORM
302
+ && protocol_ != "norm"
303
+ #endif
304
+ #if defined ZMQ_HAVE_VMCI
305
+ && protocol_ != "vmci"
306
+ #endif
307
+ && protocol_ != "udp") {
308
+ errno = EPROTONOSUPPORT;
309
+ return -1;
310
+ }
311
+
312
+ // Check whether socket type and transport protocol match.
313
+ // Specifically, multicast protocols can't be combined with
314
+ // bi-directional messaging patterns (socket types).
315
+ #if defined ZMQ_HAVE_OPENPGM || defined ZMQ_HAVE_NORM
316
+ if ((protocol_ == "pgm" || protocol_ == "epgm" || protocol_ == "norm") &&
317
+ options.type != ZMQ_PUB && options.type != ZMQ_SUB &&
318
+ options.type != ZMQ_XPUB && options.type != ZMQ_XSUB) {
319
+ errno = ENOCOMPATPROTO;
320
+ return -1;
321
+ }
322
+ #endif
323
+
324
+ if (protocol_ == "udp" && (options.type != ZMQ_DISH &&
325
+ options.type != ZMQ_RADIO &&
326
+ options.type != ZMQ_DGRAM)) {
327
+ errno = ENOCOMPATPROTO;
328
+ return -1;
329
+ }
330
+
331
+ // Protocol is available.
332
+ return 0;
333
+ }
334
+
335
+ void zmq::socket_base_t::attach_pipe (pipe_t *pipe_, bool subscribe_to_all_)
336
+ {
337
+ // First, register the pipe so that we can terminate it later on.
338
+ pipe_->set_event_sink (this);
339
+ pipes.push_back (pipe_);
340
+
341
+ // Let the derived socket type know about new pipe.
342
+ xattach_pipe (pipe_, subscribe_to_all_);
343
+
344
+ // If the socket is already being closed, ask any new pipes to terminate
345
+ // straight away.
346
+ if (is_terminating ()) {
347
+ register_term_acks (1);
348
+ pipe_->terminate (false);
349
+ }
350
+ }
351
+
352
+ int zmq::socket_base_t::setsockopt (int option_, const void *optval_,
353
+ size_t optvallen_)
354
+ {
355
+ scoped_optional_lock_t sync_lock(thread_safe ? &sync : NULL);
356
+
357
+ if (!options.is_valid(option_)) {
358
+ errno = EINVAL;
359
+ return -1;
360
+ }
361
+
362
+ if (unlikely (ctx_terminated)) {
363
+ errno = ETERM;
364
+ return -1;
365
+ }
366
+
367
+ // First, check whether specific socket type overloads the option.
368
+ int rc = xsetsockopt (option_, optval_, optvallen_);
369
+ if (rc == 0 || errno != EINVAL) {
370
+ return rc;
371
+ }
372
+
373
+ // If the socket type doesn't support the option, pass it to
374
+ // the generic option parser.
375
+ rc = options.setsockopt (option_, optval_, optvallen_);
376
+ update_pipe_options(option_);
377
+
378
+ return rc;
379
+ }
380
+
381
+ int zmq::socket_base_t::getsockopt (int option_, void *optval_,
382
+ size_t *optvallen_)
383
+ {
384
+ scoped_optional_lock_t sync_lock(thread_safe ? &sync : NULL);
385
+
386
+ if (unlikely (ctx_terminated)) {
387
+ errno = ETERM;
388
+ return -1;
389
+ }
390
+
391
+ if (option_ == ZMQ_RCVMORE) {
392
+ if (*optvallen_ < sizeof (int)) {
393
+ errno = EINVAL;
394
+ return -1;
395
+ }
396
+ memset(optval_, 0, *optvallen_);
397
+ *((int*) optval_) = rcvmore ? 1 : 0;
398
+ *optvallen_ = sizeof (int);
399
+ return 0;
400
+ }
401
+
402
+ if (option_ == ZMQ_FD) {
403
+ if (*optvallen_ < sizeof (fd_t)) {
404
+ errno = EINVAL;
405
+ return -1;
406
+ }
407
+
408
+ if (thread_safe) {
409
+ // thread safe socket doesn't provide file descriptor
410
+ errno = EINVAL;
411
+ return -1;
412
+ }
413
+
414
+ *((fd_t*)optval_) = ((mailbox_t*)mailbox)->get_fd();
415
+ *optvallen_ = sizeof(fd_t);
416
+
417
+ return 0;
418
+ }
419
+
420
+ if (option_ == ZMQ_EVENTS) {
421
+ if (*optvallen_ < sizeof (int)) {
422
+ errno = EINVAL;
423
+ return -1;
424
+ }
425
+ int rc = process_commands (0, false);
426
+ if (rc != 0 && (errno == EINTR || errno == ETERM)) {
427
+ return -1;
428
+ }
429
+ errno_assert (rc == 0);
430
+ *((int*) optval_) = 0;
431
+ if (has_out ())
432
+ *((int*) optval_) |= ZMQ_POLLOUT;
433
+ if (has_in ())
434
+ *((int*) optval_) |= ZMQ_POLLIN;
435
+ *optvallen_ = sizeof (int);
436
+ return 0;
437
+ }
438
+
439
+ if (option_ == ZMQ_LAST_ENDPOINT) {
440
+ if (*optvallen_ < last_endpoint.size () + 1) {
441
+ errno = EINVAL;
442
+ return -1;
443
+ }
444
+ strncpy(static_cast <char *> (optval_), last_endpoint.c_str(), last_endpoint.size() + 1);
445
+ *optvallen_ = last_endpoint.size () + 1;
446
+ return 0;
447
+ }
448
+
449
+ if (option_ == ZMQ_THREAD_SAFE) {
450
+ if (*optvallen_ < sizeof (int)) {
451
+ errno = EINVAL;
452
+ return -1;
453
+ }
454
+ memset(optval_, 0, *optvallen_);
455
+ *((int*) optval_) = thread_safe ? 1 : 0;
456
+ *optvallen_ = sizeof (int);
457
+ return 0;
458
+ }
459
+
460
+ int rc = options.getsockopt (option_, optval_, optvallen_);
461
+ return rc;
462
+ }
463
+
464
+ int zmq::socket_base_t::join (const char* group_)
465
+ {
466
+ scoped_optional_lock_t sync_lock(thread_safe ? &sync : NULL);
467
+
468
+ int rc = xjoin (group_);
469
+
470
+
471
+ return rc;
472
+ }
473
+
474
+ int zmq::socket_base_t::leave (const char* group_)
475
+ {
476
+ scoped_optional_lock_t sync_lock(thread_safe ? &sync : NULL);
477
+
478
+ int rc = xleave (group_);
479
+
480
+
481
+ return rc;
482
+ }
483
+
484
+ int zmq::socket_base_t::add_signaler(signaler_t *s_)
485
+ {
486
+ scoped_optional_lock_t sync_lock(thread_safe ? &sync : NULL);
487
+
488
+ if (!thread_safe) {
489
+ errno = EINVAL;
490
+ return -1;
491
+ }
492
+
493
+ ((mailbox_safe_t*)mailbox)->add_signaler(s_);
494
+
495
+ return 0;
496
+ }
497
+
498
+ int zmq::socket_base_t::remove_signaler(signaler_t *s_)
499
+ {
500
+ scoped_optional_lock_t sync_lock(thread_safe ? &sync : NULL);
501
+
502
+ if (!thread_safe) {
503
+ errno = EINVAL;
504
+ return -1;
505
+ }
506
+
507
+ ((mailbox_safe_t*)mailbox)->remove_signaler(s_);
508
+
509
+ return 0;
510
+ }
511
+
512
+ int zmq::socket_base_t::bind (const char *addr_)
513
+ {
514
+ scoped_optional_lock_t sync_lock(thread_safe ? &sync : NULL);
515
+
516
+ if (unlikely (ctx_terminated)) {
517
+ errno = ETERM;
518
+ return -1;
519
+ }
520
+
521
+ // Process pending commands, if any.
522
+ int rc = process_commands (0, false);
523
+ if (unlikely (rc != 0)) {
524
+ return -1;
525
+ }
526
+
527
+ // Parse addr_ string.
528
+ std::string protocol;
529
+ std::string address;
530
+ if (parse_uri (addr_, protocol, address) || check_protocol (protocol)) {
531
+ return -1;
532
+ }
533
+
534
+ if (protocol == "inproc") {
535
+ const endpoint_t endpoint = { this, options };
536
+ rc = register_endpoint (addr_, endpoint);
537
+ if (rc == 0) {
538
+ connect_pending (addr_, this);
539
+ last_endpoint.assign (addr_);
540
+ options.connected = true;
541
+ }
542
+ return rc;
543
+ }
544
+
545
+ if (protocol == "pgm" || protocol == "epgm" || protocol == "norm") {
546
+ // For convenience's sake, bind can be used interchangeable with
547
+ // connect for PGM, EPGM, NORM transports.
548
+ rc = connect (addr_);
549
+ if (rc != -1)
550
+ options.connected = true;
551
+ return rc;
552
+ }
553
+
554
+ if (protocol == "udp") {
555
+ if (!(options.type == ZMQ_DGRAM || options.type == ZMQ_DISH)) {
556
+ errno = ENOCOMPATPROTO;
557
+ return -1;
558
+ }
559
+
560
+ // Choose the I/O thread to run the session in.
561
+ io_thread_t *io_thread = choose_io_thread (options.affinity);
562
+ if (!io_thread) {
563
+ errno = EMTHREAD;
564
+ return -1;
565
+ }
566
+
567
+ address_t *paddr = new (std::nothrow) address_t (protocol, address, this->get_ctx ());
568
+ alloc_assert (paddr);
569
+
570
+ paddr->resolved.udp_addr = new (std::nothrow) udp_address_t ();
571
+ alloc_assert (paddr->resolved.udp_addr);
572
+ rc = paddr->resolved.udp_addr->resolve (address.c_str(), true);
573
+ if (rc != 0) {
574
+ LIBZMQ_DELETE(paddr);
575
+ return -1;
576
+ }
577
+
578
+ session_base_t *session = session_base_t::create (io_thread, true, this,
579
+ options, paddr);
580
+ errno_assert (session);
581
+
582
+ pipe_t *newpipe = NULL;
583
+
584
+ // Create a bi-directional pipe.
585
+ object_t *parents [2] = {this, session};
586
+ pipe_t *new_pipes [2] = {NULL, NULL};
587
+
588
+ int hwms [2] = {options.sndhwm, options.rcvhwm};
589
+ bool conflates [2] = {false, false};
590
+ rc = pipepair (parents, new_pipes, hwms, conflates);
591
+ errno_assert (rc == 0);
592
+
593
+ // Attach local end of the pipe to the socket object.
594
+ attach_pipe (new_pipes [0], true);
595
+ newpipe = new_pipes [0];
596
+
597
+ // Attach remote end of the pipe to the session object later on.
598
+ session->attach_pipe (new_pipes [1]);
599
+
600
+ // Save last endpoint URI
601
+ paddr->to_string (last_endpoint);
602
+
603
+ add_endpoint (addr_, (own_t *) session, newpipe);
604
+
605
+ return 0;
606
+ }
607
+
608
+ // Remaining transports require to be run in an I/O thread, so at this
609
+ // point we'll choose one.
610
+ io_thread_t *io_thread = choose_io_thread (options.affinity);
611
+ if (!io_thread) {
612
+ errno = EMTHREAD;
613
+ return -1;
614
+ }
615
+
616
+ if (protocol == "tcp") {
617
+ tcp_listener_t *listener = new (std::nothrow) tcp_listener_t (
618
+ io_thread, this, options);
619
+ alloc_assert (listener);
620
+ rc = listener->set_address (address.c_str ());
621
+ if (rc != 0) {
622
+ LIBZMQ_DELETE(listener);
623
+ event_bind_failed (address, zmq_errno());
624
+ return -1;
625
+ }
626
+
627
+ // Save last endpoint URI
628
+ listener->get_address (last_endpoint);
629
+
630
+ add_endpoint (last_endpoint.c_str (), (own_t *) listener, NULL);
631
+ options.connected = true;
632
+ return 0;
633
+ }
634
+
635
+ #if !defined ZMQ_HAVE_WINDOWS && !defined ZMQ_HAVE_OPENVMS
636
+ if (protocol == "ipc") {
637
+ ipc_listener_t *listener = new (std::nothrow) ipc_listener_t (
638
+ io_thread, this, options);
639
+ alloc_assert (listener);
640
+ int rc = listener->set_address (address.c_str ());
641
+ if (rc != 0) {
642
+ LIBZMQ_DELETE(listener);
643
+ event_bind_failed (address, zmq_errno());
644
+ return -1;
645
+ }
646
+
647
+ // Save last endpoint URI
648
+ listener->get_address (last_endpoint);
649
+
650
+ add_endpoint (last_endpoint.c_str (), (own_t *) listener, NULL);
651
+ options.connected = true;
652
+ return 0;
653
+ }
654
+ #endif
655
+ #if defined ZMQ_HAVE_TIPC
656
+ if (protocol == "tipc") {
657
+ tipc_listener_t *listener = new (std::nothrow) tipc_listener_t (
658
+ io_thread, this, options);
659
+ alloc_assert (listener);
660
+ int rc = listener->set_address (address.c_str ());
661
+ if (rc != 0) {
662
+ LIBZMQ_DELETE(listener);
663
+ event_bind_failed (address, zmq_errno());
664
+ return -1;
665
+ }
666
+
667
+ // Save last endpoint URI
668
+ listener->get_address (last_endpoint);
669
+
670
+ add_endpoint (addr_, (own_t *) listener, NULL);
671
+ options.connected = true;
672
+ return 0;
673
+ }
674
+ #endif
675
+ #if defined ZMQ_HAVE_VMCI
676
+ if (protocol == "vmci") {
677
+ vmci_listener_t *listener = new (std::nothrow) vmci_listener_t (
678
+ io_thread, this, options);
679
+ alloc_assert (listener);
680
+ int rc = listener->set_address (address.c_str ());
681
+ if (rc != 0) {
682
+ LIBZMQ_DELETE(listener);
683
+ event_bind_failed (address, zmq_errno ());
684
+ return -1;
685
+ }
686
+
687
+ listener->get_address (last_endpoint);
688
+
689
+ add_endpoint (last_endpoint.c_str(), (own_t *) listener, NULL);
690
+ options.connected = true;
691
+ return 0;
692
+ }
693
+ #endif
694
+
695
+ zmq_assert (false);
696
+ return -1;
697
+ }
698
+
699
+ int zmq::socket_base_t::connect (const char *addr_)
700
+ {
701
+ scoped_optional_lock_t sync_lock(thread_safe ? &sync : NULL);
702
+
703
+ if (unlikely (ctx_terminated)) {
704
+ errno = ETERM;
705
+ return -1;
706
+ }
707
+
708
+ // Process pending commands, if any.
709
+ int rc = process_commands (0, false);
710
+ if (unlikely (rc != 0)) {
711
+ return -1;
712
+ }
713
+
714
+ // Parse addr_ string.
715
+ std::string protocol;
716
+ std::string address;
717
+ if (parse_uri (addr_, protocol, address) || check_protocol (protocol)) {
718
+ return -1;
719
+ }
720
+
721
+ if (protocol == "inproc") {
722
+
723
+ // TODO: inproc connect is specific with respect to creating pipes
724
+ // as there's no 'reconnect' functionality implemented. Once that
725
+ // is in place we should follow generic pipe creation algorithm.
726
+
727
+ // Find the peer endpoint.
728
+ endpoint_t peer = find_endpoint (addr_);
729
+
730
+ // The total HWM for an inproc connection should be the sum of
731
+ // the binder's HWM and the connector's HWM.
732
+ int sndhwm = 0;
733
+ if (peer.socket == NULL)
734
+ sndhwm = options.sndhwm;
735
+ else if (options.sndhwm != 0 && peer.options.rcvhwm != 0)
736
+ sndhwm = options.sndhwm + peer.options.rcvhwm;
737
+ int rcvhwm = 0;
738
+ if (peer.socket == NULL)
739
+ rcvhwm = options.rcvhwm;
740
+ else
741
+ if (options.rcvhwm != 0 && peer.options.sndhwm != 0)
742
+ rcvhwm = options.rcvhwm + peer.options.sndhwm;
743
+
744
+ // Create a bi-directional pipe to connect the peers.
745
+ object_t *parents [2] = {this, peer.socket == NULL ? this : peer.socket};
746
+ pipe_t *new_pipes [2] = {NULL, NULL};
747
+
748
+ bool conflate = options.conflate &&
749
+ (options.type == ZMQ_DEALER ||
750
+ options.type == ZMQ_PULL ||
751
+ options.type == ZMQ_PUSH ||
752
+ options.type == ZMQ_PUB ||
753
+ options.type == ZMQ_SUB);
754
+
755
+ int hwms [2] = {conflate? -1 : sndhwm, conflate? -1 : rcvhwm};
756
+ bool conflates [2] = {conflate, conflate};
757
+ rc = pipepair (parents, new_pipes, hwms, conflates);
758
+ if (!conflate) {
759
+ new_pipes[0]->set_hwms_boost(peer.options.sndhwm, peer.options.rcvhwm);
760
+ new_pipes[1]->set_hwms_boost(options.sndhwm, options.rcvhwm);
761
+ }
762
+
763
+ errno_assert (rc == 0);
764
+
765
+ if (!peer.socket) {
766
+ // The peer doesn't exist yet so we don't know whether
767
+ // to send the routing id message or not. To resolve this,
768
+ // we always send our routing id and drop it later if
769
+ // the peer doesn't expect it.
770
+ msg_t id;
771
+ rc = id.init_size (options.routing_id_size);
772
+ errno_assert (rc == 0);
773
+ memcpy (id.data (), options.routing_id, options.routing_id_size);
774
+ id.set_flags (msg_t::routing_id);
775
+ bool written = new_pipes [0]->write (&id);
776
+ zmq_assert (written);
777
+ new_pipes [0]->flush ();
778
+
779
+ const endpoint_t endpoint = {this, options};
780
+ pend_connection (std::string (addr_), endpoint, new_pipes);
781
+ }
782
+ else {
783
+ // If required, send the routing id of the local socket to the peer.
784
+ if (peer.options.recv_routing_id) {
785
+ msg_t id;
786
+ rc = id.init_size (options.routing_id_size);
787
+ errno_assert (rc == 0);
788
+ memcpy (id.data (), options.routing_id, options.routing_id_size);
789
+ id.set_flags (msg_t::routing_id);
790
+ bool written = new_pipes [0]->write (&id);
791
+ zmq_assert (written);
792
+ new_pipes [0]->flush ();
793
+ }
794
+
795
+ // If required, send the routing id of the peer to the local socket.
796
+ if (options.recv_routing_id) {
797
+ msg_t id;
798
+ rc = id.init_size (peer.options.routing_id_size);
799
+ errno_assert (rc == 0);
800
+ memcpy (id.data (), peer.options.routing_id, peer.options.routing_id_size);
801
+ id.set_flags (msg_t::routing_id);
802
+ bool written = new_pipes [1]->write (&id);
803
+ zmq_assert (written);
804
+ new_pipes [1]->flush ();
805
+ }
806
+
807
+ // Attach remote end of the pipe to the peer socket. Note that peer's
808
+ // seqnum was incremented in find_endpoint function. We don't need it
809
+ // increased here.
810
+ send_bind (peer.socket, new_pipes [1], false);
811
+ }
812
+
813
+ // Attach local end of the pipe to this socket object.
814
+ attach_pipe (new_pipes [0]);
815
+
816
+ // Save last endpoint URI
817
+ last_endpoint.assign (addr_);
818
+
819
+ // remember inproc connections for disconnect
820
+ inprocs.ZMQ_MAP_INSERT_OR_EMPLACE (addr_, new_pipes [0]);
821
+
822
+ options.connected = true;
823
+ return 0;
824
+ }
825
+ bool is_single_connect = (options.type == ZMQ_DEALER ||
826
+ options.type == ZMQ_SUB ||
827
+ options.type == ZMQ_REQ);
828
+ if (unlikely (is_single_connect)) {
829
+ const endpoints_t::iterator it = endpoints.find (addr_);
830
+ if (it != endpoints.end ()) {
831
+ // There is no valid use for multiple connects for SUB-PUB nor
832
+ // DEALER-ROUTER nor REQ-REP. Multiple connects produces
833
+ // nonsensical results.
834
+ return 0;
835
+ }
836
+ }
837
+
838
+ // Choose the I/O thread to run the session in.
839
+ io_thread_t *io_thread = choose_io_thread (options.affinity);
840
+ if (!io_thread) {
841
+ errno = EMTHREAD;
842
+ return -1;
843
+ }
844
+
845
+ address_t *paddr = new (std::nothrow) address_t (protocol, address, this->get_ctx ());
846
+ alloc_assert (paddr);
847
+
848
+ // Resolve address (if needed by the protocol)
849
+ if (protocol == "tcp") {
850
+ // Do some basic sanity checks on tcp:// address syntax
851
+ // - hostname starts with digit or letter, with embedded '-' or '.'
852
+ // - IPv6 address may contain hex chars and colons.
853
+ // - IPv6 link local address may contain % followed by interface name / zone_id
854
+ // (Reference: https://tools.ietf.org/html/rfc4007)
855
+ // - IPv4 address may contain decimal digits and dots.
856
+ // - Address must end in ":port" where port is *, or numeric
857
+ // - Address may contain two parts separated by ':'
858
+ // Following code is quick and dirty check to catch obvious errors,
859
+ // without trying to be fully accurate.
860
+ const char *check = address.c_str ();
861
+ if (isalnum (*check) || isxdigit (*check) || *check == '[' || *check == ':') {
862
+ check++;
863
+ while (isalnum (*check)
864
+ || isxdigit (*check)
865
+ || *check == '.' || *check == '-' || *check == ':' || *check == '%'
866
+ || *check == ';' || *check == '[' || *check == ']' || *check == '_'
867
+ || *check == '*'
868
+ ) {
869
+ check++;
870
+ }
871
+ }
872
+ // Assume the worst, now look for success
873
+ rc = -1;
874
+ // Did we reach the end of the address safely?
875
+ if (*check == 0) {
876
+ // Do we have a valid port string? (cannot be '*' in connect
877
+ check = strrchr (address.c_str (), ':');
878
+ if (check) {
879
+ check++;
880
+ if (*check && (isdigit (*check)))
881
+ rc = 0; // Valid
882
+ }
883
+ }
884
+ if (rc == -1) {
885
+ errno = EINVAL;
886
+ LIBZMQ_DELETE(paddr);
887
+ return -1;
888
+ }
889
+ // Defer resolution until a socket is opened
890
+ paddr->resolved.tcp_addr = NULL;
891
+ }
892
+ #if !defined ZMQ_HAVE_WINDOWS && !defined ZMQ_HAVE_OPENVMS
893
+ else
894
+ if (protocol == "ipc") {
895
+ paddr->resolved.ipc_addr = new (std::nothrow) ipc_address_t ();
896
+ alloc_assert (paddr->resolved.ipc_addr);
897
+ int rc = paddr->resolved.ipc_addr->resolve (address.c_str ());
898
+ if (rc != 0) {
899
+ LIBZMQ_DELETE(paddr);
900
+ return -1;
901
+ }
902
+ }
903
+ #endif
904
+
905
+ if (protocol == "udp") {
906
+ if (options.type != ZMQ_RADIO) {
907
+ errno = ENOCOMPATPROTO;
908
+ LIBZMQ_DELETE(paddr);
909
+ return -1;
910
+ }
911
+
912
+ paddr->resolved.udp_addr = new (std::nothrow) udp_address_t ();
913
+ alloc_assert (paddr->resolved.udp_addr);
914
+ rc = paddr->resolved.udp_addr->resolve (address.c_str(), false);
915
+ if (rc != 0) {
916
+ LIBZMQ_DELETE(paddr);
917
+ return -1;
918
+ }
919
+ }
920
+
921
+ // TBD - Should we check address for ZMQ_HAVE_NORM???
922
+
923
+ #ifdef ZMQ_HAVE_OPENPGM
924
+ if (protocol == "pgm" || protocol == "epgm") {
925
+ struct pgm_addrinfo_t *res = NULL;
926
+ uint16_t port_number = 0;
927
+ int rc = pgm_socket_t::init_address(address.c_str(), &res, &port_number);
928
+ if (res != NULL)
929
+ pgm_freeaddrinfo (res);
930
+ if (rc != 0 || port_number == 0) {
931
+ return -1;
932
+ }
933
+ }
934
+ #endif
935
+ #if defined ZMQ_HAVE_TIPC
936
+ else
937
+ if (protocol == "tipc") {
938
+ paddr->resolved.tipc_addr = new (std::nothrow) tipc_address_t ();
939
+ alloc_assert (paddr->resolved.tipc_addr);
940
+ int rc = paddr->resolved.tipc_addr->resolve (address.c_str());
941
+ if (rc != 0) {
942
+ LIBZMQ_DELETE(paddr);
943
+ return -1;
944
+ }
945
+ }
946
+ #endif
947
+ #if defined ZMQ_HAVE_VMCI
948
+ else
949
+ if (protocol == "vmci") {
950
+ paddr->resolved.vmci_addr = new (std::nothrow) vmci_address_t (this->get_ctx ());
951
+ alloc_assert (paddr->resolved.vmci_addr);
952
+ int rc = paddr->resolved.vmci_addr->resolve (address.c_str ());
953
+ if (rc != 0) {
954
+ LIBZMQ_DELETE(paddr);
955
+ return -1;
956
+ }
957
+ }
958
+ #endif
959
+
960
+ // Create session.
961
+ session_base_t *session = session_base_t::create (io_thread, true, this,
962
+ options, paddr);
963
+ errno_assert (session);
964
+
965
+ // PGM does not support subscription forwarding; ask for all data to be
966
+ // sent to this pipe. (same for NORM, currently?)
967
+ bool subscribe_to_all = protocol == "pgm" || protocol == "epgm" || protocol == "norm" || protocol == "udp";
968
+ pipe_t *newpipe = NULL;
969
+
970
+ if (options.immediate != 1 || subscribe_to_all) {
971
+ // Create a bi-directional pipe.
972
+ object_t *parents [2] = {this, session};
973
+ pipe_t *new_pipes [2] = {NULL, NULL};
974
+
975
+ bool conflate = options.conflate &&
976
+ (options.type == ZMQ_DEALER ||
977
+ options.type == ZMQ_PULL ||
978
+ options.type == ZMQ_PUSH ||
979
+ options.type == ZMQ_PUB ||
980
+ options.type == ZMQ_SUB);
981
+
982
+ int hwms [2] = {conflate? -1 : options.sndhwm,
983
+ conflate? -1 : options.rcvhwm};
984
+ bool conflates [2] = {conflate, conflate};
985
+ rc = pipepair (parents, new_pipes, hwms, conflates);
986
+ errno_assert (rc == 0);
987
+
988
+ // Attach local end of the pipe to the socket object.
989
+ attach_pipe (new_pipes [0], subscribe_to_all);
990
+ newpipe = new_pipes [0];
991
+
992
+ // Attach remote end of the pipe to the session object later on.
993
+ session->attach_pipe (new_pipes [1]);
994
+ }
995
+
996
+ // Save last endpoint URI
997
+ paddr->to_string (last_endpoint);
998
+
999
+ add_endpoint (addr_, (own_t *) session, newpipe);
1000
+ return 0;
1001
+ }
1002
+
1003
+ void zmq::socket_base_t::add_endpoint (const char *addr_, own_t *endpoint_, pipe_t *pipe)
1004
+ {
1005
+ // Activate the session. Make it a child of this socket.
1006
+ launch_child (endpoint_);
1007
+ endpoints.ZMQ_MAP_INSERT_OR_EMPLACE (addr_, endpoint_pipe_t (endpoint_, pipe));
1008
+ }
1009
+
1010
+ int zmq::socket_base_t::term_endpoint (const char *addr_)
1011
+ {
1012
+ scoped_optional_lock_t sync_lock(thread_safe ? &sync : NULL);
1013
+
1014
+ // Check whether the library haven't been shut down yet.
1015
+ if (unlikely (ctx_terminated)) {
1016
+ errno = ETERM;
1017
+ return -1;
1018
+ }
1019
+
1020
+ // Check whether endpoint address passed to the function is valid.
1021
+ if (unlikely (!addr_)) {
1022
+ errno = EINVAL;
1023
+ return -1;
1024
+ }
1025
+
1026
+ // Process pending commands, if any, since there could be pending unprocessed process_own()'s
1027
+ // (from launch_child() for example) we're asked to terminate now.
1028
+ int rc = process_commands (0, false);
1029
+ if (unlikely(rc != 0)) {
1030
+ return -1;
1031
+ }
1032
+
1033
+ // Parse addr_ string.
1034
+ std::string protocol;
1035
+ std::string address;
1036
+ if (parse_uri(addr_, protocol, address) || check_protocol(protocol)) {
1037
+ return -1;
1038
+ }
1039
+
1040
+ // Disconnect an inproc socket
1041
+ if (protocol == "inproc") {
1042
+ if (unregister_endpoint (std::string(addr_), this) == 0) {
1043
+ return 0;
1044
+ }
1045
+ std::pair <inprocs_t::iterator, inprocs_t::iterator> range = inprocs.equal_range (std::string (addr_));
1046
+ if (range.first == range.second) {
1047
+ errno = ENOENT;
1048
+ return -1;
1049
+ }
1050
+
1051
+ for (inprocs_t::iterator it = range.first; it != range.second; ++it)
1052
+ it->second->terminate (true);
1053
+ inprocs.erase (range.first, range.second);
1054
+ return 0;
1055
+ }
1056
+
1057
+ std::string resolved_addr = std::string (addr_);
1058
+ std::pair <endpoints_t::iterator, endpoints_t::iterator> range;
1059
+
1060
+ // The resolved last_endpoint is used as a key in the endpoints map.
1061
+ // The address passed by the user might not match in the TCP case due to
1062
+ // IPv4-in-IPv6 mapping (EG: tcp://[::ffff:127.0.0.1]:9999), so try to
1063
+ // resolve before giving up. Given at this stage we don't know whether a
1064
+ // socket is connected or bound, try with both.
1065
+ if (protocol == "tcp") {
1066
+ range = endpoints.equal_range (resolved_addr);
1067
+ if (range.first == range.second) {
1068
+ tcp_address_t *tcp_addr = new (std::nothrow) tcp_address_t ();
1069
+ alloc_assert (tcp_addr);
1070
+ rc = tcp_addr->resolve (address.c_str (), false, options.ipv6);
1071
+
1072
+ if (rc == 0) {
1073
+ tcp_addr->to_string (resolved_addr);
1074
+ range = endpoints.equal_range (resolved_addr);
1075
+
1076
+ if (range.first == range.second) {
1077
+ rc = tcp_addr->resolve (address.c_str (), true, options.ipv6);
1078
+ if (rc == 0) {
1079
+ tcp_addr->to_string (resolved_addr);
1080
+ }
1081
+ }
1082
+ }
1083
+ LIBZMQ_DELETE(tcp_addr);
1084
+ }
1085
+ }
1086
+
1087
+ // Find the endpoints range (if any) corresponding to the addr_ string.
1088
+ range = endpoints.equal_range (resolved_addr);
1089
+ if (range.first == range.second) {
1090
+ errno = ENOENT;
1091
+ return -1;
1092
+ }
1093
+
1094
+ for (endpoints_t::iterator it = range.first; it != range.second; ++it) {
1095
+ // If we have an associated pipe, terminate it.
1096
+ if (it->second.second != NULL)
1097
+ it->second.second->terminate (false);
1098
+ term_child (it->second.first);
1099
+ }
1100
+ endpoints.erase (range.first, range.second);
1101
+ return 0;
1102
+ }
1103
+
1104
+ int zmq::socket_base_t::send (msg_t *msg_, int flags_)
1105
+ {
1106
+ scoped_optional_lock_t sync_lock(thread_safe ? &sync : NULL);
1107
+
1108
+ // Check whether the library haven't been shut down yet.
1109
+ if (unlikely (ctx_terminated)) {
1110
+ errno = ETERM;
1111
+ return -1;
1112
+ }
1113
+
1114
+ // Check whether message passed to the function is valid.
1115
+ if (unlikely (!msg_ || !msg_->check ())) {
1116
+ errno = EFAULT;
1117
+ return -1;
1118
+ }
1119
+
1120
+ // Process pending commands, if any.
1121
+ int rc = process_commands (0, true);
1122
+ if (unlikely (rc != 0)) {
1123
+ return -1;
1124
+ }
1125
+
1126
+ // Clear any user-visible flags that are set on the message.
1127
+ msg_->reset_flags (msg_t::more);
1128
+
1129
+ // At this point we impose the flags on the message.
1130
+ if (flags_ & ZMQ_SNDMORE)
1131
+ msg_->set_flags (msg_t::more);
1132
+
1133
+ msg_->reset_metadata ();
1134
+
1135
+ // Try to send the message using method in each socket class
1136
+ rc = xsend (msg_);
1137
+ if (rc == 0) {
1138
+ return 0;
1139
+ }
1140
+ if (unlikely (errno != EAGAIN)) {
1141
+ return -1;
1142
+ }
1143
+
1144
+ // In case of non-blocking send we'll simply propagate
1145
+ // the error - including EAGAIN - up the stack.
1146
+ if ((flags_ & ZMQ_DONTWAIT) || options.sndtimeo == 0) {
1147
+ return -1;
1148
+ }
1149
+
1150
+ // Compute the time when the timeout should occur.
1151
+ // If the timeout is infinite, don't care.
1152
+ int timeout = options.sndtimeo;
1153
+ uint64_t end = timeout < 0 ? 0 : (clock.now_ms () + timeout);
1154
+
1155
+ // Oops, we couldn't send the message. Wait for the next
1156
+ // command, process it and try to send the message again.
1157
+ // If timeout is reached in the meantime, return EAGAIN.
1158
+ while (true) {
1159
+ if (unlikely (process_commands (timeout, false) != 0)) {
1160
+ return -1;
1161
+ }
1162
+ rc = xsend (msg_);
1163
+ if (rc == 0)
1164
+ break;
1165
+ if (unlikely (errno != EAGAIN)) {
1166
+ return -1;
1167
+ }
1168
+ if (timeout > 0) {
1169
+ timeout = (int) (end - clock.now_ms ());
1170
+ if (timeout <= 0) {
1171
+ errno = EAGAIN;
1172
+ return -1;
1173
+ }
1174
+ }
1175
+ }
1176
+
1177
+ return 0;
1178
+ }
1179
+
1180
+ int zmq::socket_base_t::recv (msg_t *msg_, int flags_)
1181
+ {
1182
+ scoped_optional_lock_t sync_lock(thread_safe ? &sync : NULL);
1183
+
1184
+ // Check whether the library haven't been shut down yet.
1185
+ if (unlikely (ctx_terminated)) {
1186
+ errno = ETERM;
1187
+ return -1;
1188
+ }
1189
+
1190
+ // Check whether message passed to the function is valid.
1191
+ if (unlikely (!msg_ || !msg_->check ())) {
1192
+ errno = EFAULT;
1193
+ return -1;
1194
+ }
1195
+
1196
+ // Once every inbound_poll_rate messages check for signals and process
1197
+ // incoming commands. This happens only if we are not polling altogether
1198
+ // because there are messages available all the time. If poll occurs,
1199
+ // ticks is set to zero and thus we avoid this code.
1200
+ //
1201
+ // Note that 'recv' uses different command throttling algorithm (the one
1202
+ // described above) from the one used by 'send'. This is because counting
1203
+ // ticks is more efficient than doing RDTSC all the time.
1204
+ if (++ticks == inbound_poll_rate) {
1205
+ if (unlikely (process_commands (0, false) != 0)) {
1206
+ return -1;
1207
+ }
1208
+ ticks = 0;
1209
+ }
1210
+
1211
+ // Get the message.
1212
+ int rc = xrecv (msg_);
1213
+ if (unlikely (rc != 0 && errno != EAGAIN)) {
1214
+ return -1;
1215
+ }
1216
+
1217
+ // If we have the message, return immediately.
1218
+ if (rc == 0) {
1219
+ extract_flags (msg_);
1220
+ return 0;
1221
+ }
1222
+
1223
+ // If the message cannot be fetched immediately, there are two scenarios.
1224
+ // For non-blocking recv, commands are processed in case there's an
1225
+ // activate_reader command already waiting in a command pipe.
1226
+ // If it's not, return EAGAIN.
1227
+ if ((flags_ & ZMQ_DONTWAIT) || options.rcvtimeo == 0) {
1228
+ if (unlikely (process_commands (0, false) != 0)) {
1229
+ return -1;
1230
+ }
1231
+ ticks = 0;
1232
+
1233
+ rc = xrecv (msg_);
1234
+ if (rc < 0) {
1235
+ return rc;
1236
+ }
1237
+ extract_flags (msg_);
1238
+
1239
+ return 0;
1240
+ }
1241
+
1242
+ // Compute the time when the timeout should occur.
1243
+ // If the timeout is infinite, don't care.
1244
+ int timeout = options.rcvtimeo;
1245
+ uint64_t end = timeout < 0 ? 0 : (clock.now_ms () + timeout);
1246
+
1247
+ // In blocking scenario, commands are processed over and over again until
1248
+ // we are able to fetch a message.
1249
+ bool block = (ticks != 0);
1250
+ while (true) {
1251
+ if (unlikely (process_commands (block ? timeout : 0, false) != 0)) {
1252
+ return -1;
1253
+ }
1254
+ rc = xrecv (msg_);
1255
+ if (rc == 0) {
1256
+ ticks = 0;
1257
+ break;
1258
+ }
1259
+ if (unlikely (errno != EAGAIN)) {
1260
+ return -1;
1261
+ }
1262
+ block = true;
1263
+ if (timeout > 0) {
1264
+ timeout = (int) (end - clock.now_ms ());
1265
+ if (timeout <= 0) {
1266
+ errno = EAGAIN;
1267
+ return -1;
1268
+ }
1269
+ }
1270
+ }
1271
+
1272
+ extract_flags (msg_);
1273
+ return 0;
1274
+ }
1275
+
1276
+ int zmq::socket_base_t::close ()
1277
+ {
1278
+ scoped_optional_lock_t sync_lock(thread_safe ? &sync : NULL);
1279
+
1280
+ // Remove all existing signalers for thread safe sockets
1281
+ if (thread_safe)
1282
+ ((mailbox_safe_t*)mailbox)->clear_signalers();
1283
+
1284
+ // Mark the socket as dead
1285
+ tag = 0xdeadbeef;
1286
+
1287
+
1288
+ // Transfer the ownership of the socket from this application thread
1289
+ // to the reaper thread which will take care of the rest of shutdown
1290
+ // process.
1291
+ send_reap (this);
1292
+
1293
+ return 0;
1294
+ }
1295
+
1296
+ bool zmq::socket_base_t::has_in ()
1297
+ {
1298
+ return xhas_in ();
1299
+ }
1300
+
1301
+ bool zmq::socket_base_t::has_out ()
1302
+ {
1303
+ return xhas_out ();
1304
+ }
1305
+
1306
+ void zmq::socket_base_t::start_reaping (poller_t *poller_)
1307
+ {
1308
+ // Plug the socket to the reaper thread.
1309
+ poller = poller_;
1310
+
1311
+ fd_t fd;
1312
+
1313
+ if (!thread_safe)
1314
+ fd = ((mailbox_t*)mailbox)->get_fd();
1315
+ else {
1316
+ scoped_optional_lock_t sync_lock(thread_safe ? &sync : NULL);
1317
+
1318
+ reaper_signaler = new (std::nothrow) signaler_t();
1319
+ zmq_assert (reaper_signaler);
1320
+
1321
+ // Add signaler to the safe mailbox
1322
+ fd = reaper_signaler->get_fd();
1323
+ ((mailbox_safe_t*)mailbox)->add_signaler(reaper_signaler);
1324
+
1325
+ // Send a signal to make sure reaper handle existing commands
1326
+ reaper_signaler->send();
1327
+
1328
+ }
1329
+
1330
+ handle = poller->add_fd (fd, this);
1331
+ poller->set_pollin (handle);
1332
+
1333
+ // Initialise the termination and check whether it can be deallocated
1334
+ // immediately.
1335
+ terminate ();
1336
+ check_destroy ();
1337
+ }
1338
+
1339
+ int zmq::socket_base_t::process_commands (int timeout_, bool throttle_)
1340
+ {
1341
+ int rc;
1342
+ command_t cmd;
1343
+ if (timeout_ != 0) {
1344
+
1345
+ // If we are asked to wait, simply ask mailbox to wait.
1346
+ rc = mailbox->recv (&cmd, timeout_);
1347
+ }
1348
+ else {
1349
+
1350
+ // If we are asked not to wait, check whether we haven't processed
1351
+ // commands recently, so that we can throttle the new commands.
1352
+
1353
+ // Get the CPU's tick counter. If 0, the counter is not available.
1354
+ const uint64_t tsc = zmq::clock_t::rdtsc ();
1355
+
1356
+ // Optimised version of command processing - it doesn't have to check
1357
+ // for incoming commands each time. It does so only if certain time
1358
+ // elapsed since last command processing. Command delay varies
1359
+ // depending on CPU speed: It's ~1ms on 3GHz CPU, ~2ms on 1.5GHz CPU
1360
+ // etc. The optimisation makes sense only on platforms where getting
1361
+ // a timestamp is a very cheap operation (tens of nanoseconds).
1362
+ if (tsc && throttle_) {
1363
+
1364
+ // Check whether TSC haven't jumped backwards (in case of migration
1365
+ // between CPU cores) and whether certain time have elapsed since
1366
+ // last command processing. If it didn't do nothing.
1367
+ if (tsc >= last_tsc && tsc - last_tsc <= max_command_delay)
1368
+ return 0;
1369
+ last_tsc = tsc;
1370
+ }
1371
+
1372
+ // Check whether there are any commands pending for this thread.
1373
+ rc = mailbox->recv (&cmd, 0);
1374
+ }
1375
+
1376
+ // Process all available commands.
1377
+ while (rc == 0) {
1378
+ cmd.destination->process_command (cmd);
1379
+ rc = mailbox->recv (&cmd, 0);
1380
+ }
1381
+
1382
+ if (errno == EINTR)
1383
+ return -1;
1384
+
1385
+ zmq_assert (errno == EAGAIN);
1386
+
1387
+ if (ctx_terminated) {
1388
+ errno = ETERM;
1389
+ return -1;
1390
+ }
1391
+
1392
+ return 0;
1393
+ }
1394
+
1395
+ void zmq::socket_base_t::process_stop ()
1396
+ {
1397
+ // Here, someone have called zmq_ctx_term while the socket was still alive.
1398
+ // We'll remember the fact so that any blocking call is interrupted and any
1399
+ // further attempt to use the socket will return ETERM. The user is still
1400
+ // responsible for calling zmq_close on the socket though!
1401
+ scoped_lock_t lock(monitor_sync);
1402
+ stop_monitor ();
1403
+
1404
+ ctx_terminated = true;
1405
+ }
1406
+
1407
+ void zmq::socket_base_t::process_bind (pipe_t *pipe_)
1408
+ {
1409
+ attach_pipe (pipe_);
1410
+ }
1411
+
1412
+ void zmq::socket_base_t::process_term (int linger_)
1413
+ {
1414
+ // Unregister all inproc endpoints associated with this socket.
1415
+ // Doing this we make sure that no new pipes from other sockets (inproc)
1416
+ // will be initiated.
1417
+ unregister_endpoints (this);
1418
+
1419
+ // Ask all attached pipes to terminate.
1420
+ for (pipes_t::size_type i = 0; i != pipes.size (); ++i)
1421
+ pipes [i]->terminate (false);
1422
+ register_term_acks ((int) pipes.size ());
1423
+
1424
+ // Continue the termination process immediately.
1425
+ own_t::process_term (linger_);
1426
+ }
1427
+
1428
+ void zmq::socket_base_t::process_term_endpoint (std::string *endpoint_)
1429
+ {
1430
+ term_endpoint (endpoint_->c_str());
1431
+ delete endpoint_;
1432
+ }
1433
+
1434
+ void zmq::socket_base_t::update_pipe_options(int option_)
1435
+ {
1436
+ if (option_ == ZMQ_SNDHWM || option_ == ZMQ_RCVHWM)
1437
+ {
1438
+ for (pipes_t::size_type i = 0; i != pipes.size(); ++i)
1439
+ {
1440
+ pipes[i]->set_hwms(options.rcvhwm, options.sndhwm);
1441
+ pipes[i]->send_hwms_to_peer(options.sndhwm, options.rcvhwm);
1442
+ }
1443
+ }
1444
+
1445
+ }
1446
+
1447
+ void zmq::socket_base_t::process_destroy ()
1448
+ {
1449
+ destroyed = true;
1450
+ }
1451
+
1452
+ int zmq::socket_base_t::xsetsockopt (int, const void *, size_t)
1453
+ {
1454
+ errno = EINVAL;
1455
+ return -1;
1456
+ }
1457
+
1458
+ bool zmq::socket_base_t::xhas_out ()
1459
+ {
1460
+ return false;
1461
+ }
1462
+
1463
+ int zmq::socket_base_t::xsend (msg_t *)
1464
+ {
1465
+ errno = ENOTSUP;
1466
+ return -1;
1467
+ }
1468
+
1469
+ bool zmq::socket_base_t::xhas_in ()
1470
+ {
1471
+ return false;
1472
+ }
1473
+
1474
+ int zmq::socket_base_t::xjoin (const char *group_)
1475
+ {
1476
+ LIBZMQ_UNUSED (group_);
1477
+ errno = ENOTSUP;
1478
+ return -1;
1479
+ }
1480
+
1481
+ int zmq::socket_base_t::xleave (const char *group_)
1482
+ {
1483
+ LIBZMQ_UNUSED (group_);
1484
+ errno = ENOTSUP;
1485
+ return -1;
1486
+ }
1487
+
1488
+ int zmq::socket_base_t::xrecv (msg_t *)
1489
+ {
1490
+ errno = ENOTSUP;
1491
+ return -1;
1492
+ }
1493
+
1494
+ static const zmq::blob_t empty_blob;
1495
+
1496
+ const zmq::blob_t &zmq::socket_base_t::get_credential () const
1497
+ {
1498
+ return empty_blob;
1499
+ }
1500
+
1501
+ void zmq::socket_base_t::xread_activated (pipe_t *)
1502
+ {
1503
+ zmq_assert (false);
1504
+ }
1505
+ void zmq::socket_base_t::xwrite_activated (pipe_t *)
1506
+ {
1507
+ zmq_assert (false);
1508
+ }
1509
+
1510
+ void zmq::socket_base_t::xhiccuped (pipe_t *)
1511
+ {
1512
+ zmq_assert (false);
1513
+ }
1514
+
1515
+ void zmq::socket_base_t::in_event ()
1516
+ {
1517
+ // This function is invoked only once the socket is running in the context
1518
+ // of the reaper thread. Process any commands from other threads/sockets
1519
+ // that may be available at the moment. Ultimately, the socket will
1520
+ // be destroyed.
1521
+ {
1522
+ scoped_optional_lock_t sync_lock(thread_safe ? &sync : NULL);
1523
+
1524
+ // If the socket is thread safe we need to unsignal the reaper signaler
1525
+ if (thread_safe)
1526
+ reaper_signaler->recv();
1527
+
1528
+ process_commands (0, false);
1529
+ }
1530
+ check_destroy();
1531
+ }
1532
+
1533
+ void zmq::socket_base_t::out_event ()
1534
+ {
1535
+ zmq_assert (false);
1536
+ }
1537
+
1538
+ void zmq::socket_base_t::timer_event (int)
1539
+ {
1540
+ zmq_assert (false);
1541
+ }
1542
+
1543
+ void zmq::socket_base_t::check_destroy ()
1544
+ {
1545
+ // If the object was already marked as destroyed, finish the deallocation.
1546
+ if (destroyed) {
1547
+
1548
+ // Remove the socket from the reaper's poller.
1549
+ poller->rm_fd (handle);
1550
+
1551
+ // Remove the socket from the context.
1552
+ destroy_socket (this);
1553
+
1554
+ // Notify the reaper about the fact.
1555
+ send_reaped ();
1556
+
1557
+ // Deallocate.
1558
+ own_t::process_destroy ();
1559
+ }
1560
+ }
1561
+
1562
+ void zmq::socket_base_t::read_activated (pipe_t *pipe_)
1563
+ {
1564
+ xread_activated (pipe_);
1565
+ }
1566
+
1567
+ void zmq::socket_base_t::write_activated (pipe_t *pipe_)
1568
+ {
1569
+ xwrite_activated (pipe_);
1570
+ }
1571
+
1572
+ void zmq::socket_base_t::hiccuped (pipe_t *pipe_)
1573
+ {
1574
+ if (options.immediate == 1)
1575
+ pipe_->terminate (false);
1576
+ else
1577
+ // Notify derived sockets of the hiccup
1578
+ xhiccuped (pipe_);
1579
+ }
1580
+
1581
+ void zmq::socket_base_t::pipe_terminated (pipe_t *pipe_)
1582
+ {
1583
+ // Notify the specific socket type about the pipe termination.
1584
+ xpipe_terminated (pipe_);
1585
+
1586
+ // Remove pipe from inproc pipes
1587
+ for (inprocs_t::iterator it = inprocs.begin (); it != inprocs.end (); ++it)
1588
+ if (it->second == pipe_) {
1589
+ inprocs.erase (it);
1590
+ break;
1591
+ }
1592
+
1593
+ // Remove the pipe from the list of attached pipes and confirm its
1594
+ // termination if we are already shutting down.
1595
+ pipes.erase (pipe_);
1596
+ if (is_terminating ())
1597
+ unregister_term_ack ();
1598
+ }
1599
+
1600
+ void zmq::socket_base_t::extract_flags (msg_t *msg_)
1601
+ {
1602
+ // Test whether routing_id flag is valid for this socket type.
1603
+ if (unlikely (msg_->flags () & msg_t::routing_id))
1604
+ zmq_assert (options.recv_routing_id);
1605
+
1606
+ // Remove MORE flag.
1607
+ rcvmore = msg_->flags () & msg_t::more ? true : false;
1608
+ }
1609
+
1610
+ int zmq::socket_base_t::monitor (const char *addr_, int events_)
1611
+ {
1612
+ scoped_lock_t lock(monitor_sync);
1613
+
1614
+ if (unlikely (ctx_terminated)) {
1615
+ errno = ETERM;
1616
+ return -1;
1617
+ }
1618
+
1619
+ // Support deregistering monitoring endpoints as well
1620
+ if (addr_ == NULL) {
1621
+ stop_monitor ();
1622
+ return 0;
1623
+ }
1624
+ // Parse addr_ string.
1625
+ std::string protocol;
1626
+ std::string address;
1627
+ if (parse_uri (addr_, protocol, address) || check_protocol (protocol))
1628
+ return -1;
1629
+
1630
+ // Event notification only supported over inproc://
1631
+ if (protocol != "inproc") {
1632
+ errno = EPROTONOSUPPORT;
1633
+ return -1;
1634
+ }
1635
+ // already monitoring. Stop previous monitor before starting new one.
1636
+ if (monitor_socket != NULL) {
1637
+ stop_monitor (true);
1638
+ }
1639
+ // Register events to monitor
1640
+ monitor_events = events_;
1641
+ monitor_socket = zmq_socket (get_ctx (), ZMQ_PAIR);
1642
+ if (monitor_socket == NULL)
1643
+ return -1;
1644
+
1645
+ // Never block context termination on pending event messages
1646
+ int linger = 0;
1647
+ int rc = zmq_setsockopt (monitor_socket, ZMQ_LINGER, &linger, sizeof (linger));
1648
+ if (rc == -1)
1649
+ stop_monitor (false);
1650
+
1651
+ // Spawn the monitor socket endpoint
1652
+ rc = zmq_bind (monitor_socket, addr_);
1653
+ if (rc == -1)
1654
+ stop_monitor (false);
1655
+ return rc;
1656
+ }
1657
+
1658
+ void zmq::socket_base_t::event_connected (const std::string &addr_, zmq::fd_t fd_)
1659
+ {
1660
+ event(addr_, fd_, ZMQ_EVENT_CONNECTED);
1661
+ }
1662
+
1663
+ void zmq::socket_base_t::event_connect_delayed (const std::string &addr_, int err_)
1664
+ {
1665
+ event(addr_, err_, ZMQ_EVENT_CONNECT_DELAYED);
1666
+ }
1667
+
1668
+ void zmq::socket_base_t::event_connect_retried (const std::string &addr_, int interval_)
1669
+ {
1670
+ event(addr_, interval_, ZMQ_EVENT_CONNECT_RETRIED);
1671
+ }
1672
+
1673
+ void zmq::socket_base_t::event_listening (const std::string &addr_, zmq::fd_t fd_)
1674
+ {
1675
+ event(addr_, fd_, ZMQ_EVENT_LISTENING);
1676
+ }
1677
+
1678
+ void zmq::socket_base_t::event_bind_failed (const std::string &addr_, int err_)
1679
+ {
1680
+ event(addr_, err_, ZMQ_EVENT_BIND_FAILED);
1681
+ }
1682
+
1683
+ void zmq::socket_base_t::event_accepted (const std::string &addr_, zmq::fd_t fd_)
1684
+ {
1685
+ event(addr_, fd_, ZMQ_EVENT_ACCEPTED);
1686
+ }
1687
+
1688
+ void zmq::socket_base_t::event_accept_failed (const std::string &addr_, int err_)
1689
+ {
1690
+ event(addr_, err_, ZMQ_EVENT_ACCEPT_FAILED);
1691
+ }
1692
+
1693
+ void zmq::socket_base_t::event_closed (const std::string &addr_, zmq::fd_t fd_)
1694
+ {
1695
+ event(addr_, fd_, ZMQ_EVENT_CLOSED);
1696
+ }
1697
+
1698
+ void zmq::socket_base_t::event_close_failed (const std::string &addr_, int err_)
1699
+ {
1700
+ event(addr_, err_, ZMQ_EVENT_CLOSE_FAILED);
1701
+ }
1702
+
1703
+ void zmq::socket_base_t::event_disconnected (const std::string &addr_, zmq::fd_t fd_)
1704
+ {
1705
+ event(addr_, fd_, ZMQ_EVENT_DISCONNECTED);
1706
+ }
1707
+
1708
+ void zmq::socket_base_t::event_handshake_failed_no_detail (
1709
+ const std::string &addr_, int err_)
1710
+ {
1711
+ event (addr_, err_, ZMQ_EVENT_HANDSHAKE_FAILED_NO_DETAIL);
1712
+ }
1713
+
1714
+ void zmq::socket_base_t::event_handshake_failed_protocol (
1715
+ const std::string &addr_, int err_)
1716
+ {
1717
+ event (addr_, err_, ZMQ_EVENT_HANDSHAKE_FAILED_PROTOCOL);
1718
+ }
1719
+
1720
+ void zmq::socket_base_t::event_handshake_failed_auth (const std::string &addr_,
1721
+ int err_)
1722
+ {
1723
+ event (addr_, err_, ZMQ_EVENT_HANDSHAKE_FAILED_AUTH);
1724
+ }
1725
+
1726
+ void zmq::socket_base_t::event_handshake_succeeded (const std::string &addr_,
1727
+ int err_)
1728
+ {
1729
+ event (addr_, err_, ZMQ_EVENT_HANDSHAKE_SUCCEEDED);
1730
+ }
1731
+
1732
+ void zmq::socket_base_t::event(const std::string &addr_, intptr_t value_, int type_)
1733
+ {
1734
+ scoped_lock_t lock(monitor_sync);
1735
+ if (monitor_events & type_)
1736
+ {
1737
+ monitor_event (type_, value_, addr_);
1738
+ }
1739
+ }
1740
+
1741
+ // Send a monitor event
1742
+ void zmq::socket_base_t::monitor_event (int event_, intptr_t value_, const std::string &addr_)
1743
+ {
1744
+ // this is a private method which is only called from
1745
+ // contexts where the mutex has been locked before
1746
+
1747
+ if (monitor_socket) {
1748
+ // Send event in first frame
1749
+ zmq_msg_t msg;
1750
+ zmq_msg_init_size (&msg, 6);
1751
+ uint8_t *data = (uint8_t *) zmq_msg_data (&msg);
1752
+ // Avoid dereferencing uint32_t on unaligned address
1753
+ uint16_t event = (uint16_t) event_;
1754
+ uint32_t value = (uint32_t) value_;
1755
+ memcpy (data + 0, &event, sizeof(event));
1756
+ memcpy (data + 2, &value, sizeof(value));
1757
+ zmq_sendmsg (monitor_socket, &msg, ZMQ_SNDMORE);
1758
+
1759
+ // Send address in second frame
1760
+ zmq_msg_init_size (&msg, addr_.size());
1761
+ memcpy (zmq_msg_data (&msg), addr_.c_str (), addr_.size ());
1762
+ zmq_sendmsg (monitor_socket, &msg, 0);
1763
+ }
1764
+ }
1765
+
1766
+ void zmq::socket_base_t::stop_monitor (bool send_monitor_stopped_event_)
1767
+ {
1768
+ // this is a private method which is only called from
1769
+ // contexts where the mutex has been locked before
1770
+
1771
+ if (monitor_socket) {
1772
+ if ((monitor_events & ZMQ_EVENT_MONITOR_STOPPED) && send_monitor_stopped_event_)
1773
+ monitor_event (ZMQ_EVENT_MONITOR_STOPPED, 0, "");
1774
+ zmq_close (monitor_socket);
1775
+ monitor_socket = NULL;
1776
+ monitor_events = 0;
1777
+ }
1778
+ }