[vlc-commits] objects: fix data-race in debug code
Thomas Guillem
git at videolan.org
Wed Mar 13 11:39:40 CET 2019
vlc | branch: master | Thomas Guillem <thomas at gllm.fr> | Wed Mar 13 11:35:01 2019 +0100| [02d494255ce1b8b9c8357cbef5d7eda2a5264495] | committer: Thomas Guillem
objects: fix data-race in debug code
assert(!ObjectHasChild(obj)) was causing the following data_race:
WARNING: ThreadSanitizer: data race (pid=18491)
Write of size 8 at 0x7b7000041888 by thread T7 (mutexes: write M150, write M148, write M18):
#0 vlc_list_add_between ../../include/vlc_list.h:75 (libvlccore.so.9+0xe4765)
#1 vlc_list_add_before ../../include/vlc_list.h:100 (libvlccore.so.9+0xe4765)
#2 vlc_list_append ../../include/vlc_list.h:112 (libvlccore.so.9+0xe4765)
#3 vlc_custom_create ../../src/misc/objects.c:247 (libvlccore.so.9+0xe4765)
#4 CreateDecoder ../../src/input/decoder.c:1765 (libvlccore.so.9+0x69538)
#5 decoder_New ../../src/input/decoder.c:2014 (libvlccore.so.9+0x69d1d)
#6 input_DecoderNew ../../src/input/decoder.c:2077 (libvlccore.so.9+0x6a7a4)
#7 EsOutCreateDecoder ../../src/input/es_out.c:1824 (libvlccore.so.9+0x7025d)
#8 EsOutSelectEs ../../src/input/es_out.c:1932 (libvlccore.so.9+0x706c2)
#9 EsOutSelect ../../src/input/es_out.c:2164 (libvlccore.so.9+0x716e6)
#10 EsOutVaControlLocked ../../src/input/es_out.c:2523 (libvlccore.so.9+0x77d57)
#11 EsOutControl ../../src/input/es_out.c:3208 (libvlccore.so.9+0x79f3e)
#12 es_out_vaControl ../../include/vlc_es_out.h:158 (libvlccore.so.9+0x7c1ba)
#13 es_out_Control ../../include/vlc_es_out.h:167 (libvlccore.so.9+0x7c1ba)
#14 CmdExecuteControl ../../src/input/es_out_timeshift.c:1556 (libvlccore.so.9+0x7c4a8)
#15 ControlLocked ../../src/input/es_out_timeshift.c:638 (libvlccore.so.9+0x7df40)
#16 Control ../../src/input/es_out_timeshift.c:764 (libvlccore.so.9+0x7e35c)
#17 es_out_vaControl ../../include/vlc_es_out.h:158 (libvlccore.so.9+0x7fd81)
#18 es_out_Control ../../include/vlc_es_out.h:167 (libvlccore.so.9+0x7fd81)
#19 es_out_SetMode ../../src/input/es_out.h:97 (libvlccore.so.9+0x82b25)
#20 InitPrograms ../../src/input/input.c:1304 (libvlccore.so.9+0x82b25)
#21 Init ../../src/input/input.c:1385 (libvlccore.so.9+0x8887c)
#22 Run ../../src/input/input.c:532 (libvlccore.so.9+0x89757)
Previous read of size 8 at 0x7b7000041888 by thread T20:
#0 vlc_list_it_next ../../include/vlc_list.h:229 (libvlccore.so.9+0xe42b9)
#1 ObjectHasChild ../../src/misc/objects.c:83 (libvlccore.so.9+0xe42b9)
#2 vlc_object_release ../../src/misc/objects.c:405 (libvlccore.so.9+0xe4adf)
#3 vlc_object_delete ../../include/vlc_objects.h:120 (libvlccore.so.9+0x59210)
#4 InvokeModule ../../src/preparser/fetcher.c:161 (libvlccore.so.9+0x59210)
#5 SearchArt ../../src/preparser/fetcher.c:188 (libvlccore.so.9+0x5925a)
#6 SearchByScope ../../src/preparser/fetcher.c:207 (libvlccore.so.9+0x5a029)
#7 SearchNetwork ../../src/preparser/fetcher.c:309 (libvlccore.so.9+0x5a068)
#8 FetcherThread ../../src/preparser/fetcher.c:338 (libvlccore.so.9+0x59153)
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=02d494255ce1b8b9c8357cbef5d7eda2a5264495
---
src/misc/objects.c | 12 ++++++++++--
1 file changed, 10 insertions(+), 2 deletions(-)
diff --git a/src/misc/objects.c b/src/misc/objects.c
index 1f92381c26..07bea99a85 100644
--- a/src/misc/objects.c
+++ b/src/misc/objects.c
@@ -76,7 +76,7 @@ static bool ObjectIsLastChild(vlc_object_t *obj, vlc_object_t *parent)
return true;
}
-static bool ObjectHasChild(vlc_object_t *obj)
+static bool ObjectHasChildLocked(vlc_object_t *obj)
{
vlc_object_internals_t *priv;
@@ -85,6 +85,14 @@ static bool ObjectHasChild(vlc_object_t *obj)
return false;
}
+static bool ObjectHasChild(vlc_object_t *obj)
+{
+ vlc_mutex_lock(&tree_lock);
+ bool ret = ObjectHasChildLocked(obj);
+ vlc_mutex_unlock(&tree_lock);
+ return ret;
+}
+
static void PrintObjectPrefix(vlc_object_t *obj, bool last)
{
vlc_object_t *parent = vlc_object_parent(obj);
@@ -111,7 +119,7 @@ static void PrintObject(vlc_object_t *obj)
PrintObjectPrefix(obj, true);
printf("\xE2\x94\x80\xE2\x94%c\xE2\x95\xB4%p %s, %u refs\n",
- ObjectHasChild(obj) ? 0xAC : 0x80,
+ ObjectHasChildLocked(obj) ? 0xAC : 0x80,
(void *)obj, vlc_object_typename(obj), atomic_load(&priv->refs));
vlc_restorecancel (canc);
More information about the vlc-commits
mailing list