diff --git a/main/sched.c b/main/sched.c index fa809e17220451c6b683b3638a45e7278948d8eb..4de0214320857650e733b7624bd7ce5dbb61a3cc 100644 --- a/main/sched.c +++ b/main/sched.c @@ -47,9 +47,6 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$") #include "asterisk/channel.h" #include "asterisk/lock.h" #include "asterisk/utils.h" -#include "asterisk/linkedlists.h" -#include "asterisk/dlinkedlists.h" -#include "asterisk/hashtab.h" #include "asterisk/heap.h" #include "asterisk/threadstorage.h" @@ -85,9 +82,7 @@ struct sched_thread { struct ast_sched_context { ast_mutex_t lock; unsigned int eventcnt; /*!< Number of events processed */ - unsigned int schedcnt; /*!< Number of outstanding schedule events */ unsigned int highwater; /*!< highest count so far */ - struct ast_hashtab *schedq_ht; /*!< hash table for fast searching */ struct ast_heap *sched_heap; struct sched_thread *sched_thread; @@ -188,20 +183,6 @@ int ast_sched_start_thread(struct ast_sched_context *con) return 0; } -static int sched_cmp(const void *a, const void *b) -{ - const struct sched *as = a; - const struct sched *bs = b; - return as->id != bs->id; /* return 0 on a match like strcmp would */ -} - -static unsigned int sched_hash(const void *obj) -{ - const struct sched *s = obj; - unsigned int h = s->id; - return h; -} - static int sched_time_cmp(void *a, void *b) { return ast_tvcmp(((struct sched *) b)->when, ((struct sched *) a)->when); @@ -218,8 +199,6 @@ struct ast_sched_context *ast_sched_context_create(void) ast_mutex_init(&tmp->lock); tmp->eventcnt = 1; - tmp->schedq_ht = ast_hashtab_create(23, sched_cmp, ast_hashtab_resize_java, ast_hashtab_newsize_java, sched_hash, 1); - if (!(tmp->sched_heap = ast_heap_create(8, sched_time_cmp, offsetof(struct sched, __heap_index)))) { ast_sched_context_destroy(tmp); @@ -252,9 +231,6 @@ void ast_sched_context_destroy(struct ast_sched_context *con) con->sched_heap = NULL; } - ast_hashtab_destroy(con->schedq_ht, NULL); - con->schedq_ht = NULL; - ast_mutex_unlock(&con->lock); ast_mutex_destroy(&con->lock); @@ -330,14 +306,8 @@ static void schedule(struct ast_sched_context *con, struct sched *s) { ast_heap_push(con->sched_heap, s); - if (!ast_hashtab_insert_safe(con->schedq_ht, s)) { - ast_log(LOG_WARNING,"Schedule Queue entry %d is already in table!\n", s->id); - } - - con->schedcnt++; - - if (con->schedcnt > con->highwater) { - con->highwater = con->schedcnt; + if (ast_heap_size(con->sched_heap) > con->highwater) { + con->highwater = ast_heap_size(con->sched_heap); } } @@ -419,16 +389,40 @@ int ast_sched_add(struct ast_sched_context *con, int when, ast_sched_cb callback return ast_sched_add_variable(con, when, callback, data, 0); } -const void *ast_sched_find_data(struct ast_sched_context *con, int id) +static struct sched *sched_find(struct ast_sched_context *con, int id) { - struct sched tmp,*res; - tmp.id = id; - res = ast_hashtab_lookup(con->schedq_ht, &tmp); - if (res) - return res->data; + int x; + size_t heap_size; + + heap_size = ast_heap_size(con->sched_heap); + for (x = 1; x <= heap_size; x++) { + struct sched *cur = ast_heap_peek(con->sched_heap, x); + + if (cur->id == id) { + return cur; + } + } + return NULL; } +const void *ast_sched_find_data(struct ast_sched_context *con, int id) +{ + struct sched *s; + const void *data = NULL; + + ast_mutex_lock(&con->lock); + + s = sched_find(con, id); + if (s) { + data = s->data; + } + + ast_mutex_unlock(&con->lock); + + return data; +} + /*! \brief * Delete the schedule entry with number * "id". It's nearly impossible that there @@ -441,9 +435,7 @@ int ast_sched_del(struct ast_sched_context *con, int id) int _ast_sched_del(struct ast_sched_context *con, int id, const char *file, int line, const char *function) #endif { - struct sched *s, tmp = { - .id = id, - }; + struct sched *s = NULL; int *last_id = ast_threadstorage_get(&last_del_id, sizeof(int)); DEBUG(ast_debug(1, "ast_sched_del(%d)\n", id)); @@ -453,18 +445,13 @@ int _ast_sched_del(struct ast_sched_context *con, int id, const char *file, int } ast_mutex_lock(&con->lock); - s = ast_hashtab_lookup(con->schedq_ht, &tmp); + + s = sched_find(con, id); if (s) { if (!ast_heap_remove(con->sched_heap, s)) { ast_log(LOG_WARNING,"sched entry %d not in the sched heap?\n", s->id); } - if (!ast_hashtab_remove_this_object(con->schedq_ht, s)) { - ast_log(LOG_WARNING,"Found sched entry %d, then couldn't remove it?\n", s->id); - } - - con->schedcnt--; - sched_release(con, s); } @@ -506,7 +493,7 @@ void ast_sched_report(struct ast_sched_context *con, struct ast_str **buf, struc size_t heap_size; memset(countlist, 0, sizeof(countlist)); - ast_str_set(buf, 0, " Highwater = %d\n schedcnt = %d\n", con->highwater, con->schedcnt); + ast_str_set(buf, 0, " Highwater = %d\n schedcnt = %zd\n", con->highwater, ast_heap_size(con->sched_heap)); ast_mutex_lock(&con->lock); @@ -543,9 +530,9 @@ void ast_sched_dump(struct ast_sched_context *con) int x; size_t heap_size; #ifdef SCHED_MAX_CACHE - ast_debug(1, "Asterisk Schedule Dump (%d in Q, %d Total, %d Cache, %d high-water)\n", con->schedcnt, con->eventcnt - 1, con->schedccnt, con->highwater); + ast_debug(1, "Asterisk Schedule Dump (%zd in Q, %d Total, %d Cache, %d high-water)\n", ast_heap_size(con->sched_heap), con->eventcnt - 1, con->schedccnt, con->highwater); #else - ast_debug(1, "Asterisk Schedule Dump (%d in Q, %d Total, %d high-water)\n", con->schedcnt, con->eventcnt - 1, con->highwater); + ast_debug(1, "Asterisk Schedule Dump (%zd in Q, %d Total, %d high-water)\n", ast_heap_size(con->sched_heap), con->eventcnt - 1, con->highwater); #endif ast_debug(1, "=============================================================\n"); @@ -595,12 +582,6 @@ int ast_sched_runq(struct ast_sched_context *con) current = ast_heap_pop(con->sched_heap); - if (!ast_hashtab_remove_this_object(con->schedq_ht, current)) { - ast_log(LOG_ERROR,"Sched entry %d was in the schedq list but not in the hashtab???\n", current->id); - } - - con->schedcnt--; - /* * At this point, the schedule queue is still intact. We * have removed the first event and the rest is still there, @@ -637,20 +618,18 @@ int ast_sched_runq(struct ast_sched_context *con) long ast_sched_when(struct ast_sched_context *con,int id) { - struct sched *s, tmp; + struct sched *s; long secs = -1; DEBUG(ast_debug(1, "ast_sched_when()\n")); ast_mutex_lock(&con->lock); - /* these next 2 lines replace a lookup loop */ - tmp.id = id; - s = ast_hashtab_lookup(con->schedq_ht, &tmp); - + s = sched_find(con, id); if (s) { struct timeval now = ast_tvnow(); secs = s->when.tv_sec - now.tv_sec; } + ast_mutex_unlock(&con->lock); return secs;