pvxslibs 1.2.2__tar.gz → 1.2.3__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of pvxslibs might be problematic. Click here for more details.

Files changed (245) hide show
  1. {pvxslibs-1.2.2/python/pvxslibs.egg-info → pvxslibs-1.2.3}/PKG-INFO +1 -1
  2. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/configure/CONFIG_PVXS_VERSION +3 -2
  3. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/ioc/fieldnamecomponent.h +1 -0
  4. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/ioc/group.cpp +2 -5
  5. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/ioc/groupconfigprocessor.cpp +8 -15
  6. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/ioc/groupconfigprocessor.h +0 -1
  7. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/ioc/iochooks.cpp +58 -48
  8. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/ioc/iocshcommand.h +0 -2
  9. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/ioc/iocsource.cpp +1 -0
  10. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/ioc/pvxs/iochooks.h +11 -1
  11. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/ioc/singlesourcehooks.cpp +7 -7
  12. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/ioc/subscriptionctx.h +4 -3
  13. {pvxslibs-1.2.2 → pvxslibs-1.2.3/python/pvxslibs.egg-info}/PKG-INFO +1 -1
  14. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/src/client.cpp +9 -1
  15. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/src/clientget.cpp +1 -1
  16. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/src/data.cpp +7 -2
  17. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/src/describe.cpp +8 -0
  18. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/src/evhelper.cpp +17 -11
  19. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/src/evhelper.h +46 -10
  20. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/src/log.cpp +17 -12
  21. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/src/nt.cpp +61 -0
  22. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/src/os/WIN32/osdSockExt.cpp +2 -5
  23. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/src/os/default/osdSockExt.cpp +2 -5
  24. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/src/pvrequest.cpp +1 -1
  25. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/src/pvxs/netcommon.h +5 -0
  26. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/src/pvxs/nt.h +40 -0
  27. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/src/pvxs/source.h +2 -0
  28. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/src/pvxs/srvcommon.h +6 -0
  29. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/src/pvxs/util.h +18 -3
  30. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/src/server.cpp +4 -0
  31. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/src/serverget.cpp +6 -3
  32. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/src/servermon.cpp +3 -2
  33. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/src/udp_collector.cpp +2 -4
  34. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/src/udp_collector.h +1 -1
  35. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/src/util.cpp +19 -11
  36. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/src/utilpvt.h +18 -1
  37. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/COPYRIGHT +0 -0
  38. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/LICENSE +0 -0
  39. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/MANIFEST.in +0 -0
  40. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/README.md +0 -0
  41. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/bundle/libevent/LICENSE +0 -0
  42. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/bundle/libevent/arc4random.c +0 -0
  43. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/bundle/libevent/buffer.c +0 -0
  44. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/bundle/libevent/buffer_iocp.c +0 -0
  45. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/bundle/libevent/bufferevent-internal.h +0 -0
  46. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/bundle/libevent/bufferevent.c +0 -0
  47. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/bundle/libevent/bufferevent_async.c +0 -0
  48. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/bundle/libevent/bufferevent_filter.c +0 -0
  49. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/bundle/libevent/bufferevent_mbedtls.c +0 -0
  50. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/bundle/libevent/bufferevent_openssl.c +0 -0
  51. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/bundle/libevent/bufferevent_pair.c +0 -0
  52. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/bundle/libevent/bufferevent_ratelim.c +0 -0
  53. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/bundle/libevent/bufferevent_sock.c +0 -0
  54. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/bundle/libevent/bufferevent_ssl.c +0 -0
  55. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/bundle/libevent/changelist-internal.h +0 -0
  56. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/bundle/libevent/cmake/VersionViaGit.cmake +0 -0
  57. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/bundle/libevent/compat/sys/queue.h +0 -0
  58. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/bundle/libevent/defer-internal.h +0 -0
  59. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/bundle/libevent/devpoll.c +0 -0
  60. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/bundle/libevent/epoll.c +0 -0
  61. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/bundle/libevent/epoll_sub.c +0 -0
  62. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/bundle/libevent/epolltable-internal.h +0 -0
  63. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/bundle/libevent/evbuffer-internal.h +0 -0
  64. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/bundle/libevent/evconfig-private.h.cmake +0 -0
  65. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/bundle/libevent/evdns.c +0 -0
  66. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/bundle/libevent/event-config.h.cmake +0 -0
  67. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/bundle/libevent/event-internal.h +0 -0
  68. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/bundle/libevent/event.c +0 -0
  69. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/bundle/libevent/event_iocp.c +0 -0
  70. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/bundle/libevent/event_tagging.c +0 -0
  71. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/bundle/libevent/evmap-internal.h +0 -0
  72. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/bundle/libevent/evmap.c +0 -0
  73. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/bundle/libevent/evport.c +0 -0
  74. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/bundle/libevent/evrpc-internal.h +0 -0
  75. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/bundle/libevent/evrpc.c +0 -0
  76. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/bundle/libevent/evsignal-internal.h +0 -0
  77. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/bundle/libevent/evthread-internal.h +0 -0
  78. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/bundle/libevent/evthread.c +0 -0
  79. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/bundle/libevent/evthread_pthread.c +0 -0
  80. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/bundle/libevent/evthread_win32.c +0 -0
  81. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/bundle/libevent/evutil.c +0 -0
  82. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/bundle/libevent/evutil_rand.c +0 -0
  83. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/bundle/libevent/evutil_time.c +0 -0
  84. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/bundle/libevent/ht-internal.h +0 -0
  85. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/bundle/libevent/http-internal.h +0 -0
  86. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/bundle/libevent/http.c +0 -0
  87. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/bundle/libevent/include/evdns.h +0 -0
  88. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/bundle/libevent/include/event.h +0 -0
  89. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/bundle/libevent/include/event2/buffer.h +0 -0
  90. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/bundle/libevent/include/event2/buffer_compat.h +0 -0
  91. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/bundle/libevent/include/event2/bufferevent.h +0 -0
  92. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/bundle/libevent/include/event2/bufferevent_compat.h +0 -0
  93. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/bundle/libevent/include/event2/bufferevent_ssl.h +0 -0
  94. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/bundle/libevent/include/event2/bufferevent_struct.h +0 -0
  95. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/bundle/libevent/include/event2/dns.h +0 -0
  96. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/bundle/libevent/include/event2/dns_compat.h +0 -0
  97. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/bundle/libevent/include/event2/dns_struct.h +0 -0
  98. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/bundle/libevent/include/event2/event.h +0 -0
  99. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/bundle/libevent/include/event2/event_compat.h +0 -0
  100. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/bundle/libevent/include/event2/event_struct.h +0 -0
  101. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/bundle/libevent/include/event2/http.h +0 -0
  102. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/bundle/libevent/include/event2/http_compat.h +0 -0
  103. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/bundle/libevent/include/event2/http_struct.h +0 -0
  104. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/bundle/libevent/include/event2/keyvalq_struct.h +0 -0
  105. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/bundle/libevent/include/event2/listener.h +0 -0
  106. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/bundle/libevent/include/event2/rpc.h +0 -0
  107. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/bundle/libevent/include/event2/rpc_compat.h +0 -0
  108. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/bundle/libevent/include/event2/rpc_struct.h +0 -0
  109. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/bundle/libevent/include/event2/tag.h +0 -0
  110. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/bundle/libevent/include/event2/tag_compat.h +0 -0
  111. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/bundle/libevent/include/event2/thread.h +0 -0
  112. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/bundle/libevent/include/event2/util.h +0 -0
  113. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/bundle/libevent/include/event2/visibility.h +0 -0
  114. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/bundle/libevent/include/event2/watch.h +0 -0
  115. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/bundle/libevent/include/event2/ws.h +0 -0
  116. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/bundle/libevent/include/evhttp.h +0 -0
  117. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/bundle/libevent/include/evrpc.h +0 -0
  118. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/bundle/libevent/include/evutil.h +0 -0
  119. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/bundle/libevent/iocp-internal.h +0 -0
  120. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/bundle/libevent/ipv6-internal.h +0 -0
  121. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/bundle/libevent/kqueue-internal.h +0 -0
  122. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/bundle/libevent/kqueue.c +0 -0
  123. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/bundle/libevent/listener.c +0 -0
  124. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/bundle/libevent/log-internal.h +0 -0
  125. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/bundle/libevent/log.c +0 -0
  126. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/bundle/libevent/mbedtls-compat.h +0 -0
  127. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/bundle/libevent/minheap-internal.h +0 -0
  128. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/bundle/libevent/mm-internal.h +0 -0
  129. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/bundle/libevent/openssl-compat.h +0 -0
  130. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/bundle/libevent/poll.c +0 -0
  131. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/bundle/libevent/ratelim-internal.h +0 -0
  132. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/bundle/libevent/select.c +0 -0
  133. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/bundle/libevent/sha1.c +0 -0
  134. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/bundle/libevent/sha1.h +0 -0
  135. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/bundle/libevent/signal.c +0 -0
  136. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/bundle/libevent/signalfd.c +0 -0
  137. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/bundle/libevent/ssl-compat.h +0 -0
  138. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/bundle/libevent/strlcpy-internal.h +0 -0
  139. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/bundle/libevent/strlcpy.c +0 -0
  140. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/bundle/libevent/time-internal.h +0 -0
  141. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/bundle/libevent/util-internal.h +0 -0
  142. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/bundle/libevent/watch.c +0 -0
  143. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/bundle/libevent/wepoll.c +0 -0
  144. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/bundle/libevent/wepoll.h +0 -0
  145. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/bundle/libevent/win32select.c +0 -0
  146. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/bundle/libevent/ws.c +0 -0
  147. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/ioc/channel.cpp +0 -0
  148. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/ioc/channel.h +0 -0
  149. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/ioc/credentials.cpp +0 -0
  150. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/ioc/credentials.h +0 -0
  151. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/ioc/dbentry.h +0 -0
  152. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/ioc/dberrormessage.cpp +0 -0
  153. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/ioc/dberrormessage.h +0 -0
  154. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/ioc/dbeventcontextdeleter.h +0 -0
  155. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/ioc/dblocker.h +0 -0
  156. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/ioc/dbmanylocker.h +0 -0
  157. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/ioc/demo.cpp +0 -0
  158. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/ioc/dummygroup.cpp +0 -0
  159. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/ioc/dummysingle.cpp +0 -0
  160. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/ioc/field.cpp +0 -0
  161. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/ioc/field.h +0 -0
  162. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/ioc/fieldconfig.h +0 -0
  163. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/ioc/fielddefinition.cpp +0 -0
  164. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/ioc/fielddefinition.h +0 -0
  165. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/ioc/fieldname.cpp +0 -0
  166. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/ioc/fieldname.h +0 -0
  167. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/ioc/fieldsubscriptionctx.cpp +0 -0
  168. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/ioc/fieldsubscriptionctx.h +0 -0
  169. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/ioc/group.h +0 -0
  170. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/ioc/groupconfig.h +0 -0
  171. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/ioc/groupdefinition.h +0 -0
  172. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/ioc/groupprocessorcontext.cpp +0 -0
  173. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/ioc/groupprocessorcontext.h +0 -0
  174. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/ioc/groupsource.cpp +0 -0
  175. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/ioc/groupsource.h +0 -0
  176. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/ioc/groupsourcehooks.cpp +0 -0
  177. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/ioc/groupsrcsubscriptionctx.h +0 -0
  178. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/ioc/imagedemo.c +0 -0
  179. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/ioc/iocshargument.h +0 -0
  180. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/ioc/iocshindex.h +0 -0
  181. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/ioc/iocsource.h +0 -0
  182. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/ioc/localfieldlog.cpp +0 -0
  183. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/ioc/localfieldlog.h +0 -0
  184. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/ioc/pvxsIoc.dbd +0 -0
  185. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/ioc/securityclient.cpp +0 -0
  186. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/ioc/securityclient.h +0 -0
  187. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/ioc/securitylogger.h +0 -0
  188. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/ioc/singlesource.cpp +0 -0
  189. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/ioc/singlesource.h +0 -0
  190. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/ioc/singlesrcsubscriptionctx.cpp +0 -0
  191. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/ioc/singlesrcsubscriptionctx.h +0 -0
  192. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/ioc/typeutils.cpp +0 -0
  193. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/ioc/typeutils.h +0 -0
  194. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/ioc/yajlcallbackhandler.h +0 -0
  195. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/pyproject.toml +0 -0
  196. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/python/pvxslibs/__init__.py +0 -0
  197. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/python/pvxslibs/lib/__init__.py +0 -0
  198. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/python/pvxslibs/path.py +0 -0
  199. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/python/pvxslibs/test/__init__.py +0 -0
  200. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/python/pvxslibs/test/test_load.py +0 -0
  201. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/python/pvxslibs/version.py +0 -0
  202. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/python/pvxslibs.egg-info/SOURCES.txt +0 -0
  203. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/python/pvxslibs.egg-info/dependency_links.txt +0 -0
  204. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/python/pvxslibs.egg-info/not-zip-safe +0 -0
  205. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/python/pvxslibs.egg-info/requires.txt +0 -0
  206. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/python/pvxslibs.egg-info/top_level.txt +0 -0
  207. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/setup.cfg +0 -0
  208. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/setup.py +0 -0
  209. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/src/bitmask.cpp +0 -0
  210. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/src/bitmask.h +0 -0
  211. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/src/clientconn.cpp +0 -0
  212. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/src/clientdiscover.cpp +0 -0
  213. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/src/clientimpl.h +0 -0
  214. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/src/clientintrospect.cpp +0 -0
  215. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/src/clientmon.cpp +0 -0
  216. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/src/clientreq.cpp +0 -0
  217. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/src/config.cpp +0 -0
  218. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/src/conn.cpp +0 -0
  219. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/src/conn.h +0 -0
  220. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/src/dataencode.cpp +0 -0
  221. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/src/datafmt.cpp +0 -0
  222. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/src/dataimpl.h +0 -0
  223. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/src/describe.h@ +0 -0
  224. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/src/osgroups.cpp +0 -0
  225. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/src/osiSockExt.h +0 -0
  226. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/src/pvaproto.h +0 -0
  227. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/src/pvrequest.h +0 -0
  228. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/src/pvxs/client.h +0 -0
  229. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/src/pvxs/data.h +0 -0
  230. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/src/pvxs/log.h +0 -0
  231. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/src/pvxs/server.h +0 -0
  232. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/src/pvxs/sharedArray.h +0 -0
  233. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/src/pvxs/sharedpv.h +0 -0
  234. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/src/pvxs/unittest.h +0 -0
  235. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/src/pvxs/version.h +0 -0
  236. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/src/pvxs/versionNum.h@ +0 -0
  237. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/src/serverchan.cpp +0 -0
  238. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/src/serverconn.cpp +0 -0
  239. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/src/serverconn.h +0 -0
  240. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/src/serverintrospect.cpp +0 -0
  241. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/src/serversource.cpp +0 -0
  242. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/src/sharedarray.cpp +0 -0
  243. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/src/sharedpv.cpp +0 -0
  244. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/src/type.cpp +0 -0
  245. {pvxslibs-1.2.2 → pvxslibs-1.2.3}/src/unittest.cpp +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: pvxslibs
