pvxslibs 1.3.2a1__tar.gz → 1.3.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 (256) hide show
  1. {pvxslibs-1.3.2a1/python/pvxslibs.egg-info → pvxslibs-1.3.3}/PKG-INFO +1 -1
  2. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/configure/CONFIG_PVXS_VERSION +3 -2
  3. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/ioc/groupconfigprocessor.cpp +1 -1
  4. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/ioc/groupprocessorcontext.cpp +3 -5
  5. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/ioc/groupsource.cpp +1 -1
  6. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/ioc/groupsourcehooks.cpp +29 -1
  7. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/ioc/pvalink_jlif.cpp +16 -12
  8. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/ioc/pvalink_lset.cpp +2 -2
  9. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/ioc/qsrvpvt.h +1 -1
  10. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/ioc/singlesource.cpp +8 -4
  11. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/ioc/subscriptionctx.h +2 -0
  12. pvxslibs-1.3.3/pyproject.toml +8 -0
  13. pvxslibs-1.3.3/python/pvxslibs/ioc.py +10 -0
  14. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3/python/pvxslibs.egg-info}/PKG-INFO +1 -1
  15. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/python/pvxslibs.egg-info/SOURCES.txt +1 -0
  16. pvxslibs-1.3.3/python/pvxslibs.egg-info/requires.txt +2 -0
  17. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/setup.py +1 -1
  18. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/src/client.cpp +19 -14
  19. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/src/clientconn.cpp +15 -2
  20. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/src/clientimpl.h +9 -2
  21. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/src/clientmon.cpp +1 -1
  22. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/src/datafmt.cpp +16 -13
  23. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/src/nt.cpp +2 -2
  24. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/src/server.cpp +2 -1
  25. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/src/serverconn.cpp +29 -19
  26. pvxslibs-1.3.2a1/pyproject.toml +0 -2
  27. pvxslibs-1.3.2a1/python/pvxslibs.egg-info/requires.txt +0 -2
  28. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/COPYRIGHT +0 -0
  29. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/LICENSE +0 -0
  30. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/MANIFEST.in +0 -0
  31. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/README.md +0 -0
  32. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/bundle/libevent/LICENSE +0 -0
  33. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/bundle/libevent/arc4random.c +0 -0
  34. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/bundle/libevent/buffer.c +0 -0
  35. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/bundle/libevent/buffer_iocp.c +0 -0
  36. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/bundle/libevent/bufferevent-internal.h +0 -0
  37. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/bundle/libevent/bufferevent.c +0 -0
  38. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/bundle/libevent/bufferevent_async.c +0 -0
  39. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/bundle/libevent/bufferevent_filter.c +0 -0
  40. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/bundle/libevent/bufferevent_mbedtls.c +0 -0
  41. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/bundle/libevent/bufferevent_openssl.c +0 -0
  42. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/bundle/libevent/bufferevent_pair.c +0 -0
  43. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/bundle/libevent/bufferevent_ratelim.c +0 -0
  44. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/bundle/libevent/bufferevent_sock.c +0 -0
  45. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/bundle/libevent/bufferevent_ssl.c +0 -0
  46. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/bundle/libevent/changelist-internal.h +0 -0
  47. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/bundle/libevent/cmake/VersionViaGit.cmake +0 -0
  48. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/bundle/libevent/compat/sys/queue.h +0 -0
  49. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/bundle/libevent/defer-internal.h +0 -0
  50. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/bundle/libevent/devpoll.c +0 -0
  51. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/bundle/libevent/epoll.c +0 -0
  52. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/bundle/libevent/epoll_sub.c +0 -0
  53. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/bundle/libevent/epolltable-internal.h +0 -0
  54. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/bundle/libevent/evbuffer-internal.h +0 -0
  55. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/bundle/libevent/evconfig-private.h.cmake +0 -0
  56. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/bundle/libevent/evdns.c +0 -0
  57. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/bundle/libevent/event-config.h.cmake +0 -0
  58. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/bundle/libevent/event-internal.h +0 -0
  59. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/bundle/libevent/event.c +0 -0
  60. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/bundle/libevent/event_iocp.c +0 -0
  61. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/bundle/libevent/event_tagging.c +0 -0
  62. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/bundle/libevent/evmap-internal.h +0 -0
  63. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/bundle/libevent/evmap.c +0 -0
  64. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/bundle/libevent/evport.c +0 -0
  65. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/bundle/libevent/evrpc-internal.h +0 -0
  66. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/bundle/libevent/evrpc.c +0 -0
  67. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/bundle/libevent/evsignal-internal.h +0 -0
  68. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/bundle/libevent/evthread-internal.h +0 -0
  69. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/bundle/libevent/evthread.c +0 -0
  70. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/bundle/libevent/evthread_pthread.c +0 -0
  71. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/bundle/libevent/evthread_win32.c +0 -0
  72. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/bundle/libevent/evutil.c +0 -0
  73. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/bundle/libevent/evutil_rand.c +0 -0
  74. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/bundle/libevent/evutil_time.c +0 -0
  75. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/bundle/libevent/ht-internal.h +0 -0
  76. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/bundle/libevent/http-internal.h +0 -0
  77. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/bundle/libevent/http.c +0 -0
  78. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/bundle/libevent/include/evdns.h +0 -0
  79. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/bundle/libevent/include/event.h +0 -0
  80. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/bundle/libevent/include/event2/buffer.h +0 -0
  81. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/bundle/libevent/include/event2/buffer_compat.h +0 -0
  82. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/bundle/libevent/include/event2/bufferevent.h +0 -0
  83. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/bundle/libevent/include/event2/bufferevent_compat.h +0 -0
  84. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/bundle/libevent/include/event2/bufferevent_ssl.h +0 -0
  85. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/bundle/libevent/include/event2/bufferevent_struct.h +0 -0
  86. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/bundle/libevent/include/event2/dns.h +0 -0
  87. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/bundle/libevent/include/event2/dns_compat.h +0 -0
  88. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/bundle/libevent/include/event2/dns_struct.h +0 -0
  89. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/bundle/libevent/include/event2/event.h +0 -0
  90. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/bundle/libevent/include/event2/event_compat.h +0 -0
  91. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/bundle/libevent/include/event2/event_struct.h +0 -0
  92. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/bundle/libevent/include/event2/http.h +0 -0
  93. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/bundle/libevent/include/event2/http_compat.h +0 -0
  94. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/bundle/libevent/include/event2/http_struct.h +0 -0
  95. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/bundle/libevent/include/event2/keyvalq_struct.h +0 -0
  96. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/bundle/libevent/include/event2/listener.h +0 -0
  97. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/bundle/libevent/include/event2/rpc.h +0 -0
  98. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/bundle/libevent/include/event2/rpc_compat.h +0 -0
  99. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/bundle/libevent/include/event2/rpc_struct.h +0 -0
  100. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/bundle/libevent/include/event2/tag.h +0 -0
  101. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/bundle/libevent/include/event2/tag_compat.h +0 -0
  102. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/bundle/libevent/include/event2/thread.h +0 -0
  103. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/bundle/libevent/include/event2/util.h +0 -0
  104. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/bundle/libevent/include/event2/visibility.h +0 -0
  105. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/bundle/libevent/include/event2/watch.h +0 -0
  106. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/bundle/libevent/include/event2/ws.h +0 -0
  107. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/bundle/libevent/include/evhttp.h +0 -0
  108. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/bundle/libevent/include/evrpc.h +0 -0
  109. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/bundle/libevent/include/evutil.h +0 -0
  110. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/bundle/libevent/iocp-internal.h +0 -0
  111. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/bundle/libevent/ipv6-internal.h +0 -0
  112. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/bundle/libevent/kqueue-internal.h +0 -0
  113. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/bundle/libevent/kqueue.c +0 -0
  114. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/bundle/libevent/listener.c +0 -0
  115. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/bundle/libevent/log-internal.h +0 -0
  116. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/bundle/libevent/log.c +0 -0
  117. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/bundle/libevent/mbedtls-compat.h +0 -0
  118. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/bundle/libevent/minheap-internal.h +0 -0
  119. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/bundle/libevent/mm-internal.h +0 -0
  120. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/bundle/libevent/openssl-compat.h +0 -0
  121. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/bundle/libevent/poll.c +0 -0
  122. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/bundle/libevent/ratelim-internal.h +0 -0
  123. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/bundle/libevent/select.c +0 -0
  124. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/bundle/libevent/sha1.c +0 -0
  125. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/bundle/libevent/sha1.h +0 -0
  126. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/bundle/libevent/signal.c +0 -0
  127. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/bundle/libevent/signalfd.c +0 -0
  128. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/bundle/libevent/ssl-compat.h +0 -0
  129. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/bundle/libevent/strlcpy-internal.h +0 -0
  130. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/bundle/libevent/strlcpy.c +0 -0
  131. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/bundle/libevent/time-internal.h +0 -0
  132. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/bundle/libevent/util-internal.h +0 -0
  133. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/bundle/libevent/watch.c +0 -0
  134. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/bundle/libevent/wepoll.c +0 -0
  135. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/bundle/libevent/wepoll.h +0 -0
  136. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/bundle/libevent/win32select.c +0 -0
  137. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/bundle/libevent/ws.c +0 -0
  138. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/ioc/channel.cpp +0 -0
  139. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/ioc/channel.h +0 -0
  140. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/ioc/credentials.cpp +0 -0
  141. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/ioc/credentials.h +0 -0
  142. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/ioc/dbentry.h +0 -0
  143. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/ioc/dberrormessage.cpp +0 -0
  144. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/ioc/dberrormessage.h +0 -0
  145. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/ioc/dbeventcontextdeleter.h +0 -0
  146. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/ioc/dblocker.h +0 -0
  147. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/ioc/dbmanylocker.h +0 -0
  148. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/ioc/demo.cpp +0 -0
  149. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/ioc/dummygroup.cpp +0 -0
  150. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/ioc/dummysingle.cpp +0 -0
  151. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/ioc/field.cpp +0 -0
  152. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/ioc/field.h +0 -0
  153. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/ioc/fieldconfig.h +0 -0
  154. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/ioc/fielddefinition.cpp +0 -0
  155. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/ioc/fielddefinition.h +0 -0
  156. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/ioc/fieldname.cpp +0 -0
  157. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/ioc/fieldname.h +0 -0
  158. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/ioc/fieldnamecomponent.h +0 -0
  159. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/ioc/fieldsubscriptionctx.cpp +0 -0
  160. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/ioc/fieldsubscriptionctx.h +0 -0
  161. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/ioc/group.cpp +0 -0
  162. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/ioc/group.h +0 -0
  163. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/ioc/groupconfig.h +0 -0
  164. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/ioc/groupconfigprocessor.h +0 -0
  165. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/ioc/groupdefinition.h +0 -0
  166. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/ioc/groupprocessorcontext.h +0 -0
  167. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/ioc/groupsource.h +0 -0
  168. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/ioc/groupsrcsubscriptionctx.h +0 -0
  169. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/ioc/imagedemo.c +0 -0
  170. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/ioc/iochooks.cpp +0 -0
  171. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/ioc/iocshargument.h +0 -0
  172. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/ioc/iocshcommand.h +0 -0
  173. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/ioc/iocshindex.h +0 -0
  174. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/ioc/iocsource.cpp +0 -0
  175. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/ioc/iocsource.h +0 -0
  176. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/ioc/localfieldlog.cpp +0 -0
  177. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/ioc/localfieldlog.h +0 -0
  178. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/ioc/pvalink.cpp +0 -0
  179. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/ioc/pvalink.h +0 -0
  180. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/ioc/pvalink_channel.cpp +0 -0
  181. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/ioc/pvalink_link.cpp +0 -0
  182. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/ioc/pvxs/iochooks.h +0 -0
  183. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/ioc/pvxs3x.dbd +0 -0
  184. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/ioc/pvxs7x.dbd +0 -0
  185. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/ioc/securityclient.cpp +0 -0
  186. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/ioc/securityclient.h +0 -0
  187. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/ioc/securitylogger.h +0 -0
  188. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/ioc/singlesource.h +0 -0
  189. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/ioc/singlesourcehooks.cpp +0 -0
  190. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/ioc/singlesrcsubscriptionctx.cpp +0 -0
  191. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/ioc/singlesrcsubscriptionctx.h +0 -0
  192. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/ioc/typeutils.cpp +0 -0
  193. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/ioc/typeutils.h +0 -0
  194. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/ioc/yajlcallbackhandler.h +0 -0
  195. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/python/pvxslibs/__init__.py +0 -0
  196. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/python/pvxslibs/lib/__init__.py +0 -0
  197. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/python/pvxslibs/path.py +0 -0
  198. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/python/pvxslibs/test/__init__.py +0 -0
  199. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/python/pvxslibs/test/test_load.py +0 -0
  200. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/python/pvxslibs/version.py +0 -0
  201. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/python/pvxslibs.egg-info/dependency_links.txt +0 -0
  202. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/python/pvxslibs.egg-info/not-zip-safe +0 -0
  203. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/python/pvxslibs.egg-info/top_level.txt +0 -0
  204. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/setup.cfg +0 -0
  205. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/src/bitmask.cpp +0 -0
  206. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/src/bitmask.h +0 -0
  207. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/src/clientdiscover.cpp +0 -0
  208. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/src/clientget.cpp +0 -0
  209. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/src/clientintrospect.cpp +0 -0
  210. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/src/clientreq.cpp +0 -0
  211. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/src/config.cpp +0 -0
  212. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/src/conn.cpp +0 -0
  213. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/src/conn.h +0 -0
  214. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/src/data.cpp +0 -0
  215. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/src/dataencode.cpp +0 -0
  216. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/src/dataimpl.h +0 -0
  217. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/src/describe.cpp +0 -0
  218. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/src/describe.h@ +0 -0
  219. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/src/evhelper.cpp +0 -0
  220. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/src/evhelper.h +0 -0
  221. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/src/log.cpp +0 -0
  222. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/src/os/WIN32/osdSockExt.cpp +0 -0
  223. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/src/os/default/osdSockExt.cpp +0 -0
  224. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/src/osgroups.cpp +0 -0
  225. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/src/osiSockExt.h +0 -0
  226. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/src/pvaproto.h +0 -0
  227. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/src/pvrequest.cpp +0 -0
  228. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/src/pvrequest.h +0 -0
  229. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/src/pvxs/client.h +0 -0
  230. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/src/pvxs/data.h +0 -0
  231. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/src/pvxs/log.h +0 -0
  232. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/src/pvxs/netcommon.h +0 -0
  233. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/src/pvxs/nt.h +0 -0
  234. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/src/pvxs/server.h +0 -0
  235. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/src/pvxs/sharedArray.h +0 -0
  236. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/src/pvxs/sharedpv.h +0 -0
  237. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/src/pvxs/source.h +0 -0
  238. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/src/pvxs/srvcommon.h +0 -0
  239. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/src/pvxs/unittest.h +0 -0
  240. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/src/pvxs/util.h +0 -0
  241. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/src/pvxs/version.h +0 -0
  242. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/src/pvxs/versionNum.h@ +0 -0
  243. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/src/serverchan.cpp +0 -0
  244. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/src/serverconn.h +0 -0
  245. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/src/serverget.cpp +0 -0
  246. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/src/serverintrospect.cpp +0 -0
  247. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/src/servermon.cpp +0 -0
  248. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/src/serversource.cpp +0 -0
  249. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/src/sharedarray.cpp +0 -0
  250. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/src/sharedpv.cpp +0 -0
  251. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/src/type.cpp +0 -0
  252. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/src/udp_collector.cpp +0 -0
  253. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/src/udp_collector.h +0 -0
  254. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/src/unittest.cpp +0 -0
  255. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/src/util.cpp +0 -0
  256. {pvxslibs-1.3.2a1 → pvxslibs-1.3.3}/src/utilpvt.h +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: pvxslibs
