• D
    Rewrite LXC I/O forwarding to use main event loop · 86b53e59
    Daniel P. Berrange 提交于
    The current I/O code for LXC uses a hand crafted event loop
    to forward I/O between the container & host app, based on
    epoll to handle EOF on PTYs. This event loop is not easily
    extensible to add more consoles, or monitor other types of
    file descriptors.
    
    Remove the custom event loop and replace it with a normal
    libvirt event loop. When detecting EOF on a PTY, disable
    the event watch on that FD, and fork off a background thread
    that does a edge-triggered epoll() on the FD. When the FD
    finally shows new incoming data, the thread re-enables the
    watch on the FD and exits.
    
    When getting EOF from a read() on the PTY, the existing code
    would do waitpid(WNOHANG) to see if the container had exited.
    Unfortunately there is a race condition, because even though
    the process has closed its stdio handles, it might still
    exist.
    
    To deal with this the new event loop uses a SIG_CHILD handler
    to perform the waitpid only when the container is known to
    have actually exited.
    
    * src/lxc/lxc_controller.c: Rewrite the event loop to use
      the standard APIs.
    86b53e59
lxc_controller.c 40.9 KB