3
- Version: 1.2.2
3
+ Version: 1.2.3
4
4
  Summary: PVXS libraries packaged for python
5
5
  Home-page: https://mdavidsaver.github.io/pvxs
6
6
  Author: Michael Davidsaver
@@ -1,6 +1,6 @@
1
1
  PVXS_MAJOR_VERSION = 1
2
2
  PVXS_MINOR_VERSION = 2
3
- PVXS_MAINTENANCE_VERSION = 2
3
+ PVXS_MAINTENANCE_VERSION = 3
4
4
 
5
5
  # Version range conditions in Makefiles
6
6
  #
@@ -12,7 +12,8 @@ PVXS_MAINTENANCE_VERSION = 2
12
12
  #
13
13
  # ifneq ($(PVXS_X_Y_Z),YES) # PVXS != X.Y.Z
14
14
  #
15
- PVXS_1_2_2 = YES
15
+ PVXS_1_2_3 = YES
16
+ PVXS_1_2_2 = NO
16
17
  PVXS_1_2_1 = NO
17
18
  PVXS_1_2_0 = NO
18
19
  PVXS_1_1_4 = NO
@@ -13,6 +13,7 @@
13
13
  #include <string>
14
14
  #include <vector>
15
15
  #include <utility>
16
+ #include <cstdint>
16
17
 
