X-Git-Url: http://git.onelab.eu/?p=fprobe-ulog.git;a=blobdiff_plain;f=src%2Fvserver.h;h=79a5704de5b0acc7e2d1ea3f2cac2f4255523fdd;hp=6037db3d5164a8725ee23ac7c6c1162062dcca54;hb=20279bd3a3b9cf601cdf6d1434d21f67daac5d18;hpb=ae84d4a660a154bd0247584a5813e4a01b46bf4b diff --git a/src/vserver.h b/src/vserver.h index 6037db3..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; } } @@ -62,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) { @@ -83,4 +101,5 @@ uint32_t xid_to_slice_id(unsigned int xid) { return xid_to_slice_id_slow(xid); } + #endif