On Wed, 2019-10-09 at 15:00 +0100, Stefan Hajnoczi wrote: > > The first issue is that sometimes glib actually seems to reports an FD > > as readable when it's not, so I even put them into non-blocking mode :( > > Strange. Spurious wakeups are possible in general. I think when using > fd monitoring (select(), poll(), etc) the fds should be in non-blocking > mode.
Are they? I reimplemented all this on top of my (internal) testing framework and use blocking FDs there, and had no issues whatsoever. > But if you're seeing this often it makes me wonder if something else is > unintentionally reading available bytes... I have no idea, it'd be strange though, what would even get to the FD? > > The second is that I can't seem to understand how to do recursive > > mainloops. > > > > To really do this *well*, it should remain a single-threaded > > application, but would need a hook like > > > > run_mainloop_until_fd_readable(vdev->call_fd) > > > > inside the libvhost-user.c code, and that's a bit ugly ... if I even > > could figure out how to implement that in glib. > > Recursive mainloops are tricky since usually event loop code isn't > written to be re-entrant. It opens up a whole new dimension that > existing code usually wasn't designed for. In this case you are writing > the code from scratch so maybe you can get it to work, but it makes me > wonder why the recursive mainloop is necessary. It's needed to handle different clients / connections. For example, consider this flow VM net device & simtime <-------------- VHOST_USER_SLAVE_CALL_VRING --------------> request for time handling <-------------- response for time handling --------------> REPLY_ACK for VHOST_USER_SLAVE_CALL_VRING I sort of solved it with different threads for the different entities (netdev & simtime) but that also just causes deadlocks with the locking that needs to happen. Like I said, I had reimplemented this in the meantime with a (hand- written) recursive mainloop as a single thread, and it works way better. One of these days I need to sit down and port that to be independent of my testing framework, so I can show the code ... johannes