17
18
  namespace pvxs {
18
19
  namespace ioc {
@@ -23,7 +23,7 @@ static
23
23
  IOCGroupConfig* configInstance;
24
24
 
25
25
  static
26
- void onceConfigInstance(void*)
26
+ void onceConfigInstance()
27
27
  {
28
28
  try {
29
29
  configInstance = new IOCGroupConfig;
@@ -32,12 +32,9 @@ void onceConfigInstance(void*)
32
32
  }
33
33
  }
34
34
 
35
- static
36
- epicsThreadOnceId onceConfig = EPICS_THREAD_ONCE_INIT;
37
-
38
35
  IOCGroupConfig& IOCGroupConfig::instance()
39
36
  {
40
- epicsThreadOnce(&onceConfig, &onceConfigInstance, nullptr);
37
+ threadOnce<&onceConfigInstance>();
41
38
  return *configInstance;
42
39
  }
43
40
 
@@ -322,22 +322,15 @@ void GroupConfigProcessor::resolveTriggerReferences() {
322
322
  resolveGroupTriggerReferences(groupDefinition, groupName);
323
323
  } else {
324
324
  // If no trigger specified for this group then set all fields to trigger themselves
325
- log_debug_printf(_logname, " pvxs default triggers for '%s'\n", groupName.c_str());
326
- resolveSelfTriggerReferences(groupDefinition);
327
- }
328
- }
329
- }
325
+ log_warn_printf(_logname, "Group %s defines no +trigger mappings."
326
+ " Default to individual/split monitor updates.\n",
327
+ groupName.c_str());
330
328
 
