# HG changeset patch # User Sebastien Decugis # Date 1370853858 -28800 # Node ID 6a1042d8075bdd2674669df49ab2c784213b9067 # Parent 50bf33dc8fe0279747073003960c53670f7af80c Replace FDEV_TERMINATE events with calls to fd_core_shutdown to handle the core state properly diff -r 50bf33dc8fe0 -r 6a1042d8075b extensions/app_radgw/rgw_clients.c --- a/extensions/app_radgw/rgw_clients.c Mon Jun 10 16:23:09 2013 +0800 +++ b/extensions/app_radgw/rgw_clients.c Mon Jun 10 16:44:18 2013 +0800 @@ -203,7 +203,7 @@ } /* If we reach this part, some fatal error was encountered */ - CHECK_FCT_DO(fd_event_send(fd_g_config->cnf_main_ev, FDEV_TERMINATE, 0, NULL), ); + CHECK_FCT_DO(fd_core_shutdown(), ); TRACE_DEBUG(FULL, "Thread terminated"); return NULL; } diff -r 50bf33dc8fe0 -r 6a1042d8075b extensions/test_netemul/tne_process.c --- a/extensions/test_netemul/tne_process.c Mon Jun 10 16:23:09 2013 +0800 +++ b/extensions/test_netemul/tne_process.c Mon Jun 10 16:44:18 2013 +0800 @@ -280,7 +280,7 @@ error: TRACE_DEBUG(INFO, "A fatal error occurred in test_netemul/process thread!"); ASSERT(0); - CHECK_FCT_DO(fd_event_send(fd_g_config->cnf_main_ev, FDEV_TERMINATE, 0, NULL), ); + CHECK_FCT_DO(fd_core_shutdown(), ); return NULL; } diff -r 50bf33dc8fe0 -r 6a1042d8075b include/freeDiameter/libfdcore.h --- a/include/freeDiameter/libfdcore.h Mon Jun 10 16:23:09 2013 +0800 +++ b/include/freeDiameter/libfdcore.h Mon Jun 10 16:44:18 2013 +0800 @@ -812,8 +812,8 @@ /* Daemon's codespace: 1000->1999 (1500->1999 defined in fdcore-internal.h) */ enum { - FDEV_TERMINATE = 1000 /* request to terminate */ - ,FDEV_TRIGGER /* Trigger available for extensions. size is sizeof(int), data is int * */ + FDEV_TERMINATE_INT= 1000 /* request to terminate. DO NOT USE. Use fd_core_shutdown() instead. */ + ,FDEV_TRIGGER /* Trigger available for extensions. size is sizeof(int), data is int * */ }; int fd_event_send(struct fifo *queue, int code, size_t datasz, void * data); diff -r 50bf33dc8fe0 -r 6a1042d8075b libfdcore/cnxctx.c --- a/libfdcore/cnxctx.c Mon Jun 10 16:23:09 2013 +0800 +++ b/libfdcore/cnxctx.c Mon Jun 10 16:44:18 2013 +0800 @@ -610,7 +610,7 @@ fatal: /* An unrecoverable error occurred, stop the daemon */ ASSERT(0); - CHECK_FCT_DO(fd_event_send(fd_g_config->cnf_main_ev, FDEV_TERMINATE, 0, NULL), ); + CHECK_FCT_DO(fd_core_shutdown(), ); } /* Set the timeout option on the socket */ @@ -842,8 +842,7 @@ CHECK_FCT_DO( fd_event_send( fd_cnx_target_queue(conn), FDEVP_CNX_MSG_RECV, rcv_data.length, rcv_data.buffer), { free_rcvdata(&rcv_data); - CHECK_FCT_DO(fd_event_send(fd_g_config->cnf_main_ev, FDEV_TERMINATE, 0, NULL), ); - return NULL; + goto fatal; } ); } while (conn->cc_loop); @@ -854,7 +853,7 @@ fatal: /* An unrecoverable error occurred, stop the daemon */ - CHECK_FCT_DO(fd_event_send(fd_g_config->cnf_main_ev, FDEV_TERMINATE, 0, NULL), ); + CHECK_FCT_DO(fd_core_shutdown(), ); goto out; } @@ -907,7 +906,7 @@ fatal: /* An unrecoverable error occurred, stop the daemon */ - CHECK_FCT_DO(fd_event_send(fd_g_config->cnf_main_ev, FDEV_TERMINATE, 0, NULL), ); + CHECK_FCT_DO(fd_core_shutdown(), ); goto out; } #endif /* DISABLE_SCTP */ @@ -1098,7 +1097,7 @@ CHECK_FCT_DO( ret = fd_event_send( fd_cnx_target_queue(conn), FDEVP_CNX_MSG_RECV, rcv_data.length, rcv_data.buffer), { free_rcvdata(&rcv_data); - CHECK_FCT_DO(fd_event_send(fd_g_config->cnf_main_ev, FDEV_TERMINATE, 0, NULL), ); + CHECK_FCT_DO(fd_core_shutdown(), ); return ret; } ); diff -r 50bf33dc8fe0 -r 6a1042d8075b libfdcore/core.c --- a/libfdcore/core.c Mon Jun 10 16:23:09 2013 +0800 +++ b/libfdcore/core.c Mon Jun 10 16:44:18 2013 +0800 @@ -148,7 +148,7 @@ } break; - case FDEV_TERMINATE: + case FDEV_TERMINATE_INT: goto end; default: @@ -326,6 +326,8 @@ { enum core_state cur_state = core_state_get(); + LOG_F("Initiating freeDiameter shutdown sequence (%d)", cur_state); + if (cur_state < CORE_RUNNING) { /* Calling application must make sure the initialization is not ongoing in a separate thread... */ if (pthread_mutex_lock(&core_lock) != 0) { @@ -338,7 +340,7 @@ pthread_mutex_unlock(&core_lock); } else if (cur_state == CORE_RUNNING) { core_state_set(CORE_SHUTDOWN); - CHECK_FCT( fd_event_send(fd_g_config->cnf_main_ev, FDEV_TERMINATE, 0, NULL) ); + CHECK_FCT( fd_event_send(fd_g_config->cnf_main_ev, FDEV_TERMINATE_INT, 0, NULL) ); } /* Other case, the framework is already shutting down */ diff -r 50bf33dc8fe0 -r 6a1042d8075b libfdcore/events.c --- a/libfdcore/events.c Mon Jun 10 16:23:09 2013 +0800 +++ b/libfdcore/events.c Mon Jun 10 16:44:18 2013 +0800 @@ -104,7 +104,7 @@ switch (event) { #define case_str( _val )\ case _val : return #_val - case_str(FDEV_TERMINATE); + case_str(FDEV_TERMINATE_INT); case_str(FDEV_TRIGGER); default: diff -r 50bf33dc8fe0 -r 6a1042d8075b libfdcore/p_cnx.c --- a/libfdcore/p_cnx.c Mon Jun 10 16:23:09 2013 +0800 +++ b/libfdcore/p_cnx.c Mon Jun 10 16:44:18 2013 +0800 @@ -313,7 +313,7 @@ fd_cnx_destroy(cnx); /* Generate a termination event */ - CHECK_FCT_DO(fd_event_send(fd_g_config->cnf_main_ev, FDEV_TERMINATE, 0, NULL), ); + CHECK_FCT_DO(fd_core_shutdown(), ); } return NULL; diff -r 50bf33dc8fe0 -r 6a1042d8075b libfdcore/p_expiry.c --- a/libfdcore/p_expiry.c Mon Jun 10 16:23:09 2013 +0800 +++ b/libfdcore/p_expiry.c Mon Jun 10 16:44:18 2013 +0800 @@ -86,7 +86,7 @@ error: TRACE_DEBUG(INFO, "An error occurred in peers module! GC thread is terminating..."); ASSERT(0); - CHECK_FCT_DO(fd_event_send(fd_g_config->cnf_main_ev, FDEV_TERMINATE, 0, NULL), ); + CHECK_FCT_DO(fd_core_shutdown(), ); return NULL; } @@ -138,7 +138,7 @@ pthread_cleanup_pop( 1 ); TRACE_DEBUG(INFO, "An error occurred in peers module! Expiry thread is terminating..."); - CHECK_FCT_DO(fd_event_send(fd_g_config->cnf_main_ev, FDEV_TERMINATE, 0, NULL), ); + CHECK_FCT_DO(fd_core_shutdown(), ); return NULL; } diff -r 50bf33dc8fe0 -r 6a1042d8075b libfdcore/routing_dispatch.c --- a/libfdcore/routing_dispatch.c Mon Jun 10 16:23:09 2013 +0800 +++ b/libfdcore/routing_dispatch.c Mon Jun 10 16:44:18 2013 +0800 @@ -1114,7 +1114,7 @@ fatal_error: TRACE_DEBUG(INFO, "An unrecoverable error occurred, %s thread is terminating...", action_name); - CHECK_FCT_DO(fd_event_send(fd_g_config->cnf_main_ev, FDEV_TERMINATE, 0, NULL), ); + CHECK_FCT_DO(fd_core_shutdown(), ); end: ; /* noop so that we get rid of "label at end of compund statement" warning */ diff -r 50bf33dc8fe0 -r 6a1042d8075b libfdcore/sctp3436.c --- a/libfdcore/sctp3436.c Mon Jun 10 16:23:09 2013 +0800 +++ b/libfdcore/sctp3436.c Mon Jun 10 16:44:18 2013 +0800 @@ -129,7 +129,7 @@ fatal: /* An unrecoverable error occurred, stop the daemon */ - CHECK_FCT_DO(fd_event_send(fd_g_config->cnf_main_ev, FDEV_TERMINATE, 0, NULL), ); + CHECK_FCT_DO(fd_core_shutdown(), ); goto out; } diff -r 50bf33dc8fe0 -r 6a1042d8075b libfdcore/server.c --- a/libfdcore/server.c Mon Jun 10 16:23:09 2013 +0800 +++ b/libfdcore/server.c Mon Jun 10 16:44:18 2013 +0800 @@ -303,7 +303,7 @@ /* Send error signal to the core */ LOG_F( "An error occurred in server module! Thread is terminating..."); - CHECK_FCT_DO(fd_event_send(fd_g_config->cnf_main_ev, FDEV_TERMINATE, 0, NULL), ); + CHECK_FCT_DO(fd_core_shutdown(), ); return NULL; }