How can I wake up one process from the wait queue?

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi, everyone

I am implementing a simple driver to experiment with wait queue.Two or more read processes block until a write process changes a flag and call wake_up_interruptible().I expect that a write process will only wake up one read process.However, once a write process calls  wake_up_interruptible() , all the read processes are awaken. How can I wake up one process from the wait queue? Here is the snippet of the simple dirver(just for experimenting, kernel 2.6.18):


static ssize_t rlwait_read(struct file *filp, char __user *userp, size_t size, loff_t *off)

{

    struct rlwait_t *rock = (struct rlwait_t *)filp->private_data;

    DECLARE_WAITQUEUE(wait, current);

    

    add_wait_queue(&rock->r_wait_head, &wait);

    

    while (rock->r_flag == 0) {

        set_current_state(TASK_INTERRUPTIBLE);

        schedule();

    }   


    remove_wait_queue(&rock->r_wait_head, &wait);

    set_current_state(TASK_RUNNING);

    return 0;

}


static ssize_t rlwait_write(struct file *filp, const char __user *userp, size_t size, loff_t *off)

{

    struct rlwait_t *rock = (struct rlwait_t *)filp->private_data;

        

    rock->r_flag = 1;

    wake_up_interruptible(&rock->r_wait_head);

        

    return size; 

}


Thans in advice.

_______________________________________________
Kernelnewbies mailing list
Kernelnewbies@xxxxxxxxxxxxxxxxx
http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies

[Index of Archives]     [Newbies FAQ]     [Linux Kernel Mentors]     [Linux Kernel Development]     [IETF Annouce]     [Git]     [Networking]     [Security]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux SCSI]     [Linux ACPI]
  Powered by Linux