diff options
author | "Steven J. Hill" <sjhill@realitydiluted.com> | 2006-12-16 04:24:12 +0000 |
---|---|---|
committer | "Steven J. Hill" <sjhill@realitydiluted.com> | 2006-12-16 04:24:12 +0000 |
commit | b2f673ea2a2b3915bd535ed79924ad555fc840a2 (patch) | |
tree | 8265c6c75943c7bdd54d88f061c1b634d1d17332 /libc/misc/internals/shared_flat_initfini.c | |
parent | 167eed7376c4062ad69d7e29ace136c8ce93b700 (diff) | |
download | uClibc-alpine-b2f673ea2a2b3915bd535ed79924ad555fc840a2.tar.bz2 uClibc-alpine-b2f673ea2a2b3915bd535ed79924ad555fc840a2.tar.xz |
Copy from trunk.
Diffstat (limited to 'libc/misc/internals/shared_flat_initfini.c')
-rw-r--r-- | libc/misc/internals/shared_flat_initfini.c | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/libc/misc/internals/shared_flat_initfini.c b/libc/misc/internals/shared_flat_initfini.c new file mode 100644 index 000000000..81e53834e --- /dev/null +++ b/libc/misc/internals/shared_flat_initfini.c @@ -0,0 +1,53 @@ +/* + * Copyright (C) 2006 CodeSourcery Inc + * + * Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball. + * + * This file defines the main initialisation and finalisation code for + * shared flat libraries. It in turn calls the initialisation and + * finalisation code for each registered library. + */ +#include "shared_flat_lib.h" + +/* A doubly-linked list of shared libraries. Those nearer the head + * of the list should be initialised first and finalised last. */ +struct shared_flat_lib *__first_shared_lib; +struct shared_flat_lib *__last_shared_lib; + +void __shared_flat_init(void) +{ + struct shared_flat_lib *lib; + void (**start)(void); + void (**end)(void); + + for (lib = __first_shared_lib; lib; lib = lib->next) { + end = lib->preinit_array_end; + for (start = lib->preinit_array_start; start < end; start++) + (*start)(); + } + + for (lib = __first_shared_lib; lib; lib = lib->next) { + if (lib->init) + lib->init(); + + end = lib->init_array_end; + for (start = lib->init_array_start; start < end; start++) + (*start)(); + } +} + +void __shared_flat_fini(void) +{ + struct shared_flat_lib *lib; + void (**start)(void); + void (**end)(void); + + for (lib = __last_shared_lib; lib; lib = lib->prev) { + start = lib->fini_array_start; + for (end = lib->fini_array_end; end > start;) + (*--end)(); + + if (lib->fini) + lib->fini(); + } +} |