From 561b6adce76dd209ebc547fcd98f525501742d97 Mon Sep 17 00:00:00 2001 From: "Matthias P. Braendli" Date: Fri, 8 Jul 2016 09:57:33 +0200 Subject: Protect m_nowplaying with mutex --- src/VLCInput.cpp | 12 +++++++++++- src/VLCInput.h | 3 ++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/VLCInput.cpp b/src/VLCInput.cpp index 37ad1e0..33c4594 100644 --- a/src/VLCInput.cpp +++ b/src/VLCInput.cpp @@ -320,14 +320,22 @@ ssize_t VLCInput::m_read(uint8_t* buf, size_t length) char* nowplaying_sz = libvlc_media_get_meta(media, libvlc_meta_NowPlaying); if (nowplaying_sz) { + std::lock_guard lock(m_nowplaying_mutex); m_nowplaying = nowplaying_sz; + free(nowplaying_sz); } } return err; } -bool write_icy_to_file(const std::string& text, const std::string& filename, bool dl_plus) +/* Write the corresponding text to a file readable by mot-encoder, with optional + * DL+ information. The text is passed as a copy because we actually use the m_nowplaying + * variable which is also accessed in another thread, so better make a copy. + * + * Returns false on failure + */ +bool write_icy_to_file(const std::string text, const std::string& filename, bool dl_plus) { FILE* fd = fopen(filename.c_str(), "wb"); if (fd) { @@ -368,6 +376,8 @@ void VLCInput::write_icy_text(const std::string& filename, bool dl_plus) } else { + std::lock_guard lock(m_nowplaying_mutex); + if (m_nowplaying_previous != m_nowplaying) { icy_text_written = std::async(std::launch::async, std::bind(write_icy_to_file, m_nowplaying, filename, dl_plus)); diff --git a/src/VLCInput.h b/src/VLCInput.h index ad23c4d..1ea0bee 100644 --- a/src/VLCInput.h +++ b/src/VLCInput.h @@ -119,7 +119,7 @@ class VLCInput std::vector m_current_buf; - mutable std::mutex m_queue_mutex; + std::mutex m_queue_mutex; std::deque m_queue; std::string m_uri; @@ -138,6 +138,7 @@ class VLCInput std::future icy_text_written; + std::mutex m_nowplaying_mutex; std::string m_nowplaying; std::string m_nowplaying_previous; -- cgit v1.2.3