Changeset 557:85ab58cc427c in freeDiameter
- Timestamp:
- Sep 15, 2010, 6:34:17 PM (14 years ago)
- Branch:
- default
- Phase:
- public
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
libfreeDiameter/sessions.c
r556 r557 94 94 uint32_t hash; /* computed hash of sid */ 95 95 struct fd_list chain_h;/* chaining in the hash table of sessions. */ 96 int rc; /* Reference counter on this object, freed only when it reaches 0. */97 96 98 97 struct timespec timeout;/* Timeout date for the session */ … … 101 100 pthread_mutex_t stlock; /* A lock to protect the list of states associated with this session */ 102 101 struct fd_list states; /* Sentinel for the list of states of this session. */ 102 int msg_cnt;/* Reference counter for the messages pointing to this session */ 103 103 }; 104 104 105 105 /* Sessions hash table, to allow fast sid to session retrieval */ 106 106 static struct { 107 struct fd_list 108 pthread_ rwlock_t rwlock; /* the rwlock for this sublist*/107 struct fd_list sentinel; /* sentinel element for this sublist */ 108 pthread_mutex_t lock; /* the mutex for this sublist -- we might probably change it to rwlock for a little optimization */ 109 109 } sess_hash [ 1 << SESS_HASH_SIZE ] ; 110 110 #define H_MASK( __hash ) ((__hash) & (( 1 << SESS_HASH_SIZE ) - 1)) 111 #define H_LIST( _hash ) 112 #define H_ RWLOCK( _hash ) (&(sess_hash[H_MASK(_hash)].rwlock))111 #define H_LIST( _hash ) (&(sess_hash[H_MASK(_hash)].sentinel)) 112 #define H_LOCK( _hash ) (&(sess_hash[H_MASK(_hash)].lock )) 113 113 114 114 /* The following are used to generate sid values that are eternaly unique */ … … 127 127 * i.e. state lock can be taken while holding the hash lock, but not while holding the expiry lock. 128 128 * As well, the hash lock cannot be taken while holding a state lock. 129 * Never try to take another lock while holding the expiry one.130 129 */ 131 130 … … 148 147 sess->hash = fd_hash(sid, sidlen); 149 148 fd_list_init(&sess->chain_h, sess); 150 sess->rc = 0;151 149 152 150 CHECK_SYS_DO( clock_gettime(CLOCK_REALTIME, &sess->timeout), return NULL );
Note: See TracChangeset
for help on using the changeset viewer.