Merge branch 'ab/die-errors-in-threaded'
Traditionally, the default die() routine had a code to prevent it from getting called multiple times, which interacted badly when a threaded program used it (one downside is that the real error may be hidden and instead the only error message given to the user may end up being "die recursion detected", which is not very useful). * ab/die-errors-in-threaded: die(): stop hiding errors due to overzealous recursion guard
This commit is contained in:
commit
c7ee0baae7
18
usage.c
18
usage.c
@ -44,7 +44,23 @@ static void warn_builtin(const char *warn, va_list params)
|
||||
static int die_is_recursing_builtin(void)
|
||||
{
|
||||
static int dying;
|
||||
return dying++;
|
||||
/*
|
||||
* Just an arbitrary number X where "a < x < b" where "a" is
|
||||
* "maximum number of pthreads we'll ever plausibly spawn" and
|
||||
* "b" is "something less than Inf", since the point is to
|
||||
* prevent infinite recursion.
|
||||
*/
|
||||
static const int recursion_limit = 1024;
|
||||
|
||||
dying++;
|
||||
if (dying > recursion_limit) {
|
||||
return 1;
|
||||
} else if (dying == 2) {
|
||||
warning("die() called many times. Recursion error or racy threaded death!");
|
||||
return 0;
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
/* If we are in a dlopen()ed .so write to a global variable would segfault
|
||||
|
Loading…
Reference in New Issue
Block a user