Mercurial > hg > freeDiameter
comparison libfdcore/peers.c @ 743:5d529eb0ad33 1.1.0
Fix bug in peers order
author | Sebastien Decugis <sdecugis@nict.go.jp> |
---|---|
date | Tue, 29 Mar 2011 11:42:53 +0900 |
parents | 4a9f08d6b6ba |
children | 2557127f3c8b |
comparison
equal
deleted
inserted
replaced
742:eefb6fa3c904 | 743:5d529eb0ad33 |
---|---|
147 struct fd_peer * next = (struct fd_peer *)li; | 147 struct fd_peer * next = (struct fd_peer *)li; |
148 int cont; | 148 int cont; |
149 int cmp = fd_os_almostcasesrch( p->p_hdr.info.pi_diamid, p->p_hdr.info.pi_diamidlen, | 149 int cmp = fd_os_almostcasesrch( p->p_hdr.info.pi_diamid, p->p_hdr.info.pi_diamidlen, |
150 next->p_hdr.info.pi_diamid, next->p_hdr.info.pi_diamidlen, | 150 next->p_hdr.info.pi_diamid, next->p_hdr.info.pi_diamidlen, |
151 &cont ); | 151 &cont ); |
152 if (cmp < 0) | 152 if (cmp > 0) |
153 li_inf = li; | 153 li_inf = li; /* it will come after this element, for sure */ |
154 | 154 |
155 if (cmp == 0) { | 155 if (cmp == 0) { |
156 ret = EEXIST; | 156 ret = EEXIST; /* we have a duplicate */ |
157 break; | 157 break; |
158 } | 158 } |
159 if (!cont) | 159 if (!cont) |
160 break; | 160 break; |
161 } | 161 } |
188 | 188 |
189 *peer = NULL; | 189 *peer = NULL; |
190 | 190 |
191 /* Search in the list */ | 191 /* Search in the list */ |
192 CHECK_POSIX( pthread_rwlock_rdlock(&fd_g_peers_rw) ); | 192 CHECK_POSIX( pthread_rwlock_rdlock(&fd_g_peers_rw) ); |
193 if (igncase) | 193 if (igncase) { |
194 for (li = fd_g_peers.next; li != &fd_g_peers; li = li->next) { | 194 for (li = fd_g_peers.next; li != &fd_g_peers; li = li->next) { |
195 struct fd_peer * next = (struct fd_peer *)li; | 195 struct fd_peer * next = (struct fd_peer *)li; |
196 int cmp, cont; | 196 int cmp, cont; |
197 cmp = fd_os_almostcasesrch( diamid, diamidlen, next->p_hdr.info.pi_diamid, next->p_hdr.info.pi_diamidlen, &cont ); | 197 cmp = fd_os_almostcasesrch( diamid, diamidlen, next->p_hdr.info.pi_diamid, next->p_hdr.info.pi_diamidlen, &cont ); |
198 if (cmp == 0) { | 198 if (cmp == 0) { |
200 break; | 200 break; |
201 } | 201 } |
202 if (!cont) | 202 if (!cont) |
203 break; | 203 break; |
204 } | 204 } |
205 else | 205 } else { |
206 for (li = fd_g_peers.next; li != &fd_g_peers; li = li->next) { | 206 for (li = fd_g_peers.next; li != &fd_g_peers; li = li->next) { |
207 struct fd_peer * next = (struct fd_peer *)li; | 207 struct fd_peer * next = (struct fd_peer *)li; |
208 int cmp = fd_os_cmp( diamid, diamidlen, next->p_hdr.info.pi_diamid, next->p_hdr.info.pi_diamidlen ); | 208 int cmp = fd_os_cmp( diamid, diamidlen, next->p_hdr.info.pi_diamid, next->p_hdr.info.pi_diamidlen ); |
209 if (cmp > 0) | 209 if (cmp > 0) |
210 continue; | 210 continue; |
211 if (cmp == 0) | 211 if (cmp == 0) |
212 *peer = &next->p_hdr; | 212 *peer = &next->p_hdr; |
213 break; | 213 break; |
214 } | 214 } |
215 } | |
215 CHECK_POSIX( pthread_rwlock_unlock(&fd_g_peers_rw) ); | 216 CHECK_POSIX( pthread_rwlock_unlock(&fd_g_peers_rw) ); |
216 | 217 |
217 return 0; | 218 return 0; |
218 } | 219 } |
219 | 220 |