From 827dcbc23c22e51638624aa1bc6cbf691757eed6 Mon Sep 17 00:00:00 2001 From: Pekka Riikonen Date: Fri, 16 Feb 2007 14:38:47 +0000 Subject: [PATCH] Internal scheduler initialization cannot return NULL anymore. --- lib/silcutil/silcschedule.c | 10 +++++++++- lib/silcutil/silcschedule_i.h | 5 +++-- lib/silcutil/stacktrace.c | 2 +- lib/silcutil/symbian/silcsymbianscheduler.cpp | 4 ++-- lib/silcutil/unix/silcunixnet.c | 2 ++ lib/silcutil/unix/silcunixschedule.c | 4 +++- lib/silcutil/win32/silcwin32schedule.c | 2 +- 7 files changed, 21 insertions(+), 8 deletions(-) diff --git a/lib/silcutil/silcschedule.c b/lib/silcutil/silcschedule.c index adfacd55..7ffcc510 100644 --- a/lib/silcutil/silcschedule.c +++ b/lib/silcutil/silcschedule.c @@ -325,8 +325,10 @@ SilcSchedule silc_schedule_init(int max_tasks, void *app_context) schedule->fd_queue = silc_hash_table_alloc(0, silc_hash_uint, NULL, NULL, NULL, silc_schedule_fd_destructor, NULL, TRUE); - if (!schedule->fd_queue) + if (!schedule->fd_queue) { + silc_free(schedule); return NULL; + } silc_list_init(schedule->timeout_queue, struct SilcTaskStruct, next); silc_list_init(schedule->free_tasks, struct SilcTaskStruct, next); @@ -340,6 +342,12 @@ SilcSchedule silc_schedule_init(int max_tasks, void *app_context) /* Initialize the platform specific scheduler. */ schedule->internal = schedule_ops.init(schedule, app_context); + if (!schedule->internal) { + silc_hash_table_free(schedule->fd_queue); + silc_mutex_free(schedule->lock); + silc_free(schedule); + return NULL; + } /* Timeout freelist garbage collection */ silc_schedule_task_add_timeout(schedule, silc_schedule_timeout_gc, diff --git a/lib/silcutil/silcschedule_i.h b/lib/silcutil/silcschedule_i.h index 04976c36..fcb47aa4 100644 --- a/lib/silcutil/silcschedule_i.h +++ b/lib/silcutil/silcschedule_i.h @@ -4,7 +4,7 @@ Author: Pekka Riikonen - Copyright (C) 2001 - 2006 Pekka Riikonen + Copyright (C) 2001 - 2007 Pekka Riikonen This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -86,7 +86,8 @@ typedef struct { /* Initializes the platform specific scheduler. This for example initializes the wakeup mechanism of the scheduler. In multi-threaded environment the scheduler needs to be wakenup when tasks are added or removed from - the task queues. Returns context to the platform specific scheduler. */ + the task queues. Returns context to the platform specific scheduler. + If this returns NULL the scheduler initialization will fail. */ void *(*init)(SilcSchedule schedule, void *app_context); /* Uninitializes the platform specific scheduler context. */ diff --git a/lib/silcutil/stacktrace.c b/lib/silcutil/stacktrace.c index 1a931926..2174080c 100644 --- a/lib/silcutil/stacktrace.c +++ b/lib/silcutil/stacktrace.c @@ -203,7 +203,7 @@ void silc_st_dump(void) fprintf(fp, "%s:%d: #blocks=%lu, bytes=%lu\n", stack->file, stack->line, blocks, bytes); for (i = 0; i < stack->depth; i++) - fprintf(fp, "%p\n", stack->stack[i]); + fprintf(fp, "\tpc=%p\n", stack->stack[i]); } } diff --git a/lib/silcutil/symbian/silcsymbianscheduler.cpp b/lib/silcutil/symbian/silcsymbianscheduler.cpp index bf3ee235..d8a8a183 100644 --- a/lib/silcutil/symbian/silcsymbianscheduler.cpp +++ b/lib/silcutil/symbian/silcsymbianscheduler.cpp @@ -4,7 +4,7 @@ Author: Pekka Riikonen - Copyright (C) 1998 - 2006 Pekka Riikonen + Copyright (C) 1998 - 2007 Pekka Riikonen This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -48,7 +48,7 @@ void *silc_schedule_internal_init(SilcSchedule schedule, void *app_context) { /* Nothing to do */ - return NULL; + return (void *)1; } diff --git a/lib/silcutil/unix/silcunixnet.c b/lib/silcutil/unix/silcunixnet.c index ba1736dd..4254fab9 100644 --- a/lib/silcutil/unix/silcunixnet.c +++ b/lib/silcutil/unix/silcunixnet.c @@ -641,6 +641,8 @@ SILC_FSM_STATE(silc_net_connect_st_connected) return SILC_FSM_CONTINUE; } + SILC_LOG_DEBUG(("TCP connection established")); + /** Connection created */ silc_fsm_next(fsm, silc_net_connect_st_stream); SILC_FSM_CALL((conn->sop = silc_socket_tcp_stream_create( diff --git a/lib/silcutil/unix/silcunixschedule.c b/lib/silcutil/unix/silcunixschedule.c index df080730..9a4ae9a4 100644 --- a/lib/silcutil/unix/silcunixschedule.c +++ b/lib/silcutil/unix/silcunixschedule.c @@ -338,8 +338,10 @@ void *silc_schedule_internal_init(SilcSchedule schedule, #if defined(HAVE_EPOLL_WAIT) internal->epfd = epoll_create(4); - if (internal->epfd < 0) + if (internal->epfd < 0) { + SILC_LOG_ERROR(("epoll_create() failed: %s", strerror(errno))); return NULL; + } internal->fds = silc_calloc(4, sizeof(*internal->fds)); if (!internal->fds) { close(internal->epfd); diff --git a/lib/silcutil/win32/silcwin32schedule.c b/lib/silcutil/win32/silcwin32schedule.c index f4a263fc..aa2cd254 100644 --- a/lib/silcutil/win32/silcwin32schedule.c +++ b/lib/silcutil/win32/silcwin32schedule.c @@ -242,7 +242,7 @@ void *silc_schedule_internal_init(SilcSchedule schedule, void *app_context) return (void *)wakeup; #else - return NULL; + return (void *)1; #endif } -- 2.24.0