3
- Version: 1.3.2a1
3
+ Version: 1.3.3
4
4
  Summary: PVXS libraries packaged for python
5
5
  Home-page: https://epics-base.github.io/pvxs
6
6
  Author: Michael Davidsaver
@@ -1,6 +1,6 @@
1
1
  PVXS_MAJOR_VERSION = 1
2
2
  PVXS_MINOR_VERSION = 3
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_3_2 = YES
15
+ PVXS_1_3_3 = YES
16
+ PVXS_1_3_2 = NO
16
17
  PVXS_1_3_1 = NO
17
18
  PVXS_1_3_0 = NO
18
19
  PVXS_1_2_4 = NO
@@ -225,7 +225,7 @@ void GroupConfigProcessor::defineFields(GroupDefinition& groupDefinition, const
225
225
  }
226
226
 
227
227
  if(fieldName.empty() && fieldConfig.info.type!=MappingInfo::Meta) {
228
- fprintf(stderr, "%s.%s Error: only +type:\"meta\" map be mapped at struct top\n",
228
+ fprintf(stderr, "%s.%s Error: only +type:\"meta\" can be mapped at struct top\n",
229
229
  groupName.c_str(), fieldName.c_str());
230
230
  continue;
231
231
  }
@@ -33,8 +33,7 @@ void GroupProcessorContext::assign(const Value& value) {
33
33
  groupPvConfig.structureId = value.as<std::string>();
34
34
 
35
35
  } else {
36
- groupConfigProcessor->groupProcessingWarnings += "Unknown group option ";
37
- groupConfigProcessor->groupProcessingWarnings += field;
36
+ groupConfigProcessor->groupProcessingWarnings += SB()<<"Unknown group option: \""<<field<<"\"\n";
38
37
  }
39
38
  field.clear();
40
39
 
@@ -59,7 +58,7 @@ void GroupProcessorContext::assign(const Value& value) {
59
58
  } else if(tname == "const") {
60
59
  type = MappingInfo::Const;
61
60
  } else {
62
- groupConfigProcessor->groupProcessingWarnings += SB()<<"Unknown mapping +type:\""<<tname<<"\" ignored";
61
+ groupConfigProcessor->groupProcessingWarnings += SB()<<"Unknown mapping +type:\""<<tname<<"\" ignored\n";
63
62
  }
64
63
  groupField.info.type = type;
65
64
 
@@ -82,8 +81,7 @@ void GroupProcessorContext::assign(const Value& value) {
82
81
  groupField.info.cval = value;
83
82
 
84
83
  } else {
85
- groupConfigProcessor->groupProcessingWarnings += "Unknown group field option ";
86
- groupConfigProcessor->groupProcessingWarnings += field + ":" + key;
84
+ groupConfigProcessor->groupProcessingWarnings += SB()<<"Unknown group field option: \""<<field<<":"<<key<<"\"\n";
87
85
  }
88
86
  key.clear();
89
87
  }
