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.
- {pvxslibs-1.2.4a3/python/pvxslibs.egg-info → pvxslibs-1.3.0}/PKG-INFO +1 -1
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/configure/CONFIG_PVXS_VERSION +4 -3
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/ioc/field.h +1 -1
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/ioc/groupsource.cpp +15 -5
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/ioc/groupsourcehooks.cpp +34 -58
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/ioc/iochooks.cpp +198 -38
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/ioc/iocsource.cpp +28 -53
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/ioc/iocsource.h +0 -2
- pvxslibs-1.3.0/ioc/pvalink.cpp +336 -0
- pvxslibs-1.3.0/ioc/pvalink.h +273 -0
- pvxslibs-1.3.0/ioc/pvalink_channel.cpp +439 -0
- pvxslibs-1.3.0/ioc/pvalink_jlif.cpp +307 -0
- pvxslibs-1.3.0/ioc/pvalink_link.cpp +135 -0
- pvxslibs-1.3.0/ioc/pvalink_lset.cpp +704 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/ioc/pvxs/iochooks.h +66 -0
- pvxslibs-1.2.4a3/ioc/pvxsIoc.dbd → pvxslibs-1.3.0/ioc/pvxs3x.dbd +0 -2
- pvxslibs-1.3.0/ioc/pvxs7x.dbd +8 -0
- pvxslibs-1.3.0/ioc/qsrvpvt.h +67 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/ioc/singlesource.cpp +32 -4
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/ioc/singlesourcehooks.cpp +17 -35
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/ioc/subscriptionctx.h +2 -1
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0/python/pvxslibs.egg-info}/PKG-INFO +1 -1
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/python/pvxslibs.egg-info/SOURCES.txt +9 -1
- pvxslibs-1.3.0/python/pvxslibs.egg-info/requires.txt +2 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/setup.py +6 -1
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/src/bitmask.cpp +2 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/src/bitmask.h +2 -2
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/src/clientconn.cpp +8 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/src/clientget.cpp +1 -1
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/src/dataencode.cpp +13 -10
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/src/evhelper.cpp +10 -3
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/src/log.cpp +3 -3
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/src/pvaproto.h +80 -20
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/src/pvxs/server.h +5 -1
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/src/pvxs/source.h +1 -1
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/src/pvxs/version.h +1 -1
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/src/serverconn.cpp +7 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/src/serverget.cpp +2 -1
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/src/servermon.cpp +6 -1
- pvxslibs-1.2.4a3/python/pvxslibs.egg-info/requires.txt +0 -2
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/COPYRIGHT +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/LICENSE +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/MANIFEST.in +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/README.md +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/LICENSE +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/arc4random.c +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/buffer.c +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/buffer_iocp.c +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/bufferevent-internal.h +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/bufferevent.c +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/bufferevent_async.c +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/bufferevent_filter.c +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/bufferevent_mbedtls.c +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/bufferevent_openssl.c +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/bufferevent_pair.c +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/bufferevent_ratelim.c +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/bufferevent_sock.c +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/bufferevent_ssl.c +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/changelist-internal.h +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/cmake/VersionViaGit.cmake +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/compat/sys/queue.h +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/defer-internal.h +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/devpoll.c +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/epoll.c +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/epoll_sub.c +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/epolltable-internal.h +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/evbuffer-internal.h +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/evconfig-private.h.cmake +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/evdns.c +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/event-config.h.cmake +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/event-internal.h +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/event.c +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/event_iocp.c +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/event_tagging.c +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/evmap-internal.h +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/evmap.c +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/evport.c +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/evrpc-internal.h +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/evrpc.c +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/evsignal-internal.h +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/evthread-internal.h +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/evthread.c +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/evthread_pthread.c +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/evthread_win32.c +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/evutil.c +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/evutil_rand.c +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/evutil_time.c +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/ht-internal.h +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/http-internal.h +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/http.c +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/include/evdns.h +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/include/event.h +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/include/event2/buffer.h +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/include/event2/buffer_compat.h +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/include/event2/bufferevent.h +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/include/event2/bufferevent_compat.h +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/include/event2/bufferevent_ssl.h +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/include/event2/bufferevent_struct.h +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/include/event2/dns.h +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/include/event2/dns_compat.h +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/include/event2/dns_struct.h +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/include/event2/event.h +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/include/event2/event_compat.h +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/include/event2/event_struct.h +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/include/event2/http.h +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/include/event2/http_compat.h +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/include/event2/http_struct.h +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/include/event2/keyvalq_struct.h +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/include/event2/listener.h +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/include/event2/rpc.h +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/include/event2/rpc_compat.h +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/include/event2/rpc_struct.h +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/include/event2/tag.h +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/include/event2/tag_compat.h +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/include/event2/thread.h +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/include/event2/util.h +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/include/event2/visibility.h +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/include/event2/watch.h +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/include/event2/ws.h +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/include/evhttp.h +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/include/evrpc.h +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/include/evutil.h +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/iocp-internal.h +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/ipv6-internal.h +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/kqueue-internal.h +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/kqueue.c +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/listener.c +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/log-internal.h +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/log.c +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/mbedtls-compat.h +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/minheap-internal.h +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/mm-internal.h +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/openssl-compat.h +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/poll.c +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/ratelim-internal.h +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/select.c +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/sha1.c +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/sha1.h +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/signal.c +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/signalfd.c +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/ssl-compat.h +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/strlcpy-internal.h +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/strlcpy.c +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/time-internal.h +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/util-internal.h +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/watch.c +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/wepoll.c +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/wepoll.h +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/win32select.c +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/bundle/libevent/ws.c +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/ioc/channel.cpp +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/ioc/channel.h +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/ioc/credentials.cpp +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/ioc/credentials.h +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/ioc/dbentry.h +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/ioc/dberrormessage.cpp +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/ioc/dberrormessage.h +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/ioc/dbeventcontextdeleter.h +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/ioc/dblocker.h +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/ioc/dbmanylocker.h +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/ioc/demo.cpp +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/ioc/dummygroup.cpp +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/ioc/dummysingle.cpp +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/ioc/field.cpp +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/ioc/fieldconfig.h +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/ioc/fielddefinition.cpp +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/ioc/fielddefinition.h +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/ioc/fieldname.cpp +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/ioc/fieldname.h +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/ioc/fieldnamecomponent.h +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/ioc/fieldsubscriptionctx.cpp +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/ioc/fieldsubscriptionctx.h +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/ioc/group.cpp +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/ioc/group.h +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/ioc/groupconfig.h +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/ioc/groupconfigprocessor.cpp +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/ioc/groupconfigprocessor.h +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/ioc/groupdefinition.h +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/ioc/groupprocessorcontext.cpp +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/ioc/groupprocessorcontext.h +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/ioc/groupsource.h +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/ioc/groupsrcsubscriptionctx.h +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/ioc/imagedemo.c +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/ioc/iocshargument.h +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/ioc/iocshcommand.h +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/ioc/iocshindex.h +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/ioc/localfieldlog.cpp +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/ioc/localfieldlog.h +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/ioc/securityclient.cpp +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/ioc/securityclient.h +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/ioc/securitylogger.h +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/ioc/singlesource.h +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/ioc/singlesrcsubscriptionctx.cpp +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/ioc/singlesrcsubscriptionctx.h +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/ioc/typeutils.cpp +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/ioc/typeutils.h +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/ioc/yajlcallbackhandler.h +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/pyproject.toml +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/python/pvxslibs/__init__.py +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/python/pvxslibs/lib/__init__.py +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/python/pvxslibs/path.py +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/python/pvxslibs/test/__init__.py +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/python/pvxslibs/test/test_load.py +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/python/pvxslibs/version.py +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/python/pvxslibs.egg-info/dependency_links.txt +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/python/pvxslibs.egg-info/not-zip-safe +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/python/pvxslibs.egg-info/top_level.txt +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/setup.cfg +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/src/client.cpp +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/src/clientdiscover.cpp +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/src/clientimpl.h +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/src/clientintrospect.cpp +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/src/clientmon.cpp +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/src/clientreq.cpp +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/src/config.cpp +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/src/conn.cpp +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/src/conn.h +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/src/data.cpp +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/src/datafmt.cpp +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/src/dataimpl.h +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/src/describe.cpp +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/src/describe.h@ +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/src/evhelper.h +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/src/nt.cpp +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/src/os/WIN32/osdSockExt.cpp +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/src/os/default/osdSockExt.cpp +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/src/osgroups.cpp +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/src/osiSockExt.h +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/src/pvrequest.cpp +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/src/pvrequest.h +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/src/pvxs/client.h +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/src/pvxs/data.h +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/src/pvxs/log.h +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/src/pvxs/netcommon.h +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/src/pvxs/nt.h +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/src/pvxs/sharedArray.h +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/src/pvxs/sharedpv.h +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/src/pvxs/srvcommon.h +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/src/pvxs/unittest.h +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/src/pvxs/util.h +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/src/pvxs/versionNum.h@ +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/src/server.cpp +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/src/serverchan.cpp +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/src/serverconn.h +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/src/serverintrospect.cpp +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/src/serversource.cpp +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/src/sharedarray.cpp +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/src/sharedpv.cpp +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/src/type.cpp +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/src/udp_collector.cpp +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/src/udp_collector.h +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/src/unittest.cpp +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/src/util.cpp +0 -0
- {pvxslibs-1.2.4a3 → pvxslibs-1.3.0}/src/utilpvt.h +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
PVXS_MAJOR_VERSION = 1
|
|
2
|
-
PVXS_MINOR_VERSION =
|
|
3
|
-
PVXS_MAINTENANCE_VERSION =
|
|
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
|
-
|
|
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
|
|
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,
|
|
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,
|
|
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
|
-
|
|
166
|
+
void processGroups()
|
|
167
|
+
{
|
|
168
|
+
GroupConfigProcessor processor;
|
|
169
|
+
epicsGuard<epicsMutex> G(processor.config.groupMapMutex);
|
|
168
170
|
|
|
169
|
-
|
|
170
|
-
|
|
171
|
+
// Parse all info(Q:Group... records to configure groups
|
|
172
|
+
processor.loadConfigFromDb();
|
|
171
173
|
|
|
172
|
-
|
|
173
|
-
|
|
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
|
-
|
|
186
|
-
|
|
177
|
+
// checks on groupConfigMap
|
|
178
|
+
processor.validateGroups();
|
|
187
179
|
|
|
188
|
-
|
|
189
|
-
|
|
180
|
+
// Configure groups
|
|
181
|
+
processor.defineGroups();
|
|
190
182
|
|
|
191
|
-
|
|
192
|
-
|
|
183
|
+
// Resolve triggers
|
|
184
|
+
processor.resolveTriggerReferences();
|
|
193
185
|
|
|
194
|
-
|
|
195
|
-
|
|
186
|
+
// Create Server Groups
|
|
187
|
+
processor.createGroups();
|
|
188
|
+
}
|
|
196
189
|
|
|
197
|
-
|
|
198
|
-
|
|
190
|
+
void addGroupSrc()
|
|
191
|
+
{
|
|
192
|
+
pvxs::ioc::server()
|
|
193
|
+
.addSource("qsrvGroup", std::make_shared<pvxs::ioc::GroupSource>(), 1);
|
|
194
|
+
}
|
|
199
195
|
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
118
|
-
|
|
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
|
-
|
|
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
|
-
|
|
253
|
-
// function to run before exitDatabase
|
|
336
|
+
processGroups();
|
|
254
337
|
#ifndef USE_DEINIT_HOOKS
|
|
255
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
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
|