X-Git-Url: http://git.onelab.eu/?p=fprobe-ulog.git;a=blobdiff_plain;f=src%2Fvserver.h;fp=src%2Fvserver.h;h=6f59356182e358596102352b0a79ad39f8c73dfc;hp=6037db3d5164a8725ee23ac7c6c1162062dcca54;hb=703dab51738ba64ce2ba88e70b550c229d6f89b9;hpb=ae84d4a660a154bd0247584a5813e4a01b46bf4b diff --git a/src/vserver.h b/src/vserver.h index 6037db3..6f59356 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_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