Navigation



Ignore:
Timestamp:
Apr 9, 2019, 10:46:50 PM (5 years ago)
Author:
Thomas Klausner <tk@giga.or.at>
Branch:
default
Phase:
public
histedit_source:
4e04e2f73d936608db88f0e70d10049fcaf66190
Message:

rt_default: add reload support.

When SIGUSR1 is sent to the freeDiameter process, rt_default reloads
its config file.

Written for Effortel Technologies SA, published with their consent.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • extensions/rt_default/rt_default.c

    r1235 r1336  
    3838 */
    3939
     40#include <signal.h>
     41
    4042#include "rt_default.h"
     43
     44#define MODULE_NAME "rt_default"
     45
     46#include <pthread.h>
     47
     48static pthread_rwlock_t rtd_lock;
     49
     50static char *rtd_config_file;
    4151
    4252/* The callback called on new messages */
     
    4555        struct msg * msg = *pmsg;
    4656        TRACE_ENTRY("%p %p %p", cbdata, msg, candidates);
     57        int ret;
    4758       
    4859        CHECK_PARAMS(msg && candidates);
    49        
     60
     61        if (pthread_rwlock_rdlock(&rtd_lock) != 0) {
     62                fd_log_notice("%s: read-lock failed, skipping handler", MODULE_NAME);
     63                return 0;
     64        }
    5065        /* Simply pass it to the appropriate function */
    5166        if (FD_IS_LIST_EMPTY(candidates)) {
    52                 return 0;
     67                ret = 0;
    5368        } else {
    54                 return rtd_process( msg, candidates );
     69                ret = rtd_process( msg, candidates );
    5570        }
     71        if (pthread_rwlock_unlock(&rtd_lock) != 0) {
     72                fd_log_notice("%s: read-unlock failed after rtd_out, exiting", MODULE_NAME);
     73                exit(1);
     74        }
     75        return ret;
    5676}
    5777
     
    5979static struct fd_rt_out_hdl * rtd_hdl = NULL;
    6080
     81static volatile int in_signal_handler = 0;
     82
     83/* signal handler */
     84static void sig_hdlr(void)
     85{
     86        if (in_signal_handler) {
     87                fd_log_error("%s: already handling a signal, ignoring new one", MODULE_NAME);
     88                return;
     89        }
     90        in_signal_handler = 1;
     91
     92        if (pthread_rwlock_wrlock(&rtd_lock) != 0) {
     93                fd_log_error("%s: locking failed, aborting config reload", MODULE_NAME);
     94                return;
     95        }
     96        rtd_conf_reload(rtd_config_file);
     97        if (pthread_rwlock_unlock(&rtd_lock) != 0) {
     98                fd_log_error("%s: unlocking failed after config reload, exiting", MODULE_NAME);
     99                exit(1);
     100        }               
     101
     102        fd_log_notice("%s: reloaded configuration", MODULE_NAME);
     103
     104        in_signal_handler = 0;
     105}
     106
     107
    61108/* entry point */
    62109static int rtd_entry(char * conffile)
    63110{
    64111        TRACE_ENTRY("%p", conffile);
    65        
     112
     113        rtd_config_file = conffile;
     114        pthread_rwlock_init(&rtd_lock, NULL);
     115
     116        if (pthread_rwlock_wrlock(&rtd_lock) != 0) {
     117                fd_log_notice("%s: write-lock failed, aborting", MODULE_NAME);
     118                return EDEADLK;
     119        }
     120
    66121        /* Initialize the repo */
    67122        CHECK_FCT( rtd_init() );
     
    69124        /* Parse the configuration file */
    70125        CHECK_FCT( rtd_conf_handle(conffile) );
    71        
     126
     127        if (pthread_rwlock_unlock(&rtd_lock) != 0) {
     128                fd_log_notice("%s: write-unlock failed, aborting", MODULE_NAME);
     129                return EDEADLK;
     130        }
     131
     132        /* Register reload callback */
     133        CHECK_FCT(fd_event_trig_regcb(SIGUSR1, MODULE_NAME, sig_hdlr));
     134
    72135#if 0
    73136        /* Dump the rules */
     
    92155        /* Destroy the data */
    93156        rtd_fini();
    94        
     157
     158        pthread_rwlock_destroy(&rtd_lock);
     159
    95160        /* Done */
    96161        return ;
    97162}
    98163
    99 EXTENSION_ENTRY("rt_default", rtd_entry);
     164EXTENSION_ENTRY(MODULE_NAME, rtd_entry);
Note: See TracChangeset for help on using the changeset viewer.