X-Git-Url: http://git.onelab.eu/?p=fprobe-ulog.git;a=blobdiff_plain;f=src%2Fvserver.h;h=79a5704de5b0acc7e2d1ea3f2cac2f4255523fdd;hp=afeebf20e169378b38f2aa69504be026a50979d3;hb=20279bd3a3b9cf601cdf6d1434d21f67daac5d18;hpb=f8cd9d2b367c472229d06806ad3be08f221823bd diff --git a/src/vserver.h b/src/vserver.h index afeebf2..79a5704 100644 --- a/src/vserver.h +++ b/src/vserver.h @@ -31,13 +31,25 @@ struct hash_entry { struct hash_entry slice_id_hash[HASH_SIZE]; +void init_slice_id_hash() { + memset(slice_id_hash, 0, HASH_SIZE); +} void set_hash_entry(unsigned int xid, uint32_t slice_id) { int idx = xid & HASH_TABLE_MASK; int i; - for (i = idx;i!=idx;i=(i+1) & HASH_TABLE_MASK) { - struct hash_entry *entry = &slice_id_hash[i]; + + struct hash_entry *entry = &slice_id_hash[idx]; + if (entry->xid == 0 || entry->xid ==xid) { + entry->slice_id = slice_id; + entry->xid = xid; + return; + } + + for (i = idx+1;i!=idx;i=(i+1) & HASH_TABLE_MASK) { + entry = &slice_id_hash[i]; if (entry->xid == 0 || entry->xid == xid) { - entry->xid = slice_id; + entry->slice_id = slice_id; + entry->xid = xid; break; } } @@ -53,6 +65,8 @@ uint32_t xid_to_slice_id_slow(unsigned int xid) { fscanf(fp,"%u",&slice_id); set_hash_entry(xid, slice_id); } + else + slice_id = xid; // Let's leave some evidence behind, even if it's imperfect. fclose(fp); return slice_id; } @@ -60,15 +74,21 @@ uint32_t xid_to_slice_id_slow(unsigned int xid) { uint32_t xid_to_slice_id_fast(unsigned int xid) { int idx = xid & HASH_TABLE_MASK; int i; - uint32_t slice_id; - for (i = idx;i!=idx;i=(i+1) & HASH_TABLE_MASK) { - struct hash_entry *entry = &slice_id_hash[i]; + uint32_t slice_id = 0; + + struct hash_entry *entry = &slice_id_hash[idx]; + if (entry->xid == xid) + return entry->slice_id; + + for (i = idx+1;i!=idx;i=(i+1) & HASH_TABLE_MASK) { + entry = &slice_id_hash[i]; if (entry->xid == xid) { - entry->xid = slice_id; + slice_id = entry->slice_id; break; } } - + + return slice_id; } uint32_t xid_to_slice_id(unsigned int xid) { @@ -81,4 +101,5 @@ uint32_t xid_to_slice_id(unsigned int xid) { return xid_to_slice_id_slow(xid); } + #endif