331
- /**
332
- * When triggers are unspecified for a group, call this function to configure all its fields to
333
- * trigger themselves
334
- *
335
- * @param groupDefinition the group to define triggers for
336
- */
337
- void GroupConfigProcessor::resolveSelfTriggerReferences(GroupDefinition& groupDefinition) {
338
- for (auto&& field: groupDefinition.fields) {
339
- if (!field.channel.empty()) {
340
- field.triggerNames.insert(field.name); // default is self trigger
329
+ for (auto&& field: groupDefinition.fields) {
330
+ if (!field.channel.empty()) {
331
+ field.triggerNames.insert(field.name); // default is self trigger
332
+ }
333
+ }
341
334
  }
342
335
  }
343
336
  }
@@ -77,7 +77,6 @@ private:
77
77
  static void defineAtomicity(GroupDefinition& groupDefinition, const GroupConfig& groupConfig,
78
78
  const std::string& groupName);
79
79
  void defineFieldSortOrder();
80
- static void resolveSelfTriggerReferences(GroupDefinition& groupDefinition);
81
80
  void parseConfigString(const char* jsonGroupDefinition, const char* dbRecordName = nullptr);
82
81
  static void defineTriggers(GroupDefinition& groupDefinition, const FieldConfig& fieldConfig,
83
82
  const std::string& fieldName);
