filedictrb 0.1.1 → 0.1.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/ext/filedict/filedict.h +21 -3
- data/ext/filedictrb/hash.c +2 -6
- data/lib/filedict/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3c8fd3a6260d33ec56a995b4116af3cdb60ec8b52fa8aee688c7fd0b305b14ae
|
4
|
+
data.tar.gz: '0349634431c7e9abde136b1503e4ae23a8855236cdafb21ee9157f946456c16c'
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5811b3a6fba572d75e39d9fec5d7e2d6cb1bde1701604d80e0fa040de624b7b7c7edca928293fa9814b91614a3c5d6289f15e55becc7e4b1153d34212216ec39
|
7
|
+
data.tar.gz: db8da5021c456578f8654bce8feab2a7f4138f9c3f405423fb441ff3248cc3924b451da94473d5eac1b9d3eccda643d22582b278dbaebb6a7087f819bf896e08
|
data/ext/filedict/filedict.h
CHANGED
@@ -38,7 +38,7 @@ typedef struct filedict_header_t {
|
|
38
38
|
} __attribute__ ((__packed__)) filedict_header_t;
|
39
39
|
|
40
40
|
typedef struct filedict_read_t {
|
41
|
-
|
41
|
+
filedict_t *filedict;
|
42
42
|
const char *key;
|
43
43
|
const char *value;
|
44
44
|
filedict_bucket_t *bucket;
|
@@ -353,7 +353,7 @@ static int filedict_read_advance_entry(filedict_read_t *read) {
|
|
353
353
|
* Returns 0 when there are no more hashmaps, or the latest hashmap has no matching entries.
|
354
354
|
*/
|
355
355
|
static int filedict_read_advance_hashmap(filedict_read_t *read) {
|
356
|
-
|
356
|
+
filedict_t *filedict = read->filedict;
|
357
357
|
|
358
358
|
assert(filedict);
|
359
359
|
assert(filedict->data);
|
@@ -363,6 +363,24 @@ static int filedict_read_advance_hashmap(filedict_read_t *read) {
|
|
363
363
|
if (read->hashmap_i >= header->hashmap_count) log_return(0);
|
364
364
|
|
365
365
|
size_t offset = filedict_file_size(header->initial_bucket_count, read->hashmap_i);
|
366
|
+
|
367
|
+
if (offset >= filedict->data_len) {
|
368
|
+
/* Need to resize! */
|
369
|
+
size_t computed_size = filedict_file_size(header->initial_bucket_count, header->hashmap_count);
|
370
|
+
munmap(filedict->data, filedict->data_len);
|
371
|
+
filedict->data = mmap(
|
372
|
+
filedict->data,
|
373
|
+
computed_size,
|
374
|
+
PROT_READ | PROT_WRITE,
|
375
|
+
MAP_SHARED,
|
376
|
+
filedict->fd,
|
377
|
+
0
|
378
|
+
);
|
379
|
+
if (filedict->data == MAP_FAILED) { filedict->error = strerror(errno); return 0; }
|
380
|
+
filedict->data_len = computed_size;
|
381
|
+
header = (filedict_header_t*)filedict->data;
|
382
|
+
}
|
383
|
+
|
366
384
|
filedict_bucket_t *hashmap = filedict->data + offset;
|
367
385
|
|
368
386
|
read->bucket_count = (size_t)header->initial_bucket_count << read->hashmap_i;
|
@@ -377,7 +395,7 @@ static int filedict_read_advance_hashmap(filedict_read_t *read) {
|
|
377
395
|
/*
|
378
396
|
* Returns a "read" at the given key. If there's a hit, <return>.value will have the value.
|
379
397
|
*/
|
380
|
-
static filedict_read_t filedict_get(
|
398
|
+
static filedict_read_t filedict_get(filedict_t *filedict, const char *key) {
|
381
399
|
filedict_read_t read;
|
382
400
|
read.filedict = filedict;
|
383
401
|
read.key = key;
|
data/ext/filedictrb/hash.c
CHANGED
@@ -3,7 +3,6 @@
|
|
3
3
|
|
4
4
|
extern VALUE mFiledict;
|
5
5
|
VALUE cHash;
|
6
|
-
VALUE mSetExt;
|
7
6
|
VALUE cSet;
|
8
7
|
|
9
8
|
ID id_add;
|
@@ -89,7 +88,7 @@ static VALUE fd_set_add(int argc, VALUE *argv, VALUE self) {
|
|
89
88
|
VALUE fd_hash_ruby_object = rb_ivar_get(self, id_fd_hash);
|
90
89
|
|
91
90
|
if (fd_hash_ruby_object == Qnil) {
|
92
|
-
return
|
91
|
+
return rb_call_super(argc, argv);
|
93
92
|
}
|
94
93
|
|
95
94
|
fd_hash_t *fd_hash = RTYPEDDATA_DATA(fd_hash_ruby_object);
|
@@ -124,8 +123,6 @@ static VALUE fd_hash_access(VALUE self, VALUE key) {
|
|
124
123
|
rb_ivar_set(result, id_fd_hash, self);
|
125
124
|
rb_ivar_set(result, id_fd_key, key);
|
126
125
|
|
127
|
-
rb_extend_object(result, mSetExt);
|
128
|
-
|
129
126
|
return result;
|
130
127
|
}
|
131
128
|
|
@@ -139,9 +136,8 @@ void fdrb_init_hash() {
|
|
139
136
|
|
140
137
|
VALUE rb_cSet = rb_define_class("Set", rb_cObject);
|
141
138
|
cSet = rb_define_class_under(mFiledict, "Set", rb_cSet);
|
142
|
-
mSetExt = rb_define_module_under(mFiledict, "SetExt");
|
143
139
|
|
144
|
-
rb_define_method(
|
140
|
+
rb_define_method(cSet, "add", fd_set_add, -1);
|
145
141
|
|
146
142
|
id_add = rb_intern("add");
|
147
143
|
id_remove = rb_intern("remove");
|
data/lib/filedict/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: filedictrb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nigel Baillie
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-03-
|
11
|
+
date: 2022-03-31 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description:
|
14
14
|
email:
|