Possible crash due to race condition when pushing events
If using push_change_event/push_archive_event in the code with also the poller enabled and event thresholds set, the device server could crash. Attached a simple device server reproducing the issue.
Some backtrace of the crash follows:
#0 tcache_get (tc_idx=0) at malloc.c:2943
#1 __GI___libc_malloc (bytes=16) at malloc.c:3050
#2 0x00007fa6c857f1a8 in operator new(unsigned long) () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#3 0x00007fa6c92d8aea in __gnu_cxx::new_allocator<double>::allocate (this=0x7fa6c235ab00, __n=2) at /usr/include/c++/7/ext/new_allocator.h:111
#4 0x00007fa6c92d7ef8 in std::allocator_traits<std::allocator<double> >::allocate (__a=..., __n=2) at /usr/include/c++/7/bits/alloc_traits.h:436
#5 0x00007fa6c92d6fda in std::_Vector_base<double, std::allocator<double> >::_M_allocate (this=0x7fa6c235ab00, __n=2) at /usr/include/c++/7/bits/stl_vector.h:172
#6 0x00007fa6c9503764 in std::vector<double, std::allocator<double> >::_M_realloc_insert<double> (this=0x7fa6c235ab00, __position=1.4440053121040064e+214, __args#0=@0x7fa6c235aa50: 0)
at /usr/include/c++/7/bits/vector.tcc:406
#7 0x00007fa6c9502fb0 in std::vector<double, std::allocator<double> >::emplace_back<double> (this=0x7fa6c235ab00, __args#0=@0x7fa6c235aa50: 0) at /usr/include/c++/7/bits/vector.tcc:105
#8 0x00007fa6c9502746 in std::vector<double, std::allocator<double> >::push_back (this=0x7fa6c235ab00, __x=@0x7fa6c235aa50: 0) at /usr/include/c++/7/bits/stl_vector.h:954
#9 0x00007fa6c9511ff1 in Tango::Attribute::fire_change_event (this=0x55ef509fd890, except=0x0) at /home/graziano/Downloads/cppTango-9.3.2/cppapi/server/attribute.cpp:4079
#10 0x00007fa6c953c6ac in Tango::DeviceImpl::push_change_event (this=0x55ef509f4c60, attr_name="doubleattr1", p_data=0x55ef509f6030, x=1, y=0, release=false)
at /home/graziano/Downloads/cppTango-9.3.2/cppapi/server/dev_event.cpp:843
#11 0x000055ef4face2f2 in TestPushCrash_ns::readthread::run (this=0x55ef509ebd20) at src/readthread.cpp:99
#12 0x00007fa6c8878673 in omni_thread_wrapper () from /usr/local/omniorb-4.2.1/lib/libomnithread.so.4
#13 0x00007fa6c6bd96db in start_thread (arg=0x7fa6c235b700) at pthread_create.c:463
#14 0x00007fa6c800488f in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:95
#0 0x0e46c41c in raise () from /lib/libc.so.6
#1 0x0e46e09c in abort () from /lib/libc.so.6
#2 0x0e4aaea4 in ?? () from /lib/libc.so.6
#3 0x0e4b2ce8 in ?? () from /lib/libc.so.6
#4 0x0e4b5158 in free () from /lib/libc.so.6
#5 0x0e795a0c in operator delete () from /usr/lib/libstdc++.so.6
#6 0x0e795a84 in operator delete[] () from /usr/lib/libstdc++.so.6
#7 0x0f52a0d4 in _CORBA_Sequence<double>::freebuf (b=0x100b7da0) at /usr/local/omniorb-4.2.1/include/omniORB4/seqTemplatedecls.h:91
#8 0x0f52a150 in ~_CORBA_Sequence (this=0x3dbbbab0) at /usr/local/omniorb-4.2.1/include/omniORB4/seqTemplatedecls.h:129
#9 0x0f52a1b0 in ~_CORBA_Unbounded_Sequence (this=0x3dbbbab0) at /usr/local/omniorb-4.2.1/include/omniORB4/seqTemplatedecls.h:255
#10 0x0f52a204 in ~_CORBA_Unbounded_Sequence_w_FixSizeElement (this=0x3dbbbab0)
at /usr/local/omniorb-4.2.1/include/omniORB4/seqTemplatedecls.h:518
#11 0x0f52a258 in ~DevVarDoubleArray (this=0x3dbbbab0) at /opt/src/packages/cppTango-9.3.2-nommx/cppapi/server/idl/tango.h:233
#12 0x0f5b5b30 in Tango::AttrValUnion::_release_member (this=0x10140538)
at /opt/src/packages/cppTango-9.3.2-nommx/cppapi/server/idl/tango.h:3281
#13 0x0f5b6384 in Tango::AttrValUnion::union_no_data (this=0x10140538, _value=true)
at /opt/src/packages/cppTango-9.3.2-nommx/cppapi/server/idl/tango.h:3204
#14 0x0f5b7028 in Tango::AttrValUnion::operator= (this=0x10140538, _value=@0x1050005c)
at /opt/src/packages/cppTango-9.3.2-nommx/cppapi/server/idl/tango.h:2878
#15 0x0f8b2c5c in Tango::EventSupplier::detect_and_push_change_event (this=0x100c18e8, device_impl=0x33830008, attr_value=@0x3a8f6a2c,
attr=@0x10140320, attr_name=@0x3dbbc340, except=0x0, user_push=false)
at /opt/src/packages/cppTango-9.3.2-nommx/cppapi/server/eventsupplier.cpp:417
#16 0x0f8b3d4c in Tango::EventSupplier::detect_and_push_events (this=0x100c18e8, device_impl=0x33830008, attr_value=@0x3a8f6a2c,
except=0x0, attr_name=@0x3dbbc340, time_bef_attr=0x3a8f6b4c)
at /opt/src/packages/cppTango-9.3.2-nommx/cppapi/server/eventsupplier.cpp:179
#17 0x0f90dc84 in Tango::PollThread::poll_attr (this=0x100e8b90, to_do=@0x3a8f6c94)
at /opt/src/packages/cppTango-9.3.2-nommx/cppapi/server/pollthread.cpp:1970
#18 0x0f910ae4 in Tango::PollThread::one_more_poll (this=0x100e8b90)
at /opt/src/packages/cppTango-9.3.2-nommx/cppapi/server/pollthread.cpp:800
#19 0x0f9133d8 in Tango::PollThread::run_undetached (this=0x100e8b90, ptr=0x0)
at /opt/src/packages/cppTango-9.3.2-nommx/cppapi/server/pollthread.cpp:193
#20 0x0e8b6ee8 in omni_thread_wrapper () from /usr/local/omniorb-4.2.1/lib/libomnithread.so.4
#21 0x0ff1fb14 in start_thread () from /lib/libpthread.so.0
#22 0x0e5177d4 in clone () from /lib/libc.so.6