Fix waiting poll on unix-domain socketpair
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.
Please register or sign in to comment