Navigation


Changeset 14:14cf6daf716d in freeDiameter for freeDiameter/peers.c


Ignore:
Timestamp:
Oct 1, 2009, 6:24:07 PM (15 years ago)
Author:
Sebastien Decugis <sdecugis@nict.go.jp>
Branch:
default
Phase:
public
Message:

Some progress on peers module

File:
1 edited

Legend:

Unmodified
Added
Removed
  • freeDiameter/peers.c

    r13 r14  
    3636#include "fD.h"
    3737
    38 const char *peer_state_str[] = { "<error>"
    39         , "STATE_DISABLED"
    40         , "STATE_OPEN"
    41         , "STATE_CLOSED"
    42         , "STATE_CLOSING"
    43         , "STATE_WAITCNXACK"
    44         , "STATE_WAITCNXACK_ELEC"
    45         , "STATE_WAITCEA"
    46         , "STATE_SUSPECT"
    47         , "STATE_REOPEN"
    48         };
    49 
    50 struct fd_list   fd_g_peers;
    51 pthread_rwlock_t fd_g_peers_rw;
    52 
    53 /* Initialize the peers list */
    54 int fd_peer_init()
    55 {
    56         TRACE_ENTRY();
    57        
    58         fd_list_init(&fd_g_peers, NULL);
    59         CHECK_POSIX( pthread_rwlock_init(&fd_g_peers_rw, NULL) );
    60        
    61         CHECK_FCT(fd_p_expi_init());
    62        
    63         return 0;
    64 }
     38struct fd_list   fd_g_peers = FD_LIST_INITIALIZER(fd_g_peers);
     39pthread_rwlock_t fd_g_peers_rw = PTHREAD_RWLOCK_INITIALIZER;
    6540
    6641/* Terminate peer module (destroy all peers) */
    6742int fd_peer_fini()
    6843{
     44        struct fd_list * li;
    6945        TRACE_ENTRY();
    7046       
    7147        CHECK_FCT_DO(fd_p_expi_fini(), /* continue */);
    7248       
    73         TODO("Complete this function")
     49        TRACE_DEBUG(INFO, "Sending signal to terminate to all peer connections");
     50       
     51        CHECK_FCT_DO( pthread_rwlock_rdlock(&fd_g_peers_rw), /* continue */ );
     52        /* For each peer in the list, ... */
     53        for (li = fd_g_peers.next; li != &fd_g_peers; li = li->next) {
     54                struct fd_peer * np = (struct fd_peer *)li;
     55                CHECK_FCT_DO( fd_psm_terminate(np), /* continue */ );
     56        }
     57        CHECK_FCT_DO( pthread_rwlock_unlock(&fd_g_peers_rw), /* continue */ );
     58       
     59        TODO("Give some time to all PSM, then destroy remaining threads");
     60        /* fd_psm_abord(struct fd_peer * peer ) */
    7461       
    7562        return 0;
     
    125112       
    126113        fd_list_init(&p->p_hdr.info.pi_endpoints, NULL);
    127         p->p_hdr.info.pi_state = STATE_DISABLED;
    128114        fd_list_init(&p->p_hdr.info.pi_apps, NULL);
    129115       
    130116        p->p_eyec = EYEC_PEER;
    131         CHECK_POSIX( pthread_mutex_init(&p->p_mtx, NULL) );
    132117        fd_list_init(&p->p_expiry, p);
    133118        fd_list_init(&p->p_actives, p);
     
    166151        CHECK_PARAMS(p);
    167152       
    168         CHECK_PARAMS( (p->p_refcount == 0) && FD_IS_LIST_EMPTY(&p->p_hdr.chain) );
     153        CHECK_PARAMS( FD_IS_LIST_EMPTY(&p->p_hdr.chain) );
    169154       
    170155        free_null(p->p_hdr.info.pi_diamid);
     
    176161       
    177162        free_null(p->p_dbgorig);
    178         CHECK_POSIX( pthread_mutex_destroy(&p->p_mtx) );
    179163        ASSERT(FD_IS_LIST_EMPTY(&p->p_expiry));
    180164        ASSERT(FD_IS_LIST_EMPTY(&p->p_actives));
     
    214198        }
    215199       
    216         TRACE_DEBUG(NONE, "TODO: destroy p->p_cnxctx here");
     200        if (p->p_cnxctx) {
     201                TODO("destroy p->p_cnxctx");
     202        }
    217203       
    218204        if (p->p_cb)
     
    224210}
    225211
    226 /* Decrement refcount, delete if 0 */
    227 int fd_peer_rc_decr(struct fd_peer **ptr, int locked)
    228 {
    229         int count;
    230         struct fd_peer *p;
    231         TRACE_ENTRY("%p %d", p, locked);
    232        
    233         CHECK_PARAMS(ptr && CHECK_PEER( *ptr ));
    234         p = *ptr;
    235        
    236         if (!locked) {
    237                 CHECK_POSIX( pthread_rwlock_rdlock(&fd_g_peers_rw) );
    238                 CHECK_POSIX( pthread_mutex_lock( &p->p_mtx ) );
    239                 CHECK_POSIX( pthread_rwlock_unlock(&fd_g_peers_rw) );
    240         }
    241        
    242         count = --(p->p_refcount);
    243        
    244         if (!locked) {
    245                 CHECK_POSIX( pthread_mutex_unlock( &p->p_mtx ) );
    246         }
    247        
    248         if (count <= 0) {
    249                 /* All links have already been removed, we can destroy */
    250                 CHECK_FCT( fd_sp_destroy(ptr) );
    251         }
    252         return 0;
    253 }
    254212
    255213/* Add a new peer entry */
     
    284242       
    285243        /* Move the items from one list to the other */
    286         while (!FD_IS_LIST_EMPTY( &info->pi_endpoints ) ) {
    287                 li = info->pi_endpoints.next;
    288                 fd_list_unlink(li);
    289                 fd_list_insert_before(&p->p_hdr.info.pi_endpoints, li);
    290         }
     244        if (info->pi_endpoints.next)
     245                while (!FD_IS_LIST_EMPTY( &info->pi_endpoints ) ) {
     246                        li = info->pi_endpoints.next;
     247                        fd_list_unlink(li);
     248                        fd_list_insert_before(&p->p_hdr.info.pi_endpoints, li);
     249                }
    291250       
    292251        p->p_hdr.info.pi_sec_module = info->pi_sec_module;
     
    304263        /* Ok, now check if we don't already have an entry with the same Diameter Id, and insert this one */
    305264        CHECK_POSIX( pthread_rwlock_wrlock(&fd_g_peers_rw) );
    306         CHECK_POSIX( pthread_mutex_lock( &p->p_mtx ) );
    307265       
    308266        for (li = fd_g_peers.next; li != &fd_g_peers; li = li->next) {
     
    319277        if (! ret) {
    320278                /* Update expiry list */
    321                 CHECK_FCT_DO( ret = fd_p_expi_update( p, 1 ), goto out );
     279                CHECK_FCT_DO( ret = fd_p_expi_update( p ), goto out );
    322280               
    323281                /* Insert the new element in the list */
    324282                fd_list_insert_before( li, &p->p_hdr.chain );
    325                 p->p_refcount++;
    326283        }
    327284
    328285out:   
    329         CHECK_POSIX( pthread_mutex_unlock( &p->p_mtx ) );
    330286        CHECK_POSIX( pthread_rwlock_unlock(&fd_g_peers_rw) );
    331287        if (ret) {
    332288                CHECK_FCT( fd_sp_destroy(&p) );
    333289        } else {
    334                 CHECK_FCT( fd_psm_start(p) );
     290                CHECK_FCT( fd_psm_begin(p) );
    335291        }
    336292        return ret;
Note: See TracChangeset for help on using the changeset viewer.