X-Git-Url: http://git.silcnet.org/gitweb/?p=crypto.git;a=blobdiff_plain;f=lib%2Fsilcutil%2Fsilcschedule.c;h=476d11f1031e3518b39442dab2a7fe31b1242dc8;hp=d2ad0c924ccac83c9b124e9485bea30b5b42d470;hb=f2dd07bb06c199bc35b8a69c0828f88c8e028db6;hpb=1f27d9647347b2da8797ccaaa76c04c51c41a6c4 diff --git a/lib/silcutil/silcschedule.c b/lib/silcutil/silcschedule.c index d2ad0c92..476d11f1 100644 --- a/lib/silcutil/silcschedule.c +++ b/lib/silcutil/silcschedule.c @@ -290,14 +290,14 @@ void silc_schedule_stats(SilcSchedule schedule) { SilcTaskFd ftask; fprintf(stdout, "Schedule %p statistics:\n\n", schedule); - fprintf(stdout, "Num FD tasks : %lu (%lu bytes allocated)\n", + fprintf(stdout, "Num FD tasks : %d (%lu bytes allocated)\n", silc_hash_table_count(schedule->fd_queue), sizeof(*ftask) * silc_hash_table_count(schedule->fd_queue)); - fprintf(stdout, "Num Timeout tasks : %d (%d bytes allocated)\n", + fprintf(stdout, "Num Timeout tasks : %d (%lu bytes allocated)\n", silc_list_count(schedule->timeout_queue), sizeof(struct SilcTaskTimeoutStruct) * silc_list_count(schedule->timeout_queue)); - fprintf(stdout, "Num Timeout freelist : %d (%d bytes allocated)\n", + fprintf(stdout, "Num Timeout freelist : %d (%lu bytes allocated)\n", silc_list_count(schedule->free_tasks), sizeof(struct SilcTaskTimeoutStruct) * silc_list_count(schedule->free_tasks)); @@ -376,6 +376,8 @@ SilcBool silc_schedule_uninit(SilcSchedule schedule) { SilcTask task; + SILC_VERIFY(schedule); + SILC_LOG_DEBUG(("Uninitializing scheduler %p", schedule)); if (schedule->valid == TRUE) @@ -420,6 +422,7 @@ SilcBool silc_schedule_uninit(SilcSchedule schedule) void silc_schedule_stop(SilcSchedule schedule) { SILC_LOG_DEBUG(("Stopping scheduler")); + SILC_VERIFY(schedule); SILC_SCHEDULE_LOCK(schedule); schedule->valid = FALSE; SILC_SCHEDULE_UNLOCK(schedule); @@ -575,6 +578,39 @@ void silc_schedule_set_notify(SilcSchedule schedule, schedule->notify_context = context; } +/* Set global scheduler */ + +void silc_schedule_set_global(SilcSchedule schedule) +{ + SilcTls tls = silc_thread_get_tls(); + + if (!tls) { + /* Try to initialize Tls */ + tls = silc_thread_tls_init(); + SILC_VERIFY(tls); + if (!tls) + return; + } + + SILC_LOG_DEBUG(("Setting global scheduler %p", schedule)); + + tls->schedule = schedule; +} + +/* Return global scheduler */ + +SilcSchedule silc_schedule_get_global(void) +{ + SilcTls tls = silc_thread_get_tls(); + + if (!tls) + return NULL; + + SILC_LOG_DEBUG(("Return global scheduler %p", tls->schedule)); + + return tls->schedule; +} + /* Add new task to the scheduler */ SilcTask silc_schedule_task_add(SilcSchedule schedule, SilcUInt32 fd, @@ -584,6 +620,15 @@ SilcTask silc_schedule_task_add(SilcSchedule schedule, SilcUInt32 fd, { SilcTask task = NULL; + if (!schedule) { + schedule = silc_schedule_get_global(); + SILC_VERIFY(schedule); + if (!schedule) { + silc_set_errno(SILC_ERR_INVALID_ARGUMENT); + return NULL; + } + } + if (silc_unlikely(!schedule->valid)) { silc_set_errno(SILC_ERR_NOT_VALID); return NULL; @@ -730,6 +775,15 @@ SilcTask silc_schedule_task_add(SilcSchedule schedule, SilcUInt32 fd, SilcBool silc_schedule_task_del(SilcSchedule schedule, SilcTask task) { + if (!schedule) { + schedule = silc_schedule_get_global(); + SILC_VERIFY(schedule); + if (!schedule) { + silc_set_errno(SILC_ERR_INVALID_ARGUMENT); + return FALSE; + } + } + if (silc_unlikely(task == SILC_ALL_TASKS)) { SilcHashTableList htl; @@ -787,6 +841,15 @@ SilcBool silc_schedule_task_del_by_fd(SilcSchedule schedule, SilcUInt32 fd) SILC_LOG_DEBUG(("Unregister task by fd %d", fd)); + if (!schedule) { + schedule = silc_schedule_get_global(); + SILC_VERIFY(schedule); + if (!schedule) { + silc_set_errno(SILC_ERR_INVALID_ARGUMENT); + return FALSE; + } + } + SILC_SCHEDULE_LOCK(schedule); /* fd is unique, so there is only one task with this fd in the table */ @@ -829,6 +892,15 @@ SilcBool silc_schedule_task_del_by_callback(SilcSchedule schedule, SILC_LOG_DEBUG(("Unregister task by callback")); + if (!schedule) { + schedule = silc_schedule_get_global(); + SILC_VERIFY(schedule); + if (!schedule) { + silc_set_errno(SILC_ERR_INVALID_ARGUMENT); + return FALSE; + } + } + SILC_SCHEDULE_LOCK(schedule); /* Delete from fd queue */ @@ -882,6 +954,15 @@ SilcBool silc_schedule_task_del_by_context(SilcSchedule schedule, SILC_LOG_DEBUG(("Unregister task by context")); + if (!schedule) { + schedule = silc_schedule_get_global(); + SILC_VERIFY(schedule); + if (!schedule) { + silc_set_errno(SILC_ERR_INVALID_ARGUMENT); + return FALSE; + } + } + SILC_SCHEDULE_LOCK(schedule); /* Delete from fd queue */ @@ -939,6 +1020,15 @@ SilcBool silc_schedule_task_del_by_all(SilcSchedule schedule, int fd, if (fd) return silc_schedule_task_del_by_fd(schedule, fd); + if (!schedule) { + schedule = silc_schedule_get_global(); + SILC_VERIFY(schedule); + if (!schedule) { + silc_set_errno(SILC_ERR_INVALID_ARGUMENT); + return FALSE; + } + } + SILC_SCHEDULE_LOCK(schedule); /* Delete from timeout queue */ @@ -973,6 +1063,15 @@ SilcBool silc_schedule_set_listen_fd(SilcSchedule schedule, SilcUInt32 fd, { SilcTaskFd task; + if (!schedule) { + schedule = silc_schedule_get_global(); + SILC_VERIFY(schedule); + if (!schedule) { + silc_set_errno(SILC_ERR_INVALID_ARGUMENT); + return FALSE; + } + } + if (silc_unlikely(!schedule->valid)) { silc_set_errno(SILC_ERR_NOT_VALID); return FALSE; @@ -1012,6 +1111,15 @@ SilcTaskEvent silc_schedule_get_fd_events(SilcSchedule schedule, SilcTaskFd task; SilcTaskEvent event = 0; + if (!schedule) { + schedule = silc_schedule_get_global(); + SILC_VERIFY(schedule); + if (!schedule) { + silc_set_errno(SILC_ERR_INVALID_ARGUMENT); + return 0; + } + } + if (silc_unlikely(!schedule->valid)) { silc_set_errno(SILC_ERR_NOT_VALID); return 0;