annotate libfdcore/core.c @ 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
author Sebastien Decugis <sdecugis@freediameter.net>
date Thu, 16 May 2013 15:25:53 +0800
parents c473581adff2
children 05f74dc19c49
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
16c373df0947 Cleanups
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 691
diff changeset
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
f198d16fa7f4 Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
151 case FDEV_TERMINATE:
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 /* Return a string describing the version of the library */
f198d16fa7f4 Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
169 const char *fd_core_version(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 return _stringize(FD_PROJECT_VERSION_MAJOR) "." _stringize(FD_PROJECT_VERSION_MINOR) "." _stringize(FD_PROJECT_VERSION_REV);
f198d16fa7f4 Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
172 }
f198d16fa7f4 Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
173
f198d16fa7f4 Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
174 /* Initialize the libfdcore internals. This also initializes libfdproto */
f198d16fa7f4 Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
175 int fd_core_initialize(void)
f198d16fa7f4 Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
176 {
f198d16fa7f4 Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
177 int ret;
f198d16fa7f4 Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
178
1111
84162710428e Cleanup to avoid sending several terminate event
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1107
diff changeset
179 if (core_state_get() != CORE_NOT_INIT) {
84162710428e Cleanup to avoid sending several terminate event
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1107
diff changeset
180 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
181 return EINVAL;
84162710428e Cleanup to avoid sending several terminate event
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1107
diff changeset
182 }
84162710428e Cleanup to avoid sending several terminate event
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1107
diff changeset
183
658
f198d16fa7f4 Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
184 /* 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
185 ret = fd_libproto_init();
f198d16fa7f4 Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
186 if (ret != 0) {
f198d16fa7f4 Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
187 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
188 return ret;
f198d16fa7f4 Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
189 }
f198d16fa7f4 Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
190
1112
d87cee14b051 Fix core termination sequence
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1111
diff changeset
191 LOG_N("libfdproto initialized.");
658
f198d16fa7f4 Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
192
f198d16fa7f4 Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
193 /* Name this thread */
f198d16fa7f4 Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
194 fd_log_threadname("Main");
f198d16fa7f4 Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
195
f198d16fa7f4 Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
196 /* 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
197 #ifndef GNUTLS_VERSION_210
658
f198d16fa7f4 Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
198 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
199 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
200 #endif /* GNUTLS_VERSION_210 */
658
f198d16fa7f4 Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
201 CHECK_GNUTLS_DO( gnutls_global_init(), return EINVAL );
f198d16fa7f4 Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
202 if ( ! gnutls_check_version(GNUTLS_VERSION) ) {
994
1e1d6f94cd94 Remove more newlines.
Thomas Klausner <tk@giga.or.at>
parents: 983
diff changeset
203 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
204 return EINVAL;
f198d16fa7f4 Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
205 } 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
206 #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
207 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
208 #else /* GNUTLS_VERSION_210 */
658
f198d16fa7f4 Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
209 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
210 #endif /* GNUTLS_VERSION_210 */
658
f198d16fa7f4 Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
211 }
f198d16fa7f4 Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
212
f198d16fa7f4 Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
213 /* 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
214 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
215 fd_g_config = &g_conf;
658
f198d16fa7f4 Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
216 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
217
658
f198d16fa7f4 Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
218 /* Add definitions of the base protocol */
f198d16fa7f4 Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
219 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
220
f198d16fa7f4 Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
221 /* Initialize some modules */
1098
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1085
diff changeset
222 CHECK_FCT( fd_hooks_init() );
658
f198d16fa7f4 Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
223 CHECK_FCT( fd_queues_init() );
f198d16fa7f4 Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
224 CHECK_FCT( fd_sess_start() );
f198d16fa7f4 Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
225 CHECK_FCT( fd_p_expi_init() );
f198d16fa7f4 Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
226
1111
84162710428e Cleanup to avoid sending several terminate event
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1107
diff changeset
227 core_state_set(CORE_LIBS_INIT);
84162710428e Cleanup to avoid sending several terminate event
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1107
diff changeset
228
658
f198d16fa7f4 Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
229 /* 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
230 return 0;
f198d16fa7f4 Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
231 }
f198d16fa7f4 Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
232
f198d16fa7f4 Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
233 /* Parse the freeDiameter.conf configuration file, load the extensions */
947
cce5d4bace82 Make config file parameter const and convert another fprintf to TRACE_DEBUG_ERROR.
Thomas Klausner <tk@giga.or.at>
parents: 908
diff changeset
234 int fd_core_parseconf(const char * conffile)
658
f198d16fa7f4 Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
235 {
1085
7d7266115a34 Cleaning of the traces in progress
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1079
diff changeset
236 char * buf = NULL, *b;
7d7266115a34 Cleaning of the traces in progress
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1079
diff changeset
237 size_t len = 0, offset=0;
7d7266115a34 Cleaning of the traces in progress
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1079
diff changeset
238
7d7266115a34 Cleaning of the traces in progress
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1079
diff changeset
239
658
f198d16fa7f4 Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
240 TRACE_ENTRY("%p", conffile);
f198d16fa7f4 Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
241
f198d16fa7f4 Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
242 /* Conf file */
f198d16fa7f4 Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
243 if (conffile)
f198d16fa7f4 Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
244 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
245
f198d16fa7f4 Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
246 CHECK_FCT( fd_conf_parse() );
f198d16fa7f4 Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
247
f198d16fa7f4 Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
248 /* The following module use data from the configuration */
f198d16fa7f4 Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
249 CHECK_FCT( fd_rtdisp_init() );
f198d16fa7f4 Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
250
f198d16fa7f4 Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
251 /* Now, load all dynamic extensions */
f198d16fa7f4 Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
252 CHECK_FCT( fd_ext_load() );
f198d16fa7f4 Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
253
f198d16fa7f4 Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
254 /* Display configuration */
1085
7d7266115a34 Cleaning of the traces in progress
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1079
diff changeset
255 b = fd_conf_dump(&buf, &len, NULL);
1107
96f2051215c8 Replaced calls to TRACE_sSA and sSA_DUMP_NODE* macros
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1098
diff changeset
256 LOG_N("%s", b ?: "Error during configuration dump...");
658
f198d16fa7f4 Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
257
1120
c473581adff2 Cleanup some traces
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1119
diff changeset
258 /* Display extensions status */
c473581adff2 Cleanup some traces
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1119
diff changeset
259 b = fd_ext_dump(&buf, &len, NULL, 19);
c473581adff2 Cleanup some traces
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1119
diff changeset
260 LOG_N("Loaded extensions: %s", b ?: "Error during extensions dump...");
c473581adff2 Cleanup some traces
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1119
diff changeset
261
658
f198d16fa7f4 Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
262 /* Display registered triggers for FDEV_TRIGGER */
1085
7d7266115a34 Cleaning of the traces in progress
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1079
diff changeset
263 b = fd_event_trig_dump(&buf, &len, &offset);
7d7266115a34 Cleaning of the traces in progress
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1079
diff changeset
264 if (!b || offset) {
1107
96f2051215c8 Replaced calls to TRACE_sSA and sSA_DUMP_NODE* macros
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1098
diff changeset
265 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
266 }
658
f198d16fa7f4 Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
267
1085
7d7266115a34 Cleaning of the traces in progress
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1079
diff changeset
268 free(buf);
7d7266115a34 Cleaning of the traces in progress
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1079
diff changeset
269
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
270 /* 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
271 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
272
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
273 /* Ok, ready for next step */
1111
84162710428e Cleanup to avoid sending several terminate event
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1107
diff changeset
274 core_state_set(CORE_CONF_READY);
84162710428e Cleanup to avoid sending several terminate event
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1107
diff changeset
275
658
f198d16fa7f4 Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
276 return 0;
f198d16fa7f4 Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
277 }
f198d16fa7f4 Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
278
f198d16fa7f4 Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
279 /* 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
280 int fd_core_waitstartcomplete(void)
f198d16fa7f4 Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
281 {
f198d16fa7f4 Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
282 TRACE_ENTRY("");
f198d16fa7f4 Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
283
1111
84162710428e Cleanup to avoid sending several terminate event
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1107
diff changeset
284 return core_state_wait(CORE_RUNNING);
658
f198d16fa7f4 Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
285 }
f198d16fa7f4 Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
286
f198d16fa7f4 Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
287 /* Start the server & client threads */
f198d16fa7f4 Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
288 int fd_core_start(void)
f198d16fa7f4 Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
289 {
f198d16fa7f4 Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
290 /* Start server threads */
f198d16fa7f4 Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
291 CHECK_FCT( fd_servers_start() );
f198d16fa7f4 Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
292
f198d16fa7f4 Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
293 /* Start the peer state machines */
f198d16fa7f4 Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
294 CHECK_FCT( fd_psm_start() );
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 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
297 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
298
658
f198d16fa7f4 Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
299 /* 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
300 core_state_set(CORE_RUNNING);
658
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 /* Ok, everything is running now... */
f198d16fa7f4 Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
303 return 0;
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
f198d16fa7f4 Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
306
f198d16fa7f4 Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
307 /* 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
308 int fd_core_shutdown(void)
f198d16fa7f4 Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
309 {
1111
84162710428e Cleanup to avoid sending several terminate event
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1107
diff changeset
310 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
311
84162710428e Cleanup to avoid sending several terminate event
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1107
diff changeset
312 if (cur_state < CORE_RUNNING) {
84162710428e Cleanup to avoid sending several terminate event
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1107
diff changeset
313 core_shutdown();
1112
d87cee14b051 Fix core termination sequence
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1111
diff changeset
314 core_state_set(CORE_TERM);
1111
84162710428e Cleanup to avoid sending several terminate event
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1107
diff changeset
315 } else if (cur_state == CORE_RUNNING) {
84162710428e Cleanup to avoid sending several terminate event
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1107
diff changeset
316 core_state_set(CORE_SHUTDOWN);
686
f83d9878bf66 Fixed in case of termination of several modules (before initialization completed)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 662
diff changeset
317 CHECK_FCT( fd_event_send(fd_g_config->cnf_main_ev, FDEV_TERMINATE, 0, NULL) );
f83d9878bf66 Fixed in case of termination of several modules (before initialization completed)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 662
diff changeset
318 }
658
f198d16fa7f4 Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
319
1111
84162710428e Cleanup to avoid sending several terminate event
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1107
diff changeset
320 /* 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
321
658
f198d16fa7f4 Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
322 return 0;
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
f198d16fa7f4 Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
325
1111
84162710428e Cleanup to avoid sending several terminate event
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1107
diff changeset
326 /* 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
327 int fd_core_wait_shutdown_complete(void)
f198d16fa7f4 Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
328 {
1111
84162710428e Cleanup to avoid sending several terminate event
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1107
diff changeset
329 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
330 void * th_ret = NULL;
f198d16fa7f4 Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
331
1112
d87cee14b051 Fix core termination sequence
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1111
diff changeset
332 CHECK_FCT(core_state_wait(CORE_SHUTDOWN));
d87cee14b051 Fix core termination sequence
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1111
diff changeset
333
1111
84162710428e Cleanup to avoid sending several terminate event
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1107
diff changeset
334 if (cur_state == CORE_TERM)
84162710428e Cleanup to avoid sending several terminate event
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1107
diff changeset
335 return 0;
84162710428e Cleanup to avoid sending several terminate event
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1107
diff changeset
336
84162710428e Cleanup to avoid sending several terminate event
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1107
diff changeset
337 /* 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
338 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
339
84162710428e Cleanup to avoid sending several terminate event
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1107
diff changeset
340 core_state_set(CORE_TERM);
84162710428e Cleanup to avoid sending several terminate event
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1107
diff changeset
341
658
f198d16fa7f4 Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
342 return 0;
f198d16fa7f4 Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
343 }
f198d16fa7f4 Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
344
f198d16fa7f4 Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
345
f198d16fa7f4 Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
346
f198d16fa7f4 Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
347
"Welcome to our mercurial repository"