summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLiong Sauw Ming <ming@teluu.com>2015-03-22 07:50:28 +0000
committerLiong Sauw Ming <ming@teluu.com>2015-03-22 07:50:28 +0000
commite346ff50cd4cbc37c5961c2c2f36315f06c3525e (patch)
treeff5216612b3f2ee05a1ef7decacdf359933bd8eb
parent17a5d263408c7e694f71453d6c420da44e6a3d88 (diff)
Fixed #1827: Video port's clock thread may get stuck during format change event
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@5012 74dad513-b988-da41-8d7b-12977e46ad98
-rw-r--r--pjlib/include/pj/os.h4
-rw-r--r--pjlib/src/pj/os_core_unix.c3
-rw-r--r--pjmedia/src/pjmedia/vid_port.c12
3 files changed, 16 insertions, 3 deletions
diff --git a/pjlib/include/pj/os.h b/pjlib/include/pj/os.h
index 8cf9bcd9..8d8e602b 100644
--- a/pjlib/include/pj/os.h
+++ b/pjlib/include/pj/os.h
@@ -311,8 +311,10 @@ PJ_DECL(pj_thread_t*) pj_thread_this(void);
/**
* Join thread, and block the caller thread until the specified thread exits.
+ * If it is called from within the thread itself, it will return immediately
+ * with failure status.
* If the specified thread has already been dead, or it does not exist,
- * the function will return immediately with successfull status.
+ * the function will return immediately with successful status.
*
* @param thread The thread handle.
*
diff --git a/pjlib/src/pj/os_core_unix.c b/pjlib/src/pj/os_core_unix.c
index 8ec0cdb7..1a9fedd0 100644
--- a/pjlib/src/pj/os_core_unix.c
+++ b/pjlib/src/pj/os_core_unix.c
@@ -717,6 +717,9 @@ PJ_DEF(pj_status_t) pj_thread_join(pj_thread_t *p)
PJ_CHECK_STACK();
+ if (p == pj_thread_this())
+ return PJ_ECANCELLED;
+
PJ_LOG(6, (pj_thread_this()->obj_name, "Joining thread %s", p->obj_name));
result = pthread_join( rec->thread, &ret);
diff --git a/pjmedia/src/pjmedia/vid_port.c b/pjmedia/src/pjmedia/vid_port.c
index 2444402a..a5dcfcdb 100644
--- a/pjmedia/src/pjmedia/vid_port.c
+++ b/pjmedia/src/pjmedia/vid_port.c
@@ -580,7 +580,14 @@ static pj_status_t client_port_event_cb(pjmedia_event *event,
pjmedia_vid_dev_param vid_param;
pj_status_t status;
- pjmedia_vid_port_stop(vp);
+ /* Ticket #1827:
+ * Stopping video port should not be necessary here because
+ * it will also try to stop the clock, from inside the clock's
+ * own thread, so it may get stuck. We just stop the video device
+ * stream instead.
+ * pjmedia_vid_port_stop(vp);
+ */
+ pjmedia_vid_dev_stream_stop(vp->strm);
/* Retrieve the video format detail */
vfd = pjmedia_format_get_video_format_detail(
@@ -635,7 +642,8 @@ static pj_status_t client_port_event_cb(pjmedia_event *event,
pjmedia_clock_modify(vp->clock, &clock_param);
}
- pjmedia_vid_port_start(vp);
+ /* pjmedia_vid_port_start(vp); */
+ pjmedia_vid_dev_stream_start(vp->strm);
}
/* Republish the event, post the event to the event manager