Stefan Schuermans commited on 2019-08-28 11:43:44
Showing 2 changed files, with 14 additions and 6 deletions.
introduce global interlock for liblinphone instances, this fixes the crashes when multiple SIP phones are configured
| ... | ... |
@@ -34,10 +34,13 @@ namespace Blinker {
|
| 34 | 34 |
|
| 35 | 35 |
/** |
| 36 | 36 |
* everything using the linphone library happens in a separate thread, |
| 37 |
- * because some call to linphone take long (up to two seconds) |
|
| 37 |
+ * because some calls to linphone take long (up to two seconds) |
|
| 38 | 38 |
*/ |
| 39 | 39 |
namespace linphone {
|
| 40 | 40 |
|
| 41 |
+/// interlock for liblinphone, higher in mutex hierarchy than shared data mutex |
|
| 42 |
+static std::mutex g_mtx; |
|
| 43 |
+ |
|
| 41 | 44 |
static char const *loglevel2str(OrtpLogLevel lev) |
| 42 | 45 |
{
|
| 43 | 46 |
switch(lev) {
|
| ... | ... |
@@ -165,7 +168,7 @@ struct Data {
|
| 165 | 168 |
}; |
| 166 | 169 |
|
| 167 | 170 |
/** |
| 168 |
- * @breif set playback file |
|
| 171 |
+ * @brief set playback file |
|
| 169 | 172 |
* @param[in,out] data data of SIP client |
| 170 | 173 |
* @param[in] name name of sound file (without extension) |
| 171 | 174 |
*/ |
| ... | ... |
@@ -557,6 +560,7 @@ void worker(SipPhone::ConfigData const &configData, |
| 557 | 560 |
|
| 558 | 561 |
// main loop of worker - with shared data locked |
| 559 | 562 |
std::chrono::milliseconds timeout(10); |
| 563 |
+ std::unique_lock<std::mutex> g_lock(g_mtx); |
|
| 560 | 564 |
std::unique_lock<std::mutex> lock(sharedData.mtx); |
| 561 | 565 |
while (sharedData.run) {
|
| 562 | 566 |
|
| ... | ... |
@@ -609,8 +613,10 @@ void worker(SipPhone::ConfigData const &configData, |
| 609 | 613 |
lock.lock(); |
| 610 | 614 |
} |
| 611 | 615 |
|
| 612 |
- // nothing to do, wait for signal |
|
| 613 |
- sharedData.cond.wait_for(lock, timeout); |
|
| 616 |
+ // nothing to do, wait for signal (with both locks released) |
|
| 617 |
+ lock.unlock(); |
|
| 618 |
+ sharedData.cond.wait_for(g_lock, timeout); |
|
| 619 |
+ lock.lock(); |
|
| 614 | 620 |
|
| 615 | 621 |
} // while (sharedData.run) |
| 616 | 622 |
} |
| ... | ... |
@@ -32,8 +32,10 @@ public: |
| 32 | 32 |
}; |
| 33 | 33 |
/// data shared between linphone thread and main Blinker thread |
| 34 | 34 |
struct SharedData {
|
| 35 |
- std::mutex mtx; ///< protection for this structure |
|
| 36 |
- std::condition_variable cond; ///< worker threads waits on this condition |
|
| 35 |
+ /// protection for this structure |
|
| 36 |
+ std::mutex mtx; |
|
| 37 |
+ /// worker threads waits on this condition, related mutex is g_mtx |
|
| 38 |
+ std::condition_variable cond; |
|
| 37 | 39 |
/// Blinker -> SIP |
| 38 | 40 |
//@{
|
| 39 | 41 |
bool run; ///< whether to keep worker running (false = exit) |
| 40 | 42 |