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
|