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