// // Copyright 2017 Garrett D'Amore // Copyright 2017 Capitar IT Group BV // Copyright 2017 Staysail Systems, Inc. // // This software is supplied under the terms of the MIT License, a // copy of which should be located in the distribution where this // file was obtained (LICENSE.txt). A copy of the license may also be // found online at https://opensource.org/licenses/MIT. // #ifndef CORE_INIT_H #define CORE_INIT_H #include "core/nng_impl.h" // nni_init is called each time the user enters the library. It ensures that // the library is initlialized properly, and also deals with checks such as // whether the process has forked since last initialization. int nni_init(void); // nni_fini tears everything down. In the future it may be used to ensure // that all resources used by the library are released back to the system. void nni_fini(void); typedef struct nni_initializer { int (*i_init)(void); // i_init is called exactly once void (*i_fini)(void); // i_fini is called on shutdown int i_once; // private -- initialize to zero nni_list_node i_node; // private -- initialize to zero } nni_initializer; // nni_initialize will call the initialization routine exactly once. This is // done efficiently, so that if the caller has initialized already, then // subsequent calls are "cheap" (no synchronization cost). The initialization // function must not itself cause any further calls to nni_initialize; the // function should limit itself to initialization of locks and static data // structures. When shutting down, the finalizer will be called. The // order in which finalizers are called is unspecified. // // An initializer may fail (due to resource exhaustion), in which case the // return value of nni_initialize will be non-zero. int nni_initialize(nni_initializer *); #endif // CORE_INIT_H