From 3bb81a42394316b1c88bb7ce4ee51c1740fca9b2 Mon Sep 17 00:00:00 2001 From: Marcus Overhagen Date: Tue, 7 Mar 2006 14:37:17 +0000 Subject: [PATCH] Fixed deadlock that occured when quitting media applications. I don't know why this never happened on R5. Haiku close_port() works as documented in BeBook, but might possibly different in R5. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@16629 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/kits/media/MediaEventLooper.cpp | 10 +++++----- src/kits/media/MediaNode.cpp | 2 ++ 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/kits/media/MediaEventLooper.cpp b/src/kits/media/MediaEventLooper.cpp index f2ffa18b2c..e1e4abad45 100644 --- a/src/kits/media/MediaEventLooper.cpp +++ b/src/kits/media/MediaEventLooper.cpp @@ -433,18 +433,18 @@ void BMediaEventLooper::Quit() { CALLED(); - status_t err; if (fRunState == B_TERMINATED) return; SetRunState(B_QUITTING); - + write_port(ControlPort(), 0, NULL, 0); // null message to unblock the read (see BMediaNode::WaitForMessage) close_port(ControlPort()); - if (fControlThread != -1) + if (fControlThread != -1) { + status_t err; wait_for_thread(fControlThread, &err); - fControlThread = -1; - + fControlThread = -1; + } SetRunState(B_TERMINATED); } diff --git a/src/kits/media/MediaNode.cpp b/src/kits/media/MediaNode.cpp index 607a90d65b..e9dbcea9da 100644 --- a/src/kits/media/MediaNode.cpp +++ b/src/kits/media/MediaNode.cpp @@ -359,6 +359,8 @@ BMediaNode::WaitForMessage(bigtime_t waitUntil, size = read_port_etc(ControlPort(), &message, data, sizeof(data), B_ABSOLUTE_TIMEOUT, waitUntil); if (size <= 0) { + if (size == 0 && message == 0) + return B_OK; // a null message was received (to unblock the read) if (size != B_TIMED_OUT) ERROR("BMediaNode::WaitForMessage: read_port_etc error 0x%08lx\n",size); return size; // returns the error code