X-Git-Url: http://git.silcnet.org/gitweb/?a=blobdiff_plain;f=lib%2Fsilcutil%2Funix%2Fsilcunixschedule.c;h=0856358764ec216f67c5c5dfa7e9872f3c7b8ed3;hb=7c09989ba3aa3b85f8494821806400984c7cd588;hp=e661ca6461da95a589cdf25cf4bee93a22c50a85;hpb=619b07dee2e25aeb8834f1a3a9588d44b0a21b71;p=silc.git diff --git a/lib/silcutil/unix/silcunixschedule.c b/lib/silcutil/unix/silcunixschedule.c index e661ca64..08563587 100644 --- a/lib/silcutil/unix/silcunixschedule.c +++ b/lib/silcutil/unix/silcunixschedule.c @@ -121,11 +121,13 @@ int silc_poll(SilcSchedule schedule, void *context) struct pollfd *fds = internal->fds; SilcUInt32 fds_count = internal->fds_count; int fd, ret, i = 0, timeout = -1; + void *fdp; silc_hash_table_list(schedule->fd_queue, &htl); - while (silc_hash_table_get(&htl, (void *)&fd, (void *)&task)) { + while (silc_hash_table_get(&htl, &fdp, (void *)&task)) { if (!task->events) continue; + fd = SILC_PTR_TO_32(fdp); /* Allocate larger fd table if needed */ if (i >= fds_count) { @@ -198,14 +200,16 @@ int silc_select(SilcSchedule schedule, void *context) SilcTaskFd task; fd_set in, out; int fd, max_fd = 0, ret; + void *fdp; FD_ZERO(&in); FD_ZERO(&out); silc_hash_table_list(schedule->fd_queue, &htl); - while (silc_hash_table_get(&htl, (void *)&fd, (void *)&task)) { + while (silc_hash_table_get(&htl, &fdp, (void *)&task)) { if (!task->events) continue; + fd = SILC_PTR_TO_32(fdp); #ifdef FD_SETSIZE if (fd >= FD_SETSIZE) @@ -233,9 +237,10 @@ int silc_select(SilcSchedule schedule, void *context) return ret; silc_hash_table_list(schedule->fd_queue, &htl); - while (silc_hash_table_get(&htl, (void *)&fd, (void *)&task)) { + while (silc_hash_table_get(&htl, &fdp, (void *)&task)) { if (!task->header.valid || !task->events) continue; + fd = SILC_PTR_TO_32(fdp); #ifdef FD_SETSIZE if (fd >= FD_SETSIZE) @@ -459,6 +464,8 @@ static void silc_schedule_internal_sighandler(int signal) { int i; + SILC_LOG_DEBUG(("Start")); + for (i = 0; i < SIGNAL_COUNT; i++) { if (signal_call[i].sig == signal) { signal_call[i].call = TRUE; @@ -491,6 +498,7 @@ void silc_schedule_internal_signal_register(SilcSchedule schedule, signal_call[i].sig = sig; signal_call[i].callback = callback; signal_call[i].context = callback_context; + signal_call[i].schedule = schedule; signal_call[i].call = FALSE; signal(sig, silc_schedule_internal_sighandler); break; @@ -520,6 +528,7 @@ void silc_schedule_internal_signal_unregister(SilcSchedule schedule, signal_call[i].sig = 0; signal_call[i].callback = NULL; signal_call[i].context = NULL; + signal_call[i].schedule = NULL; signal_call[i].call = FALSE; signal(sig, SIG_DFL); } @@ -548,11 +557,13 @@ void silc_schedule_internal_signals_call(SilcSchedule schedule, void *context) signal_call[i].callback) { SILC_LOG_DEBUG(("Calling signal %d callback", signal_call[i].sig)); + silc_schedule_internal_signals_unblock(schedule, context); signal_call[i].callback(schedule, internal->app_context, SILC_TASK_INTERRUPT, signal_call[i].sig, signal_call[i].context); signal_call[i].call = FALSE; + silc_schedule_internal_signals_block(schedule, context); } }