From d10749b9f2e5e1441fa82c9d820fff6beb2f8aa7 Mon Sep 17 00:00:00 2001 From: Marco Bascetta Date: Wed, 17 Jan 2018 08:50:28 +0100 Subject: [PATCH 08/23] msqueue: added mutex lock in MSBufferizer in order to avoid wrong data read when ms_bufferizer_put and ms_bufferizer_read are used in different threads --- include/mediastreamer2/msqueue.h | 1 + src/base/msqueue.c | 7 +++++++ 2 files changed, 8 insertions(+) diff --git a/include/mediastreamer2/msqueue.h b/include/mediastreamer2/msqueue.h index 656014a6..6691015d 100644 --- a/include/mediastreamer2/msqueue.h +++ b/include/mediastreamer2/msqueue.h @@ -121,6 +121,7 @@ MS2_PUBLIC void ms_queue_destroy(MSQueue *q); struct _MSBufferizer{ queue_t q; size_t size; + ms_mutex_t lock; }; typedef struct _MSBufferizer MSBufferizer; diff --git a/src/base/msqueue.c b/src/base/msqueue.c index 41f227c8..eebbd4af 100644 --- a/src/base/msqueue.c +++ b/src/base/msqueue.c @@ -59,6 +59,7 @@ void ms_queue_flush(MSQueue *q){ void ms_bufferizer_init(MSBufferizer *obj){ + ms_mutex_init(&obj->lock,NULL); qinit(&obj->q); obj->size=0; } @@ -70,8 +71,10 @@ MSBufferizer * ms_bufferizer_new(){ } void ms_bufferizer_put(MSBufferizer *obj, mblk_t *m){ + ms_mutex_lock(&obj->lock); obj->size+=msgdsize(m); putq(&obj->q,m); + ms_mutex_unlock(&obj->lock); } void ms_bufferizer_put_from_queue(MSBufferizer *obj, MSQueue *q){ @@ -82,6 +85,7 @@ void ms_bufferizer_put_from_queue(MSBufferizer *obj, MSQueue *q){ } size_t ms_bufferizer_read(MSBufferizer *obj, uint8_t *data, size_t datalen){ + ms_mutex_lock(&obj->lock); if (obj->size>=datalen && datalen > 0){ /*we can return something */ size_t sz=0; @@ -108,8 +112,10 @@ size_t ms_bufferizer_read(MSBufferizer *obj, uint8_t *data, size_t datalen){ } } obj->size-=datalen; + ms_mutex_unlock(&obj->lock); return datalen; } + ms_mutex_unlock(&obj->lock); return 0; } @@ -132,6 +138,7 @@ void ms_bufferizer_flush(MSBufferizer *obj){ void ms_bufferizer_uninit(MSBufferizer *obj){ flushq(&obj->q,0); + ms_mutex_destroy(&obj->lock); } void ms_bufferizer_destroy(MSBufferizer *obj){ -- 2.11.0