@@ -159,7 +159,7 @@ void GroupSource::onOp(Group& group,
159
159
  });
160
160
 
161
161
  // Make a security cache for this client's connection to this group
162
- // Each time the same client calls put we will re-use the cached security client
162
+ // Each time the same client calls put we will reuse the cached security client
163
163
  // The security cache will be deleted when the client disconnects from this group pv
164
164
  auto securityCache = std::make_shared<GroupSecurityCache>();
165
165
 
@@ -16,6 +16,8 @@
16
16
  #include <iocsh.h>
17
17
 
18
18
  #include <initHooks.h>
19
+ #include <iocInit.h>
20
+ #include <dbAccess.h>
19
21
 
20
22
  #include <pvxs/source.h>
21
23
  #include <pvxs/iochooks.h>
@@ -28,6 +30,9 @@
28
30
  #if EPICS_VERSION_INT < VERSION_INT(7, 0, 3, 1)
29
31
  # define iocshSetError(ret) do { (void)ret; }while(0)
30
32
  #endif
33
+ #ifndef ERL_ERROR
34
+ # define ERL_ERROR "ERROR"
35
+ #endif
31
36
 
32
37
  // include last to avoid clash of #define printf with other headers
33
38
  #include <epicsStdio.h>
@@ -42,7 +47,6 @@ namespace ioc {
42
47
  static
43
48
  void dbLoadGroupCmd(const char* jsonFileName, const char *macros) {
44
49
  iocshSetError(!!dbLoadGroup(jsonFileName, macros));
45
- GroupConfigProcessor().loadConfigFiles();
46
50
  }
47
51
 
48
52
  /**
@@ -96,6 +100,30 @@ const auto dbLoadGroupMsg =
96
100
 
97
101
  long dbLoadGroup(const char* jsonFilename, const char* macros) {
98
102
  try {
103
+ /* getIocState() introduced to the 3.15 branch in R3.15.8
104
+ * 7.0 branch in R7.0.4
105
+ */
106
+ #if EPICS_VERSION_INT >= VERSION_INT(7, 0, 4, 0) \
107
+ || (EPICS_VERSION_INT < VERSION_INT(7, 0, 0, 0) && EPICS_VERSION_INT >= VERSION_INT(3, 15, 8, 0))
108
+ if(getIocState() != iocVoid)
109
+ {
110
+ fprintf(stderr,
111
+ ERL_ERROR " dbLoadGroup() not allowed in current IOC state (%d).\n"
112
+ " Hint: Move before iocInit()\n",
113
+ getIocState()
114
+ );
115
+ return 1;
116
+ }
117
+ #else
118
+ if(interruptAccept)
119
+ {
120
+ fprintf(stderr,
121
+ ERL_ERROR " dbLoadGroup() not allowed in current IOC state.\n"
122
+ " Hint: Move before iocInit()\n");
123
+ return 1;
124
+ }
125
+ #endif
126
+
99
127
  if (!jsonFilename || !jsonFilename[0]) {
100
128
  fprintf(stderr, "%s\n"
101
129
  "Error: Missing required JSON filename\n", dbLoadGroupMsg);
@@ -6,6 +6,8 @@
6
6
 
7
7
  #include <sstream>
8
8
 
9
+ #include <pvxs/log.h>
10
+ #include "qsrvpvt.h"
9
11
  #include "pvalink.h"
10
12
 
11
13
  #include <epicsStdio.h> // redirects stdout/stderr
@@ -17,6 +19,8 @@ pvaLinkConfig::~pvaLinkConfig() {}
17
19
 
18
20
  namespace {
19
21
 
22
+ DEFINE_LOGGER(logj, "pvxs.ioc.link.parse");
23
+
20
24
  /* link options.
21
25
  *
22
26
  * "pvname" # short-hand, sets PV name only
@@ -73,8 +77,8 @@ jlif_result pva_parse_null(jlink *pjlink) noexcept
73
77
  pvt->sevr = pvaLinkConfig::NMS;
74
78
  } else if(pvt->jkey == "local") {
75
79
  pvt->local = false; // alias for local:false
76
- } else if(pvt->debug) {
77
- printf("pva link parsing unknown none depth=%u key=\"%s\"\n",
80
+ } else {
81
+ log_warn_printf(logj, "pva link parsing unknown none depth=%u key=\"%s\"\n",
78
82
  pvt->parseDepth, pvt->jkey.c_str());
79
83
  }
80
84
 
@@ -107,8 +111,8 @@ jlif_result pva_parse_bool(jlink *pjlink, int val) noexcept
107
111
  pvt->always = !!val;
108
112
  } else if(pvt->jkey == "atomic") {
109
113
  pvt->atomic = !!val;
110
- } else if(pvt->debug) {
111
- printf("pva link parsing unknown integer depth=%u key=\"%s\" value=%s\n",
114
+ } else {
115
+ log_warn_printf(logj, "pva link parsing unknown integer depth=%u key=\"%s\" value=%s\n",
112
116
  pvt->parseDepth, pvt->jkey.c_str(), val ? "true" : "false");
113
117
  }
114
118
 
@@ -126,8 +130,8 @@ jlif_result pva_parse_integer(jlink *pjlink, long long val) noexcept
126
130
  pvt->queueSize = val < 1 ? 1 : size_t(val);
127
131
  } else if(pvt->jkey == "monorder") {
128
132
  pvt->monorder = std::max(-1024, std::min(int(val), 1024));
129
- } else if(pvt->debug) {
130
- printf("pva link parsing unknown integer depth=%u key=\"%s\" value=%lld\n",
133
+ } else {
134
+ log_warn_printf(logj, "pva link parsing unknown integer depth=%u key=\"%s\" value=%lld\n",
131
135
  pvt->parseDepth, pvt->jkey.c_str(), val);
132
136
  }
133
137
 
@@ -160,8 +164,8 @@ jlif_result pva_parse_string(jlink *pjlink, const char *val, size_t len) noexcep
160
164
  pvt->proc = pvaLinkConfig::PP;
161
165
  } else if(sval=="NPP") {
162
166
  pvt->proc = pvaLinkConfig::NPP;
163
- } else if(pvt->debug) {
164
- printf("pva link parsing unknown proc depth=%u key=\"%s\" value=\"%s\"\n",
167
+ } else {
168
+ log_warn_printf(logj, "pva link parsing unknown proc depth=%u key=\"%s\" value=\"%s\"\n",
165
169
  pvt->parseDepth, pvt->jkey.c_str(), sval.c_str());
166
170
  }
167
171
 
@@ -177,13 +181,13 @@ jlif_result pva_parse_string(jlink *pjlink, const char *val, size_t len) noexcep
177
181
  // leave room for this to happen compatibly later by
178
182
  // handling as alias for MS until then.
179
183
  pvt->sevr = pvaLinkConfig::MS;
180
- } else if(pvt->debug) {
181
- printf("pva link parsing unknown sevr depth=%u key=\"%s\" value=\"%s\"\n",
184
+ } else {
185
+ log_warn_printf(logj, "pva link parsing unknown sevr depth=%u key=\"%s\" value=\"%s\"\n",
182
186
  pvt->parseDepth, pvt->jkey.c_str(), sval.c_str());
183
187
  }
184
188
 
185
- } else if(pvt->debug) {
186
- printf("pva link parsing unknown string depth=%u key=\"%s\" value=\"%s\"\n",
189
+ } else {
190
+ log_warn_printf(logj, "pva link parsing unknown string depth=%u key=\"%s\" value=\"%s\"\n",
187
191
  pvt->parseDepth, pvt->jkey.c_str(), sval.c_str());
188
192
  }
189
193
 
@@ -85,7 +85,7 @@ void pvaOpenLink(DBLINK *plink) noexcept
85
85
  linkGlobal_t::channels_t::iterator it(linkGlobal->channels.find(key));
86
86
 
87
87
  if(it!=linkGlobal->channels.end()) {
88
- // re-use existing channel
88
+ // reuse existing channel
89
89
  chan = it->second.lock();
90
90
  }
91
91
 
@@ -252,7 +252,7 @@ long pvaGetValue(DBLINK *plink, short dbrType, void *pbuffer, long *pnRequest) n
252
252
  auto nReq(pnRequest ? *pnRequest : 1);
253
253
  auto value(self->fld_value);
254
254
 
255
- if(value.type()==TypeCode::Any)
255
+ if(value.type()==TypeCode::Any || value.type()==TypeCode::Union)
256
256
  value = value.lookup("->");
257
257
 
258
258
  if(nReq <= 0 || !value) {
@@ -40,7 +40,7 @@ static inline void resetGroups() {}
40
40
  #if EPICS_VERSION_INT >= VERSION_INT(7, 0, 4, 0)
41
41
  # define USE_DEINIT_HOOKS
42
42
  #endif
43
- #if EPICS_VERSION_INT > VERSION_INT(7, 0, 7, 0)
43
+ #if EPICS_VERSION_INT >= VERSION_INT(7, 0, 8, 0)
44
44
  # define USE_PREPARE_CLEANUP_HOOKS
45
45
  #endif
46
46
 
@@ -75,14 +75,18 @@ void subscriptionValueCallback(void* userArg, struct dbChannel* pChannel,
75
75
  int, struct db_field_log* pDbFieldLog) noexcept {
76
76
  auto subscriptionContext = (SingleSourceSubscriptionCtx*)userArg;
77
77
  subscriptionContext->hadValueEvent = true;
78
- auto change = UpdateType::type(UpdateType::Value | UpdateType::Alarm);
78
+ auto change = subscriptionContext->pValueEventSubscription.mask;
79
79
  #if EPICS_VERSION_INT >= VERSION_INT(7, 0, 6, 0)
80
80
  if(pDbFieldLog) {
81
81
  // when available, use DBE mask from db_field_log
82
- change = UpdateType::type(pDbFieldLog->mask & UpdateType::Everything);
82
+ change = pDbFieldLog->mask;
83
83
  }
84
84
  #endif
85
- subscriptionCallback(subscriptionContext, change, pChannel, pDbFieldLog);
85
+ // ARCHIVE events will get the same data fields as VALUE
86
+ if(change & DBE_ARCHIVE)
87
+ change = (change&~DBE_ARCHIVE)|DBE_VALUE;
88
+ change &= UpdateType::Everything; // does not include DBE_ARCHIVE
89
+ subscriptionCallback(subscriptionContext, UpdateType::type(change), pChannel, pDbFieldLog);
86
90
  }
87
91
 
88
92
  void subscriptionPropertiesCallback(void* userArg, struct dbChannel* pChannel, int,
@@ -304,7 +308,7 @@ void onOp(const std::shared_ptr<SingleInfo>& sInfo, const Value& valuePrototype,
304
308
  });
305
309
 
306
310
  // Make a security cache for this client's connection to this pv
307
- // Each time the same client calls put we will re-use the cached security client
311
+ // Each time the same client calls put we will reuse the cached security client
308
312
  // The security cache will be deleted when the client disconnects from this pv
309
313
  auto putOperationCache = std::make_shared<PutOperationCache>();
310
314
 
@@ -25,6 +25,7 @@ namespace ioc {
25
25
  class Subscription {
26
26
  std::shared_ptr<std::remove_pointer<dbEventSubscription>::type> sub; // holds void* returned by db_add_event()
27
27
  public:
28
+ unsigned mask=0;
28
29
  /* Add a subscription event by calling db_add_event using the given subscriptionCtx
29
30
  * and selecting the correct elements based on the given type of event being added.
30
31
  * You need to specify the correct options that correspond to the event type.
@@ -45,6 +46,7 @@ public:
45
46
  });
46
47
  if(!sub)
47
48
  throw std::runtime_error("Failed to create db subscription");
49
+ mask = select;
48
50
  }
49
51
  void cancel() {
50
52
  sub.reset();
@@ -0,0 +1,8 @@
1
+ [build-system]
2
+ requires = [
3
+ "setuptools",
4
+ "wheel",
5
+ "setuptools_dso>=2.7a1",
6
+ "setuptools_dso>=2.11a2; python_version >= '3.12'",
7
+ "epicscorelibs>=7.0.7.99.1.2a1",
8
+ ]
@@ -0,0 +1,10 @@
1
+ import os
2
+
3
+ from epicscorelibs import ioc
4
+ import pvxslibs.path
5
+
6
+ if __name__ == "__main__":
7
+ os.environ.setdefault("PVXS_QSRV_ENABLE", "YES")
8
+ pvxs_dbd_load = (("pvxsIoc.dbd", pvxslibs.path.dbd_path), )
9
+ pvxs_dso_load = ("pvxslibs.lib.pvxsIoc", )
10
+ ioc.main(extra_dbd_load=pvxs_dbd_load, extra_dso_load=pvxs_dso_load)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: pvxslibs
3
- Version: 1.3.2a1
3
+ Version: 1.3.3
4
4
  Summary: PVXS libraries packaged for python
5
5
  Home-page: https://epics-base.github.io/pvxs
6
6
  Author: Michael Davidsaver
@@ -178,6 +178,7 @@ ioc/typeutils.h
178
178
  ioc/yajlcallbackhandler.h
179
179
  ioc/pvxs/iochooks.h
180
180
  python/pvxslibs/__init__.py
181
+ python/pvxslibs/ioc.py
181
182
  python/pvxslibs/path.py
182
183
  python/pvxslibs/version.py
183
184
  python/pvxslibs.egg-info/PKG-INFO
@@ -0,0 +1,2 @@
1
+ setuptools_dso>=2.7a1
2
+ epicscorelibs<7.0.7.99.2,>=7.0.7.99.1.2a1
@@ -696,7 +696,7 @@ build_dso.sub_commands.extend([
696
696
 
697
697
 
698
698
  pvxs_ver = '%(PVXS_MAJOR_VERSION)s.%(PVXS_MINOR_VERSION)s.%(PVXS_MAINTENANCE_VERSION)s'%pvxsversion
699
- pvxs_ver += 'a1'
699
+ #pvxs_ver += 'a1'
700
700
 
701
701
  with open(os.path.join(os.path.dirname(__file__), 'README.md')) as F:
702
702
  long_description = F.read()
@@ -516,8 +516,7 @@ Value buildCAMethod()
516
516
  }
517
517
 
518
518
  ContextImpl::ContextImpl(const Config& conf, const evbase& tcp_loop)
519
- :ifmap(IfaceMap::instance())
520
- ,effective([conf]() -> Config{
519
+ :effective([conf]() -> Config{
521
520
  Config eff(conf);
522
521
  eff.expand();
523
522
  return eff;
@@ -798,7 +797,7 @@ void ContextImpl::onBeacon(const UDPManager::Beacon& msg)
798
797
  cur.guid = msg.guid;
799
798
  cur.peerVersion = msg.peerVersion;
800
799
  cur.time = now;
801
- // don't trigger if sender changes as server (mis)configuration
800
+ // don't trigger if sender changes as server configuration
802
801
  // could see beacons reach us from multiple interfaces.
803
802
  cur.sender = msg.src;
804
803
 
@@ -904,6 +903,7 @@ void procSearchReply(ContextImpl& self, const SockAddr& src, uint8_t peerVersion
904
903
  chan->conn = Connection::build(self.shared_from_this(), serv);
905
904
 
906
905
  chan->conn->pending[chan->cid] = chan;
906
+ chan->nSearch = 0u;
907
907
  chan->state = Channel::Connecting;
908
908
 
909
909
  chan->conn->createChannels();
@@ -1145,37 +1145,42 @@ void ContextImpl::tickSearch(SearchKind kind, bool poked)
1145
1145
  to_wire(H, Header{CMD_SEARCH, 0, uint32_t(consumed-8u)});
1146
1146
  }
1147
1147
  for(auto& pair : searchDest) {
1148
- auto& dest = pair.first.addr.family()==AF_INET ? searchTx4 : searchTx6;
1148
+ auto& dest = pair.dest.addr.family()==AF_INET ? searchTx4 : searchTx6;
1149
1149
 
1150
- if(pair.second) {
1150
+ if(pair.isucast) {
1151
1151
  *pflags |= pva_search_flags::Unicast;
1152
1152
 
1153
1153
  } else {
1154
1154
  *pflags &= ~pva_search_flags::Unicast;
1155
1155
 
1156
- dest.mcast_prep_sendto(pair.first);
1156
+ dest.mcast_prep_sendto(pair.dest);
1157
1157
  }
1158
1158
 
1159
1159
  int ntx = sendto(dest.sock, (char*)searchMsg.data(), consumed, 0,
1160
- &pair.first.addr->sa, pair.first.addr.size());
1160
+ &pair.dest.addr->sa, pair.dest.addr.size());
1161
1161
 
1162
1162
  if(ntx<0) {
1163
1163
  int err = evutil_socket_geterror(dest.sock);
1164
1164
  auto lvl = Level::Warn;
1165
- if(err==EINTR || err==EPERM)
1165
+ if(err==EINTR || err==EPERM || !pair.lastSuccess)
1166
1166
  lvl = Level::Debug;
1167
1167
  log_printf(io, lvl, "Search tx %s error (%d) %s\n",
1168
- pair.first.addr.tostring().c_str(), err, evutil_socket_error_to_string(err));
1168
+ pair.dest.addr.tostring().c_str(), err, evutil_socket_error_to_string(err));
1169
+ pair.lastSuccess = false;
1169
1170
 
1170
1171
  } else if(unsigned(ntx)<consumed) {
1171
- log_warn_printf(io, "Search truncated %u < %u",
1172
+ log_warn_printf(io, "Search tx truncated %u < %u",
1172
1173
  unsigned(ntx), unsigned(consumed));
1173
1174
 
1174
1175
  } else {
1175
- log_hex_printf(io, Level::Debug, (char*)searchMsg.data(), consumed,
1176
- "Search to %s %s\n",
1177
- std::string(SB()<<pair.first).c_str(),
1178
- pair.second ? "ucast" : "bcast");
1176
+ auto lvl = Level::Info;
1177
+ if(pair.lastSuccess)
1178
+ lvl = Level::Debug;
1179
+ log_hex_printf(io, lvl, (char*)searchMsg.data(), consumed,
1180
+ "Search tx %s %s\n",
1181
+ std::string(SB()<<pair.dest).c_str(),
1182
+ pair.isucast ? "ucast" : "bcast");
1183
+ pair.lastSuccess = true;
1179
1184
  }
1180
1185
  }
1181
1186
  *pflags |= 0x80; // TCP search is always "unicast"
@@ -71,8 +71,16 @@ void Connection::startConnecting()
71
71
  timeval tmo(totv(context->effective.tcpTimeout));
72
72
  bufferevent_set_timeouts(bev.get(), &tmo, &tmo);
73
73
 
74
- if(bufferevent_socket_connect(bev.get(), const_cast<sockaddr*>(&peerAddr->sa), peerAddr.size()))
75
- throw std::runtime_error("Unable to begin connecting");
74
+ if(bufferevent_socket_connect(bev.get(), const_cast<sockaddr*>(&peerAddr->sa), peerAddr.size())) {
75
+ // non-blocking connect() failed immediately.
76
+ // try to defer notification.
77
+ state = Disconnected;
78
+ constexpr timeval immediate{0, 0};
79
+ if(event_add(echoTimer.get(), &immediate))
80
+ throw std::runtime_error(SB()<<"Unable to begin connecting or schedule deferred notification "<<peerName);
81
+ log_warn_printf(io, "Unable to connect() to %s\n", peerName.c_str());
82
+ return;
83
+ }
76
84
 
77
85
  connect(std::move(bev));
78
86
 
@@ -480,6 +488,11 @@ void Connection::tickEcho()
480
488
 
481
489
  startConnecting();
482
490
 
491
+ }else if(state==Disconnected) {
492
+ // deferred notification of early connect() failure.
493
+ // TODO: avoid a misleading "closed by peer" error
494
+ bevEvent(BEV_EVENT_EOF);
495
+
483
496
  } else {
484
497
  log_debug_printf(io, "Server %s ping\n", peerName.c_str());
485
498
 
@@ -86,6 +86,7 @@ struct Connection final : public ConnBase, public std::enable_shared_from_this<C
86
86
 
87
87
  // While HoldOff, the time until re-connection
88
88
  // While Connected, periodic Echo
89
+ // After early connect() failure, deferred notification
89
90
  const evevent echoTimer;
90
91
 
91
92
  bool ready = false;
@@ -246,7 +247,6 @@ private:
246
247
  struct ContextImpl : public std::enable_shared_from_this<ContextImpl>
247
248
  {
248
249
  SockAttach attach;
249
- IfaceMap& ifmap;
250
250
 
251
251
  enum state_t {
252
252
  Init,
@@ -288,7 +288,14 @@ struct ContextImpl : public std::enable_shared_from_this<ContextImpl>
288
288
  std::vector<uint8_t> searchMsg;
289
289
 
290
290
  // search destination address and whether to set the unicast flag
291
- std::vector<std::pair<SockEndpoint, bool>> searchDest;
291
+ struct SearchDest {
292
+ const SockEndpoint dest;
293
+ const bool isucast;
294
+ bool lastSuccess = true;
295
+ SearchDest(SockEndpoint dest, bool isu) :dest(dest), isucast(isu) {}
296
+ };
297
+
298
+ std::vector<SearchDest> searchDest;
292
299
 
293
300
  size_t currentBucket = 0u;
294
301
  // Channels where we have yet to send out an initial search request
@@ -242,7 +242,7 @@ struct SubscriptionImpl final : public OperationBase, public Subscription
242
242
  loop.call([this, &ret](){
243
243
  // really on worker
244
244
 
245
- // try to re-use already wrapped
245
+ // try to reuse already wrapped
246
246
  ret = external_internal.lock();
247
247
  if(!ret) {
248
248
  // nope, need to build a fresh one
@@ -133,19 +133,22 @@ struct FmtTree {
133
133
  case TypeCode::Bool:
134
134
  strm<<(fld.as<bool>() ? "true" : "false");
135
135
  return;
136
- #define CASE(ENUM, TYPE) \
137
- case TypeCode::ENUM : strm<<fld.as<TYPE>(); return
138
- CASE(Int8, int8_t);
139
- CASE(Int16, int16_t);
140
- CASE(Int32, int32_t);
141
- CASE(Int64, int64_t);
142
- CASE(UInt8, uint8_t);
143
- CASE(UInt16, uint16_t);
144
- CASE(UInt32, uint32_t);
145
- CASE(UInt64, uint64_t);
146
- CASE(Float32, float);
147
- CASE(Float64, double);
148
- #undef CASE
136
+ case TypeCode::Int8:
137
+ case TypeCode::Int16:
138
+ case TypeCode::Int32:
139
+ case TypeCode::Int64:
140
+ strm<<fld.as<int64_t>();
141
+ return;
142
+ case TypeCode::UInt8:
143
+ case TypeCode::UInt16:
144
+ case TypeCode::UInt32:
145
+ case TypeCode::UInt64:
146
+ strm<<fld.as<uint64_t>();
147
+ return;
148
+ case TypeCode::Float32:
149
+ case TypeCode::Float64:
150
+ strm<<fld.as<double>();
151
+ return;
149
152
  case TypeCode::String:
150
153
  strm<<"\""<<escape(fld.as<std::string>())<<"\"";
151
154
  return;
@@ -215,8 +215,8 @@ TypeDef NTNDArray::build() const
215
215
  UInt16A("ushortValue"),
216
216
  UInt32A("uintValue"),
217
217
  UInt64A("ulongValue"),
218
- Float32("floatValue"),
219
- Float64("doubleValue"),
218
+ Float32A("floatValue"),
219
+ Float64A("doubleValue"),
220
220
  }),
221
221
  Struct("codec", "codec_t", {
222
222
  String("name"),
@@ -788,7 +788,8 @@ void Server::Pvt::doBeacons(short evt)
788
788
  auto lvl = Level::Warn;
789
789
  if(err==EINTR || err==EPERM)
790
790
  lvl = Level::Debug;
791
- log_printf(serverio, lvl, "Beacon tx error (%d) %s\n",
791
+ log_printf(serverio, lvl, "Beacon tx %s error (%d) %s\n",
792
+ (SB()<<dest).str().c_str(),
792
793
  err, evutil_socket_error_to_string(err));
793
794
 
794
795
  } else if(unsigned(ntx)<pktlen) {
@@ -408,18 +408,40 @@ ServIface::ServIface(const SockAddr &addr, server::Server::Pvt *server, bool fal
408
408
  server->acceptor_loop.assertInLoop();
409
409
  auto orig_port = bind_addr.port();
410
410
 
411
- sock = evsocket(bind_addr.family(), SOCK_STREAM, 0);
412
-
413
- if(evutil_make_listen_socket_reuseable(sock.sock))
414
- log_warn_printf(connsetup, "Unable to make socket reusable%s", "\n");
415
-
416
411
  // try to bind to requested port, then fallback to a random port
417
412
  while(true) {
413
+
414
+ sock = evsocket(bind_addr.family(), SOCK_STREAM, 0);
415
+
416
+ if(evutil_make_listen_socket_reuseable(sock.sock))
417
+ log_warn_printf(connsetup, "Unable to make socket reusable%s", "\n");
418
+
418
419
  try {
419
420
  sock.bind(bind_addr);
421
+ // semantics of SO_REUSEADDR on *nix allow multiple bind() to success.
422
+ // however, only one listen() will succeed
423
+
424
+ // added in libevent 2.1.1
425
+ #ifndef LEV_OPT_DISABLED
426
+ # define LEV_OPT_DISABLED 0
427
+ #endif
428
+
429
+ const int backlog = 4;
430
+ auto list(evconnlistener_new(server->acceptor_loop.base, onConnS, this, LEV_OPT_DISABLED|LEV_OPT_CLOSE_ON_EXEC, backlog, sock.sock));
431
+ if(!list) {
432
+ int err = evutil_socket_geterror(sock);
433
+ throw std::system_error(err, std::system_category());
434
+ }
435
+ listener = evlisten(__FILE__, __LINE__, list);
436
+
437
+ if(!LEV_OPT_DISABLED)
438
+ evconnlistener_disable(listener.get());
439
+
420
440
  } catch(std::system_error& e) {
421
- if(fallback && e.code().value()==SOCK_EADDRINUSE) {
422
- log_debug_printf(connsetup, "Address %s in use\n", bind_addr.tostring().c_str());
441
+ if(fallback && (e.code().value()==SOCK_EADDRINUSE || e.code().value()==SOCK_EACCES)) {
442
+ log_debug_printf(connsetup, "Address %s in use or not permitted: %s\n",
443
+ bind_addr.tostring().c_str(),
444
+ e.what());
423
445
  bind_addr.setPort(0);
424
446
  fallback = false;
425
447
  continue;
@@ -438,18 +460,6 @@ ServIface::ServIface(const SockAddr &addr, server::Server::Pvt *server, bool fal
438
460
  if(orig_port && bind_addr.port() != orig_port) {
439
461
  log_warn_printf(connsetup, "Server unable to bind port %u, falling back to %s\n", orig_port, name.c_str());
440
462
  }
441
-
442
- // added in libevent 2.1.1
443
- #ifndef LEV_OPT_DISABLED
444
- # define LEV_OPT_DISABLED 0
445
- #endif
446
-
447
- const int backlog = 4;
448
- listener = evlisten(__FILE__, __LINE__,
449
- evconnlistener_new(server->acceptor_loop.base, onConnS, this, LEV_OPT_DISABLED|LEV_OPT_CLOSE_ON_EXEC, backlog, sock.sock));
450
-
451
- if(!LEV_OPT_DISABLED)
452
- evconnlistener_disable(listener.get());
453
463
  }
454
464
 
455
465
  void ServIface::onConnS(struct evconnlistener *listener, evutil_socket_t sock, struct sockaddr *peer, int socklen, void *raw)
@@ -1,2 +0,0 @@
1
- [build-system]
2
- requires = ["setuptools", "wheel", "setuptools_dso>=2.7a1", "setuptools_dso>=2.11a2; python_version >= '3.12'", "epicscorelibs>=7.0.7.99.1.1a2"]
@@ -1,2 +0,0 @@
1
- setuptools_dso>=2.7a1
2
- epicscorelibs<7.0.7.99.2,>=7.0.7.99.1.1a2
File without changes
File without changes
File without changes
File without changes