Skip to content
Snippets Groups Projects
  • Nadav Har'El's avatar
    b9ed15c2
    Add kill() support - sort of · b9ed15c2
    Nadav Har'El authored
    
    This patch adds support for the Linux kill(2) function.
    The next patch will add alarm(2) support, which uses kill(2).
    
    To be honest, we sort-of implement kill(). This implementation is
    compatible with the API, but the semantics are somewhat different:
    While in Linux kill() causes the signal handler to run on one of the
    existing threads, in this implementation, the signal handler is run in a
    *new* thread.
    
    Implementing the exact Linux semantics in OSv would require tracking when
    OSv runs kernel code (i.e., code in the main executable, not a shared
    object) so we can delay running the signal handler until returning to the
    user code. Moreover, we'll need to be able to interrupt sleeping kernel
    code. This is complicated and adds overhead even if signals aren't used
    (and they aren't used in most modern code).
    
    I expect that this code will be "good enough" in many use cases.
    This code will *not* be good in enough in programs that expect one of the
    following:
    
    1. A program that by using Posix Thread's "signal masks" tried to ensure
       that the signal is delivered to one specific thread, and not to an
       arbitrary thread.
    
    2. A program that used kill() or alarm() not intending to run a signal
       handler, but rather intending to interrupt a sleeping system call
       like sleep() or read(). Our kill() does not interrupt sleeping OSv
       function calls, which will continue to sleep on the thread they run
       on.
    
    The support in this patch (and see next patch, for alarm()) is good
    enough for netperf's use of alarm().
    
    P.S. kill() can be used only to send a signal to the current process, the
    only process we have in OSv (you can also use pid=0 and pid=-1 to achieve
    the same results).
    
    This patch also adds a test for kill() and alarm(). The alarm() test
    will fail until the next patch :-)
    
    Signed-off-by: default avatarNadav Har'El <nyh@cloudius-systems.com>
    b9ed15c2
    History
    Add kill() support - sort of
    Nadav Har'El authored
    
    This patch adds support for the Linux kill(2) function.
    The next patch will add alarm(2) support, which uses kill(2).
    
    To be honest, we sort-of implement kill(). This implementation is
    compatible with the API, but the semantics are somewhat different:
    While in Linux kill() causes the signal handler to run on one of the
    existing threads, in this implementation, the signal handler is run in a
    *new* thread.
    
    Implementing the exact Linux semantics in OSv would require tracking when
    OSv runs kernel code (i.e., code in the main executable, not a shared
    object) so we can delay running the signal handler until returning to the
    user code. Moreover, we'll need to be able to interrupt sleeping kernel
    code. This is complicated and adds overhead even if signals aren't used
    (and they aren't used in most modern code).
    
    I expect that this code will be "good enough" in many use cases.
    This code will *not* be good in enough in programs that expect one of the
    following:
    
    1. A program that by using Posix Thread's "signal masks" tried to ensure
       that the signal is delivered to one specific thread, and not to an
       arbitrary thread.
    
    2. A program that used kill() or alarm() not intending to run a signal
       handler, but rather intending to interrupt a sleeping system call
       like sleep() or read(). Our kill() does not interrupt sleeping OSv
       function calls, which will continue to sleep on the thread they run
       on.
    
    The support in this patch (and see next patch, for alarm()) is good
    enough for netperf's use of alarm().
    
    P.S. kill() can be used only to send a signal to the current process, the
    only process we have in OSv (you can also use pid=0 and pid=-1 to achieve
    the same results).
    
    This patch also adds a test for kill() and alarm(). The alarm() test
    will fail until the next patch :-)
    
    Signed-off-by: default avatarNadav Har'El <nyh@cloudius-systems.com>