summaryrefslogtreecommitdiff
path: root/pjmedia
diff options
context:
space:
mode:
authorLiong Sauw Ming <ming@teluu.com>2011-12-09 05:15:39 +0000
committerLiong Sauw Ming <ming@teluu.com>2011-12-09 05:15:39 +0000
commit18e7622287344908ae3ce02164a40336da99d664 (patch)
tree5eed515bdd4de047c23f1e3d4ca3476a93ee69c8 /pjmedia
parent79da10cf65badc07e5ebd712f2aa43cc76844898 (diff)
Re #1420: Create a pool for the event manager so subscriber doesn't need to supply its own pool.
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@3905 74dad513-b988-da41-8d7b-12977e46ad98
Diffstat (limited to 'pjmedia')
-rw-r--r--pjmedia/include/pjmedia/event.h2
-rw-r--r--pjmedia/src/pjmedia/event.c32
-rw-r--r--pjmedia/src/pjmedia/vid_port.c4
-rw-r--r--pjmedia/src/pjmedia/vid_stream.c2
-rw-r--r--pjmedia/src/test/vid_codec_test.c2
-rw-r--r--pjmedia/src/test/vid_dev_test.c2
-rw-r--r--pjmedia/src/test/vid_port_test.c2
7 files changed, 24 insertions, 22 deletions
diff --git a/pjmedia/include/pjmedia/event.h b/pjmedia/include/pjmedia/event.h
index ba06625c..84baba9d 100644
--- a/pjmedia/include/pjmedia/event.h
+++ b/pjmedia/include/pjmedia/event.h
@@ -331,7 +331,6 @@ PJ_DECL(void) pjmedia_event_init(pjmedia_event *event,
* events from other publishers.
*
* @param mgr The event manager.
- * @param pool Pool to allocate memory from.
* @param cb The callback function to receive the event.
* @param user_data The user data to be associated with the callback
* function.
@@ -340,7 +339,6 @@ PJ_DECL(void) pjmedia_event_init(pjmedia_event *event,
* @return PJ_SUCCESS on success or the appropriate error code.
*/
PJ_DECL(pj_status_t) pjmedia_event_subscribe(pjmedia_event_mgr *mgr,
- pj_pool_t *pool,
pjmedia_event_cb *cb,
void *user_data,
void *epub);
diff --git a/pjmedia/src/pjmedia/event.c b/pjmedia/src/pjmedia/event.c
index 10df2b54..0dfcacb3 100644
--- a/pjmedia/src/pjmedia/event.c
+++ b/pjmedia/src/pjmedia/event.c
@@ -49,6 +49,7 @@ typedef struct event_queue
struct pjmedia_event_mgr
{
+ pj_pool_t *pool;
pj_thread_t *thread; /**< worker thread. */
pj_bool_t is_quitting;
pj_sem_t *sem;
@@ -56,6 +57,7 @@ struct pjmedia_event_mgr
event_queue ev_queue;
event_queue *pub_ev_queue; /**< publish() event queue. */
esub esub_list; /**< list of subscribers. */
+ esub free_esub_list; /**< list of subscribers. */
esub *th_next_sub, /**< worker thread's next sub. */
*pub_next_sub; /**< publish() next sub. */
};
@@ -154,14 +156,18 @@ PJ_DEF(pj_status_t) pjmedia_event_mgr_create(pj_pool_t *pool,
pj_status_t status;
mgr = PJ_POOL_ZALLOC_T(pool, pjmedia_event_mgr);
+ mgr->pool = pj_pool_create(pool->factory, "evt mgr", 500, 500, NULL);
pj_list_init(&mgr->esub_list);
+ pj_list_init(&mgr->free_esub_list);
if (!(options & PJMEDIA_EVENT_MGR_NO_THREAD)) {
- status = pj_sem_create(pool, "ev_sem", 0, MAX_EVENTS + 1, &mgr->sem);
+ status = pj_sem_create(mgr->pool, "ev_sem", 0, MAX_EVENTS + 1,
+ &mgr->sem);
if (status != PJ_SUCCESS)
return status;
- status = pj_thread_create(pool, "ev_thread", &event_worker_thread,
+ status = pj_thread_create(mgr->pool, "ev_thread",
+ &event_worker_thread,
mgr, 0, 0, &mgr->thread);
if (status != PJ_SUCCESS) {
pjmedia_event_mgr_destroy(mgr);
@@ -169,7 +175,7 @@ PJ_DEF(pj_status_t) pjmedia_event_mgr_create(pj_pool_t *pool,
}
}
- status = pj_mutex_create_recursive(pool, "ev_mutex", &mgr->mutex);
+ status = pj_mutex_create_recursive(mgr->pool, "ev_mutex", &mgr->mutex);
if (status != PJ_SUCCESS) {
pjmedia_event_mgr_destroy(mgr);
return status;
@@ -196,8 +202,6 @@ PJ_DEF(void) pjmedia_event_mgr_set_instance(pjmedia_event_mgr *mgr)
PJ_DEF(void) pjmedia_event_mgr_destroy(pjmedia_event_mgr *mgr)
{
- esub *sub;
-
if (!mgr) mgr = pjmedia_event_mgr_instance();
PJ_ASSERT_ON_FAIL(mgr != NULL, return);
@@ -217,12 +221,8 @@ PJ_DEF(void) pjmedia_event_mgr_destroy(pjmedia_event_mgr *mgr)
mgr->mutex = NULL;
}
- sub = mgr->esub_list.next;
- while (sub != &mgr->esub_list) {
- esub *next = sub->next;
- pj_list_erase(sub);
- sub = next;
- }
+ if (mgr->pool)
+ pj_pool_release(mgr->pool);
if (event_manager_instance == mgr)
event_manager_instance = NULL;
@@ -241,14 +241,13 @@ PJ_DEF(void) pjmedia_event_init( pjmedia_event *event,
}
PJ_DEF(pj_status_t) pjmedia_event_subscribe( pjmedia_event_mgr *mgr,
- pj_pool_t *pool,
pjmedia_event_cb *cb,
void *user_data,
void *epub)
{
esub *sub;
- PJ_ASSERT_RETURN(pool && cb, PJ_EINVAL);
+ PJ_ASSERT_RETURN(cb, PJ_EINVAL);
if (!mgr) mgr = pjmedia_event_mgr_instance();
PJ_ASSERT_RETURN(mgr, PJ_EINVAL);
@@ -270,7 +269,11 @@ PJ_DEF(pj_status_t) pjmedia_event_subscribe( pjmedia_event_mgr *mgr,
sub = next;
}
- sub = PJ_POOL_ZALLOC_T(pool, esub);
+ if (mgr->free_esub_list.next != &mgr->free_esub_list) {
+ sub = mgr->free_esub_list.next;
+ pj_list_erase(sub);
+ } else
+ sub = PJ_POOL_ZALLOC_T(mgr->pool, esub);
sub->cb = cb;
sub->user_data = user_data;
sub->epub = epub;
@@ -309,6 +312,7 @@ pjmedia_event_unsubscribe(pjmedia_event_mgr *mgr,
if (mgr->pub_next_sub == sub)
mgr->pub_next_sub = sub->next;
pj_list_erase(sub);
+ pj_list_push_back(&mgr->free_esub_list, sub);
if (user_data && epub)
break;
}
diff --git a/pjmedia/src/pjmedia/vid_port.c b/pjmedia/src/pjmedia/vid_port.c
index 1c1cdedf..1e292fb1 100644
--- a/pjmedia/src/pjmedia/vid_port.c
+++ b/pjmedia/src/pjmedia/vid_port.c
@@ -267,7 +267,7 @@ PJ_DEF(pj_status_t) pjmedia_vid_port_create( pj_pool_t *pool,
vparam.fmt.det.vid.fps.num, vparam.fmt.det.vid.fps.denum));
/* Subscribe to device's events */
- pjmedia_event_subscribe(NULL, vp->pool, &vidstream_event_cb,
+ pjmedia_event_subscribe(NULL, &vidstream_event_cb,
vp, vp->strm);
if (vp->dir & PJMEDIA_DIR_CAPTURE) {
@@ -410,7 +410,7 @@ PJ_DEF(pj_status_t) pjmedia_vid_port_connect(pjmedia_vid_port *vp,
vp->client_port = port;
/* Subscribe to client port's events */
- pjmedia_event_subscribe(NULL, vp->pool, &client_port_event_cb, vp,
+ pjmedia_event_subscribe(NULL, &client_port_event_cb, vp,
vp->client_port);
return PJ_SUCCESS;
diff --git a/pjmedia/src/pjmedia/vid_stream.c b/pjmedia/src/pjmedia/vid_stream.c
index 8d055770..7b0b1f9d 100644
--- a/pjmedia/src/pjmedia/vid_stream.c
+++ b/pjmedia/src/pjmedia/vid_stream.c
@@ -1361,7 +1361,7 @@ PJ_DEF(pj_status_t) pjmedia_vid_stream_create(
return status;
/* Subscribe to codec events */
- pjmedia_event_subscribe(NULL, pool, &stream_event_cb, stream,
+ pjmedia_event_subscribe(NULL, &stream_event_cb, stream,
stream->codec);
/* Estimate the maximum frame size */
diff --git a/pjmedia/src/test/vid_codec_test.c b/pjmedia/src/test/vid_codec_test.c
index 3df532ab..5d1af672 100644
--- a/pjmedia/src/test/vid_codec_test.c
+++ b/pjmedia/src/test/vid_codec_test.c
@@ -320,7 +320,7 @@ static int encode_decode_test(pj_pool_t *pool, const char *codec_id,
codec_param.dec_fmt.det = codec_param.enc_fmt.det;
/* Subscribe to codec events */
- pjmedia_event_subscribe(NULL, pool, &codec_on_event, &codec_port_data,
+ pjmedia_event_subscribe(NULL, &codec_on_event, &codec_port_data,
codec);
}
diff --git a/pjmedia/src/test/vid_dev_test.c b/pjmedia/src/test/vid_dev_test.c
index 5782337b..8f78094a 100644
--- a/pjmedia/src/test/vid_dev_test.c
+++ b/pjmedia/src/test/vid_dev_test.c
@@ -160,7 +160,7 @@ static int capture_render_loopback(int cap_dev_id, int rend_dev_id,
}
/* Set event handler */
- pjmedia_event_subscribe(NULL, pool, &vid_event_cb, NULL, renderer);
+ pjmedia_event_subscribe(NULL, &vid_event_cb, NULL, renderer);
/* Connect capture to renderer */
status = pjmedia_vid_port_connect(
diff --git a/pjmedia/src/test/vid_port_test.c b/pjmedia/src/test/vid_port_test.c
index dd3bf37e..82f0c1bf 100644
--- a/pjmedia/src/test/vid_port_test.c
+++ b/pjmedia/src/test/vid_port_test.c
@@ -117,7 +117,7 @@ static int capture_render_loopback(pj_bool_t active,
}
/* Set event handler */
- pjmedia_event_subscribe(NULL, pool, &vid_event_cb, NULL, renderer);
+ pjmedia_event_subscribe(NULL, &vid_event_cb, NULL, renderer);
/* Connect capture to renderer */
status = pjmedia_vid_port_connect(