summaryrefslogtreecommitdiff
path: root/core/pkg/tbox.pkg/inc/tbox/utils/singleton.h
blob: cf8170bc2f42ba6ba392c6cf185da528beda23b1 (plain)
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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
/*!The Treasure Box Library
 * 
 * TBox is free software; you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as published by
 * the Free Software Foundation; either version 2.1 of the License, or
 * (at your option) any later version.
 * 
 * TBox is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Lesser General Public License for more details.
 * 
 * You should have received a copy of the GNU Lesser General Public License
 * along with TBox; 
 * If not, see <a href="http://www.gnu.org/licenses/"> http://www.gnu.org/licenses/</a>
 * 
 * Copyright (C) 2009 - 2015, ruki All rights reserved.
 *
 * @author      ruki
 * @file        singleton.h
 * @ingroup     utils
 *
 */
#ifndef TB_UTILS_SINGLETON_H
#define TB_UTILS_SINGLETON_H

/* //////////////////////////////////////////////////////////////////////////////////////
 * includes
 */
#include "prefix.h"

/* //////////////////////////////////////////////////////////////////////////////////////
 * extern
 */
__tb_extern_c_enter__

/* //////////////////////////////////////////////////////////////////////////////////////
 * types
 */

/// the singleton type enum
typedef enum __tb_singleton_type_e
{
    /// the default allocator
    TB_SINGLETON_TYPE_DEFAULT_ALLOCATOR     = 0

    /// the static allocator
,   TB_SINGLETON_TYPE_STATIC_ALLOCATOR      = 1

    /// the lock profiler type
,   TB_SINGLETON_TYPE_LOCK_PROFILER         = 2

    /// the random type
,   TB_SINGLETON_TYPE_RANDOM                = 3

    /// the ifaddrs type
,   TB_SINGLETON_TYPE_IFADDRS               = 4

    /// the timer type
,   TB_SINGLETON_TYPE_TIMER                 = 5

    /// the ltimer type
,   TB_SINGLETON_TYPE_LTIMER                = 6

    /// the aicp type
,   TB_SINGLETON_TYPE_AICP                  = 7

    /// the openssl library type
,   TB_SINGLETON_TYPE_LIBRARY_OPENSSL       = 8

    /// the mysql library type
,   TB_SINGLETON_TYPE_LIBRARY_MYSQL         = 9

    /// the sqlite3 library type
,   TB_SINGLETON_TYPE_LIBRARY_SQLITE3       = 10

    /// the thread pool type
,   TB_SINGLETON_TYPE_THREAD_POOL           = 11

    /// the transfer pool type
,   TB_SINGLETON_TYPE_TRANSFER_POOL         = 12

    /// the cookies type
,   TB_SINGLETON_TYPE_COOKIES               = 13

    /// the user defined type
,   TB_SINGLETON_TYPE_USER                  = 14

    /// the max count of the singleton type
#ifdef __tb_small__
,   TB_SINGLETON_TYPE_MAXN                  = 32
#else
,   TB_SINGLETON_TYPE_MAXN                  = 128
#endif

}tb_singleton_type_e;

/// the singleton init func type
typedef tb_handle_t (*tb_singleton_init_func_t)(tb_cpointer_t* ppriv);

/// the singleton exit func type
typedef tb_void_t   (*tb_singleton_exit_func_t)(tb_handle_t instance, tb_cpointer_t priv);

/// the singleton kill func type
typedef tb_void_t   (*tb_singleton_kill_func_t)(tb_handle_t instance, tb_cpointer_t priv);

/// the singleton static init func type
typedef tb_bool_t   (*tb_singleton_static_init_func_t)(tb_handle_t instance, tb_cpointer_t priv);

/* //////////////////////////////////////////////////////////////////////////////////////
 * interfaces
 */

/*! init singleton
 *
 * @return          tb_true or tb_false
 */
tb_bool_t           tb_singleton_init(tb_noarg_t);

/*! kill singleton
 */
tb_void_t           tb_singleton_kill(tb_noarg_t);

/*! exit singleton
 */
tb_void_t           tb_singleton_exit(tb_noarg_t);

/*! the singleton instance
 *
 * @param type      the singleton type
 * @param init      the singleton init func 
 * @param exit      the singleton exit func 
 * @param kill      the singleton kill func 
 * @param priv      the private data
 *
 * @return          the singleton instance handle
 */
tb_handle_t         tb_singleton_instance(tb_size_t type, tb_singleton_init_func_t init, tb_singleton_exit_func_t exit, tb_singleton_kill_func_t kill, tb_cpointer_t priv);

/*! the singleton static instance
 *
 * @code
    static tb_bool_t tb_xxxx_instance_init(tb_handle_t instance, tb_cpointer_t priv)
    {
        // init 
        // ...

        // ok
        return tb_true;
    }
    tb_xxxx_t* tb_xxxx()
    {
        // init
        static tb_atomic_t      s_binited = 0;
        static tb_xxxx_t        s_xxxx = {0};

        // init the static instance
        tb_bool_t ok = tb_singleton_static_init(&s_binited, &s_xxxx, tb_xxxx_instance_init, tb_null);
        tb_assert(ok);

        // ok
        return &s_xxxx;
    }
 * @endcode
 *
 * @param binited   the singleton static instance is inited?
 * @param instance  the singleton static instance
 * @param init      the singleton static init func 
 * @param priv      the private data
 *
 * @return          tb_true or tb_false
 */
tb_bool_t           tb_singleton_static_init(tb_atomic_t* binited, tb_handle_t instance, tb_singleton_static_init_func_t init, tb_cpointer_t priv);

/* //////////////////////////////////////////////////////////////////////////////////////
 * extern
 */
__tb_extern_c_leave__

#endif