inmemory_kv 0.1.4 → 0.1.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +3 -0
- data/ext/inmemory_kv.c +30 -14
- data/lib/inmemory_kv/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ee6413bdf95e2e902b4abb882e72284a8742c7bc
|
4
|
+
data.tar.gz: cdc96cbf5654abbd99aa4a263271e8a29e12c374
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b442b6dabd287018b2e519d98eb182340f9e5653f6bc31f973492a965af6be7d4c3dc9324e5353efef71d42f42602f4b383da804cdb19f0504664dedcfac5883
|
7
|
+
data.tar.gz: 1826699cf819121d272488f187dd05367ca85db0944ff9b2ab7eecb95a3771a37cace4e895c4b82afaf1186aec7bbd4ef3063c3a583be8655423ae826023e17f
|
data/README.md
CHANGED
data/ext/inmemory_kv.c
CHANGED
@@ -262,9 +262,11 @@ hash_insert(hash_table* tab, u32 hash) {
|
|
262
262
|
u32 i, pos, buc, npos;
|
263
263
|
if (tab->size == tab->alloced) {
|
264
264
|
u32 new_alloced = tab->alloced ? tab->alloced * 1.5 : 32;
|
265
|
-
|
265
|
+
hash_entry* new_entries = realloc(tab->entries,
|
266
266
|
sizeof(hash_entry)*new_alloced);
|
267
|
-
|
267
|
+
if (new_entries == NULL)
|
268
|
+
return end;
|
269
|
+
tab->entries = new_entries;
|
268
270
|
memset(tab->entries + tab->alloced, 0,
|
269
271
|
sizeof(hash_entry)*(new_alloced - tab->alloced));
|
270
272
|
for (i=tab->alloced; i<new_alloced-1; i++) {
|
@@ -275,8 +277,11 @@ hash_insert(hash_table* tab, u32 hash) {
|
|
275
277
|
}
|
276
278
|
if (tab->size >= tab->nbuckets * 2) {
|
277
279
|
u32 new_nbuckets = tab->nbuckets ? (tab->nbuckets+1)*2-1 : 15;
|
280
|
+
u32* new_buckets = calloc(new_nbuckets, sizeof(u32));
|
281
|
+
if (new_buckets == NULL)
|
282
|
+
return end;
|
278
283
|
free(tab->buckets);
|
279
|
-
tab->buckets =
|
284
|
+
tab->buckets = new_buckets;
|
280
285
|
for (i=0; i<tab->alloced; i++) {
|
281
286
|
if (tab->entries[i].item == NULL)
|
282
287
|
continue;
|
@@ -373,7 +378,7 @@ static hash_item*
|
|
373
378
|
kv_insert(inmemory_kv *kv, const char* key, u32 key_size, const char* val, u32 val_size) {
|
374
379
|
u32 hash = kv_hash(key, key_size);
|
375
380
|
u32 pos;
|
376
|
-
hash_item*
|
381
|
+
hash_item *item, *old_item = NULL;
|
377
382
|
pos = hash_hash_first(&kv->tab, hash);
|
378
383
|
while (pos != end) {
|
379
384
|
item = kv->tab.entries[pos].item;
|
@@ -385,15 +390,13 @@ kv_insert(inmemory_kv *kv, const char* key, u32 key_size, const char* val, u32 v
|
|
385
390
|
}
|
386
391
|
if (pos == end) {
|
387
392
|
pos = hash_insert(&kv->tab, hash);
|
393
|
+
if (pos == end)
|
394
|
+
return NULL;
|
388
395
|
item = NULL;
|
389
396
|
} else {
|
390
397
|
hash_up(&kv->tab, pos);
|
391
398
|
if (!item_compatible(item, val_size) || item->rc > 0) {
|
392
|
-
|
393
|
-
if (item->rc > 0)
|
394
|
-
item->rc--;
|
395
|
-
else
|
396
|
-
free(item);
|
399
|
+
old_item = item;
|
397
400
|
item = NULL;
|
398
401
|
}
|
399
402
|
}
|
@@ -401,16 +404,24 @@ kv_insert(inmemory_kv *kv, const char* key, u32 key_size, const char* val, u32 v
|
|
401
404
|
u32 new_size = item_need_size(key_size, val_size);
|
402
405
|
#ifdef HAVE_MALLOC_USABLE_SIZE
|
403
406
|
item = malloc(new_size);
|
404
|
-
|
407
|
+
if (item == NULL)
|
408
|
+
return NULL;
|
405
409
|
new_size = malloc_usable_size(item);
|
406
|
-
item->rc = 0;
|
407
410
|
#else
|
408
411
|
new_size = (new_size + 7) & 7;
|
409
412
|
item = malloc(new_size);
|
410
|
-
|
411
|
-
|
413
|
+
if (item == NULL)
|
414
|
+
return NULL;
|
412
415
|
item->item_size = new_size;
|
413
416
|
#endif
|
417
|
+
if (old_item != NULL) {
|
418
|
+
kv->total_size -= item_size(old_item);
|
419
|
+
if (old_item->rc > 0)
|
420
|
+
old_item->rc--;
|
421
|
+
else
|
422
|
+
free(old_item);
|
423
|
+
}
|
424
|
+
item->rc = 0;
|
414
425
|
kv->total_size += new_size;
|
415
426
|
item_set_sizes(item, key_size, val_size);
|
416
427
|
item->pos = pos;
|
@@ -632,7 +643,9 @@ rb_kv_set(VALUE self, VALUE vkey, VALUE vval) {
|
|
632
643
|
val = RSTRING_PTR(vval);
|
633
644
|
vsize = RSTRING_LEN(vval);
|
634
645
|
|
635
|
-
kv_insert(kv, key, ksize, val, vsize)
|
646
|
+
if (kv_insert(kv, key, ksize, val, vsize) == NULL) {
|
647
|
+
rb_raise(rb_eNoMemError, "could not malloc");
|
648
|
+
}
|
636
649
|
|
637
650
|
return vval;
|
638
651
|
}
|
@@ -701,6 +714,9 @@ rb_kv_unshift(VALUE self, VALUE vkey, VALUE vval) {
|
|
701
714
|
vsize = RSTRING_LEN(vval);
|
702
715
|
|
703
716
|
item = kv_insert(kv, key, ksize, val, vsize);
|
717
|
+
if (item == NULL) {
|
718
|
+
rb_raise(rb_eNoMemError, "could not malloc");
|
719
|
+
}
|
704
720
|
kv_down(kv, item);
|
705
721
|
|
706
722
|
return vval;
|
data/lib/inmemory_kv/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: inmemory_kv
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sokolov Yura aka funny_falcon
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-07-
|
11
|
+
date: 2015-07-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|