lkml.org 
[lkml]   [2007]   [Apr]   [1]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[patch 03/12] pollfs: asynchronously wait for a signal
    Add a wait queue to the task_struct in order to be able to
    associate (wait for) a signal with other resources.

    Signed-off-by: Davi E. M. Arnaut <davi@haxent.com.br>
    ---

    Index: linux-2.6/include/linux/sched.h
    ===================================================================
    --- linux-2.6.orig/include/linux/sched.h
    +++ linux-2.6/include/linux/sched.h
    @@ -939,6 +939,7 @@ struct task_struct {
    sigset_t blocked, real_blocked;
    sigset_t saved_sigmask; /* To be restored with TIF_RESTORE_SIGMASK */
    struct sigpending pending;
    + wait_queue_head_t sigwait;

    unsigned long sas_ss_sp;
    size_t sas_ss_size;
    Index: linux-2.6/include/linux/init_task.h
    ===================================================================
    --- linux-2.6.orig/include/linux/init_task.h
    +++ linux-2.6/include/linux/init_task.h
    @@ -134,6 +134,7 @@ extern struct group_info init_groups;
    .list = LIST_HEAD_INIT(tsk.pending.list), \
    .signal = {{0}}}, \
    .blocked = {{0}}, \
    + .sigwait = __WAIT_QUEUE_HEAD_INITIALIZER(tsk.sigwait), \
    .alloc_lock = __SPIN_LOCK_UNLOCKED(tsk.alloc_lock), \
    .journal_info = NULL, \
    .cpu_timers = INIT_CPU_TIMERS(tsk.cpu_timers), \
    Index: linux-2.6/kernel/fork.c
    ===================================================================
    --- linux-2.6.orig/kernel/fork.c
    +++ linux-2.6/kernel/fork.c
    @@ -1034,6 +1034,7 @@ static struct task_struct *copy_process(

    clear_tsk_thread_flag(p, TIF_SIGPENDING);
    init_sigpending(&p->pending);
    + init_waitqueue_head(&p->sigwait);

    p->utime = cputime_zero;
    p->stime = cputime_zero;
    Index: linux-2.6/kernel/signal.c
    ===================================================================
    --- linux-2.6.orig/kernel/signal.c
    +++ linux-2.6/kernel/signal.c
    @@ -224,6 +224,8 @@ fastcall void recalc_sigpending_tsk(stru
    set_tsk_thread_flag(t, TIF_SIGPENDING);
    else
    clear_tsk_thread_flag(t, TIF_SIGPENDING);
    +
    + wake_up_interruptible_sync(&t->sigwait);
    }

    void recalc_sigpending(void)
    @@ -759,6 +761,7 @@ static int send_signal(int sig, struct s
    info->si_code >= 0)));
    if (q) {
    list_add_tail(&q->list, &signals->list);
    + wake_up_interruptible_sync(&t->sigwait);
    switch ((unsigned long) info) {
    case (unsigned long) SEND_SIG_NOINFO:
    q->info.si_signo = sig;
    @@ -1404,6 +1407,7 @@ int send_sigqueue(int sig, struct sigque

    list_add_tail(&q->list, &p->pending.list);
    sigaddset(&p->pending.signal, sig);
    + wake_up_interruptible_sync(&p->sigwait);
    if (!sigismember(&p->blocked, sig))
    signal_wake_up(p, sig == SIGKILL);

    @@ -1453,6 +1457,7 @@ send_group_sigqueue(int sig, struct sigq
    list_add_tail(&q->list, &p->signal->shared_pending.list);
    sigaddset(&p->signal->shared_pending.signal, sig);

    + wake_up_interruptible_sync(&p->sigwait);
    __group_complete_signal(sig, p);
    out:
    spin_unlock_irqrestore(&p->sighand->siglock, flags);
    --
    -
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

    \
     
     \ /
      Last update: 2007-04-01 18:07    [W:0.057 / U:30.424 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site