Mercurial > hg > freeDiameter
annotate libfdcore/core.c @ 1251:bdd7bf840c8d
Validated previous fix, seems to work
author | Sebastien Decugis <sdecugis@freediameter.net> |
---|---|
date | Mon, 13 Jan 2014 16:11:00 +0100 |
parents | cec3e9b579e1 |
children | ae81cd81ab09 |
rev | line source |
---|---|
658
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
1 /********************************************************************************************************* |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
2 * Software License Agreement (BSD License) * |
740
4a9f08d6b6ba
Updated my mail address
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
706
diff
changeset
|
3 * Author: Sebastien Decugis <sdecugis@freediameter.net> * |
658
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
4 * * |
928
5053f1abcf5d
Updated copyright information
Sebastien Decugis <sdecugis@freediameter.net>
parents:
908
diff
changeset
|
5 * Copyright (c) 2013, WIDE Project and NICT * |
658
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
6 * All rights reserved. * |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
7 * * |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
8 * Redistribution and use of this software in source and binary forms, with or without modification, are * |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
9 * permitted provided that the following conditions are met: * |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
10 * * |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
11 * * Redistributions of source code must retain the above * |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
12 * copyright notice, this list of conditions and the * |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
13 * following disclaimer. * |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
14 * * |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
15 * * Redistributions in binary form must reproduce the above * |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
16 * copyright notice, this list of conditions and the * |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
17 * following disclaimer in the documentation and/or other * |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
18 * materials provided with the distribution. * |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
19 * * |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
20 * * Neither the name of the WIDE Project or NICT nor the * |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
21 * names of its contributors may be used to endorse or * |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
22 * promote products derived from this software without * |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
23 * specific prior written permission of WIDE Project and * |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
24 * NICT. * |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
25 * * |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
26 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED * |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
27 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
28 * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR * |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
29 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
30 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
31 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
32 * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
33 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
34 *********************************************************************************************************/ |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
35 |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
36 #include "fdcore-internal.h" |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
37 |
1034
f4a73a991623
Fix warning on old GCC versions
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1033
diff
changeset
|
38 GCC_DIAG_OFF("-Wdeprecated-declarations") |
658
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
39 #include <gcrypt.h> |
1034
f4a73a991623
Fix warning on old GCC versions
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1033
diff
changeset
|
40 GCC_DIAG_ON("-Wdeprecated-declarations") |
658
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
41 |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
42 /* The static configuration structure */ |
686
f83d9878bf66
Fixed in case of termination of several modules (before initialization completed)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
662
diff
changeset
|
43 static struct fd_config g_conf; |
f83d9878bf66
Fixed in case of termination of several modules (before initialization completed)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
662
diff
changeset
|
44 struct fd_config * fd_g_config = NULL; |
658
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
45 |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
46 /* gcrypt functions to support posix threads */ |
799
7895724d2787
Removed the warning on unused variable
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
797
diff
changeset
|
47 #ifndef GNUTLS_VERSION_210 |
658
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
48 GCRY_THREAD_OPTION_PTHREAD_IMPL; |
799
7895724d2787
Removed the warning on unused variable
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
797
diff
changeset
|
49 #endif /* GNUTLS_VERSION_210 */ |
658
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
50 |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
51 /* Thread that process incoming events on the main queue -- and terminates the framework when requested */ |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
52 static pthread_t core_runner = (pthread_t)NULL; |
706
4ffbc9f1e922
Large UNTESTED commit with the following changes:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
693
diff
changeset
|
53 |
1111
84162710428e
Cleanup to avoid sending several terminate event
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1107
diff
changeset
|
54 /* Signal extensions when the framework is completely initialized (they are waiting in fd_core_waitstartcomplete()) */ |
84162710428e
Cleanup to avoid sending several terminate event
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1107
diff
changeset
|
55 static enum core_state { |
84162710428e
Cleanup to avoid sending several terminate event
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1107
diff
changeset
|
56 CORE_NOT_INIT, /* initial state */ |
84162710428e
Cleanup to avoid sending several terminate event
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1107
diff
changeset
|
57 CORE_LIBS_INIT, /* fd_core_initialize was called */ |
84162710428e
Cleanup to avoid sending several terminate event
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1107
diff
changeset
|
58 CORE_CONF_READY,/* Configuration was parsed, extensions are loaded */ |
84162710428e
Cleanup to avoid sending several terminate event
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1107
diff
changeset
|
59 CORE_RUNNING, /* Servers and clients are started, core_runner thread is running */ |
84162710428e
Cleanup to avoid sending several terminate event
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1107
diff
changeset
|
60 CORE_SHUTDOWN, /* The framework is terminating all objects */ |
84162710428e
Cleanup to avoid sending several terminate event
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1107
diff
changeset
|
61 CORE_TERM /* Shutdown complete. */ |
84162710428e
Cleanup to avoid sending several terminate event
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1107
diff
changeset
|
62 } core_state = CORE_NOT_INIT; |
84162710428e
Cleanup to avoid sending several terminate event
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1107
diff
changeset
|
63 static pthread_mutex_t core_mtx = PTHREAD_MUTEX_INITIALIZER; |
84162710428e
Cleanup to avoid sending several terminate event
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1107
diff
changeset
|
64 static pthread_cond_t core_cnd = PTHREAD_COND_INITIALIZER; |
84162710428e
Cleanup to avoid sending several terminate event
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1107
diff
changeset
|
65 |
84162710428e
Cleanup to avoid sending several terminate event
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1107
diff
changeset
|
66 static enum core_state core_state_get(void) |
84162710428e
Cleanup to avoid sending several terminate event
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1107
diff
changeset
|
67 { |
84162710428e
Cleanup to avoid sending several terminate event
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1107
diff
changeset
|
68 enum core_state cur_state; |
84162710428e
Cleanup to avoid sending several terminate event
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1107
diff
changeset
|
69 CHECK_POSIX_DO( pthread_mutex_lock( &core_mtx ), ); |
84162710428e
Cleanup to avoid sending several terminate event
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1107
diff
changeset
|
70 cur_state = core_state; |
84162710428e
Cleanup to avoid sending several terminate event
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1107
diff
changeset
|
71 CHECK_POSIX_DO( pthread_mutex_unlock( &core_mtx ), ); |
84162710428e
Cleanup to avoid sending several terminate event
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1107
diff
changeset
|
72 return cur_state; |
84162710428e
Cleanup to avoid sending several terminate event
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1107
diff
changeset
|
73 } |
84162710428e
Cleanup to avoid sending several terminate event
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1107
diff
changeset
|
74 |
84162710428e
Cleanup to avoid sending several terminate event
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1107
diff
changeset
|
75 static void core_state_set(enum core_state newstate) |
84162710428e
Cleanup to avoid sending several terminate event
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1107
diff
changeset
|
76 { |
84162710428e
Cleanup to avoid sending several terminate event
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1107
diff
changeset
|
77 CHECK_POSIX_DO( pthread_mutex_lock( &core_mtx ), ); |
84162710428e
Cleanup to avoid sending several terminate event
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1107
diff
changeset
|
78 LOG_D("Core state: %d -> %d", core_state, newstate); |
84162710428e
Cleanup to avoid sending several terminate event
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1107
diff
changeset
|
79 core_state = newstate; |
84162710428e
Cleanup to avoid sending several terminate event
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1107
diff
changeset
|
80 CHECK_POSIX_DO( pthread_cond_broadcast( &core_cnd ), ); |
84162710428e
Cleanup to avoid sending several terminate event
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1107
diff
changeset
|
81 CHECK_POSIX_DO( pthread_mutex_unlock( &core_mtx ), ); |
84162710428e
Cleanup to avoid sending several terminate event
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1107
diff
changeset
|
82 } |
84162710428e
Cleanup to avoid sending several terminate event
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1107
diff
changeset
|
83 |
84162710428e
Cleanup to avoid sending several terminate event
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1107
diff
changeset
|
84 static int core_state_wait(enum core_state waitstate) |
84162710428e
Cleanup to avoid sending several terminate event
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1107
diff
changeset
|
85 { |
1112
d87cee14b051
Fix core termination sequence
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1111
diff
changeset
|
86 int ret = 0; |
1111
84162710428e
Cleanup to avoid sending several terminate event
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1107
diff
changeset
|
87 CHECK_POSIX( pthread_mutex_lock( &core_mtx )); |
84162710428e
Cleanup to avoid sending several terminate event
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1107
diff
changeset
|
88 pthread_cleanup_push( fd_cleanup_mutex, &core_mtx ); |
1112
d87cee14b051
Fix core termination sequence
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1111
diff
changeset
|
89 while (waitstate > core_state) { |
1111
84162710428e
Cleanup to avoid sending several terminate event
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1107
diff
changeset
|
90 CHECK_POSIX_DO(ret = pthread_cond_wait(&core_cnd, &core_mtx), break); |
1112
d87cee14b051
Fix core termination sequence
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1111
diff
changeset
|
91 } |
1111
84162710428e
Cleanup to avoid sending several terminate event
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1107
diff
changeset
|
92 pthread_cleanup_pop( 0 ); |
84162710428e
Cleanup to avoid sending several terminate event
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1107
diff
changeset
|
93 CHECK_POSIX( pthread_mutex_unlock( &core_mtx )); |
84162710428e
Cleanup to avoid sending several terminate event
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1107
diff
changeset
|
94 return ret; |
84162710428e
Cleanup to avoid sending several terminate event
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1107
diff
changeset
|
95 } |
84162710428e
Cleanup to avoid sending several terminate event
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1107
diff
changeset
|
96 |
84162710428e
Cleanup to avoid sending several terminate event
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1107
diff
changeset
|
97 static void core_shutdown(void) |
84162710428e
Cleanup to avoid sending several terminate event
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1107
diff
changeset
|
98 { |
84162710428e
Cleanup to avoid sending several terminate event
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1107
diff
changeset
|
99 LOG_N( FD_PROJECT_BINARY " framework is stopping..."); |
84162710428e
Cleanup to avoid sending several terminate event
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1107
diff
changeset
|
100 fd_log_threadname("fD Core Shutdown"); |
84162710428e
Cleanup to avoid sending several terminate event
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1107
diff
changeset
|
101 |
84162710428e
Cleanup to avoid sending several terminate event
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1107
diff
changeset
|
102 /* cleanups */ |
84162710428e
Cleanup to avoid sending several terminate event
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1107
diff
changeset
|
103 CHECK_FCT_DO( fd_servers_stop(), /* Stop accepting new connections */ ); |
84162710428e
Cleanup to avoid sending several terminate event
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1107
diff
changeset
|
104 CHECK_FCT_DO( fd_rtdisp_cleanstop(), /* Stop dispatch thread(s) after a clean loop if possible */ ); |
84162710428e
Cleanup to avoid sending several terminate event
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1107
diff
changeset
|
105 CHECK_FCT_DO( fd_peer_fini(), /* Stop all connections */ ); |
84162710428e
Cleanup to avoid sending several terminate event
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1107
diff
changeset
|
106 CHECK_FCT_DO( fd_rtdisp_fini(), /* Stop routing threads and destroy routing queues */ ); |
84162710428e
Cleanup to avoid sending several terminate event
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1107
diff
changeset
|
107 |
84162710428e
Cleanup to avoid sending several terminate event
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1107
diff
changeset
|
108 CHECK_FCT_DO( fd_ext_term(), /* Cleanup all extensions */ ); |
84162710428e
Cleanup to avoid sending several terminate event
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1107
diff
changeset
|
109 CHECK_FCT_DO( fd_rtdisp_cleanup(), /* destroy remaining handlers */ ); |
84162710428e
Cleanup to avoid sending several terminate event
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1107
diff
changeset
|
110 |
84162710428e
Cleanup to avoid sending several terminate event
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1107
diff
changeset
|
111 GNUTLS_TRACE( gnutls_global_deinit() ); |
84162710428e
Cleanup to avoid sending several terminate event
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1107
diff
changeset
|
112 |
84162710428e
Cleanup to avoid sending several terminate event
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1107
diff
changeset
|
113 CHECK_FCT_DO( fd_conf_deinit(), ); |
84162710428e
Cleanup to avoid sending several terminate event
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1107
diff
changeset
|
114 |
84162710428e
Cleanup to avoid sending several terminate event
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1107
diff
changeset
|
115 CHECK_FCT_DO( fd_event_trig_fini(), ); |
84162710428e
Cleanup to avoid sending several terminate event
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1107
diff
changeset
|
116 |
84162710428e
Cleanup to avoid sending several terminate event
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1107
diff
changeset
|
117 fd_log_debug(FD_PROJECT_BINARY " framework is terminated."); |
84162710428e
Cleanup to avoid sending several terminate event
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1107
diff
changeset
|
118 |
84162710428e
Cleanup to avoid sending several terminate event
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1107
diff
changeset
|
119 fd_libproto_fini(); |
84162710428e
Cleanup to avoid sending several terminate event
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1107
diff
changeset
|
120 |
84162710428e
Cleanup to avoid sending several terminate event
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1107
diff
changeset
|
121 } |
84162710428e
Cleanup to avoid sending several terminate event
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1107
diff
changeset
|
122 |
658
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
123 |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
124 static void * core_runner_thread(void * arg) |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
125 { |
1111
84162710428e
Cleanup to avoid sending several terminate event
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1107
diff
changeset
|
126 fd_log_threadname("fD Core Runner"); |
686
f83d9878bf66
Fixed in case of termination of several modules (before initialization completed)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
662
diff
changeset
|
127 |
1111
84162710428e
Cleanup to avoid sending several terminate event
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1107
diff
changeset
|
128 core_state_wait(CORE_RUNNING); |
693 | 129 |
658
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
130 /* Handle events incoming on the main event queue */ |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
131 while (1) { |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
132 int code; size_t sz; void * data; |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
133 CHECK_FCT_DO( fd_event_get(fd_g_config->cnf_main_ev, &code, &sz, &data), break ); |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
134 switch (code) { |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
135 case FDEV_TRIGGER: |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
136 { |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
137 int tv, *p; |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
138 CHECK_PARAMS_DO( sz == sizeof(int), |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
139 { |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
140 TRACE_DEBUG(NONE, "Internal error: got FDEV_TRIGGER without trigger value!"); |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
141 ASSERT(0); |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
142 goto end; |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
143 } ); |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
144 p = data; |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
145 tv = *p; |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
146 free(p); |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
147 CHECK_FCT_DO( fd_event_trig_call_cb(tv), goto end ); |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
148 } |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
149 break; |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
150 |
1190
6a1042d8075b
Replace FDEV_TERMINATE events with calls to fd_core_shutdown to handle the core state properly
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1182
diff
changeset
|
151 case FDEV_TERMINATE_INT: |
658
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
152 goto end; |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
153 |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
154 default: |
974
2091bf698fb1
Remove newlines from fd_log_debug, TRACE_DEBUG, TRACE_ERROR, and TRACE_DEBUG_ERROR
Thomas Klausner <tk@giga.or.at>
parents:
961
diff
changeset
|
155 TRACE_DEBUG(INFO, "Unexpected event in the main event queue (%d), ignored.", code); |
658
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
156 } |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
157 } |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
158 |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
159 end: |
1111
84162710428e
Cleanup to avoid sending several terminate event
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1107
diff
changeset
|
160 core_shutdown(); |
658
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
161 |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
162 return NULL; |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
163 } |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
164 |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
165 /*********************************/ |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
166 /* Public interfaces */ |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
167 |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
168 /* Initialize the libfdcore internals. This also initializes libfdproto */ |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
169 int fd_core_initialize(void) |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
170 { |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
171 int ret; |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
172 |
1111
84162710428e
Cleanup to avoid sending several terminate event
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1107
diff
changeset
|
173 if (core_state_get() != CORE_NOT_INIT) { |
84162710428e
Cleanup to avoid sending several terminate event
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1107
diff
changeset
|
174 fprintf(stderr, "fd_core_initialize() called more than once!\n"); |
84162710428e
Cleanup to avoid sending several terminate event
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1107
diff
changeset
|
175 return EINVAL; |
84162710428e
Cleanup to avoid sending several terminate event
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1107
diff
changeset
|
176 } |
84162710428e
Cleanup to avoid sending several terminate event
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1107
diff
changeset
|
177 |
658
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
178 /* Initialize the library -- must come first since it initializes the debug facility */ |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
179 ret = fd_libproto_init(); |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
180 if (ret != 0) { |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
181 fprintf(stderr, "Unable to initialize libfdproto: %s\n", strerror(ret)); |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
182 return ret; |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
183 } |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
184 |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
185 /* Name this thread */ |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
186 fd_log_threadname("Main"); |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
187 |
1159
05f74dc19c49
Include source rev number in version information when available
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1142
diff
changeset
|
188 LOG_N("libfdproto '%s' initialized.", fd_libproto_version); |
05f74dc19c49
Include source rev number in version information when available
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1142
diff
changeset
|
189 |
658
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
190 /* Initialize gcrypt and gnutls */ |
797
36821971d47b
Renamed GNUTLS_NEW_VERSION and added GNUTLS_VERSION_300 to prepare for API change in gnutls
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
746
diff
changeset
|
191 #ifndef GNUTLS_VERSION_210 |
658
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
192 GNUTLS_TRACE( (void) gcry_control (GCRYCTL_SET_THREAD_CBS, &gcry_threads_pthread) ); |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
193 GNUTLS_TRACE( (void) gcry_control (GCRYCTL_ENABLE_QUICK_RANDOM, 0) ); |
797
36821971d47b
Renamed GNUTLS_NEW_VERSION and added GNUTLS_VERSION_300 to prepare for API change in gnutls
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
746
diff
changeset
|
194 #endif /* GNUTLS_VERSION_210 */ |
658
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
195 CHECK_GNUTLS_DO( gnutls_global_init(), return EINVAL ); |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
196 if ( ! gnutls_check_version(GNUTLS_VERSION) ) { |
994 | 197 TRACE_ERROR( "The GNUTLS library is too old; found '%s', need '" GNUTLS_VERSION "'", gnutls_check_version(NULL)); |
658
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
198 return EINVAL; |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
199 } else { |
797
36821971d47b
Renamed GNUTLS_NEW_VERSION and added GNUTLS_VERSION_300 to prepare for API change in gnutls
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
746
diff
changeset
|
200 #ifdef GNUTLS_VERSION_210 |
746
96c75744d3c4
Attempt to support newer GNU TLS libraries. Need more work...
Sebastien Decugis <sdecugis@freediameter.net>
parents:
740
diff
changeset
|
201 TRACE_DEBUG(INFO, "libgnutls '%s' initialized.", gnutls_check_version(NULL) ); |
797
36821971d47b
Renamed GNUTLS_NEW_VERSION and added GNUTLS_VERSION_300 to prepare for API change in gnutls
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
746
diff
changeset
|
202 #else /* GNUTLS_VERSION_210 */ |
658
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
203 TRACE_DEBUG(INFO, "libgnutls '%s', libgcrypt '%s', initialized.", gnutls_check_version(NULL), gcry_check_version(NULL) ); |
797
36821971d47b
Renamed GNUTLS_NEW_VERSION and added GNUTLS_VERSION_300 to prepare for API change in gnutls
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
746
diff
changeset
|
204 #endif /* GNUTLS_VERSION_210 */ |
658
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
205 } |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
206 |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
207 /* Initialize the config with default values */ |
686
f83d9878bf66
Fixed in case of termination of several modules (before initialization completed)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
662
diff
changeset
|
208 memset(&g_conf, 0, sizeof(struct fd_config)); |
f83d9878bf66
Fixed in case of termination of several modules (before initialization completed)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
662
diff
changeset
|
209 fd_g_config = &g_conf; |
658
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
210 CHECK_FCT( fd_conf_init() ); |
688
8c3dc8584dab
Prepared capability for messages logging to separate files / folders
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
686
diff
changeset
|
211 |
658
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
212 /* Add definitions of the base protocol */ |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
213 CHECK_FCT( fd_dict_base_protocol(fd_g_config->cnf_dict) ); |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
214 |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
215 /* Initialize some modules */ |
1098
f38d77f9cfd3
Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1085
diff
changeset
|
216 CHECK_FCT( fd_hooks_init() ); |
658
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
217 CHECK_FCT( fd_queues_init() ); |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
218 CHECK_FCT( fd_sess_start() ); |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
219 CHECK_FCT( fd_p_expi_init() ); |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
220 |
1111
84162710428e
Cleanup to avoid sending several terminate event
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1107
diff
changeset
|
221 core_state_set(CORE_LIBS_INIT); |
84162710428e
Cleanup to avoid sending several terminate event
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1107
diff
changeset
|
222 |
1159
05f74dc19c49
Include source rev number in version information when available
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1142
diff
changeset
|
223 LOG_N("libfdcore '%s' initialized.", fd_core_version); |
05f74dc19c49
Include source rev number in version information when available
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1142
diff
changeset
|
224 |
05f74dc19c49
Include source rev number in version information when available
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1142
diff
changeset
|
225 |
658
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
226 /* Next thing is to parse the config, leave this for a different function */ |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
227 return 0; |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
228 } |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
229 |
1182
cc96a4dfb3d1
Early shutdown situation: detect the race condition and delay the shutdown in freeDiameterd. Alternative would be to initialize in a separate thread that we can cancel before calling shutdown.
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1167
diff
changeset
|
230 static pthread_mutex_t core_lock = PTHREAD_MUTEX_INITIALIZER; |
cc96a4dfb3d1
Early shutdown situation: detect the race condition and delay the shutdown in freeDiameterd. Alternative would be to initialize in a separate thread that we can cancel before calling shutdown.
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1167
diff
changeset
|
231 |
658
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
232 /* Parse the freeDiameter.conf configuration file, load the extensions */ |
1182
cc96a4dfb3d1
Early shutdown situation: detect the race condition and delay the shutdown in freeDiameterd. Alternative would be to initialize in a separate thread that we can cancel before calling shutdown.
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1167
diff
changeset
|
233 static int fd_core_parseconf_int(const char * conffile) |
658
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
234 { |
1085
7d7266115a34
Cleaning of the traces in progress
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1079
diff
changeset
|
235 char * buf = NULL, *b; |
7d7266115a34
Cleaning of the traces in progress
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1079
diff
changeset
|
236 size_t len = 0, offset=0; |
7d7266115a34
Cleaning of the traces in progress
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1079
diff
changeset
|
237 |
7d7266115a34
Cleaning of the traces in progress
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1079
diff
changeset
|
238 |
658
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
239 TRACE_ENTRY("%p", conffile); |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
240 |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
241 /* Conf file */ |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
242 if (conffile) |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
243 fd_g_config->cnf_file = conffile; /* otherwise, we use the default name */ |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
244 |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
245 CHECK_FCT( fd_conf_parse() ); |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
246 |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
247 /* The following module use data from the configuration */ |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
248 CHECK_FCT( fd_rtdisp_init() ); |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
249 |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
250 /* Now, load all dynamic extensions */ |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
251 CHECK_FCT( fd_ext_load() ); |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
252 |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
253 /* Display configuration */ |
1085
7d7266115a34
Cleaning of the traces in progress
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1079
diff
changeset
|
254 b = fd_conf_dump(&buf, &len, NULL); |
1167
eaa92af9e46d
New macro LOG_SPLIT to allow dumping multi-line buffers with prefix and suffix
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1159
diff
changeset
|
255 LOG_SPLIT(FD_LOG_NOTICE, NULL, b ?: "<Error during configuration dump...>", NULL); |
658
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
256 |
1120
c473581adff2
Cleanup some traces
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1119
diff
changeset
|
257 /* Display extensions status */ |
1220
cec3e9b579e1
Cleanup parameter that has become useless
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1190
diff
changeset
|
258 b = fd_ext_dump(&buf, &len, NULL); |
1167
eaa92af9e46d
New macro LOG_SPLIT to allow dumping multi-line buffers with prefix and suffix
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1159
diff
changeset
|
259 LOG_SPLIT(FD_LOG_NOTICE, "Loaded extensions: ", b?:"<Error during extensions dump...>", NULL); |
1120
c473581adff2
Cleanup some traces
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1119
diff
changeset
|
260 |
658
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
261 /* Display registered triggers for FDEV_TRIGGER */ |
1085
7d7266115a34
Cleaning of the traces in progress
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1079
diff
changeset
|
262 b = fd_event_trig_dump(&buf, &len, &offset); |
7d7266115a34
Cleaning of the traces in progress
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1079
diff
changeset
|
263 if (!b || offset) { |
1107
96f2051215c8
Replaced calls to TRACE_sSA and sSA_DUMP_NODE* macros
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1098
diff
changeset
|
264 LOG_N("%s", b ?: "Error during triggers dump..."); |
1085
7d7266115a34
Cleaning of the traces in progress
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1079
diff
changeset
|
265 } |
658
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
266 |
1085
7d7266115a34
Cleaning of the traces in progress
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1079
diff
changeset
|
267 free(buf); |
7d7266115a34
Cleaning of the traces in progress
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1079
diff
changeset
|
268 |
1142
7ef8ab1d664f
Delay the initialization of some dictionary definitions after extensions are loaded, so that these defintions may be altered by some extension in special setup environment
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1120
diff
changeset
|
269 /* Since some extensions might have modified the definitions from the dict_base_protocol, we only load the objects now */ |
7ef8ab1d664f
Delay the initialization of some dictionary definitions after extensions are loaded, so that these defintions may be altered by some extension in special setup environment
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1120
diff
changeset
|
270 CHECK_FCT( fd_msg_init() ); |
7ef8ab1d664f
Delay the initialization of some dictionary definitions after extensions are loaded, so that these defintions may be altered by some extension in special setup environment
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1120
diff
changeset
|
271 |
7ef8ab1d664f
Delay the initialization of some dictionary definitions after extensions are loaded, so that these defintions may be altered by some extension in special setup environment
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1120
diff
changeset
|
272 /* Ok, ready for next step */ |
1111
84162710428e
Cleanup to avoid sending several terminate event
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1107
diff
changeset
|
273 core_state_set(CORE_CONF_READY); |
84162710428e
Cleanup to avoid sending several terminate event
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1107
diff
changeset
|
274 |
658
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
275 return 0; |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
276 } |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
277 |
1182
cc96a4dfb3d1
Early shutdown situation: detect the race condition and delay the shutdown in freeDiameterd. Alternative would be to initialize in a separate thread that we can cancel before calling shutdown.
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1167
diff
changeset
|
278 int fd_core_parseconf(const char * conffile) |
cc96a4dfb3d1
Early shutdown situation: detect the race condition and delay the shutdown in freeDiameterd. Alternative would be to initialize in a separate thread that we can cancel before calling shutdown.
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1167
diff
changeset
|
279 { |
cc96a4dfb3d1
Early shutdown situation: detect the race condition and delay the shutdown in freeDiameterd. Alternative would be to initialize in a separate thread that we can cancel before calling shutdown.
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1167
diff
changeset
|
280 int ret; |
cc96a4dfb3d1
Early shutdown situation: detect the race condition and delay the shutdown in freeDiameterd. Alternative would be to initialize in a separate thread that we can cancel before calling shutdown.
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1167
diff
changeset
|
281 CHECK_POSIX( pthread_mutex_lock(&core_lock) ); |
cc96a4dfb3d1
Early shutdown situation: detect the race condition and delay the shutdown in freeDiameterd. Alternative would be to initialize in a separate thread that we can cancel before calling shutdown.
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1167
diff
changeset
|
282 ret = fd_core_parseconf_int(conffile); |
cc96a4dfb3d1
Early shutdown situation: detect the race condition and delay the shutdown in freeDiameterd. Alternative would be to initialize in a separate thread that we can cancel before calling shutdown.
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1167
diff
changeset
|
283 CHECK_POSIX( pthread_mutex_unlock(&core_lock) ); |
cc96a4dfb3d1
Early shutdown situation: detect the race condition and delay the shutdown in freeDiameterd. Alternative would be to initialize in a separate thread that we can cancel before calling shutdown.
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1167
diff
changeset
|
284 return ret; |
cc96a4dfb3d1
Early shutdown situation: detect the race condition and delay the shutdown in freeDiameterd. Alternative would be to initialize in a separate thread that we can cancel before calling shutdown.
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1167
diff
changeset
|
285 } |
cc96a4dfb3d1
Early shutdown situation: detect the race condition and delay the shutdown in freeDiameterd. Alternative would be to initialize in a separate thread that we can cancel before calling shutdown.
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1167
diff
changeset
|
286 |
cc96a4dfb3d1
Early shutdown situation: detect the race condition and delay the shutdown in freeDiameterd. Alternative would be to initialize in a separate thread that we can cancel before calling shutdown.
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1167
diff
changeset
|
287 |
658
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
288 /* For threads that would need to wait complete start of the framework (ex: in extensions) */ |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
289 int fd_core_waitstartcomplete(void) |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
290 { |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
291 TRACE_ENTRY(""); |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
292 |
1111
84162710428e
Cleanup to avoid sending several terminate event
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1107
diff
changeset
|
293 return core_state_wait(CORE_RUNNING); |
658
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
294 } |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
295 |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
296 /* Start the server & client threads */ |
1182
cc96a4dfb3d1
Early shutdown situation: detect the race condition and delay the shutdown in freeDiameterd. Alternative would be to initialize in a separate thread that we can cancel before calling shutdown.
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1167
diff
changeset
|
297 static int fd_core_start_int(void) |
658
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
298 { |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
299 /* Start server threads */ |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
300 CHECK_FCT( fd_servers_start() ); |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
301 |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
302 /* Start the peer state machines */ |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
303 CHECK_FCT( fd_psm_start() ); |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
304 |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
305 /* Start the core runner thread that handles main events (until shutdown) */ |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
306 CHECK_POSIX( pthread_create(&core_runner, NULL, core_runner_thread, NULL) ); |
1111
84162710428e
Cleanup to avoid sending several terminate event
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1107
diff
changeset
|
307 |
658
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
308 /* Unlock threads waiting into fd_core_waitstartcomplete */ |
1111
84162710428e
Cleanup to avoid sending several terminate event
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1107
diff
changeset
|
309 core_state_set(CORE_RUNNING); |
658
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
310 |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
311 /* Ok, everything is running now... */ |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
312 return 0; |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
313 } |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
314 |
1182
cc96a4dfb3d1
Early shutdown situation: detect the race condition and delay the shutdown in freeDiameterd. Alternative would be to initialize in a separate thread that we can cancel before calling shutdown.
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1167
diff
changeset
|
315 int fd_core_start(void) |
cc96a4dfb3d1
Early shutdown situation: detect the race condition and delay the shutdown in freeDiameterd. Alternative would be to initialize in a separate thread that we can cancel before calling shutdown.
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1167
diff
changeset
|
316 { |
cc96a4dfb3d1
Early shutdown situation: detect the race condition and delay the shutdown in freeDiameterd. Alternative would be to initialize in a separate thread that we can cancel before calling shutdown.
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1167
diff
changeset
|
317 int ret; |
cc96a4dfb3d1
Early shutdown situation: detect the race condition and delay the shutdown in freeDiameterd. Alternative would be to initialize in a separate thread that we can cancel before calling shutdown.
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1167
diff
changeset
|
318 CHECK_POSIX( pthread_mutex_lock(&core_lock) ); |
cc96a4dfb3d1
Early shutdown situation: detect the race condition and delay the shutdown in freeDiameterd. Alternative would be to initialize in a separate thread that we can cancel before calling shutdown.
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1167
diff
changeset
|
319 ret = fd_core_start_int(); |
cc96a4dfb3d1
Early shutdown situation: detect the race condition and delay the shutdown in freeDiameterd. Alternative would be to initialize in a separate thread that we can cancel before calling shutdown.
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1167
diff
changeset
|
320 CHECK_POSIX( pthread_mutex_unlock(&core_lock) ); |
cc96a4dfb3d1
Early shutdown situation: detect the race condition and delay the shutdown in freeDiameterd. Alternative would be to initialize in a separate thread that we can cancel before calling shutdown.
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1167
diff
changeset
|
321 return ret; |
cc96a4dfb3d1
Early shutdown situation: detect the race condition and delay the shutdown in freeDiameterd. Alternative would be to initialize in a separate thread that we can cancel before calling shutdown.
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1167
diff
changeset
|
322 } |
658
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
323 |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
324 /* Initialize shutdown of the framework. This is not blocking. */ |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
325 int fd_core_shutdown(void) |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
326 { |
1111
84162710428e
Cleanup to avoid sending several terminate event
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1107
diff
changeset
|
327 enum core_state cur_state = core_state_get(); |
84162710428e
Cleanup to avoid sending several terminate event
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1107
diff
changeset
|
328 |
1190
6a1042d8075b
Replace FDEV_TERMINATE events with calls to fd_core_shutdown to handle the core state properly
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1182
diff
changeset
|
329 LOG_F("Initiating freeDiameter shutdown sequence (%d)", cur_state); |
6a1042d8075b
Replace FDEV_TERMINATE events with calls to fd_core_shutdown to handle the core state properly
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1182
diff
changeset
|
330 |
1111
84162710428e
Cleanup to avoid sending several terminate event
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1107
diff
changeset
|
331 if (cur_state < CORE_RUNNING) { |
1182
cc96a4dfb3d1
Early shutdown situation: detect the race condition and delay the shutdown in freeDiameterd. Alternative would be to initialize in a separate thread that we can cancel before calling shutdown.
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1167
diff
changeset
|
332 /* Calling application must make sure the initialization is not ongoing in a separate thread... */ |
cc96a4dfb3d1
Early shutdown situation: detect the race condition and delay the shutdown in freeDiameterd. Alternative would be to initialize in a separate thread that we can cancel before calling shutdown.
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1167
diff
changeset
|
333 if (pthread_mutex_lock(&core_lock) != 0) { |
cc96a4dfb3d1
Early shutdown situation: detect the race condition and delay the shutdown in freeDiameterd. Alternative would be to initialize in a separate thread that we can cancel before calling shutdown.
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1167
diff
changeset
|
334 /* This function must not be called asynchronously from fd_core_parseconf / fd_core_start ! Please review your main app design */ |
cc96a4dfb3d1
Early shutdown situation: detect the race condition and delay the shutdown in freeDiameterd. Alternative would be to initialize in a separate thread that we can cancel before calling shutdown.
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1167
diff
changeset
|
335 ASSERT(0); |
cc96a4dfb3d1
Early shutdown situation: detect the race condition and delay the shutdown in freeDiameterd. Alternative would be to initialize in a separate thread that we can cancel before calling shutdown.
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1167
diff
changeset
|
336 return EINVAL; |
cc96a4dfb3d1
Early shutdown situation: detect the race condition and delay the shutdown in freeDiameterd. Alternative would be to initialize in a separate thread that we can cancel before calling shutdown.
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1167
diff
changeset
|
337 } |
1111
84162710428e
Cleanup to avoid sending several terminate event
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1107
diff
changeset
|
338 core_shutdown(); |
1112
d87cee14b051
Fix core termination sequence
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1111
diff
changeset
|
339 core_state_set(CORE_TERM); |
1182
cc96a4dfb3d1
Early shutdown situation: detect the race condition and delay the shutdown in freeDiameterd. Alternative would be to initialize in a separate thread that we can cancel before calling shutdown.
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1167
diff
changeset
|
340 pthread_mutex_unlock(&core_lock); |
1111
84162710428e
Cleanup to avoid sending several terminate event
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1107
diff
changeset
|
341 } else if (cur_state == CORE_RUNNING) { |
84162710428e
Cleanup to avoid sending several terminate event
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1107
diff
changeset
|
342 core_state_set(CORE_SHUTDOWN); |
1190
6a1042d8075b
Replace FDEV_TERMINATE events with calls to fd_core_shutdown to handle the core state properly
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1182
diff
changeset
|
343 CHECK_FCT( fd_event_send(fd_g_config->cnf_main_ev, FDEV_TERMINATE_INT, 0, NULL) ); |
686
f83d9878bf66
Fixed in case of termination of several modules (before initialization completed)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
662
diff
changeset
|
344 } |
658
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
345 |
1111
84162710428e
Cleanup to avoid sending several terminate event
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1107
diff
changeset
|
346 /* Other case, the framework is already shutting down */ |
84162710428e
Cleanup to avoid sending several terminate event
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1107
diff
changeset
|
347 |
658
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
348 return 0; |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
349 } |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
350 |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
351 |
1111
84162710428e
Cleanup to avoid sending several terminate event
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1107
diff
changeset
|
352 /* Wait for the shutdown to be complete -- this must be called after fd_core_shutdown to reclaim some resources. */ |
658
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
353 int fd_core_wait_shutdown_complete(void) |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
354 { |
1111
84162710428e
Cleanup to avoid sending several terminate event
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1107
diff
changeset
|
355 enum core_state cur_state = core_state_get(); |
658
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
356 void * th_ret = NULL; |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
357 |
1112
d87cee14b051
Fix core termination sequence
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1111
diff
changeset
|
358 CHECK_FCT(core_state_wait(CORE_SHUTDOWN)); |
d87cee14b051
Fix core termination sequence
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1111
diff
changeset
|
359 |
1111
84162710428e
Cleanup to avoid sending several terminate event
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1107
diff
changeset
|
360 if (cur_state == CORE_TERM) |
84162710428e
Cleanup to avoid sending several terminate event
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1107
diff
changeset
|
361 return 0; |
84162710428e
Cleanup to avoid sending several terminate event
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1107
diff
changeset
|
362 |
84162710428e
Cleanup to avoid sending several terminate event
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1107
diff
changeset
|
363 /* Just wait for core_runner_thread to complete and return gracefully */ |
84162710428e
Cleanup to avoid sending several terminate event
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1107
diff
changeset
|
364 CHECK_POSIX(pthread_join(core_runner, &th_ret)); |
84162710428e
Cleanup to avoid sending several terminate event
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1107
diff
changeset
|
365 |
84162710428e
Cleanup to avoid sending several terminate event
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1107
diff
changeset
|
366 core_state_set(CORE_TERM); |
84162710428e
Cleanup to avoid sending several terminate event
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1107
diff
changeset
|
367 |
658
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
368 return 0; |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
369 } |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
370 |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
371 |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
372 |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
373 |