int ast_sip_initialize_scheduler(void) { if (!(scheduler_context = ast_sched_context_create())) { ast_log(LOG_ERROR, "Failed to create scheduler. Aborting load\n"); return -1; } if (ast_sched_start_thread(scheduler_context)) { ast_log(LOG_ERROR, "Failed to start scheduler. Aborting load\n"); ast_sched_context_destroy(scheduler_context); return -1; } tasks = ao2_container_alloc_hash(AO2_ALLOC_OPT_LOCK_RWLOCK, AO2_CONTAINER_ALLOC_OPT_DUPS_REJECT, TASK_BUCKETS, ast_sip_sched_task_hash_fn, ast_sip_sched_task_sort_fn, ast_sip_sched_task_cmp_fn); if (!tasks) { ast_log(LOG_ERROR, "Failed to allocate task container. Aborting load\n"); ast_sched_context_destroy(scheduler_context); return -1; } ast_cli_register_multiple(cli_commands, ARRAY_LEN(cli_commands)); return 0; }
static pj_bool_t options_start(void) { sched = ast_sched_context_create(); if (!sched) { return -1; } if (ast_sched_start_thread(sched)) { ast_sched_context_destroy(sched); sched = NULL; return -1; } if (ast_sorcery_observer_add(ast_sip_get_sorcery(), "contact", &contact_observer)) { ast_log(LOG_WARNING, "Unable to add contact observer\n"); ast_sched_context_destroy(sched); sched = NULL; return -1; } return PJ_SUCCESS; }
int ast_sip_destroy_scheduler(void) { ast_cli_unregister_multiple(cli_commands, ARRAY_LEN(cli_commands)); if (scheduler_context) { ast_sched_context_destroy(scheduler_context); } ao2_cleanup(tasks); tasks = NULL; return 0; }
static int unload_module(void) { ast_sorcery_observer_remove(ast_sip_get_sorcery(), "contact", &contact_expiration_observer); if (sched) { ao2_callback(contact_autoexpire, OBJ_MULTIPLE | OBJ_NODATA | OBJ_UNLINK, unload_observer_delete, NULL); ast_sched_context_destroy(sched); sched = NULL; } ao2_cleanup(contact_autoexpire); contact_autoexpire = NULL; return 0; }
static pj_bool_t options_stop(void) { ast_sorcery_observer_remove(ast_sip_get_sorcery(), "contact", &contact_observer); if (sched) { ast_sched_context_destroy(sched); sched = NULL; } /* Empty the container of scheduling data refs. */ ao2_callback(sched_qualifies, OBJ_UNLINK | OBJ_NODATA | OBJ_MULTIPLE, sched_qualifies_empty, NULL); return PJ_SUCCESS; }
void ast_sip_destroy_distributor(void) { ast_cli_unregister_multiple(cli_commands, ARRAY_LEN(cli_commands)); ast_sip_unregister_cli_formatter(unid_formatter); ast_sip_unregister_service(&auth_mod); ast_sip_unregister_service(&endpoint_mod); ast_sip_unregister_service(&distributor_mod); ao2_global_obj_release(artificial_auth); ao2_cleanup(artificial_endpoint); ast_sorcery_observer_remove(ast_sip_get_sorcery(), "global", &global_observer); if (prune_context) { ast_sched_context_destroy(prune_context); } distributor_pool_shutdown(); ao2_cleanup(dialog_associations); ao2_cleanup(unidentified_requests); }
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; }