transaction: Change id allocator method to be 'circular'

The idea is to find the highest used id and try to get the
next. This way when there are transactions back to back with
an overlap, we go 0 1 2 3 4 5 6 0 1 2 ...

Signed-off-by: Sylvain Munaut <tnt@246tNt.com>
This commit is contained in:
Sylvain Munaut 2009-12-24 13:26:17 +01:00 committed by Harald Welte
parent d0cf7ba687
commit 926fcecc2d
1 changed files with 8 additions and 3 deletions

View File

@ -119,7 +119,7 @@ int trans_assign_trans_id(struct gsm_subscriber *subscr,
struct gsm_network *net = subscr->net;
struct gsm_trans *trans;
unsigned int used_tid_bitmask = 0;
int i;
int i, j, h;
if (ti_flag)
ti_flag = 0x8;
@ -133,9 +133,14 @@ int trans_assign_trans_id(struct gsm_subscriber *subscr,
used_tid_bitmask |= (1 << trans->transaction_id);
}
/* find a new one, trying to go in a 'circular' pattern */
for (h = 6; h > 0; h--)
if (used_tid_bitmask & (1 << (h | ti_flag)))
break;
for (i = 0; i < 7; i++) {
if ((used_tid_bitmask & (1 << (i | ti_flag))) == 0)
return i | ti_flag;
j = ((h + i) % 7) | ti_flag;
if ((used_tid_bitmask & (1 << j)) == 0)
return j;
}
return -1;