1. 18 4月, 2011 8 次提交
    • R
      pthread_exit is not supposed to affect cancellability · 2afed79f
      Rich Felker 提交于
      if the exit was caused by cancellation, __cancel has already set these
      flags anyway.
      2afed79f
    • R
      fix pthread_exit from cancellation handler · 1ebde9c3
      Rich Felker 提交于
      cancellation frames were not correctly popped, so this usage would not
      only loop, but also reuse discarded and invalid parts of the stack.
      1ebde9c3
    • R
      clean up handling of thread/nothread mode, locking · 9080cc15
      Rich Felker 提交于
      9080cc15
    • R
      debloat: use __syscall instead of syscall where possible · eb0e8fa0
      Rich Felker 提交于
      don't waste time (and significant code size due to function call
      overhead!) setting errno when the result of a syscall does not matter
      or when it can't fail.
      eb0e8fa0
    • R
      fix bugs in cancellable syscall asm · 09dae2b7
      Rich Felker 提交于
      x86_64 was just plain wrong in the cancel-flag-already-set path, and
      crashing.
      
      the more subtle error was not clearing the saved stack pointer before
      returning to c code. this could result in the signal handler
      misidentifying c code as the pre-syscall part of the asm, and acting
      on cancellation at the wrong time, and thus resource leak race
      conditions.
      
      also, now __cancel (in the c code) is responsible for clearing the
      saved sp in the already-cancelled branch. this means we have to use
      call rather than jmp to ensure the stack pointer in the c will never
      match what the asm saved.
      09dae2b7
    • R
      optimize cancellation enable/disable code · ebf82447
      Rich Felker 提交于
      the goal is to be able to use pthread_setcancelstate internally in
      the implementation, whenever a function might want to use functions
      which are cancellation points but avoid becoming a cancellation point
      itself. i could have just used a separate internal function for
      temporarily inhibiting cancellation, but the solution in this commit
      is better because (1) it's one less implementation-specific detail in
      functions that need to use it, and (2) application code can also get
      the same benefit.
      
      previously, pthread_setcancelstate dependend on pthread_self, which
      would pull in unwanted thread setup overhead for non-threaded
      programs. now, it temporarily stores the state in the global libc
      struct if threads have not been initialized, and later moves it if
      needed. this way we can instead use __pthread_self, which has no
      dependencies and assumes that the thread register is already valid.
      ebf82447
    • R
      02eff258
    • R
      fix some minor issues in cancellation handling patch · e7466401
      Rich Felker 提交于
      signals were wrongly left masked, and cancellability state was not
      switched to disabled, during the execution of cleanup handlers.
      e7466401
  2. 17 4月, 2011 1 次提交
    • R
      overhaul pthread cancellation · feee9890
      Rich Felker 提交于
      this patch improves the correctness, simplicity, and size of
      cancellation-related code. modulo any small errors, it should now be
      completely conformant, safe, and resource-leak free.
      
      the notion of entering and exiting cancellation-point context has been
      completely eliminated and replaced with alternative syscall assembly
      code for cancellable syscalls. the assembly is responsible for setting
      up execution context information (stack pointer and address of the
      syscall instruction) which the cancellation signal handler can use to
      determine whether the interrupted code was in a cancellable state.
      
      these changes eliminate race conditions in the previous generation of
      cancellation handling code (whereby a cancellation request received
      just prior to the syscall would not be processed, leaving the syscall
      to block, potentially indefinitely), and remedy an issue where
      non-cancellable syscalls made from signal handlers became cancellable
      if the signal handler interrupted a cancellation point.
      
      x86_64 asm is untested and may need a second try to get it right.
      feee9890
  3. 16 4月, 2011 3 次提交
  4. 15 4月, 2011 11 次提交
  5. 14 4月, 2011 11 次提交
  6. 13 4月, 2011 6 次提交