comparison libfreeDiameter/sessions.c @ 556:8c9028ec02bf

Preparing for bugfix release 1.0.1
author Sebastien Decugis <sdecugis@nict.go.jp>
date Wed, 15 Sep 2010 17:27:07 +0900
parents 9a8b3178a7a7
children 85ab58cc427c
comparison
equal deleted inserted replaced
555:fca6cfbeac3a 556:8c9028ec02bf
91 int eyec; /* Eyecatcher, SI_EYEC */ 91 int eyec; /* Eyecatcher, SI_EYEC */
92 92
93 char * sid; /* The \0-terminated Session-Id */ 93 char * sid; /* The \0-terminated Session-Id */
94 uint32_t hash; /* computed hash of sid */ 94 uint32_t hash; /* computed hash of sid */
95 struct fd_list chain_h;/* chaining in the hash table of sessions. */ 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. */
96 97
97 struct timespec timeout;/* Timeout date for the session */ 98 struct timespec timeout;/* Timeout date for the session */
98 struct fd_list expire; /* List of expiring sessions, ordered by timeouts. */ 99 struct fd_list expire; /* List of expiring sessions, ordered by timeouts. */
99 100
100 pthread_mutex_t stlock; /* A lock to protect the list of states associated with this session */ 101 pthread_mutex_t stlock; /* A lock to protect the list of states associated with this session */
101 struct fd_list states; /* Sentinel for the list of states of this session. */ 102 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 /* Sessions hash table, to allow fast sid to session retrieval */ 105 /* Sessions hash table, to allow fast sid to session retrieval */
106 static struct { 106 static struct {
107 struct fd_list sentinel; /* sentinel element 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 */ 108 pthread_rwlock_t rwlock; /* the rwlock for this sublist */
109 } sess_hash [ 1 << SESS_HASH_SIZE ] ; 109 } sess_hash [ 1 << SESS_HASH_SIZE ] ;
110 #define H_MASK( __hash ) ((__hash) & (( 1 << SESS_HASH_SIZE ) - 1)) 110 #define H_MASK( __hash ) ((__hash) & (( 1 << SESS_HASH_SIZE ) - 1))
111 #define H_LIST( _hash ) (&(sess_hash[H_MASK(_hash)].sentinel)) 111 #define H_LIST( _hash ) (&(sess_hash[H_MASK(_hash)].sentinel))
112 #define H_LOCK( _hash ) (&(sess_hash[H_MASK(_hash)].lock )) 112 #define H_RWLOCK( _hash ) (&(sess_hash[H_MASK(_hash)].rwlock ))
113 113
114 /* The following are used to generate sid values that are eternaly unique */ 114 /* The following are used to generate sid values that are eternaly unique */
115 static uint32_t sid_h; /* initialized to the current time in fd_sess_init */ 115 static uint32_t sid_h; /* initialized to the current time in fd_sess_init */
116 static uint32_t sid_l; /* incremented each time a session id is created */ 116 static uint32_t sid_l; /* incremented each time a session id is created */
117 static pthread_mutex_t sid_lock = PTHREAD_MUTEX_INITIALIZER; 117 static pthread_mutex_t sid_lock = PTHREAD_MUTEX_INITIALIZER;
124 124
125 /* Hierarchy of the locks, to avoid deadlocks: 125 /* Hierarchy of the locks, to avoid deadlocks:
126 * hash lock > state lock > expiry lock 126 * hash lock > state lock > expiry lock
127 * i.e. state lock can be taken while holding the hash lock, but not while holding the expiry lock. 127 * i.e. state lock can be taken while holding the hash lock, but not while holding the expiry lock.
128 * As well, the hash lock cannot be taken while holding a state lock. 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.
129 */ 130 */
130 131
131 /********************************************************************************************************/ 132 /********************************************************************************************************/
132 133
133 /* Initialize a session object. It is not linked now. sid must be already malloc'ed. */ 134 /* Initialize a session object. It is not linked now. sid must be already malloc'ed. */
144 sess->eyec = SI_EYEC; 145 sess->eyec = SI_EYEC;
145 146
146 sess->sid = sid; 147 sess->sid = sid;
147 sess->hash = fd_hash(sid, sidlen); 148 sess->hash = fd_hash(sid, sidlen);
148 fd_list_init(&sess->chain_h, sess); 149 fd_list_init(&sess->chain_h, sess);
150 sess->rc = 0;
149 151
150 CHECK_SYS_DO( clock_gettime(CLOCK_REALTIME, &sess->timeout), return NULL ); 152 CHECK_SYS_DO( clock_gettime(CLOCK_REALTIME, &sess->timeout), return NULL );
151 sess->timeout.tv_sec += SESS_DEFAULT_LIFETIME; 153 sess->timeout.tv_sec += SESS_DEFAULT_LIFETIME;
152 fd_list_init(&sess->expire, sess); 154 fd_list_init(&sess->expire, sess);
153 155
"Welcome to our mercurial repository"