Skip to content
Snippets Groups Projects
  • Nadav Har'El's avatar
    c58c7aac
    Fix waiting poll on unix-domain socketpair · c58c7aac
    Nadav Har'El authored
    If poll() was waiting on a file descriptor from socketpair_af_local, we
    would never wake it up, and an example of this is the failure in a
    recently committed fix to tst-af-local.cc.
    
    The problem is that when one writes to one end of the socket, we need to
    call wake_poll() on the other end of the socket, so we need to remember
    which "struct file *" is attached to each end of the af_local_buffer objects.
    
    What I did is what I thought the most elegant solution is:
    
    Rather than having "sender" and "receiver" of af_local_buffer booleans,
    they are now "struct file *". I added new functions, attach_sender(f) and
    attach_receiver(f), which set the file* we'll need to notify for each
    end; These functions are analogous to functions detach_sender, detach_receiver
    that we already had.
    
    After each interesting event - read, write, close, etc - we notify the
    appropriate file*, using poll_wake.
    
    attach_sender(f) and attach_receiver(f) is called by af_local_init(f) - which
    used to be empty and now does something. Note how af_local_init(f) only
    does send->attach_sender(f) and receive->attach_receiver(f), but doesn't
    touch the two others (send->attach_receiver, receive->attach_sender) -
    these other two are set when the second file descriptor, with the send
    and receive fifos in reversed roles, is initialized with its af_local_init.
    
    After this fix, the new af_local_test works correctly.
    c58c7aac
    History
    Fix waiting poll on unix-domain socketpair
    Nadav Har'El authored
    If poll() was waiting on a file descriptor from socketpair_af_local, we
    would never wake it up, and an example of this is the failure in a
    recently committed fix to tst-af-local.cc.
    
    The problem is that when one writes to one end of the socket, we need to
    call wake_poll() on the other end of the socket, so we need to remember
    which "struct file *" is attached to each end of the af_local_buffer objects.
    
    What I did is what I thought the most elegant solution is:
    
    Rather than having "sender" and "receiver" of af_local_buffer booleans,
    they are now "struct file *". I added new functions, attach_sender(f) and
    attach_receiver(f), which set the file* we'll need to notify for each
    end; These functions are analogous to functions detach_sender, detach_receiver
    that we already had.
    
    After each interesting event - read, write, close, etc - we notify the
    appropriate file*, using poll_wake.
    
    attach_sender(f) and attach_receiver(f) is called by af_local_init(f) - which
    used to be empty and now does something. Note how af_local_init(f) only
    does send->attach_sender(f) and receive->attach_receiver(f), but doesn't
    touch the two others (send->attach_receiver, receive->attach_sender) -
    these other two are set when the second file descriptor, with the send
    and receive fifos in reversed roles, is initialized with its af_local_init.
    
    After this fix, the new af_local_test works correctly.