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