Re: [PATCH] Add thread safety to cRingBufferLinear

[email protected] Thu, 02 Feb 2023 23:47:44 +0100
Newsgroups gmane.linux.vdr
Message-ID <[email protected]>
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
[email protected]
https://www.linuxtv.org/cgi-bin/mailman/listinfo/vdr