[asterisk-commits] russell: branch russell/sched_thread r140562 - in /team/russell/sched_thread:...
SVN commits to the Asterisk project
asterisk-commits at lists.digium.com
Tue Sep 2 09:51:37 CDT 2008
Author: russell
Date: Tue Sep 2 09:51:36 2008
New Revision: 140562
URL: http://svn.digium.com/view/asterisk?view=rev&rev=140562
Log:
Simplify chan_iax2 a bit by using the common sched thread implementation
Modified:
team/russell/sched_thread/channels/chan_iax2.c
team/russell/sched_thread/include/asterisk/sched.h
team/russell/sched_thread/main/sched.c
Modified: team/russell/sched_thread/channels/chan_iax2.c
URL: http://svn.digium.com/view/asterisk/team/russell/sched_thread/channels/chan_iax2.c?view=diff&rev=140562&r1=140561&r2=140562
==============================================================================
--- team/russell/sched_thread/channels/chan_iax2.c (original)
+++ team/russell/sched_thread/channels/chan_iax2.c Tue Sep 2 09:51:36 2008
@@ -222,7 +222,7 @@
} while(0)
static struct io_context *io;
-static struct sched_context *sched;
+static struct ast_sched_thread *sched;
static int iax2_capability = IAX_CAPABILITY_FULLBANDWIDTH;
@@ -249,9 +249,6 @@
static struct ast_flags globalflags = { 0 };
static pthread_t netthreadid = AST_PTHREADT_NULL;
-static pthread_t schedthreadid = AST_PTHREADT_NULL;
-AST_MUTEX_DEFINE_STATIC(sched_lock);
-static ast_cond_t sched_cond;
enum iax2_state {
IAX_STATE_STARTED = (1 << 0),
@@ -1165,22 +1162,18 @@
#define schedule_action(func, data) __schedule_action(func, data, __PRETTY_FUNCTION__)
#endif
-static int iax2_sched_replace(int id, struct sched_context *con, int when, ast_sched_cb callback, const void *data)
-{
- AST_SCHED_REPLACE(id, con, when, callback, data);
- signal_condition(&sched_lock, &sched_cond);
-
- return id;
-}
-
-static int iax2_sched_add(struct sched_context *con, int when, ast_sched_cb callback, const void *data)
-{
- int res;
-
- res = ast_sched_add(con, when, callback, data);
- signal_condition(&sched_lock, &sched_cond);
-
- return res;
+static int iax2_sched_replace(int id, struct ast_sched_thread *st, int when,
+ ast_sched_cb callback, const void *data)
+{
+ ast_sched_thread_del(st, id);
+
+ return ast_sched_thread_add(st, when, callback, data);
+}
+
+static int iax2_sched_add(struct ast_sched_thread *st, int when,
+ ast_sched_cb callback, const void *data)
+{
+ return ast_sched_thread_add(st, when, callback, data);
}
static int send_ping(const void *data);
@@ -1427,18 +1420,18 @@
ast_clear_flag(pvt, IAX_MAXAUTHREQ);
}
/* No more pings or lagrq's */
- AST_SCHED_DEL(sched, pvt->pingid);
- AST_SCHED_DEL(sched, pvt->lagid);
- AST_SCHED_DEL(sched, pvt->autoid);
- AST_SCHED_DEL(sched, pvt->authid);
- AST_SCHED_DEL(sched, pvt->initid);
- AST_SCHED_DEL(sched, pvt->jbid);
- AST_SCHED_DEL(sched, pvt->keyrotateid);
+ ast_sched_thread_del(sched, pvt->pingid);
+ ast_sched_thread_del(sched, pvt->lagid);
+ ast_sched_thread_del(sched, pvt->autoid);
+ ast_sched_thread_del(sched, pvt->authid);
+ ast_sched_thread_del(sched, pvt->initid);
+ ast_sched_thread_del(sched, pvt->jbid);
+ ast_sched_thread_del(sched, pvt->keyrotateid);
}
static void iax2_frame_free(struct iax_frame *fr)
{
- AST_SCHED_DEL(sched, fr->retrans);
+ ast_sched_thread_del(sched, fr->retrans);
iax_frame_free(fr);
}
@@ -1611,8 +1604,8 @@
* \note We delete these before switching the slot, because if
* they fire in the meantime, they will generate a warning.
*/
- AST_SCHED_DEL(sched, iaxs[callno]->pingid);
- AST_SCHED_DEL(sched, iaxs[callno]->lagid);
+ ast_sched_thread_del(sched, iaxs[callno]->pingid);
+ ast_sched_thread_del(sched, iaxs[callno]->lagid);
iaxs[x] = iaxs[callno];
iaxs[x]->callno = x;
iaxs[callno] = NULL;
@@ -3060,7 +3053,7 @@
jb_reset(iaxs[fr->callno]->jb);
- AST_SCHED_DEL(sched, iaxs[fr->callno]->jbid);
+ ast_sched_thread_del(sched, iaxs[fr->callno]->jbid);
/* deliver this frame now */
if (tsout)
@@ -3100,7 +3093,7 @@
/* Wake up the network and scheduler thread */
if (netthreadid != AST_PTHREADT_NULL)
pthread_kill(netthreadid, SIGURG);
- signal_condition(&sched_lock, &sched_cond);
+ ast_sched_thread_poke(sched);
return 0;
}
@@ -3236,7 +3229,7 @@
ast_copy_flags(peer, &globalflags, IAX_RTAUTOCLEAR|IAX_RTCACHEFRIENDS);
if (ast_test_flag(peer, IAX_RTAUTOCLEAR)) {
if (peer->expire > -1) {
- if (!ast_sched_del(sched, peer->expire)) {
+ if (!ast_sched_thread_del(sched, peer->expire)) {
peer->expire = -1;
peer_unref(peer);
}
@@ -3845,7 +3838,7 @@
ast_mutex_lock(&iaxsl[pvt->callno]);
pvt->keyrotateid =
- ast_sched_add(sched, 120000 + (ast_random() % 180001), iax2_key_rotate, vpvt);
+ ast_sched_thread_add(sched, 120000 + (ast_random() % 180001), iax2_key_rotate, vpvt);
snprintf(key, sizeof(key), "%lX", ast_random());
@@ -6810,14 +6803,14 @@
static void unlink_peer(struct iax2_peer *peer)
{
if (peer->expire > -1) {
- if (!ast_sched_del(sched, peer->expire)) {
+ if (!ast_sched_thread_del(sched, peer->expire)) {
peer->expire = -1;
peer_unref(peer);
}
}
if (peer->pokeexpire > -1) {
- if (!ast_sched_del(sched, peer->pokeexpire)) {
+ if (!ast_sched_thread_del(sched, peer->pokeexpire)) {
peer->pokeexpire = -1;
peer_unref(peer);
}
@@ -6891,7 +6884,7 @@
p->addr.sin_addr = in;
p->addr.sin_port = htons(atoi(c));
if (p->expire > -1) {
- if (!ast_sched_del(sched, p->expire)) {
+ if (!ast_sched_thread_del(sched, p->expire)) {
p->expire = -1;
peer_unref(p);
}
@@ -6987,7 +6980,7 @@
p->sockfd = fd;
/* Setup the expiry */
if (p->expire > -1) {
- if (!ast_sched_del(sched, p->expire)) {
+ if (!ast_sched_thread_del(sched, p->expire)) {
p->expire = -1;
peer_unref(p);
}
@@ -8433,7 +8426,7 @@
}
}
if (f.frametype == AST_FRAME_IAX) {
- AST_SCHED_DEL(sched, iaxs[fr->callno]->initid);
+ ast_sched_thread_del(sched, iaxs[fr->callno]->initid);
/* Handle the IAX pseudo frame itself */
if (iaxdebug)
ast_debug(1, "IAX subclass %d received\n", f.subclass);
@@ -8920,7 +8913,7 @@
/* Remove scheduled iax2_poke_noanswer */
if (peer->pokeexpire > -1) {
- if (!ast_sched_del(sched, peer->pokeexpire)) {
+ if (!ast_sched_thread_del(sched, peer->pokeexpire)) {
peer_unref(peer);
peer->pokeexpire = -1;
}
@@ -10032,7 +10025,7 @@
iaxs[peer->callno]->peerpoke = peer;
if (peer->pokeexpire > -1) {
- if (!ast_sched_del(sched, peer->pokeexpire)) {
+ if (!ast_sched_thread_del(sched, peer->pokeexpire)) {
peer->pokeexpire = -1;
peer_unref(peer);
}
@@ -10145,34 +10138,6 @@
}
return c;
-}
-
-static void *sched_thread(void *ignore)
-{
- int count;
- int res;
- struct timeval wait;
- struct timespec ts;
-
- for (;;) {
- pthread_testcancel();
- ast_mutex_lock(&sched_lock);
- res = ast_sched_wait(sched);
- if ((res > 1000) || (res < 0))
- res = 1000;
- wait = ast_tvadd(ast_tvnow(), ast_samp2tv(res, 1000));
- ts.tv_sec = wait.tv_sec;
- ts.tv_nsec = wait.tv_usec * 1000;
- ast_cond_timedwait(&sched_cond, &sched_lock, &ts);
- ast_mutex_unlock(&sched_lock);
- pthread_testcancel();
-
- count = ast_sched_runq(sched);
- if (count >= 20)
- ast_debug(1, "chan_iax2: ast_sched_runq ran %d scheduled tasks all at once\n", count);
- }
-
- return NULL;
}
static void *network_thread(void *ignore)
@@ -10262,7 +10227,6 @@
AST_LIST_UNLOCK(&idle_list);
}
}
- ast_pthread_create_background(&schedthreadid, NULL, sched_thread, NULL);
ast_pthread_create_background(&netthreadid, NULL, network_thread, NULL);
ast_verb(2, "%d helper threads started\n", threadcount);
return 0;
@@ -10535,7 +10499,7 @@
}
} else {
/* Non-dynamic. Make sure we become that way if we're not */
- AST_SCHED_DEL(sched, peer->expire);
+ ast_sched_thread_del(sched, peer->expire);
ast_clear_flag(peer, IAX_DYNAMIC);
if (ast_dnsmgr_lookup(v->value, &peer->addr, &peer->dnsmgr, srvlookup ? "_iax._udp" : NULL))
return peer_unref(peer);
@@ -10908,7 +10872,7 @@
AST_LIST_LOCK(®istrations);
while ((reg = AST_LIST_REMOVE_HEAD(®istrations, entry))) {
- AST_SCHED_DEL(sched, reg->expire);
+ ast_sched_thread_del(sched, reg->expire);
if (reg->callno) {
int callno = reg->callno;
ast_mutex_lock(&iaxsl[callno]);
@@ -12089,21 +12053,13 @@
/* Cancel the network thread, close the net socket */
if (netthreadid != AST_PTHREADT_NULL) {
AST_LIST_LOCK(&frame_queue);
- ast_mutex_lock(&sched_lock);
pthread_cancel(netthreadid);
- ast_cond_signal(&sched_cond);
- ast_mutex_unlock(&sched_lock); /* Release the schedule lock resource */
AST_LIST_UNLOCK(&frame_queue);
pthread_join(netthreadid, NULL);
}
- if (schedthreadid != AST_PTHREADT_NULL) {
- ast_mutex_lock(&sched_lock);
- pthread_cancel(schedthreadid);
- ast_cond_signal(&sched_cond);
- ast_mutex_unlock(&sched_lock);
- pthread_join(schedthreadid, NULL);
- }
-
+
+ sched = ast_sched_thread_destroy(sched);
+
/* Call for all threads to halt */
AST_LIST_LOCK(&idle_list);
while ((thread = AST_LIST_REMOVE_HEAD(&idle_list, list)))
@@ -12140,7 +12096,6 @@
ast_channel_unregister(&iax2_tech);
delete_users();
iax_provision_unload();
- sched_context_destroy(sched);
reload_firmware(1);
for (x = 0; x < ARRAY_LEN(iaxsl); x++) {
@@ -12232,23 +12187,21 @@
ast_mutex_init(&iaxsl[x]);
}
- ast_cond_init(&sched_cond, NULL);
-
- if (!(sched = sched_context_create())) {
- ast_log(LOG_ERROR, "Failed to create scheduler context\n");
+ if (!(sched = ast_sched_thread_create())) {
+ ast_log(LOG_ERROR, "Failed to create scheduler thread\n");
return AST_MODULE_LOAD_FAILURE;
}
if (!(io = io_context_create())) {
ast_log(LOG_ERROR, "Failed to create I/O context\n");
- sched_context_destroy(sched);
+ sched = ast_sched_thread_destroy(sched);
return AST_MODULE_LOAD_FAILURE;
}
if (!(netsock = ast_netsock_list_alloc())) {
ast_log(LOG_ERROR, "Failed to create netsock list\n");
io_context_destroy(io);
- sched_context_destroy(sched);
+ sched = ast_sched_thread_destroy(sched);
return AST_MODULE_LOAD_FAILURE;
}
ast_netsock_init(netsock);
@@ -12257,7 +12210,7 @@
if (!outsock) {
ast_log(LOG_ERROR, "Could not allocate outsock list.\n");
io_context_destroy(io);
- sched_context_destroy(sched);
+ sched = ast_sched_thread_destroy(sched);
return AST_MODULE_LOAD_FAILURE;
}
ast_netsock_init(outsock);
Modified: team/russell/sched_thread/include/asterisk/sched.h
URL: http://svn.digium.com/view/asterisk/team/russell/sched_thread/include/asterisk/sched.h?view=diff&rev=140562&r1=140561&r2=140562
==============================================================================
--- team/russell/sched_thread/include/asterisk/sched.h (original)
+++ team/russell/sched_thread/include/asterisk/sched.h Tue Sep 2 09:51:36 2008
@@ -291,6 +291,8 @@
long ast_sched_thread_when(struct ast_sched_thread *st, int id);
+void ast_sched_thread_poke(struct ast_sched_thread *st);
+
#if defined(__cplusplus) || defined(c_plusplus)
}
#endif
Modified: team/russell/sched_thread/main/sched.c
URL: http://svn.digium.com/view/asterisk/team/russell/sched_thread/main/sched.c?view=diff&rev=140562&r1=140561&r2=140562
==============================================================================
--- team/russell/sched_thread/main/sched.c (original)
+++ team/russell/sched_thread/main/sched.c Tue Sep 2 09:51:36 2008
@@ -117,6 +117,13 @@
}
return NULL;
+}
+
+void ast_sched_thread_poke(struct ast_sched_thread *st)
+{
+ ast_mutex_lock(&st->lock);
+ ast_cond_signal(&st->cond);
+ ast_mutex_unlock(&st->lock);
}
long ast_sched_thread_when(struct ast_sched_thread *st, int id)
More information about the asterisk-commits
mailing list