Message ID | 20190807142726.2579-4-mathieu.desnoyers@efficios.com |
---|---|
State | New |
Headers | show |
Series | Restartable Sequences support for glibc 2.31 | expand |
* Mathieu Desnoyers: > diff --git a/support/support_record_failure.c b/support/support_record_failure.c > index a8ffd1fb7d..86d9c71409 100644 > --- a/support/support_record_failure.c > +++ b/support/support_record_failure.c > @@ -32,8 +32,12 @@ > zero, the failure of a test can be detected. > > The init constructor function below puts *state on a shared > - annonymous mapping, so that failure reports from subprocesses > - propagate to the parent process. */ > + anonymous mapping, so that failure reports from subprocesses > + propagate to the parent process. > + > + support_record_failure_init is exposed so it can be called explicitly > + in case this API needs to be used from a constructor. */ > + > struct test_failures > { > unsigned int counter; > @@ -41,10 +45,14 @@ struct test_failures > }; > static struct test_failures *state; > > -static __attribute__ ((constructor)) void > -init (void) > +__attribute__ ((constructor)) void > +support_record_failure_init (void) > { > - void *ptr = mmap (NULL, sizeof (*state), PROT_READ | PROT_WRITE, > + void *ptr; > + > + if (state != NULL) > + return; > + ptr = mmap (NULL, sizeof (*state), PROT_READ | PROT_WRITE, > MAP_ANONYMOUS | MAP_SHARED, -1, 0); > if (ptr == MAP_FAILED) > { I think the general direction is useful here, but we should rather avoid constructor ordering problems by using <allocate_once.h> here. Let me check how this would look like. Thanks, Florian
diff --git a/support/check.h b/support/check.h index eb3d2487a7..f8684a477a 100644 --- a/support/check.h +++ b/support/check.h @@ -88,6 +88,10 @@ void support_test_verify_exit_impl (int status, const char *file, int line, does not support reporting failures from a DSO. */ void support_record_failure (void); +/* Initialize record failure. Calling this is only needed when + recording failures from constructors. */ +void support_record_failure_init (void); + /* Static assertion, under a common name for both C++ and C11. */ #ifdef __cplusplus # define support_static_assert static_assert diff --git a/support/support_record_failure.c b/support/support_record_failure.c index a8ffd1fb7d..86d9c71409 100644 --- a/support/support_record_failure.c +++ b/support/support_record_failure.c @@ -32,8 +32,12 @@ zero, the failure of a test can be detected. The init constructor function below puts *state on a shared - annonymous mapping, so that failure reports from subprocesses - propagate to the parent process. */ + anonymous mapping, so that failure reports from subprocesses + propagate to the parent process. + + support_record_failure_init is exposed so it can be called explicitly + in case this API needs to be used from a constructor. */ + struct test_failures { unsigned int counter; @@ -41,10 +45,14 @@ struct test_failures }; static struct test_failures *state; -static __attribute__ ((constructor)) void -init (void) +__attribute__ ((constructor)) void +support_record_failure_init (void) { - void *ptr = mmap (NULL, sizeof (*state), PROT_READ | PROT_WRITE, + void *ptr; + + if (state != NULL) + return; + ptr = mmap (NULL, sizeof (*state), PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_SHARED, -1, 0); if (ptr == MAP_FAILED) {