| extern int f1 (void **); | |
| extern void f2 (void *); | |
| struct s | |
| { | |
| unsigned char field1; | |
| int field2; | |
| }; | |
| static inline struct s * | |
| get_globals (void) | |
| { | |
| struct s * r; | |
| void * rr; | |
| if (f1 (&rr)) | |
| return 0; | |
| r = rr; | |
| if (! r) | |
| { | |
| extern struct s t; | |
| r = &t; | |
| } | |
| r->field1 = 1; | |
| return r; | |
| } | |
| void | |
| atexit_common (const void *dso) | |
| { | |
| struct s *g = get_globals (); | |
| if (! g) | |
| return; | |
| if (g->field1) | |
| { | |
| g->field2 = 0; | |
| f2 (g); | |
| } | |
| else | |
| f2 (g); | |
| } |