@@ -39,6 +39,9 @@
39
39
  namespace pvxs {
40
40
  namespace ioc {
41
41
 
42
+ typedef epicsGuard<epicsMutex> Guard;
43
+ typedef epicsGuardRelease<epicsMutex> UnGuard;
44
+
42
45
  DEFINE_LOGGER(_logname, "pvxs.ioc");
43
46
 
44
47
  void printIOCShError(const std::exception& e)
@@ -46,8 +49,17 @@ void printIOCShError(const std::exception& e)
46
49
  fprintf(stderr, "Error: %s\n", e.what());
47
50
  }
48
51
 
52
+ namespace {
49
53
  // The pvxs server singleton
50
- std::atomic<server::Server*> pvxsServer{};
54
+ struct pvxServer_t {
55
+ epicsMutex lock;
56
+ server::Server srv;
57
+ } *pvxServer;
58
+
59
+ void pvxServerInit() {
60
+ pvxServer = new pvxServer_t();
61
+ }
62
+ } // namespace
51
63
 
52
64
  /**
53
65
  * Get the plain pvxs server instance
@@ -55,11 +67,27 @@ std::atomic<server::Server*> pvxsServer{};
55
67
  * @return the pvxs server instance
56
68
  */
57
69
  server::Server server() {
58
- if (auto pPvxsServer = pvxsServer.load()) {
59
- return *pPvxsServer;
60
- } else {
70
+ threadOnce<&pvxServerInit>();
71
+ Guard (pvxServer->lock);
72
+ if(pvxServer->srv)
73
+ return pvxServer->srv;
74
+ else
61
75
  throw std::logic_error("No Instance");
62
- }
76
+ }
77
+
78
+ static
79
+ void initialisePvxsServer() {
80
+ using namespace pvxs::server;
81
+
82
+ Config conf = ::pvxs::impl::inUnitTest() ? Config::isolated() : Config::from_env();
83
+ Server newsrv(conf);
84
+
85
+ threadOnce<&pvxServerInit>();
86
+ Guard G(pvxServer->lock);
87
+ if(pvxServer->srv)
88
+ throw std::logic_error(SB()<<__func__<<" found existing server?!?");
89
+
90
+ pvxServer->srv = std::move(newsrv);
63
91
  }
64
92
 
65
93
  /**
@@ -72,20 +100,24 @@ server::Server server() {
72
100
  static
73
101
  void pvxsAtExit(void*) noexcept {
74
102
  try {
75
- if (auto pPvxsServer = pvxsServer.load()) {
76
- if (pvxsServer.compare_exchange_strong(pPvxsServer, nullptr)) {
77
- // take ownership
78
- std::unique_ptr<server::Server> serverInstance(pPvxsServer);
79
- serverInstance->stop();
80
- IOCGroupConfigCleanup();
81
- log_debug_printf(_logname, "Stopped Server%s", "\n");
82
- }
103
+ Guard (pvxServer->lock);
104
+ if(auto srv = std::move(pvxServer->srv)) {
105
+ pvxServer->srv = server::Server();
106
+ srv.stop();
107
+ IOCGroupConfigCleanup();
108
+ log_debug_printf(_logname, "Stopped Server%s", "\n");
83
109
  }
84
110
  } catch(std::exception& e) {
85
111
  fprintf(stderr, "Error in %s : %s\n", __func__, e.what());
86
112
  }
87
113
  }
88
114
 
115
+ void testPrepare()
116
+ {
117
+ if(pvxServer)
118
+ initialisePvxsServer(); // re-create server for next test cycle
119
+ }
120
+
89
121
  void testShutdown()
90
122
  {
91
123
  #ifndef USE_DEINIT_HOOKS
@@ -106,10 +138,10 @@ void testShutdown()
106
138
  */
107
139
  static
108
140
  void pvxsr(int detail) {
109
- if (auto pPvxsServer = pvxsServer.load()) {
141
+ if (auto srv = server()) {
110
142
  std::ostringstream strm;
111
143
  Detailed D(strm, detail);
112
- strm << *pPvxsServer;
144
+ strm << srv;
113
145
  printf("%s", strm.str().c_str());
114
146
  }
115
147
  }
@@ -148,14 +180,12 @@ struct RefTrack {
148
180
  std::map<std::string, size_t> refs;
149
181
  } *refTrack;
150
182
 
151
- epicsThreadOnceId refSavedOnce = EPICS_THREAD_ONCE_INIT;
152
-
153
- void refSavedInit(void *) {
183
+ void refSavedInit() {
154
184
  refTrack = new RefTrack();
155
185
  }
156
186
 
157
187
  void pvxrefsave() {
158
- epicsThreadOnce(&refSavedOnce, &refSavedInit, nullptr);
188
+ threadOnce<&refSavedInit>();
159
189
  epicsGuard<epicsMutex> G(refTrack->lock);
160
190
  refTrack->refs = instanceSnapshot();
161
191
  }
@@ -164,7 +194,7 @@ void pvxrefdiff() {
164
194
  auto cur(instanceSnapshot());
165
195
  std::map<std::string, int64_t> diff;
166
196
 
167
- epicsThreadOnce(&refSavedOnce, &refSavedInit, nullptr);
197
+ threadOnce<&refSavedInit>();
168
198
  {
169
199
  epicsGuard<epicsMutex> G(refTrack->lock);
170
200
 
@@ -217,7 +247,6 @@ void pvxrefdiff() {
217
247
  */
218
248
  static
219
249
  void pvxsInitHook(initHookState theInitHookState) {
220
- auto pPvxsServer = pvxsServer.load();
221
250
  switch(theInitHookState) {
222
251
  case initHookAfterInitDatabase:
223
252
  // when de-init hooks not available, register for later cleanup via atexit()
@@ -228,15 +257,15 @@ void pvxsInitHook(initHookState theInitHookState) {
228
257
  break;
229
258
  case initHookAfterCaServerRunning:
230
259
  case initHookAfterIocRunning:
231
- if(pPvxsServer) {
232
- pPvxsServer->start();
233
- log_debug_printf(_logname, "Started Server %p", pPvxsServer);
260
+ if(auto srv = server()) {
261
+ srv.start();
262
+ log_debug_printf(_logname, "Started Server%s", "\n");
234
263
  }
235
264
  break;
236
265
  case initHookAfterCaServerPaused:
237
- if(pPvxsServer) {
238
- pPvxsServer->stop();
239
- log_debug_printf(_logname, "Stopped Server %p", pPvxsServer);
266
+ if(auto srv = server()) {
267
+ srv.stop();
268
+ log_debug_printf(_logname, "Stopped Server%s", "\n");
240
269
  }
241
270
  break;
242
271
  #ifdef USE_DEINIT_HOOKS
@@ -257,27 +286,6 @@ using namespace pvxs::ioc;
257
286
 
258
287
  namespace {
259
288
 
260
- /**
261
- * Create the pvxs server instance. We use the global pvxsServer atomic
262
- */
263
- void initialisePvxsServer() {
264
- using namespace pvxs::server;
265
- auto serv = pvxsServer.load();
266
- if (!serv) {
267
- Config conf = ::pvxs::impl::inUnitTest() ? Config::isolated() : Config::from_env();
268
- std::unique_ptr<Server> temp(new Server(conf));
269
-
270
- if (pvxsServer.compare_exchange_strong(serv, temp.get())) {
271
- log_debug_printf(_logname, "Installing Server %p\n", temp.get());
272
- (void)temp.release();
273
- } else {
274
- log_crit_printf(_logname, "Race installing Server? %p\n", serv);
275
- }
276
- } else {
277
- log_err_printf(_logname, "Stale Server? %p\n", serv);
278
- }
279
- }
280
-
281
289
  /**
282
290
  * IOC pvxs base registrar. This implements the required registrar function that is called by xxxx_registerRecordDeviceDriver,
283
291
  * the auto-generated stub created for all IOC implementations.
@@ -292,6 +300,8 @@ void pvxsBaseRegistrar() {
292
300
  try {
293
301
  pvxs::logger_config_env();
294
302
 
303
+ pvxServer = new pvxServer_t();
304
+
295
305
  IOCShCommand<int>("pvxsr", "[show_detailed_information?]", "PVXS Server Report. "
296
306
  "Shows information about server config (level==0)\n"
297
307
  "or about connected clients (level>0).\n")
@@ -102,8 +102,6 @@ public:
102
102
  }
103
103
  };
104
104
 
105
- extern std::atomic<server::Server*> pvxsServer;
106
-
107
105
  } // pvxs
108
106
  } // ioc
109
107
 
@@ -327,6 +327,7 @@ void getProperties(dbChannel* pChannel, db_field_log *pfl, Value& node)
327
327
  if(options & DBR_GR_DOUBLE) {
328
328
  dlL = meta.lower_disp_limit;
329
329
  node["display.limitHigh"] = meta.upper_disp_limit;
330
+ node["display.precision"] = meta.precision.dp;
330
331
  }
331
332
  if(options & DBR_CTRL_DOUBLE) {
332
333
  node["control.limitLow"] = meta.lower_ctrl_limit;
@@ -61,7 +61,8 @@ namespace ioc {
61
61
  * initHookRegister(&myinitHook);
62
62
  * }
63
63
  * extern "C" {
64
- * epicsExportRegistrar(myregistrar); // needs matching entry in .dbd
64
+ * // needs matching "registrar(myregistrar)" in .dbd
65
+ * epicsExportRegistrar(myregistrar);
65
66
  * }
66
67
  * @endcode
67
68
  */
@@ -81,6 +82,15 @@ server::Server server();
81
82
  PVXS_IOC_API
82
83
  long dbLoadGroup(const char* jsonFilename, const char* macros=nullptr);
83
84
 
85
+ /** Call just after testdbPrepare()
86
+ *
87
+ * Prepare QSRV for re-test. Optional if testdbPrepare() called only once.
88
+ * Required after subsequent calls.
89
+ * @since 1.2.3
90
+ */
91
+ PVXS_IOC_API
92
+ void testPrepare();
93
+
84
94
  /** Call just before testIocShutdownOk()
85
95
  *
86
96
  * Shutdown QSRV. Only needed with Base <= 7.0.4 .
@@ -30,13 +30,13 @@
30
30
  namespace pvxs {
31
31
  namespace ioc {
32
32
  void pvxsl(int detail) {
33
- if (auto pPvxsServer = pvxsServer.load()) {
33
+ if (auto srv = ioc::server()) {
34
34
  // For each registered source/IOID pair print a line of either detailed or regular information
35
- for (auto& pair: pPvxsServer->listSource()) {
35
+ for (auto& pair: srv.listSource()) {
36
36
  auto& record = pair.first;
37
37
  auto& ioId = pair.second;
38
38
 
39
- auto source = pPvxsServer->getSource(record, ioId);
39
+ auto source = srv.getSource(record, ioId);
40
40
  if (!source) {
41
41
  // if the source is not yet available in the server then we're in a race condition
42
42
  // silently skip source
@@ -73,10 +73,10 @@ namespace {
73
73
 
74
74
  void qReport(unsigned level) noexcept {
75
75
  try{
76
- if (auto pPvxsServer = pvxsServer.load()) {
76
+ if (auto srv = ioc::server()) {
77
77
  std::ostringstream strm;
78
78
  Detailed D(strm, (int)level);
79
- strm << *pPvxsServer;
79
+ strm << srv;
80
80
  printf("%s", strm.str().c_str());
81
81
  }
82
82
  }catch(std::exception& e){
@@ -86,8 +86,8 @@ void qReport(unsigned level) noexcept {
86
86
 
87
87
  void qStats(unsigned *channels, unsigned *clients) noexcept {
88
88
  try{
89
- if (auto pPvxsServer = pvxsServer.load()) {
90
- auto report(pPvxsServer->report(false));
89
+ if (auto srv = ioc::server()) {
90
+ auto report(srv.report(false));
91
91
  if(clients) {
92
92
  *clients = report.connections.size();
93
93
  }
@@ -12,6 +12,7 @@
12
12
 
13
13
  #include <memory>
14
14
  #include <stdexcept>
15
+ #include <type_traits>
15
16
 
16
17
  #include <dbEvent.h>
17
18
 
@@ -22,21 +23,21 @@ namespace pvxs {
22
23
  namespace ioc {
23
24
 
24
25
  class Subscription {
25
- std::shared_ptr<void> sub; // holds void* returned by db_add_event()
26
+ std::shared_ptr<std::remove_pointer<dbEventSubscription>::type> sub; // holds void* returned by db_add_event()
26
27
  public:
27
28
  /* Add a subscription event by calling db_add_event using the given subscriptionCtx
28
29
  * and selecting the correct elements based on the given type of event being added.
29
30
  * You need to specify the correct options that correspond to the event type.
30
31
  * Adds a deleter to clean up the subscription by calling db_cancel_event.
31
32
  */
32
- void subscribe(void* context,
33
+ void subscribe(dbEventCtx context,
33
34
  const Channel& pChan,
34
35
  EVENTFUNC *user_sub, void *user_arg, unsigned select)
35
36
  {
36
37
  auto chan(pChan); // bind by value
37
38
  sub.reset(db_add_event(context, chan,
38
39
  user_sub, user_arg, select),
39
- [chan](void* sub) mutable
40
+ [chan](dbEventSubscription sub) mutable
40
41
  {
41
42
  db_cancel_event(sub);
42
43
  chan = Channel(); // dbChannel* must outlive subscription
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: pvxslibs
3
- Version: 1.2.2
3
+ Version: 1.2.3
4
4
  Summary: PVXS libraries packaged for python
5
5
  Home-page: https://mdavidsaver.github.io/pvxs
6
6
  Author: Michael Davidsaver
@@ -152,9 +152,15 @@ void Channel::disconnect(const std::shared_ptr<Channel>& self)
152
152
  assert(!self || this==self.get());
153
153
  auto current(std::move(conn));
154
154
 
155
+ size_t holdoff = 0u;
155
156
  switch(state) {
156
157
  case Channel::Connecting:
157
158
  current->pending.erase(cid);
159
+ /* disconnect/timeout while before CREATE_CHANNEL sent,
160
+ * likely lower level networking issue. Try to slow
161
+ * down reconnect loop.
162
+ */
163
+ holdoff = 10u; // arbitrary
158
164
  break;
159
165
  case Channel::Creating:
160
166
  current->creatingByCID.erase(cid);
@@ -201,7 +207,9 @@ void Channel::disconnect(const std::shared_ptr<Channel>& self)
201
207
 
202
208
  } else if(forcedServer.family()==AF_UNSPEC) { // begin search
203
209
 
204
- context->searchBuckets[context->currentBucket].push_back(self);
210
+ auto next = (context->currentBucket + holdoff) % nBuckets;
211
+
212
+ context->searchBuckets[next].push_back(self);
205
213
 
206
214
  log_debug_printf(io, "Server %s detach channel '%s' to re-search\n",
207
215
  current ? current->peerName.c_str() : "<disconnected>",
@@ -220,7 +220,7 @@ struct GPROp : public OperationBase
220
220
  self->arg = std::move(a);
221
221
 
222
222
  } else if(put && self->op==Put) {
223
- self->builder = [a](Value&&) -> Value {
223
+ self->builder = [a](Value&&) noexcept -> Value {
224
224
  // caller should be passing a Value of the correct prototype
225
225
  // given through onInit().
226
226
  return a;
@@ -829,8 +829,13 @@ void Value::traverse(const std::string &expr, bool modify, bool dothrow)
829
829
  // no such member
830
830
  store.reset();
831
831
  desc = nullptr;
832
- if(dothrow)
833
- throw LookupError(SB()<<"no such member '"<<name<<"' in '"<<expr<<"'");
832
+ if(dothrow) {
833
+ SB msg;
834
+ msg<<"no such member field '"<<name<<"'";
835
+ if(name!=expr)
836
+ msg<<" in expression '"<<expr<<"'";
837
+ throw LookupError(msg);
838
+ }
834
839
  }
835
840
 
836
841
  } else if(desc->code.code==TypeCode::Union || desc->code.code==TypeCode::Any) {
@@ -132,4 +132,12 @@ std::ostream& target_information(std::ostream& strm)
132
132
  return strm;
133
133
  }
134
134
 
135
+ std::ostream& version_information(std::ostream& strm)
136
+ {
137
+ strm<<version_str()<<"\n";
138
+ strm<<EPICS_VERSION_STRING<<"\n";
139
+ strm<<"libevent "<<event_get_version()<<"\n";
140
+ return strm;
141
+ }
142
+
135
143
  } // namespace pvxs
@@ -21,6 +21,7 @@
21
21
 
22
22
  #include <errlog.h>
23
23
  #include <epicsEvent.h>
24
+ #include <epicsString.h>
24
25
  #include <epicsThread.h>
25
26
  #include <epicsExit.h>
26
27
  #include <epicsMutex.h>
@@ -51,10 +52,7 @@ VFunctor0::~VFunctor0() {}
51
52
  }
52
53
 
53
54
  static
54
- epicsThreadOnceId evthread_once = EPICS_THREAD_ONCE_INIT;
55
-
56
- static
57
- void evthread_init(void* unused)
55
+ void evthread_init()
58
56
  {
59
57
  #if defined(EVTHREAD_USE_WINDOWS_THREADS_IMPLEMENTED)
60
58
  evthread_use_windows_threads();
@@ -130,7 +128,7 @@ struct evbase::Pvt final : public epicsThreadRunable
130
128
  };
131
129
  std::deque<Work> actions;
132
130
 
133
- owned_ptr<event_base> base;
131
+ evbaseptr base;
134
132
  evevent keepalive;
135
133
  evevent dowork;
136
134
  epicsEvent start_sync;
@@ -146,7 +144,7 @@ struct evbase::Pvt final : public epicsThreadRunable
146
144
  epicsThreadGetStackSize(epicsThreadStackBig),
147
145
  prio)
148
146
  {
149
- threadOnce(&evthread_once, &evthread_init, nullptr);
147
+ threadOnce<&evthread_init>();
150
148
 
151
149
  worker.start();
152
150
  start_sync.wait();
@@ -661,9 +659,19 @@ size_t evsocket::get_buffer_size(evutil_socket_t sock, bool tx)
661
659
  # define EAFNOSUPPORT WSAESOCKTNOSUPPORT
662
660
  #endif
663
661
 
664
- bool evsocket::init_canIPv6()
662
+ bool evsocket::init_canIPv6() noexcept
665
663
  {
666
664
  try {
665
+ if(auto ena6 = getenv("PVXS_ENABLE_IPV6")) {
666
+ if(epicsStrCaseCmp(ena6, "NO")==0) {
667
+ log_info_printf(logsock, "IPv6 support disabled%s", "\n");
668
+ return false;
669
+ } else if(epicsStrCaseCmp(ena6, "YES")!=0) {
670
+ log_warn_printf(logsock, "PVXS_ENABLE_IPV6=%s ignoring unrecognized\n",
671
+ ena6);
672
+ }
673
+ }
674
+
667
675
  evsocket sock(AF_INET6, SOCK_DGRAM, 0);
668
676
  auto addr(SockAddr::loopback(AF_INET6));
669
677
  sock.bind(addr);
@@ -688,19 +696,17 @@ bool evsocket::init_canIPv6()
688
696
  # define getMonotonic getCurrent
689
697
  #endif
690
698
 
691
- static epicsThreadOnceId mapOnce = EPICS_THREAD_ONCE_INIT;
692
-
693
699
  static IfaceMap* theinstance;
694
700
 
695
701
  static
696
- void mapInit(void*)
702
+ void mapInit()
697
703
  {
698
704
  theinstance = new IfaceMap();
699
705
  }
700
706
 
701
707
  IfaceMap& IfaceMap::instance()
702
708
  {
703
- threadOnce(&mapOnce, &mapInit);
709
+ threadOnce<&mapInit>();
704
710
  assert(theinstance);
705
711
  return *theinstance;
706
712
  }
@@ -56,15 +56,47 @@ struct default_delete<evbuffer> {
56
56
 
57
57
  namespace pvxs {namespace impl {
58
58
 
59
- //! unique_ptr which is never constructed with NULL
60
59
  template<typename T>
61
- struct owned_ptr : public std::unique_ptr<T>
60
+ struct ev_delete;
61
+ #define DEFINE_DELETE(TYPE) \
62
+ template<> struct ev_delete<TYPE> { \
63
+ inline void operator()(TYPE* ev) { TYPE ## _free(ev); } \
64
+ }
65
+ DEFINE_DELETE(event_config);
66
+ DEFINE_DELETE(event_base);
67
+ DEFINE_DELETE(event);
68
+ DEFINE_DELETE(evconnlistener);
69
+ DEFINE_DELETE(bufferevent);
70
+ DEFINE_DELETE(evbuffer);
71
+ #undef DEFINE_DELETE
72
+
73
+ //! unique_ptr which is never constructed with NULL
74
+ template<typename T, typename D>
75
+ struct owned_ptr : public std::unique_ptr<T, D>
62
76
  {
77
+ typedef std::unique_ptr<T, D> base_t;
63
78
  constexpr owned_ptr() {}
64
- explicit owned_ptr(const char* file, int line, T* ptr) : std::unique_ptr<T>(ptr) {
79
+ constexpr owned_ptr(std::nullptr_t np) : base_t(np) {}
80
+ explicit owned_ptr(const char* file, int line, T* ptr) : base_t(ptr) {
65
81
  if(!*this)
66
82
  throw loc_bad_alloc(file, line);
67
83
  }
84
+
85
+ // for functions which return a pointer in an argument
86
+ // int some(T** presult); // store *presult = output
87
+ // use like
88
+ // owned_ptr<T> x;
89
+ // some(x.acquire());
90
+ struct acquisition {
91
+ base_t* o;
92
+ T* ptr = nullptr;
93
+ operator T** () { return &ptr; }
94
+ constexpr acquisition(base_t* o) :o(o) {}
95
+ ~acquisition() {
96
+ o->reset(ptr);
97
+ }
98
+ };
99
+ acquisition acquire() { return acquisition{this}; }
68
100
  };
69
101
 
70
102
  /* It seems that std::function<void()>(Fn&&) from gcc (circa 8.3) and clang (circa 7.0)
@@ -96,7 +128,7 @@ struct PVXS_API VFunctor0 {
96
128
  virtual void invoke() =0;
97
129
  };
98
130
  template<typename Fn>
99
- struct Functor0 : public VFunctor0 {
131
+ struct Functor0 final : public VFunctor0 {
100
132
  Functor0() = default;
101
133
  Functor0(Fn&& fn) : fn(std::move(fn)) {}
102
134
  virtual ~Functor0() {}
@@ -180,11 +212,14 @@ public:
180
212
  event_base* base = nullptr;
181
213
  };
182
214
 
183
- typedef owned_ptr<event_config> evconfig;
184
- typedef owned_ptr<event> evevent;
185
- typedef owned_ptr<evconnlistener> evlisten;
186
- typedef owned_ptr<bufferevent> evbufferevent;
187
- typedef owned_ptr<evbuffer> evbuf;
215
+ template<typename T>
216
+ using ev_owned_ptr = owned_ptr<T, ev_delete<T>>;
217
+ typedef ev_owned_ptr<event_config> evconfig;
218
+ typedef ev_owned_ptr<event_base> evbaseptr;
219
+ typedef ev_owned_ptr<event> evevent;
220
+ typedef ev_owned_ptr<evconnlistener> evlisten;
221
+ typedef ev_owned_ptr<bufferevent> evbufferevent;
222
+ typedef ev_owned_ptr<evbuffer> evbuf;
188
223
 
189
224
  PVXS_API
190
225
  void to_wire(Buffer& buf, const SockAddr& val);
@@ -255,7 +290,7 @@ struct PVXS_API evsocket
255
290
  static
256
291
  bool canIPv6;
257
292
 
258
- static bool init_canIPv6();
293
+ static bool init_canIPv6() noexcept;
259
294
 
260
295
  enum ipstack_t {
261
296
  Linsock,
@@ -302,6 +337,7 @@ struct PVXS_API IfaceMap {
302
337
  Iface(const std::string& name, uint64_t index, bool isLO) :name(name), index(index), isLO(isLO) {}
303
338
  };
304
339
 
340
+ SockAttach attach;
305
341
  epicsMutex lock;
306
342
  std::map<uint64_t, Iface> byIndex;
307
343
  std::map<std::string, Iface*> byName;