zhangmeng
2021-12-10 5990bac28af438a914165441b3c33a370b320d16
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
//
// Copyright 2017 Garrett D'Amore <garrett@damore.org>
// Copyright 2017 Capitar IT Group BV <info@capitar.com>
// Copyright 2017 Staysail Systems, Inc. <info@staysail.tech>
//
// 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