On 02/02/2023 23:27, Klaus Schmidinger wrote:
On 02.02.23 23:16, Patrick Lerda wrote:
Beside preventing crashes with vdr-2.6.3 this is required to
get vdr to work properly with the gcc thread sanitizer.
cRingBufferLinear was designed to be thread safe without locking.
What "crashes with vdr-2.6.3" are you referring to?
Klaus
With a -fsanitize=thread compiled version of vdr, I had some crashes
that happened quickly, for instance:
ThreadSanitizer:DEADLYSIGNAL
==6496==ERROR: ThreadSanitizer: SEGV on unknown address 0x7f6ca48884a4
(pc 0x7f6cbf45726d bp 0x7f6ca3dbfb40 sp 0x7f6ca3dbf038 T7926)
==6496==The signal is caused by a WRITE memory access.
#0 <null> <null> (libc.so.6+0x16926d)
#1 __interceptor_memcpy <null> (libtsan.so.0+0x619fc)
#2 cRingBufferLinear::Put(unsigned char const*, int)
/dosy/src/vdr-2.6.3/ringbuffer.c:329 (vdr+0x5724ab)
#3 cRemuxDummy::Put(unsigned char const*, int)
/dosy/src/vdr-2.6.3/PLUGINS/src/streamdev/server/streamer.c:117
(libvdr-streamdev-server.so.2.6.3+0x504cd)
#4 cStreamdevStreamer::Put(unsigned char const*, int)
/dosy/src/vdr-2.6.3/PLUGINS/src/streamdev/server/streamer.c:182
(libvdr-streamdev-server.so.2.6.3+0x504cd)
#5 cStreamdevLiveStreamer::Put(unsigned char const*, int)
/dosy/src/vdr-2.6.3/PLUGINS/src/streamdev/server/livestreamer.c:604
(libvdr-streamdev-server.so.2.6.3+0x55565)
#6 cStreamdevStreamer::Action()
/dosy/src/vdr-2.6.3/PLUGINS/src/streamdev/server/streamer.c:174
(libvdr-streamdev-server.so.2.6.3+0x50718)
#7 cStreamdevLiveStreamer::Action()
/dosy/src/vdr-2.6.3/PLUGINS/src/streamdev/server/livestreamer.c:589
(libvdr-streamdev-server.so.2.6.3+0x55495)
#8 cThread::StartThread(cThread*) /dosy/src/vdr-2.6.3/thread.c:293
(vdr+0x5be852)
#9 <null> <null> (libtsan.so.0+0x333bf)
#10 <null> <null> (libc.so.6+0x8a729)
#11 <null> <null> (libc.so.6+0x1070bb)
Here are two detected data races:
WARNING: ThreadSanitizer: data race (pid=6496)
Write of size 4 at 0x7b4400003084 by thread T24:
#0 cRingBufferLinear::Put(unsigned char const*, int)
vdr-2.6.3/ringbuffer.c:330 (vdr+0x5724c6)
#1 cIptvDevice::WriteData(unsigned char*, int)
vdr-2.6.3/PLUGINS/src/iptv/device.c:384 (libvdr-iptv.so.2.6.3+0x16384)
#2 cIptvStreamer::Action() vdr-2.6.3/PLUGINS/src/iptv/streamer.c:51
(libvdr-iptv.so.2.6.3+0x2bc46)
#3 cThread::StartThread(cThread*) vdr-2.6.3/thread.c:293
(vdr+0x5be852)
#4 <null> <null> (libtsan.so.0+0x333bf)
Previous read of size 4 at 0x7b4400003084 by thread T23:
#0 cRingBufferLinear::Get(int&) vdr-2.6.3/ringbuffer.c:348
(vdr+0x572534)
#1 cIptvDevice::GetData(int*)
vdr-2.6.3/PLUGINS/src/iptv/device.c:408 (libvdr-iptv.so.2.6.3+0x1772c)
#2 cIptvDevice::GetTSPacket(unsigned char*&)
vdr-2.6.3/PLUGINS/src/iptv/device.c:456 (libvdr-iptv.so.2.6.3+0x17a21)
#3 cDevice::Action() vdr-2.6.3/device.c:1718 (vdr+0x4bf86f)
#4 cThread::StartThread(cThread*) vdr-2.6.3/thread.c:293
(vdr+0x5be852)
#5 <null> <null> (libtsan.so.0+0x333bf)
Location is heap block of size 288 at 0x7b4400002f80 allocated by main
thread:
#0 operator new(unsigned long) <null> (libtsan.so.0+0x8d98c)
#1 cIptvDevice::cIptvDevice(unsigned int)
vdr-2.6.3/PLUGINS/src/iptv/device.c:29 (libvdr-iptv.so.2.6.3+0x183b4)
#2 cIptvDevice::Initialize(unsigned int)
vdr-2.6.3/PLUGINS/src/iptv/device.c:88 (libvdr-iptv.so.2.6.3+0x188b7)
#3 cPluginIptv::Initialize() vdr-2.6.3/PLUGINS/src/iptv/iptv.c:109
(libvdr-iptv.so.2.6.3+0x140f2)
#4 cPluginManager::InitializePlugins() vdr-2.6.3/plugin.c:375
(vdr+0x5536f2)
#5 main vdr-2.6.3/vdr.c:825 (vdr+0x490ccb)
Thread T24 'IPTV streamer' (tid=6535, running) created by thread T23
at:
#0 pthread_create <null> (libtsan.so.0+0x5fea5)
#1 cThread::Start() vdr-2.6.3/thread.c:327 (vdr+0x5be393)
#2 cIptvStreamer::Open() vdr-2.6.3/PLUGINS/src/iptv/streamer.c:66
(libvdr-iptv.so.2.6.3+0x2bf46)
#3 cIptvDevice::OpenDvr() vdr-2.6.3/PLUGINS/src/iptv/device.c:342
(libvdr-iptv.so.2.6.3+0x15ed3)
#4 cDevice::Action() vdr-2.6.3/device.c:1714 (vdr+0x4bf7b8)
#5 cThread::StartThread(cThread*) vdr-2.6.3/thread.c:293
(vdr+0x5be852)
#6 <null> <null> (libtsan.so.0+0x333bf)
Thread T23 'device 3 receiv' (tid=6534, running) created by thread T13
at:
#0 pthread_create <null> (libtsan.so.0+0x5fea5)
#1 cThread::Start() vdr-2.6.3/thread.c:327 (vdr+0x5be393)
#2 cDevice::AttachReceiver(cReceiver*) vdr-2.6.3/device.c:1844
(vdr+0x4c055d)
#3 cStreamdevLiveStreamer::Attach()
vdr-2.6.3/PLUGINS/src/streamdev/server/livestreamer.c:614
(libvdr-streamdev-server.so.2.6.3+0x51761)
#4 cStreamdevStreamer::Start(cTBSocket*)
vdr-2.6.3/PLUGINS/src/streamdev/server/streamer.c:152
(libvdr-streamdev-server.so.2.6.3+0x508f4)
#5 cConnectionHTTP::Flushed()
vdr-2.6.3/PLUGINS/src/streamdev/server/connectionHTTP.c:439
(libvdr-streamdev-server.so.2.6.3+0x38e33)
#6 cServerConnection::Write()
vdr-2.6.3/PLUGINS/src/streamdev/server/connection.c:171
(libvdr-streamdev-server.so.2.6.3+0x2d1bf)
#7 cStreamdevServer::Action()
vdr-2.6.3/PLUGINS/src/streamdev/server/server.c:146
(libvdr-streamdev-server.so.2.6.3+0x2b94e)
#8 cThread::StartThread(cThread*) vdr-2.6.3/thread.c:293
(vdr+0x5be852)
#9 <null> <null> (libtsan.so.0+0x333bf)
SUMMARY: ThreadSanitizer: data race vdr-2.6.3/ringbuffer.c:330 in
cRingBufferLinear::Put(unsigned char const*, int)
==================
==================
WARNING: ThreadSanitizer: data race (pid=6496)
Read of size 1 at 0x7f6cae7ff0bc by thread T23:
#0 cIptvDevice::GetData(int*)
vdr-2.6.3/PLUGINS/src/iptv/device.c:410 (libvdr-iptv.so.2.6.3+0x17755)
#1 cIptvDevice::GetTSPacket(unsigned char*&)
vdr-2.6.3/PLUGINS/src/iptv/device.c:456 (libvdr-iptv.so.2.6.3+0x17a21)
#2 cDevice::Action() vdr-2.6.3/device.c:1718 (vdr+0x4bf86f)
#3 cThread::StartThread(cThread*) vdr-2.6.3/thread.c:293
(vdr+0x5be852)
#4 <null> <null> (libtsan.so.0+0x333bf)
Previous write of size 1 at 0x7f6cae7ff0bc by thread T24:
#0 memcpy <null> (libtsan.so.0+0x619ce)
#1 cRingBufferLinear::Put(unsigned char const*, int)
vdr-2.6.3/ringbuffer.c:329 (vdr+0x5724ab)
#2 cIptvDevice::WriteData(unsigned char*, int)
vdr-2.6.3/PLUGINS/src/iptv/device.c:384 (libvdr-iptv.so.2.6.3+0x16384)
#3 cIptvStreamer::Action() vdr-2.6.3/PLUGINS/src/iptv/streamer.c:51
(libvdr-iptv.so.2.6.3+0x2bc46)
#4 cThread::StartThread(cThread*) vdr-2.6.3/thread.c:293
(vdr+0x5be852)
#5 <null> <null> (libtsan.so.0+0x333bf)
Location is heap block of size 2097141 at 0x7f6cae7ff000 allocated by
main thread:
#0 malloc <null> (libtsan.so.0+0x367d9)
#1 cRingBufferLinear::cRingBufferLinear(int, int, bool, char const*)
vdr-2.6.3/ringbuffer.c:179 (vdr+0x571e2f)
#2 cIptvDevice::cIptvDevice(unsigned int)
vdr-2.6.3/PLUGINS/src/iptv/device.c:29 (libvdr-iptv.so.2.6.3+0x183ce)
#3 cIptvDevice::Initialize(unsigned int)
vdr-2.6.3/PLUGINS/src/iptv/device.c:88 (libvdr-iptv.so.2.6.3+0x188b7)
#4 cPluginIptv::Initialize() vdr-2.6.3/PLUGINS/src/iptv/iptv.c:109
(libvdr-iptv.so.2.6.3+0x140f2)
#5 cPluginManager::InitializePlugins() vdr-2.6.3/plugin.c:375
(vdr+0x5536f2)
#6 main vdr-2.6.3/vdr.c:825 (vdr+0x490ccb)
Thread T23 'device 3 receiv' (tid=6534, running) created by thread T13
at:
#0 pthread_create <null> (libtsan.so.0+0x5fea5)
#1 cThread::Start() vdr-2.6.3/thread.c:327 (vdr+0x5be393)
#2 cDevice::AttachReceiver(cReceiver*) vdr-2.6.3/device.c:1844
(vdr+0x4c055d)
#3 cStreamdevLiveStreamer::Attach()
vdr-2.6.3/PLUGINS/src/streamdev/server/livestreamer.c:614
(libvdr-streamdev-server.so.2.6.3+0x51761)
#4 cStreamdevStreamer::Start(cTBSocket*)
vdr-2.6.3/PLUGINS/src/streamdev/server/streamer.c:152
(libvdr-streamdev-server.so.2.6.3+0x508f4)
#5 cConnectionHTTP::Flushed()
vdr-2.6.3/PLUGINS/src/streamdev/server/connectionHTTP.c:439
(libvdr-streamdev-server.so.2.6.3+0x38e33)
#6 cServerConnection::Write()
vdr-2.6.3/PLUGINS/src/streamdev/server/connection.c:171
(libvdr-streamdev-server.so.2.6.3+0x2d1bf)
#7 cStreamdevServer::Action()
vdr-2.6.3/PLUGINS/src/streamdev/server/server.c:146
(libvdr-streamdev-server.so.2.6.3+0x2b94e)
#8 cThread::StartThread(cThread*) vdr-2.6.3/thread.c:293
(vdr+0x5be852)
#9 <null> <null> (libtsan.so.0+0x333bf)
Thread T24 'IPTV streamer' (tid=6535, running) created by thread T23
at:
#0 pthread_create <null> (libtsan.so.0+0x5fea5)
#1 cThread::Start() vdr-2.6.3/thread.c:327 (vdr+0x5be393)
#2 cIptvStreamer::Open() vdr-2.6.3/PLUGINS/src/iptv/streamer.c:66
(libvdr-iptv.so.2.6.3+0x2bf46)
#3 cIptvDevice::OpenDvr() vdr-2.6.3/PLUGINS/src/iptv/device.c:342
(libvdr-iptv.so.2.6.3+0x15ed3)
#4 cDevice::Action() vdr-2.6.3/device.c:1714 (vdr+0x4bf7b8)
#5 cThread::StartThread(cThread*) vdr-2.6.3/thread.c:293
(vdr+0x5be852)
#6 <null> <null> (libtsan.so.0+0x333bf)
SUMMARY: ThreadSanitizer: data race
vdr-2.6.3/PLUGINS/src/iptv/device.c:410 in IptvDevice::GetData(int*)
==================
==================
_______________________________________________
vdr mailing list
vdr@xxxxxxxxxxx
https://www.linuxtv.org/cgi-bin/mailman/listinfo/vdr