Commit Graph
10 Commits
Author SHA1 Message Date
Jens GustedtandRich Felker 32482f61da revise the definition of multiple basic locks in the code
In all cases this is just a change from two volatile int to one.
2018-01-09 13:15:27 -05:00
Jens GustedtandRich Felker c4bc0b1a64 consistently use the LOCK an UNLOCK macros
In some places there has been a direct usage of the functions. Use the
macros consistently everywhere, such that it might be easier later on to
capture the fast path directly inside the macro and only have the call
overhead on the slow path.
2018-01-09 13:14:49 -05:00
Jens GustedtandRich Felker 47d0bcd476 new lock algorithm with state and congestion count in one atomic int
A variant of this new lock algorithm has been presented at SAC'16, see
https://hal.inria.fr/hal-01304108. A full version of that paper is
available at https://hal.inria.fr/hal-01236734.

The main motivation of this is to improve on the safety of the basic lock
implementation in musl. This is achieved by squeezing a lock flag and a
congestion count (= threads inside the critical section) into a single
int. Thereby an unlock operation does exactly one memory
transfer (a_fetch_add) and never touches the value again, but still
detects if a waiter has to be woken up.

This is a fix of a use-after-free bug in pthread_detach that had
temporarily been patched. Therefore this patch also reverts

         c1e27367a9

This is also the only place where internal knowledge of the lock
algorithm is used.

The main price for the improved safety is a little bit larger code.

Under high congestion, the scheduling behavior will be different
compared to the previous algorithm. In that case, a successful
put-to-sleep may appear out of order compared to the arrival in the
critical section.
2018-01-09 13:10:12 -05:00
Jens GustedtandRich Felker a08910fc2c fix missing volatile qualifier on lock in __get_locale 2017-07-04 18:21:08 -04:00
Jens GustedtandRich Felker d906fa3118 unify the use of FUTEX_PRIVATE
The flag 1<<7 is used in several places for different purposes that are
not always easy to distinguish. Mark those usages that correspond to the
flag that is used by the kernel for futexes.
2017-07-04 17:12:52 -04:00
Jens GustedtandRich Felker 941644e98c implement a private state for the uchar.h functions
The C standard is imperative on that:

  7.28.1 ... If ps is a null pointer, each function uses its own internal
  mbstate_t object instead, which is initialized at program startup to
  the initial conversion state;

and these functions are also not supposed to implicitly use the state of
the wchar.h functions:

  7.29.6.3 ... The implementation behaves as if no library function calls
  these functions with a null pointer for ps.

Previously this resulted in two bugs.

 - The functions c16rtomb and mbrtoc16 would crash when called with ps
   set to null.

 - The function mbrtoc32 used the private state of mbrtowc, which it
   is not allowed to do.
2014-11-15 15:08:03 -05:00
Jens GustedtandRich Felker 14397cec2c add C11 condition variable functions
Because of the clear separation for private pthread_cond_t these
interfaces are quite simple and direct.
2014-09-06 22:27:45 -04:00
Jens GustedtandRich Felker 8b0472932c add C11 mutex functions 2014-09-06 22:07:22 -04:00
Jens GustedtandRich Felker e16f70f452 add C11 thread functions operating on tss_t and once_flag
These all have POSIX equivalents, but aside from tss_get, they all
have minor changes to the signature or return value and thus need to
exist as separate functions.
2014-09-06 21:38:04 -04:00
Jens GustedtandRich Felker df7d0dfb9c use weak symbols for the POSIX functions that will be used by C threads
The intent of this is to avoid name space pollution of the C threads
implementation.

This has two sides to it. First we have to provide symbols that wouldn't
pollute the name space for the C threads implementation. Second we have
to clean up some internal uses of POSIX functions such that they don't
implicitly drag in such symbols.
2014-09-06 18:11:24 -04:00