annotate libfdcore/core.c @ 1554:566bb46cc73f

Updated copyright information
author Sebastien Decugis <sdecugis@freediameter.net>
date Tue, 06 Oct 2020 21:34:53 +0800
parents 239ba25870d8
children
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 * *
1554
566bb46cc73f Updated copyright information
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1397
diff changeset
5 * Copyright (c) 2019, 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
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
1e1d6f94cd94 Remove more newlines.
Thomas Klausner <tk@giga.or.at>
parents: 983
diff changeset
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;
1397
239ba25870d8 Allow parametrizing the number of threads for routing in/out.
Thomas Klausner <tk@giga.or.at>
parents: 1325
diff changeset
318 CHECK_FCT( fd_queues_init_after_conf() );
239ba25870d8 Allow parametrizing the number of threads for routing in/out.
Thomas Klausner <tk@giga.or.at>
parents: 1325
diff changeset
319
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
320 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
321 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
322 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
323 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
324 }
658
f198d16fa7f4 Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
325
f198d16fa7f4 Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
326 /* 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
327 int fd_core_shutdown(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();
84162710428e Cleanup to avoid sending several terminate event
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1107
diff changeset
330
1325
ae81cd81ab09 Log shutdown message at normal level (instead of fatal => error).
Thomas Klausner <tk@giga.or.at>
parents: 1220
diff changeset
331 LOG_N("Initiating freeDiameter shutdown sequence (%d)", cur_state);
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
332
1111
84162710428e Cleanup to avoid sending several terminate event
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1107
diff changeset
333 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
334 /* 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
335 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
336 /* 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
337 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
338 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
339 }
1111
84162710428e Cleanup to avoid sending several terminate event
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1107
diff changeset
340 core_shutdown();
1112
d87cee14b051 Fix core termination sequence
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1111
diff changeset
341 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
342 pthread_mutex_unlock(&core_lock);
1111
84162710428e Cleanup to avoid sending several terminate event
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1107
diff changeset
343 } else if (cur_state == CORE_RUNNING) {
84162710428e Cleanup to avoid sending several terminate event
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1107
diff changeset
344 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
345 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
346 }
658
f198d16fa7f4 Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
347
1111
84162710428e Cleanup to avoid sending several terminate event
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1107
diff changeset
348 /* 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
349
658
f198d16fa7f4 Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
350 return 0;
f198d16fa7f4 Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
351 }
f198d16fa7f4 Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
352
f198d16fa7f4 Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
353
1111
84162710428e Cleanup to avoid sending several terminate event
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1107
diff changeset
354 /* 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
355 int fd_core_wait_shutdown_complete(void)
f198d16fa7f4 Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
356 {
1111
84162710428e Cleanup to avoid sending several terminate event
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1107
diff changeset
357 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
358 void * th_ret = NULL;
f198d16fa7f4 Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
359
1112
d87cee14b051 Fix core termination sequence
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1111
diff changeset
360 CHECK_FCT(core_state_wait(CORE_SHUTDOWN));
d87cee14b051 Fix core termination sequence
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1111
diff changeset
361
1111
84162710428e Cleanup to avoid sending several terminate event
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1107
diff changeset
362 if (cur_state == CORE_TERM)
84162710428e Cleanup to avoid sending several terminate event
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1107
diff changeset
363 return 0;
84162710428e Cleanup to avoid sending several terminate event
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1107
diff changeset
364
84162710428e Cleanup to avoid sending several terminate event
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1107
diff changeset
365 /* 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
366 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
367
84162710428e Cleanup to avoid sending several terminate event
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1107
diff changeset
368 core_state_set(CORE_TERM);
84162710428e Cleanup to avoid sending several terminate event
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1107
diff changeset
369
658
f198d16fa7f4 Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
370 return 0;
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
f198d16fa7f4 Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
374
f198d16fa7f4 Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
375
"Welcome to our mercurial repository"