+2005-06-07 Ken Raeburn <raeburn@mit.edu>
+
+ * k5-platform.h (MAYBE_DEFINE_CALLINIT_FUNCTION)
+ [DELAY_INITIALIZER]: New macro. If not __GNUC__, define
+ k5_call_init_function in the expansion; otherwise, do nothing.
+ (MAKE_INIT_FUNCTION) [DELAY_INITIALIZER]: Use it.
+ (k5_call_init_function): Don't define function form at top level.
+
2005-05-31 Ken Raeburn <raeburn@mit.edu>
* k5-thread.h (krb5int_pthread_loaded) [HAVE_PRAGMA_WEAK_REF]:
# else
# define MAYBE_DUMMY_INIT(NAME)
# endif
+# ifdef __GNUC__
+/* Do it in macro form so we get the file/line of the invocation if
+ the assertion fails. */
+# define k5_call_init_function(I) \
+ (__extension__ ({ \
+ k5_init_t *k5int_i = (I); \
+ int k5int_err = k5_once(&k5int_i->once, k5int_i->fn); \
+ (k5int_err \
+ ? k5int_err \
+ : (assert(k5int_i->did_run != 0), k5int_i->error)); \
+ }))
+# define MAYBE_DEFINE_CALLINIT_FUNCTION
+# else
+# define MAYBE_DEFINE_CALLINIT_FUNCTION \
+ static inline int k5_call_init_function(k5_init_t *i) \
+ { \
+ int err; \
+ err = k5_once(&i->once, i->fn); \
+ if (err) \
+ return err; \
+ assert (i->did_run != 0); \
+ return i->error; \
+ }
+# endif
# define MAKE_INIT_FUNCTION(NAME) \
static int NAME(void); \
MAYBE_DUMMY_INIT(NAME) \
static void JOIN__2(NAME, aux) (void); \
static k5_init_t JOIN__2(NAME, once) = \
{ K5_ONCE_INIT, 0, 0, JOIN__2(NAME, aux) }; \
+ MAYBE_DEFINE_CALLINIT_FUNCTION \
static void JOIN__2(NAME, aux) (void) \
{ \
JOIN__2(NAME, once).did_run = 1; \
static int NAME(void)
# define CALL_INIT_FUNCTION(NAME) \
k5_call_init_function(& JOIN__2(NAME, once))
-# ifdef __GNUC__
-/* Do it in macro form so we get the file/line of the invocation if
- the assertion fails. */
-# define k5_call_init_function(I) \
- (__extension__ ({ \
- k5_init_t *k5int_i = (I); \
- int k5int_err = k5_once(&k5int_i->once, k5int_i->fn); \
- (k5int_err \
- ? k5int_err \
- : (assert(k5int_i->did_run != 0), k5int_i->error)); \
- }))
-# else
-static inline int k5_call_init_function(k5_init_t *i)
-{
- int err;
- err = k5_once(&i->once, i->fn);
- if (err)
- return err;
- assert (i->did_run != 0);
- return i->error;
-}
-# endif
/* This should be called in finalization only, so we shouldn't have
multiple active threads mucking around in our library at this
point. So ignore the once_t object and just look at the flag.