pvxslibs 1.2.4a3__tar.gz → 1.3.0__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 (254) hide show
  1. {pvxslibs-1.2.4a3/python/pvxslibs.egg-info → pvxslibs-1.3.0}/PKG-INFO +1 -1
  2. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/configure/CONFIG_PVXS_VERSION +4 -3
  3. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/ioc/field.h +1 -1
  4. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/ioc/groupsource.cpp +15 -5
  5. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/ioc/groupsourcehooks.cpp +34 -58
  6. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/ioc/iochooks.cpp +198 -38
  7. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/ioc/iocsource.cpp +28 -53
  8. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/ioc/iocsource.h +0 -2
  9. pvxslibs-1.3.0/ioc/pvalink.cpp +336 -0
  10. pvxslibs-1.3.0/ioc/pvalink.h +273 -0
  11. pvxslibs-1.3.0/ioc/pvalink_channel.cpp +439 -0
  12. pvxslibs-1.3.0/ioc/pvalink_jlif.cpp +307 -0
  13. pvxslibs-1.3.0/ioc/pvalink_link.cpp +135 -0
  14. pvxslibs-1.3.0/ioc/pvalink_lset.cpp +704 -0
  15. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/ioc/pvxs/iochooks.h +66 -0
  16. pvxslibs-1.2.4a3/ioc/pvxsIoc.dbd → pvxslibs-1.3.0/ioc/pvxs3x.dbd +0 -2
  17. pvxslibs-1.3.0/ioc/pvxs7x.dbd +8 -0
  18. pvxslibs-1.3.0/ioc/qsrvpvt.h +67 -0
  19. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/ioc/singlesource.cpp +32 -4
  20. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/ioc/singlesourcehooks.cpp +17 -35
  21. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/ioc/subscriptionctx.h +2 -1
  22. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0/python/pvxslibs.egg-info}/PKG-INFO +1 -1
  23. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/python/pvxslibs.egg-info/SOURCES.txt +9 -1
  24. pvxslibs-1.3.0/python/pvxslibs.egg-info/requires.txt +2 -0
  25. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/setup.py +6 -1
  26. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/src/bitmask.cpp +2 -0
  27. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/src/bitmask.h +2 -2
  28. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/src/clientconn.cpp +8 -0
  29. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/src/clientget.cpp +1 -1
  30. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/src/dataencode.cpp +13 -10
  31. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/src/evhelper.cpp +10 -3
  32. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/src/log.cpp +3 -3
  33. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/src/pvaproto.h +80 -20
  34. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/src/pvxs/server.h +5 -1
  35. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/src/pvxs/source.h +1 -1
  36. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/src/pvxs/version.h +1 -1
  37. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/src/serverconn.cpp +7 -0
  38. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/src/serverget.cpp +2 -1
  39. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/src/servermon.cpp +6 -1
  40. pvxslibs-1.2.4a3/python/pvxslibs.egg-info/requires.txt +0 -2
  41. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/COPYRIGHT +0 -0
  42. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/LICENSE +0 -0
  43. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/MANIFEST.in +0 -0
  44. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/README.md +0 -0
  45. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/LICENSE +0 -0
  46. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/arc4random.c +0 -0
  47. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/buffer.c +0 -0
  48. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/buffer_iocp.c +0 -0
  49. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/bufferevent-internal.h +0 -0
  50. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/bufferevent.c +0 -0
  51. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/bufferevent_async.c +0 -0
  52. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/bufferevent_filter.c +0 -0
  53. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/bufferevent_mbedtls.c +0 -0
  54. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/bufferevent_openssl.c +0 -0
  55. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/bufferevent_pair.c +0 -0
  56. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/bufferevent_ratelim.c +0 -0
  57. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/bufferevent_sock.c +0 -0
  58. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/bufferevent_ssl.c +0 -0
  59. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/changelist-internal.h +0 -0
  60. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/cmake/VersionViaGit.cmake +0 -0
  61. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/compat/sys/queue.h +0 -0
  62. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/defer-internal.h +0 -0
  63. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/devpoll.c +0 -0
  64. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/epoll.c +0 -0
  65. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/epoll_sub.c +0 -0
  66. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/epolltable-internal.h +0 -0
  67. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/evbuffer-internal.h +0 -0
  68. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/evconfig-private.h.cmake +0 -0
  69. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/evdns.c +0 -0
  70. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/event-config.h.cmake +0 -0
  71. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/event-internal.h +0 -0
  72. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/event.c +0 -0
  73. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/event_iocp.c +0 -0
  74. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/event_tagging.c +0 -0
  75. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/evmap-internal.h +0 -0
  76. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/evmap.c +0 -0
  77. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/evport.c +0 -0
  78. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/evrpc-internal.h +0 -0
  79. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/evrpc.c +0 -0
  80. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/evsignal-internal.h +0 -0
  81. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/evthread-internal.h +0 -0
  82. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/evthread.c +0 -0
  83. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/evthread_pthread.c +0 -0
  84. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/evthread_win32.c +0 -0
  85. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/evutil.c +0 -0
  86. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/evutil_rand.c +0 -0
  87. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/evutil_time.c +0 -0
  88. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/ht-internal.h +0 -0
  89. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/http-internal.h +0 -0
  90. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/http.c +0 -0
  91. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/include/evdns.h +0 -0
  92. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/include/event.h +0 -0
  93. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/include/event2/buffer.h +0 -0
  94. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/include/event2/buffer_compat.h +0 -0
  95. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/include/event2/bufferevent.h +0 -0
  96. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/include/event2/bufferevent_compat.h +0 -0
  97. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/include/event2/bufferevent_ssl.h +0 -0
  98. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/include/event2/bufferevent_struct.h +0 -0
  99. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/include/event2/dns.h +0 -0
  100. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/include/event2/dns_compat.h +0 -0
  101. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/include/event2/dns_struct.h +0 -0
  102. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/include/event2/event.h +0 -0
  103. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/include/event2/event_compat.h +0 -0
  104. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/include/event2/event_struct.h +0 -0
  105. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/include/event2/http.h +0 -0
  106. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/include/event2/http_compat.h +0 -0
  107. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/include/event2/http_struct.h +0 -0
  108. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/include/event2/keyvalq_struct.h +0 -0
  109. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/include/event2/listener.h +0 -0
  110. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/include/event2/rpc.h +0 -0
  111. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/include/event2/rpc_compat.h +0 -0
  112. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/include/event2/rpc_struct.h +0 -0
  113. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/include/event2/tag.h +0 -0
  114. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/include/event2/tag_compat.h +0 -0
  115. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/include/event2/thread.h +0 -0
  116. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/include/event2/util.h +0 -0
  117. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/include/event2/visibility.h +0 -0
  118. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/include/event2/watch.h +0 -0
  119. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/include/event2/ws.h +0 -0
  120. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/include/evhttp.h +0 -0
  121. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/include/evrpc.h +0 -0
  122. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/include/evutil.h +0 -0
  123. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/iocp-internal.h +0 -0
  124. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/ipv6-internal.h +0 -0
  125. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/kqueue-internal.h +0 -0
  126. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/kqueue.c +0 -0
  127. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/listener.c +0 -0
  128. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/log-internal.h +0 -0
  129. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/log.c +0 -0
  130. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/mbedtls-compat.h +0 -0
  131. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/minheap-internal.h +0 -0
  132. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/mm-internal.h +0 -0
  133. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/openssl-compat.h +0 -0
  134. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/poll.c +0 -0
  135. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/ratelim-internal.h +0 -0
  136. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/select.c +0 -0
  137. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/sha1.c +0 -0
  138. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/sha1.h +0 -0
  139. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/signal.c +0 -0
  140. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/signalfd.c +0 -0
  141. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/ssl-compat.h +0 -0
  142. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/strlcpy-internal.h +0 -0
  143. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/strlcpy.c +0 -0
  144. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/time-internal.h +0 -0
  145. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/util-internal.h +0 -0
  146. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/watch.c +0 -0
  147. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/wepoll.c +0 -0
  148. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/wepoll.h +0 -0
  149. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/win32select.c +0 -0
  150. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/ws.c +0 -0
  151. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/ioc/channel.cpp +0 -0
  152. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/ioc/channel.h +0 -0
  153. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/ioc/credentials.cpp +0 -0
  154. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/ioc/credentials.h +0 -0
  155. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/ioc/dbentry.h +0 -0
  156. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/ioc/dberrormessage.cpp +0 -0
  157. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/ioc/dberrormessage.h +0 -0
  158. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/ioc/dbeventcontextdeleter.h +0 -0
  159. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/ioc/dblocker.h +0 -0
  160. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/ioc/dbmanylocker.h +0 -0
  161. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/ioc/demo.cpp +0 -0
  162. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/ioc/dummygroup.cpp +0 -0
  163. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/ioc/dummysingle.cpp +0 -0
  164. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/ioc/field.cpp +0 -0
  165. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/ioc/fieldconfig.h +0 -0
  166. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/ioc/fielddefinition.cpp +0 -0
  167. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/ioc/fielddefinition.h +0 -0
  168. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/ioc/fieldname.cpp +0 -0
  169. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/ioc/fieldname.h +0 -0
  170. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/ioc/fieldnamecomponent.h +0 -0
  171. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/ioc/fieldsubscriptionctx.cpp +0 -0
  172. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/ioc/fieldsubscriptionctx.h +0 -0
  173. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/ioc/group.cpp +0 -0
  174. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/ioc/group.h +0 -0
  175. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/ioc/groupconfig.h +0 -0
  176. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/ioc/groupconfigprocessor.cpp +0 -0
  177. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/ioc/groupconfigprocessor.h +0 -0
  178. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/ioc/groupdefinition.h +0 -0
  179. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/ioc/groupprocessorcontext.cpp +0 -0
  180. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/ioc/groupprocessorcontext.h +0 -0
  181. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/ioc/groupsource.h +0 -0
  182. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/ioc/groupsrcsubscriptionctx.h +0 -0
  183. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/ioc/imagedemo.c +0 -0
  184. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/ioc/iocshargument.h +0 -0
  185. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/ioc/iocshcommand.h +0 -0
  186. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/ioc/iocshindex.h +0 -0
  187. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/ioc/localfieldlog.cpp +0 -0
  188. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/ioc/localfieldlog.h +0 -0
  189. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/ioc/securityclient.cpp +0 -0
  190. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/ioc/securityclient.h +0 -0
  191. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/ioc/securitylogger.h +0 -0
  192. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/ioc/singlesource.h +0 -0
  193. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/ioc/singlesrcsubscriptionctx.cpp +0 -0
  194. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/ioc/singlesrcsubscriptionctx.h +0 -0
  195. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/ioc/typeutils.cpp +0 -0
  196. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/ioc/typeutils.h +0 -0
  197. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/ioc/yajlcallbackhandler.h +0 -0
  198. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/pyproject.toml +0 -0
  199. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/python/pvxslibs/__init__.py +0 -0
  200. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/python/pvxslibs/lib/__init__.py +0 -0
  201. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/python/pvxslibs/path.py +0 -0
  202. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/python/pvxslibs/test/__init__.py +0 -0
  203. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/python/pvxslibs/test/test_load.py +0 -0
  204. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/python/pvxslibs/version.py +0 -0
  205. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/python/pvxslibs.egg-info/dependency_links.txt +0 -0
  206. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/python/pvxslibs.egg-info/not-zip-safe +0 -0
  207. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/python/pvxslibs.egg-info/top_level.txt +0 -0
  208. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/setup.cfg +0 -0
  209. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/src/client.cpp +0 -0
  210. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/src/clientdiscover.cpp +0 -0
  211. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/src/clientimpl.h +0 -0
  212. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/src/clientintrospect.cpp +0 -0
  213. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/src/clientmon.cpp +0 -0
  214. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/src/clientreq.cpp +0 -0
  215. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/src/config.cpp +0 -0
  216. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/src/conn.cpp +0 -0
  217. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/src/conn.h +0 -0
  218. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/src/data.cpp +0 -0
  219. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/src/datafmt.cpp +0 -0
  220. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/src/dataimpl.h +0 -0
  221. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/src/describe.cpp +0 -0
  222. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/src/describe.h@ +0 -0
  223. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/src/evhelper.h +0 -0
  224. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/src/nt.cpp +0 -0
  225. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/src/os/WIN32/osdSockExt.cpp +0 -0
  226. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/src/os/default/osdSockExt.cpp +0 -0
  227. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/src/osgroups.cpp +0 -0
  228. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/src/osiSockExt.h +0 -0
  229. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/src/pvrequest.cpp +0 -0
  230. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/src/pvrequest.h +0 -0
  231. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/src/pvxs/client.h +0 -0
  232. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/src/pvxs/data.h +0 -0
  233. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/src/pvxs/log.h +0 -0
  234. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/src/pvxs/netcommon.h +0 -0
  235. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/src/pvxs/nt.h +0 -0
  236. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/src/pvxs/sharedArray.h +0 -0
  237. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/src/pvxs/sharedpv.h +0 -0
  238. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/src/pvxs/srvcommon.h +0 -0
  239. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/src/pvxs/unittest.h +0 -0
  240. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/src/pvxs/util.h +0 -0
  241. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/src/pvxs/versionNum.h@ +0 -0
  242. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/src/server.cpp +0 -0
  243. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/src/serverchan.cpp +0 -0
  244. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/src/serverconn.h +0 -0
  245. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/src/serverintrospect.cpp +0 -0
  246. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/src/serversource.cpp +0 -0
  247. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/src/sharedarray.cpp +0 -0
  248. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/src/sharedpv.cpp +0 -0
  249. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/src/type.cpp +0 -0
  250. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/src/udp_collector.cpp +0 -0
  251. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/src/udp_collector.h +0 -0
  252. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/src/unittest.cpp +0 -0
  253. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/src/util.cpp +0 -0
  254. {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/src/utilpvt.h +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: pvxslibs
3
- Version: 1.2.4a3
3
+ Version: 1.3.0
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
- PVXS_MINOR_VERSION = 2
3
- PVXS_MAINTENANCE_VERSION = 4
2
+ PVXS_MINOR_VERSION = 3
3
+ PVXS_MAINTENANCE_VERSION = 0
4
4
 
5
5
  # Version range conditions in Makefiles
6
6
  #
@@ -12,7 +12,8 @@ PVXS_MAINTENANCE_VERSION = 4
12
12
  #
13
13
  # ifneq ($(PVXS_X_Y_Z),YES) # PVXS != X.Y.Z
14
14
  #
15
- PVXS_1_2_4 = YES
15
+ PVXS_1_3_0 = YES
16
+ PVXS_1_2_4 = NO
16
17
  PVXS_1_2_3 = NO
17
18
  PVXS_1_2_2 = NO
18
19
  PVXS_1_2_1 = NO
@@ -42,7 +42,7 @@ public:
42
42
  // points to storage in containing Group::fields
43
43
  std::vector<Field*> triggers;
44
44
 
45
- // only for Meta mapping. type infered from dbChannelFinalFieldType()
45
+ // only for Meta mapping. type inferred from dbChannelFinalFieldType()
46
46
  Value anyType;
47
47
 
48
48
  Field(const FieldDefinition& def);
@@ -209,19 +209,27 @@ void subscriptionPost(GroupSourceSubscriptionCtx *pGroupCtx)
209
209
  // Make sure that the initial subscription update has occurred on all channels before replying
210
210
  // As we make two initial updates when opening a new subscription, for each field,
211
211
  // we need all updates for all fields to have completed before continuing
212
+ bool first = false;
212
213
  if (!pGroupCtx->eventsPrimed) {
213
214
  for (auto& fieldCtx: pGroupCtx->fieldSubscriptionContexts) {
214
215
  if (!fieldCtx.hadValueEvent || !fieldCtx.hadPropertyEvent) {
215
216
  return;
216
217
  }
217
218
  }
218
- pGroupCtx->eventsPrimed = true;
219
+ pGroupCtx->eventsPrimed = first = true;
219
220
  }
220
221
 
221
- log_debug_printf(_logname, "%s : %s\n", __func__, pGroupCtx->group.name.c_str());
222
-
223
222
  auto& currentValue = pGroupCtx->currentValue;
224
223
 
224
+ bool empty(!currentValue.isMarked(false, true));
225
+
226
+ Level lvl = first && empty ? Level::Warn : Level::Debug;
227
+ log_printf(_logname, lvl, "%s%s%s : %s\n", __func__,
228
+ first ? " first" : "", empty ? " empty" : "",
229
+ pGroupCtx->group.name.c_str());
230
+ if(empty && !first)
231
+ return;
232
+
225
233
  // If events have been primed then return the value to the subscriber,
226
234
  // and unmark all accumulated changes
227
235
  pGroupCtx->subscriptionControl->post(currentValue.clone());
@@ -251,7 +259,8 @@ void GroupSource::onStartSubscription(const std::shared_ptr<GroupSourceSubscript
251
259
  * @param pDbFieldLog the database field log containing the changes being notified
252
260
  */
253
261
  static
254
- void subscriptionValueCallback(void* userArg, dbChannel* pChannel, int, struct db_field_log* pDbFieldLog) {
262
+ void subscriptionValueCallback(void* userArg, dbChannel* pChannel,
263
+ int, struct db_field_log* pDbFieldLog) noexcept {
255
264
  try {
256
265
  auto fieldSubscriptionCtx = (FieldSubscriptionCtx*)userArg;
257
266
  auto first = !fieldSubscriptionCtx->hadValueEvent;
@@ -299,7 +308,8 @@ void subscriptionValueCallback(void* userArg, dbChannel* pChannel, int, struct d
299
308
  }
300
309
 
301
310
  static
302
- void subscriptionPropertiesCallback(void* userArg, dbChannel* pChannel, int, struct db_field_log* pDbFieldLog) {
311
+ void subscriptionPropertiesCallback(void* userArg, dbChannel* pChannel,
312
+ int, struct db_field_log* pDbFieldLog) noexcept {
303
313
  try {
304
314
  auto subscriptionContext = (FieldSubscriptionCtx*)userArg;
305
315
  bool first = subscriptionContext->hadPropertyEvent;
@@ -20,6 +20,7 @@
20
20
  #include <pvxs/source.h>
21
21
  #include <pvxs/iochooks.h>
22
22
 
23
+ #include "qsrvpvt.h"
23
24
  #include "groupsource.h"
24
25
  #include "groupconfigprocessor.h"
25
26
  #include "iocshcommand.h"
@@ -161,66 +162,49 @@ long dbLoadGroup(const char* jsonFilename, const char* macros) {
161
162
  }
162
163
  }
163
164
 
164
- }
165
- } // namespace pvxs::ioc
166
165
 
167
- using namespace pvxs::ioc;
166
+ void processGroups()
167
+ {
168
+ GroupConfigProcessor processor;
169
+ epicsGuard<epicsMutex> G(processor.config.groupMapMutex);
168
170
 
169
- namespace {
170
- using namespace pvxs;
171
+ // Parse all info(Q:Group... records to configure groups
172
+ processor.loadConfigFromDb();
171
173
 
172
- /**
173
- * Initialise qsrv database group records by adding them as sources in our running pvxs server instance
174
- *
175
- * @param theInitHookState the initHook state - we only want to trigger on the initHookAfterIocBuilt state - ignore all others
176
- */
177
- void qsrvGroupSourceInit(initHookState theInitHookState) {
178
- try {
179
- if(!IOCSource::enabled())
180
- return;
181
- if (theInitHookState == initHookAfterInitDatabase) {
182
- GroupConfigProcessor processor;
183
- epicsGuard<epicsMutex> G(processor.config.groupMapMutex);
174
+ // Load group configuration files
175
+ processor.loadConfigFiles();
184
176
 
185
- // Parse all info(Q:Group... records to configure groups
186
- processor.loadConfigFromDb();
177
+ // checks on groupConfigMap
178
+ processor.validateGroups();
187
179
 
188
- // Load group configuration files
189
- processor.loadConfigFiles();
180
+ // Configure groups
181
+ processor.defineGroups();
190
182
 
191
- // checks on groupConfigMap
192
- processor.validateGroups();
183
+ // Resolve triggers
184
+ processor.resolveTriggerReferences();
193
185
 
194
- // Configure groups
195
- processor.defineGroups();
186
+ // Create Server Groups
187
+ processor.createGroups();
188
+ }
196
189
 
197
- // Resolve triggers
198
- processor.resolveTriggerReferences();
190
+ void addGroupSrc()
191
+ {
192
+ pvxs::ioc::server()
193
+ .addSource("qsrvGroup", std::make_shared<pvxs::ioc::GroupSource>(), 1);
194
+ }
199
195
 
200
- // Create Server Groups
201
- processor.createGroups();
202
- } else if (theInitHookState == initHookAfterIocBuilt) {
203
- // Load group configuration from parsed groups in iocServer
204
- pvxs::ioc::server().addSource("qsrvGroup", std::make_shared<pvxs::ioc::GroupSource>(), 1);
205
- }
206
- } catch(std::exception& e) {
207
- fprintf(stderr, "ERROR: Unhandled exception in %s(%d): %s\n",
208
- __func__, theInitHookState, e.what());
209
- }
196
+ void resetGroups()
197
+ {
198
+ auto& config(IOCGroupConfig::instance());
199
+
200
+ // server stopped at this point, but lock anyway
201
+ epicsGuard<epicsMutex> G(config.groupMapMutex);
202
+
203
+ config.groupMap.clear();
204
+ config.groupConfigFiles.clear();
210
205
  }
211
206
 
212
- /**
213
- * IOC pvxs Group Source registrar. This implements the required registrar function that is called by xxxx_registerRecordDeviceDriver,
214
- * the auto-generated stub created for all IOC implementations.
215
- *<p>
216
- * It is registered by using the `epicsExportRegistrar()` macro.
217
- *<p>
218
- * 1. Register your hook handler to handle any state hooks that you want to implement. Here we install
219
- * an `initHookState` handler connected to the `initHookAfterIocBuilt` state. It will add all of the
220
- * group record type sources defined so far. Note that you can define sources up until the `iocInit()` call,
221
- * after which point the `initHookAfterIocBuilt` handlers are called and will register all the defined records.
222
- */
223
- void pvxsGroupSourceRegistrar() {
207
+ void group_enable() {
224
208
  // Register commands to be available in the IOC shell
225
209
  IOCShCommand<int, const char*>("pvxgl", "[level, [pattern]]",
226
210
  "Group Sources list.\n"
@@ -232,14 +216,6 @@ void pvxsGroupSourceRegistrar() {
232
216
  IOCShCommand<const char*, const char*>("dbLoadGroup",
233
217
  "JSON file", "macros", dbLoadGroupMsg)
234
218
  .implementation<&dbLoadGroupCmd>();
235
-
236
- initHookRegister(&qsrvGroupSourceInit);
237
219
  }
238
220
 
239
- } // namespace
240
-
241
- // in .dbd file
242
- //registrar(pvxsGroupSourceRegistrar)
243
- extern "C" {
244
- epicsExportRegistrar(pvxsGroupSourceRegistrar);
245
- }
221
+ }} // namespace pvxs::ioc
@@ -18,8 +18,12 @@
18
18
 
19
19
  #include <epicsExport.h>
20
20
  #include <epicsExit.h>
21
+ #include <epicsString.h>
21
22
  #include <initHooks.h>
22
23
  #include <iocsh.h>
24
+ #include <dbAccess.h>
25
+ #include <dbStaticLib.h>
26
+ #include <registryDeviceSupport.h>
23
27
 
24
28
  #include <pvxs/iochooks.h>
25
29
  #include <pvxs/log.h>
@@ -28,14 +32,18 @@
28
32
 
29
33
  #include "iocshcommand.h"
30
34
  #include "utilpvt.h"
35
+ #include "qsrvpvt.h"
36
+
37
+ #ifdef USE_QSRV_SINGLE
38
+ # include <dbUnitTest.h>
39
+ #endif
40
+ #ifdef USE_PVA_LINKS
41
+ # include "pvalink.h"
42
+ #endif
31
43
 
32
44
  // include last to avoid clash of #define printf with other headers
33
45
  #include <epicsStdio.h>
34
46
 
35
- #if EPICS_VERSION_INT >= VERSION_INT(7, 0, 4, 0)
36
- # define USE_DEINIT_HOOKS
37
- #endif
38
-
39
47
  namespace pvxs {
40
48
  namespace ioc {
41
49
 
@@ -80,29 +88,24 @@ void initialisePvxsServer() {
80
88
  using namespace pvxs::server;
81
89
 
82
90
  Config conf = ::pvxs::impl::inUnitTest() ? Config::isolated() : Config::from_env();
83
- Server newsrv(conf);
84
91
 
85
92
  threadOnce<&pvxServerInit>();
86
93
  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);
94
+ if(!pvxServer->srv) {
95
+ pvxServer->srv = Server(conf);
96
+ }
91
97
  }
92
98
 
93
- /**
94
- * The function to call when we exit the IOC process. This is only installed as the callback function
95
- * after the database has been initialized. This function will stop the pvxs server instance and destroy the
96
- * object.
97
- *
98
- * @param pep - The pointer to the exit parameter list - unused
99
- */
100
99
  static
101
- void pvxsAtExit(void*) noexcept {
100
+ void pvxsExitBeforeIocShutdown(void*) noexcept
101
+ {
102
102
  try {
103
+ #ifdef USE_PVA_LINKS
104
+ linkGlobal_t::deinit();
105
+ #endif
103
106
  Guard (pvxServer->lock);
104
107
  if(auto srv = std::move(pvxServer->srv)) {
105
- pvxServer->srv = server::Server();
108
+ assert(!pvxServer->srv);
106
109
  srv.stop();
107
110
  IOCGroupConfigCleanup();
108
111
  log_debug_printf(_logname, "Stopped Server%s", "\n");
@@ -112,19 +115,56 @@ void pvxsAtExit(void*) noexcept {
112
115
  }
113
116
  }
114
117
 
118
+ static
119
+ void pvxsExitAfterIocShutdown(void*) noexcept
120
+ {
121
+ try {
122
+ #ifdef USE_PVA_LINKS
123
+ linkGlobal_t::dtor();
124
+ #endif
125
+
126
+ } catch(std::exception& e) {
127
+ fprintf(stderr, "Error in %s : %s\n", __func__, e.what());
128
+ }
129
+ }
130
+
131
+ static
132
+ void testPrepareImpl()
133
+ {
134
+ initialisePvxsServer(); // re-create server for next test cycle
135
+ }
136
+
115
137
  void testPrepare()
116
138
  {
117
- if(pvxServer)
118
- initialisePvxsServer(); // re-create server for next test cycle
139
+ #ifndef USE_PREPARE_CLEANUP_HOOKS
140
+ testPrepareImpl();
141
+ #endif
119
142
  }
120
143
 
121
144
  void testShutdown()
122
145
  {
123
146
  #ifndef USE_DEINIT_HOOKS
124
- pvxsAtExit(nullptr);
147
+ pvxsExitBeforeIocShutdown(nullptr);
148
+ #endif
149
+ }
150
+
151
+ void testAfterShutdown()
152
+ {
153
+ #ifndef USE_DEINIT_HOOKS
154
+ pvxsExitAfterIocShutdown(nullptr);
125
155
  #endif
126
156
  }
127
157
 
158
+ void testCleanupPrepare()
159
+ {
160
+ server::Server trash;
161
+ {
162
+ Guard G(pvxServer->lock);
163
+ trash = std::move(pvxServer->srv);
164
+ }
165
+ resetGroups();
166
+ }
167
+
128
168
  ////////////////////////////////////
129
169
  // Two ioc shell commands for pvxs
130
170
  ////////////////////////////////////
@@ -165,6 +205,35 @@ void pvxsi() {
165
205
  printf("%s", capture.str().c_str());
166
206
  }
167
207
 
208
+ #ifdef USE_QSRV_SINGLE
209
+ TestIOC::TestIOC() {
210
+ testdbPrepare();
211
+ testPrepare();
212
+ }
213
+
214
+ void TestIOC::init() {
215
+ if(!isRunning) {
216
+ testIocInitOk();
217
+ isRunning = true;
218
+ }
219
+ }
220
+
221
+ void TestIOC::shutdown() {
222
+ if(isRunning) {
223
+ isRunning = false;
224
+ testShutdown();
225
+ testIocShutdownOk();
226
+ testAfterShutdown();
227
+ }
228
+ }
229
+
230
+ TestIOC::~TestIOC() {
231
+ shutdown();
232
+ testCleanupPrepare();
233
+ testdbCleanup();
234
+ }
235
+ #endif // USE_QSRV_SINGLE
236
+
168
237
  namespace {
169
238
 
170
239
  void pvxrefshow() {
@@ -236,26 +305,53 @@ void pvxrefdiff() {
236
305
 
237
306
  } // namespace
238
307
 
239
- /**
240
- * Initialise and control state of pvxs ioc server instance in response to iocInitHook events.
241
- * Installed on the initHookState hook this function will respond to the following events:
242
- * - initHookAfterInitDatabase: Set the exit callback only when we have initialized the database
243
- * - initHookAfterCaServerRunning: Start the pvxs server instance after the CA server starts running
244
- * - initHookAfterCaServerPaused: Pause the pvxs server instance if the CA server pauses
245
- *
246
- * @param theInitHookState the initHook state to respond to
247
- */
248
308
  static
249
- void pvxsInitHook(initHookState theInitHookState) {
309
+ void pvxsInitHook(initHookState theInitHookState) noexcept {
250
310
  switch(theInitHookState) {
311
+ #ifdef USE_PREPARE_CLEANUP_HOOKS
312
+ case initHookAfterPrepareDatabase: // test only
313
+ testPrepareImpl();
314
+ break;
315
+ #endif
316
+ case initHookAtBeginning:
317
+ dbRegisterQSRV2();
318
+ break;
319
+ case initHookAfterCaLinkInit:
320
+ #ifdef USE_PVA_LINKS
321
+ linkGlobal_t::alloc();
322
+ #endif
323
+ #ifndef USE_DEINIT_HOOKS
324
+ // before epicsExit(exitDatabase),
325
+ // so hook registered here will be run after iocShutdown()
326
+ {
327
+ static bool installed = false;
328
+ if(!installed) {
329
+ epicsAtExit(&pvxsExitAfterIocShutdown, nullptr);
330
+ installed = true;
331
+ }
332
+ }
333
+ #endif
334
+ break;
251
335
  case initHookAfterInitDatabase:
252
- // when de-init hooks not available, register for later cleanup via atexit()
253
- // function to run before exitDatabase
336
+ processGroups();
254
337
  #ifndef USE_DEINIT_HOOKS
255
- epicsAtExit(&pvxsAtExit, nullptr);
338
+ // register for later cleanup before iocShutdown()
339
+ {
340
+ static bool installed = false;
341
+ if(!installed) {
342
+ epicsAtExit(&pvxsExitBeforeIocShutdown, nullptr);
343
+ installed = true;
344
+ }
345
+ }
256
346
  #endif
257
347
  break;
258
- case initHookAfterCaServerRunning:
348
+ case initHookAfterIocBuilt:
349
+ #ifdef USE_PVA_LINKS
350
+ linkGlobal_t::init();
351
+ #endif
352
+ addSingleSrc();
353
+ addGroupSrc();
354
+ break;
259
355
  case initHookAfterIocRunning:
260
356
  if(auto srv = server()) {
261
357
  srv.start();
@@ -271,7 +367,15 @@ void pvxsInitHook(initHookState theInitHookState) {
271
367
  #ifdef USE_DEINIT_HOOKS
272
368
  // use de-init hook when available
273
369
  case initHookAtShutdown:
274
- pvxsAtExit(nullptr);
370
+ pvxsExitBeforeIocShutdown(nullptr);
371
+ break;
372
+ case initHookAfterShutdown:
373
+ pvxsExitAfterIocShutdown(nullptr);
374
+ break;
375
+ #endif
376
+ #ifdef USE_PREPARE_CLEANUP_HOOKS
377
+ case initHookBeforeCleanupDatabase: // test only
378
+ testCleanupPrepare();
275
379
  break;
276
380
  #endif
277
381
  default:
@@ -286,6 +390,56 @@ using namespace pvxs::ioc;
286
390
 
287
391
  namespace {
288
392
 
393
+ bool enable2() {
394
+ // detect if also linked with qsrv.dbd
395
+ const bool permit = !registryDeviceSupportFind("devWfPDBDemo");
396
+ bool request = permit;
397
+ bool quiet = false;
398
+
399
+ auto env_dis = getenv("EPICS_IOC_IGNORE_SERVERS");
400
+ auto env_ena = getenv("PVXS_QSRV_ENABLE");
401
+
402
+ if(env_dis && strstr(env_dis, "qsrv2")) {
403
+ request = false;
404
+ quiet = true;
405
+
406
+ } else if(env_ena && epicsStrCaseCmp(env_ena, "YES")==0) {
407
+ request = true;
408
+
409
+ } else if(env_ena && epicsStrCaseCmp(env_ena, "NO")==0) {
410
+ request = false;
411
+ quiet = true;
412
+
413
+ } else if(env_ena) {
414
+ // will be seen during initialization, print synchronously
415
+ fprintf(stderr, "ERROR: PVXS_QSRV_ENABLE=%s not YES/NO. Defaulting to %s.\n",
416
+ env_ena,
417
+ request ? "YES" : "NO");
418
+ }
419
+
420
+ const bool enable = permit && request;
421
+
422
+ if(quiet) {
423
+ // shut up, I know what I'm doing...
424
+ } else if(request && !permit) {
425
+ fprintf(stderr,
426
+ "WARNING: QSRV1 detected, disabling QSRV2.\n"
427
+ " If not intended, omit qsrv.dbd when including pvxsIoc.dbd\n");
428
+
429
+ } else {
430
+ printf("INFO: PVXS QSRV2 is loaded, %spermitted, and %s.\n",
431
+ permit ? "" : "NOT ",
432
+ enable ? "ENABLED" : "disabled");
433
+
434
+ if(!permit) {
435
+ printf(" Not permitted due to conflict with QSRV1.\n"
436
+ " Remove qsrv.dbd from IOC.\n");
437
+ }
438
+ }
439
+
440
+ return enable;
441
+ }
442
+
289
443
  /**
290
444
  * IOC pvxs base registrar. This implements the required registrar function that is called by xxxx_registerRecordDeviceDriver,
291
445
  * the auto-generated stub created for all IOC implementations.
@@ -296,11 +450,11 @@ namespace {
296
450
  * 2. Also make sure that you initialize your server implementation - PVXS in our case - so that it will be available for the shell.
297
451
  * 3. Lastly register your hook handler to handle any state hooks that you want to implement
298
452
  */
299
- void pvxsBaseRegistrar() {
453
+ void pvxsBaseRegistrar() noexcept {
300
454
  try {
301
455
  pvxs::logger_config_env();
302
456
 
303
- pvxServer = new pvxServer_t();
457
+ bool enableQ = enable2();
304
458
 
305
459
  IOCShCommand<int>("pvxsr", "[show_detailed_information?]", "PVXS Server Report. "
306
460
  "Shows information about server config (level==0)\n"
@@ -320,6 +474,12 @@ void pvxsBaseRegistrar() {
320
474
 
321
475
  // Register our hook handler to intercept certain state changes
322
476
  initHookRegister(&pvxsInitHook);
477
+
478
+ if(enableQ) {
479
+ single_enable();
480
+ group_enable();
481
+ pvalink_enable();
482
+ }
323
483
  } catch (std::exception& e) {
324
484
  fprintf(stderr, "Error in %s : %s\n", __func__, e.what());
325
485
  }
@@ -36,46 +36,6 @@ DEFINE_LOGGER(_log, "pvxs.ioc.db");
36
36
  namespace pvxs {
37
37
  namespace ioc {
38
38
 
39
-
40
- bool IOCSource::enabled()
41
- {
42
- /* -1 - disabled
43
- * 0 - lazy init, check environment
44
- * 1 - enabled
45
- */
46
- static std::atomic<int> ena{};
47
-
48
- auto e = ena.load();
49
- if(e==0) {
50
- e = inUnitTest() ? 1 : -1; // default to disabled normally (not unittest)
51
-
52
- auto env_dis = getenv("EPICS_IOC_IGNORE_SERVERS");
53
- auto env_ena = getenv("PVXS_QSRV_ENABLE");
54
-
55
- if(env_dis && strstr(env_dis, "qsrv2")) {
56
- e = -1;
57
-
58
- } else if(env_ena && epicsStrCaseCmp(env_ena, "YES")==0) {
59
- e = 1;
60
-
61
- } else if(env_ena && epicsStrCaseCmp(env_ena, "NO")==0) {
62
- e = -1;
63
-
64
- } else if(env_ena) {
65
- // will be seen during initialization, print synchronously
66
- fprintf(stderr, "ERROR: PVXS_QSRV_ENABLE=%s not YES/NO. Defaulting to %s.\n",
67
- env_ena,
68
- e==1 ? "YES" : "NO");
69
- }
70
- printf("INFO: PVXS QSRV2 is loaded and %s\n",
71
- e==1 ? "ENABLED." : "disabled.\n"
72
- " To enable set: epicsEnvSet(\"PVXS_QSRV_ENABLE\",\"YES\")\n"
73
- " and ensure that $EPICS_IOC_IGNORE_SERVERS does not contain \"qsrv2\".");
74
- ena = e;
75
- }
76
- return e==1;
77
- }
78
-
79
39
  void IOCSource::initialize(Value& value, const MappingInfo &info, const Channel& chan)
80
40
  {
81
41
  if(info.type==MappingInfo::Scalar) {
@@ -315,9 +275,6 @@ void getProperties(dbChannel* pChannel, db_field_log *pfl, Value& node)
315
275
  if(auto units = node["display.units"])
316
276
  units = meta.units;
317
277
  }
318
- if(options & DBR_PRECISION) {
319
- // TODO: add in nt.cpp?
320
- }
321
278
  if(options & DBR_ENUM_STRS) {
322
279
  if(auto choices = node["value.choices"]) {
323
280
  shared_array<std::string> arr(meta.no_str);
@@ -331,7 +288,9 @@ void getProperties(dbChannel* pChannel, db_field_log *pfl, Value& node)
331
288
  if(options & DBR_GR_DOUBLE) {
332
289
  dlL = meta.lower_disp_limit;
333
290
  node["display.limitHigh"] = meta.upper_disp_limit;
334
- node["display.precision"] = meta.precision.dp;
291
+ if(options & DBR_PRECISION) {
292
+ node["display.precision"] = int32_t(meta.precision.dp);
293
+ }
335
294
  }
336
295
  if(options & DBR_CTRL_DOUBLE) {
337
296
  node["control.limitLow"] = meta.lower_ctrl_limit;
@@ -477,15 +436,31 @@ void IOCSource::doPostProcessing(dbChannel* pDbChannel, TriState forceProcessing
477
436
  * @param securityControlObject the security control object to update
478
437
  */
479
438
  void IOCSource::setForceProcessingFlag(const Value& pvRequest,
480
- const std::shared_ptr<SecurityControlObject>& securityControlObject) {
481
- pvRequest["record._options.process"]
482
- .as<std::string>([&securityControlObject](const std::string& forceProcessingOption) {
483
- if (forceProcessingOption == "true") {
484
- securityControlObject->forceProcessing = True;
485
- } else if (forceProcessingOption == "false") {
486
- securityControlObject->forceProcessing = False;
487
- }
488
- });
439
+ const std::shared_ptr<SecurityControlObject>& securityControlObject)
440
+ {
441
+ auto proc = pvRequest["record._options.process"];
442
+ switch(proc.type().code) {
443
+ case TypeCode::String: {
444
+ auto val(proc.as<std::string>());
445
+ if (val == "true") {
446
+ securityControlObject->forceProcessing = True;
447
+ } else if (val == "false") {
448
+ securityControlObject->forceProcessing = False;
449
+ } else if (val == "passive") {
450
+ securityControlObject->forceProcessing = Unset;
451
+ } else {
452
+ log_warn_printf(_log, "Ignoring unsupported record._options.process='%s'", val.c_str());
453
+ }
454
+ break;
455
+ }
456
+ case TypeCode::Bool:
457
+ securityControlObject->forceProcessing = proc.as<bool>() ? True : False;
458
+ break;
459
+ default:
460
+ log_warn_printf(_log, "Ignoring unsupported record._options.process type %s", proc.type().name());
461
+ case TypeCode::Null:
462
+ break;
463
+ }
489
464
  }
490
465
 
491
466
  static
@@ -43,8 +43,6 @@ enum type {
43
43
 
44
44
  class IOCSource {
45
45
  public:
46
- static bool enabled();
47
-
48
46
  static void initialize(Value& value, const MappingInfo &info, const Channel &chan);
49
47
 
50
48
  static void get(Value& valuePrototype,