static void g723_close(struct ast_filestream *s) { struct ast_filestream *tmp, *tmpl = NULL; if (ast_mutex_lock(&g723_lock)) { ast_log(LOG_WARNING, "Unable to lock g723 list\n"); return; } tmp = glist; while(tmp) { if (tmp == s) { if (tmpl) tmpl->next = tmp->next; else glist = tmp->next; break; } tmpl = tmp; tmp = tmp->next; } glistcnt--; if (s->owner) { s->owner->stream = NULL; if (s->owner->streamid > -1) ast_sched_del(s->owner->sched, s->owner->streamid); s->owner->streamid = -1; } ast_mutex_unlock(&g723_lock); ast_update_use_count(); if (!tmp) ast_log(LOG_WARNING, "Freeing a filestream we don't seem to own\n"); close(s->fd); free(s); s = NULL; }
int ast_sip_sched_task_cancel(struct ast_sip_sched_task *schtd) { int res; if (!ao2_ref_and_lock(schtd)) { return -1; } if (schtd->current_scheduler_id < 0 || schtd->interval <= 0) { ao2_unlock_and_unref(schtd); return 0; } schtd->interval = 0; ao2_unlock_and_unref(schtd); ao2_unlink(tasks, schtd); res = ast_sched_del(scheduler_context, schtd->current_scheduler_id); return res; }
static char *handle_cli_sched_bench(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a) { struct ast_sched_context *con; struct timeval start; unsigned int num, i; int *sched_ids = NULL; switch (cmd) { case CLI_INIT: e->command = "sched benchmark"; e->usage = "" "Usage: sched benchmark <num>\n" ""; return NULL; case CLI_GENERATE: return NULL; } if (a->argc != e->args + 1) { return CLI_SHOWUSAGE; } if (sscanf(a->argv[e->args], "%u", &num) != 1) { return CLI_SHOWUSAGE; } if (!(con = ast_sched_context_create())) { ast_cli(a->fd, "Test failed - could not create scheduler context\n"); return CLI_FAILURE; } if (!(sched_ids = ast_malloc(sizeof(*sched_ids) * num))) { ast_cli(a->fd, "Test failed - memory allocation failure\n"); goto return_cleanup; } ast_cli(a->fd, "Testing ast_sched_add() performance - timing how long it takes " "to add %u entries at random time intervals from 0 to 60 seconds\n", num); start = ast_tvnow(); for (i = 0; i < num; i++) { int when = abs(ast_random()) % 60000; if ((sched_ids[i] = ast_sched_add(con, when, sched_cb, NULL)) == -1) { ast_cli(a->fd, "Test failed - sched_add returned -1\n"); goto return_cleanup; } } ast_cli(a->fd, "Test complete - %" PRIi64 " us\n", ast_tvdiff_us(ast_tvnow(), start)); ast_cli(a->fd, "Testing ast_sched_del() performance - timing how long it takes " "to delete %u entries with random time intervals from 0 to 60 seconds\n", num); start = ast_tvnow(); for (i = 0; i < num; i++) { if (ast_sched_del(con, sched_ids[i]) == -1) { ast_cli(a->fd, "Test failed - sched_del returned -1\n"); goto return_cleanup; } } ast_cli(a->fd, "Test complete - %" PRIi64 " us\n", ast_tvdiff_us(ast_tvnow(), start)); return_cleanup: ast_sched_context_destroy(con); if (sched_ids) { ast_free(sched_ids); } return CLI_SUCCESS; }