1 extern int f1 (void **); 2 extern void f2 (void *); 3 4 struct s 5 { 6 unsigned char field1; 7 int field2; 8 }; 9 10 static inline struct s * get_globals(void)11get_globals (void) 12 { 13 struct s * r; 14 void * rr; 15 16 if (f1 (&rr)) 17 return 0; 18 r = rr; 19 if (! r) 20 { 21 extern struct s t; 22 r = &t; 23 } 24 r->field1 = 1; 25 return r; 26 } 27 28 void atexit_common(const void * dso)29atexit_common (const void *dso) 30 { 31 struct s *g = get_globals (); 32 33 if (! g) 34 return; 35 if (g->field1) 36 { 37 g->field2 = 0; 38 f2 (g); 39 } 40 else 41 f2 (g); 42 } 43