diff options
| author | Olivier Houchard <cognet@FreeBSD.org> | 2018-04-02 23:35:32 +0000 | 
|---|---|---|
| committer | Olivier Houchard <cognet@FreeBSD.org> | 2018-04-02 23:35:32 +0000 | 
| commit | e8d27288c2439ee79c81e4684ea90e8ca1aab845 (patch) | |
| tree | 167d58dad3c007074e191f90478c1824dfe32aa5 /src | |
| parent | 358370410ca01ec37e55ea44c0f3cd1fa8860c5d (diff) | |
Diffstat (limited to 'src')
| -rw-r--r-- | src/ck_hs.c | 45 | ||||
| -rw-r--r-- | src/ck_ht.c | 2 | ||||
| -rw-r--r-- | src/ck_ht_hash.h | 18 | ||||
| -rw-r--r-- | src/ck_internal.h | 37 | ||||
| -rw-r--r-- | src/ck_rhs.c | 2 | 
5 files changed, 51 insertions, 53 deletions
| diff --git a/src/ck_hs.c b/src/ck_hs.c index 31510ec51dd7..a7e15eaddbeb 100644 --- a/src/ck_hs.c +++ b/src/ck_hs.c @@ -105,21 +105,10 @@ ck_hs_map_signal(struct ck_hs_map *map, unsigned long h)  	return;  } -void -ck_hs_iterator_init(struct ck_hs_iterator *iterator) +static bool  +_ck_hs_next(struct ck_hs *hs, struct ck_hs_map *map, struct ck_hs_iterator *i, void **key)  { - -	iterator->cursor = NULL; -	iterator->offset = 0; -	return; -} - -bool -ck_hs_next(struct ck_hs *hs, struct ck_hs_iterator *i, void **key) -{ -	struct ck_hs_map *map = hs->map;  	void *value; -  	if (i->offset >= map->capacity)  		return false; @@ -129,6 +118,8 @@ ck_hs_next(struct ck_hs *hs, struct ck_hs_iterator *i, void **key)  #ifdef CK_HS_PP  			if (hs->mode & CK_HS_MODE_OBJECT)  				value = CK_HS_VMA(value); +#else +			(void)hs; /* Avoid unused parameter warning. */  #endif  			i->offset++;  			*key = value; @@ -140,6 +131,32 @@ ck_hs_next(struct ck_hs *hs, struct ck_hs_iterator *i, void **key)  }  void +ck_hs_iterator_init(struct ck_hs_iterator *iterator) +{ + +	iterator->cursor = NULL; +	iterator->offset = 0; +	iterator->map = NULL; +	return; +} + +bool +ck_hs_next(struct ck_hs *hs, struct ck_hs_iterator *i, void **key) +{ +	return _ck_hs_next(hs, hs->map, i, key); +} + +bool +ck_hs_next_spmc(struct ck_hs *hs, struct ck_hs_iterator *i, void **key) +{ +	struct ck_hs_map *m = i->map; +	if (m == NULL) { +		m = i->map = ck_pr_load_ptr(&hs->map); +	} +	return _ck_hs_next(hs, m, i, key); +} + +void  ck_hs_stat(struct ck_hs *hs, struct ck_hs_stat *st)  {  	struct ck_hs_map *map = hs->map; @@ -206,7 +223,7 @@ ck_hs_map_create(struct ck_hs *hs, unsigned long entries)  	map->probe_limit = (unsigned int)limit;  	map->probe_maximum = 0;  	map->capacity = n_entries; -	map->step = ck_internal_bsf(n_entries); +	map->step = ck_cc_ffsl(n_entries);  	map->mask = n_entries - 1;  	map->n_entries = 0; diff --git a/src/ck_ht.c b/src/ck_ht.c index 2c864c5714c2..48b04c9678d9 100644 --- a/src/ck_ht.c +++ b/src/ck_ht.c @@ -171,7 +171,7 @@ ck_ht_map_create(struct ck_ht *table, CK_HT_TYPE entries)  	map->deletions = 0;  	map->probe_maximum = 0;  	map->capacity = n_entries; -	map->step = ck_internal_bsf_64(map->capacity); +	map->step = ck_cc_ffsll(map->capacity);  	map->mask = map->capacity - 1;  	map->n_entries = 0;  	map->entries = (struct ck_ht_entry *)(((uintptr_t)&map[1] + prefix + diff --git a/src/ck_ht_hash.h b/src/ck_ht_hash.h index cd3d7a538bdf..a47dc406249b 100644 --- a/src/ck_ht_hash.h +++ b/src/ck_ht_hash.h @@ -88,7 +88,15 @@ static inline uint64_t rotl64 ( uint64_t x, int8_t r )  FORCE_INLINE static uint32_t getblock ( const uint32_t * p, int i )  { +#ifdef __s390x__ +  uint32_t res; + +  __asm__ ("	lrv	%0,%1\n" +	   : "=r" (res) : "Q" (p[i]) : "cc", "mem"); +  return res; +#else    return p[i]; +#endif /* !__s390x__ */  }  //----------------------------------------------------------------------------- @@ -147,7 +155,9 @@ static inline void MurmurHash3_x86_32 ( const void * key, int len,    switch(len & 3)    {    case 3: k1 ^= tail[2] << 16; +  /* fall through */    case 2: k1 ^= tail[1] << 8; +  /* fall through */    case 1: k1 ^= tail[0];            k1 *= c1; k1 = ROTL32(k1,15); k1 *= c2; h1 ^= k1;    }; @@ -196,11 +206,17 @@ static inline uint64_t MurmurHash64A ( const void * key, int len, uint64_t seed    switch(len & 7)    {    case 7: h ^= (uint64_t)(data2[6]) << 48; +  /* fall through */    case 6: h ^= (uint64_t)(data2[5]) << 40; +  /* fall through */    case 5: h ^= (uint64_t)(data2[4]) << 32; +  /* fall through */    case 4: h ^= (uint64_t)(data2[3]) << 24; +  /* fall through */    case 3: h ^= (uint64_t)(data2[2]) << 16; +  /* fall through */    case 2: h ^= (uint64_t)(data2[1]) << 8; +  /* fall through */    case 1: h ^= (uint64_t)(data2[0]);            h *= m;    }; @@ -249,7 +265,9 @@ static inline uint64_t MurmurHash64B ( const void * key, int len, uint64_t seed    switch(len)    {    case 3: h2 ^= ((const unsigned char*)data)[2] << 16; +  /* fall through */    case 2: h2 ^= ((const unsigned char*)data)[1] << 8; +  /* fall through */    case 1: h2 ^= ((const unsigned char*)data)[0];        h2 *= m;    }; diff --git a/src/ck_internal.h b/src/ck_internal.h index 7aad3d743cee..1bca36a13c74 100644 --- a/src/ck_internal.h +++ b/src/ck_internal.h @@ -80,40 +80,3 @@ ck_internal_max_32(uint32_t x, uint32_t y)  	return x ^ ((x ^ y) & -(x < y));  } - -CK_CC_INLINE static unsigned long -ck_internal_bsf(unsigned long v) -{ -#if defined(__GNUC__) -	return __builtin_ffs(v); -#else -	unsigned int i; -	const unsigned int s = sizeof(unsigned long) * 8 - 1; - -	for (i = 0; i < s; i++) { -		if (v & (1UL << (s - i))) -			return sizeof(unsigned long) * 8 - i; -	} - -	return 1; -#endif /* !__GNUC__ */ -} - -CK_CC_INLINE static uint64_t -ck_internal_bsf_64(uint64_t v) -{ -#if defined(__GNUC__) -	return __builtin_ffs(v); -#else -	unsigned int i; -	const unsigned int s = sizeof(unsigned long) * 8 - 1; - -	for (i = 0; i < s; i++) { -		if (v & (1ULL << (63U - i))) -			return i; -	} -#endif /* !__GNUC__ */ - -	return 1; -} - diff --git a/src/ck_rhs.c b/src/ck_rhs.c index f6dd2ee29e9f..1d6b0f0d9049 100644 --- a/src/ck_rhs.c +++ b/src/ck_rhs.c @@ -366,7 +366,7 @@ ck_rhs_map_create(struct ck_rhs *hs, unsigned long entries)  	map->probe_limit = (unsigned int)limit;  	map->probe_maximum = 0;  	map->capacity = n_entries; -	map->step = ck_internal_bsf(n_entries); +	map->step = ck_cc_ffsl(n_entries);  	map->mask = n_entries - 1;  	map->n_entries = 0; | 
