filedictrb 0.1.2 → 0.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3c8fd3a6260d33ec56a995b4116af3cdb60ec8b52fa8aee688c7fd0b305b14ae
4
- data.tar.gz: '0349634431c7e9abde136b1503e4ae23a8855236cdafb21ee9157f946456c16c'
3
+ metadata.gz: aad965d1fb0dd25c74c20f917b2f71e0d48fc7d6dea59bab8ad2c5990b3fb8fe
4
+ data.tar.gz: cd8c479f17d113b19d5ef89d565aeab6c51305e1e0f81dab3d8d6a538555009b
5
5
  SHA512:
6
- metadata.gz: 5811b3a6fba572d75e39d9fec5d7e2d6cb1bde1701604d80e0fa040de624b7b7c7edca928293fa9814b91614a3c5d6289f15e55becc7e4b1153d34212216ec39
7
- data.tar.gz: db8da5021c456578f8654bce8feab2a7f4138f9c3f405423fb441ff3248cc3924b451da94473d5eac1b9d3eccda643d22582b278dbaebb6a7087f819bf896e08
6
+ metadata.gz: 2dc64caded0eadba4cb03da2dfb926b3c488d6773df59087752953371e5dfabeeac4625478f0ac33a26c4a60f76105a8026ee49aa6e2c700437c0e992ba6a6fe
7
+ data.tar.gz: 7e392f4e734fbe940fb4d86c7a04700edcad3cbab286d4103f6846dbcadb1f2fd01ac8a6a272dd31e542ded3fb919fcfa6b566919161ab1cc3782a56692a2281
@@ -27,6 +27,7 @@ typedef size_t (*filedict_hash_function_t)(const char *);
27
27
  typedef struct filedict_t {
28
28
  const char *error;
29
29
  int fd;
30
+ int flags;
30
31
  void *data;
31
32
  size_t data_len;
32
33
  filedict_hash_function_t hash_function;
@@ -96,6 +97,7 @@ static size_t filedict_copy_string(char *dest, const char *src, size_t max_len)
96
97
  static void filedict_init(filedict_t *filedict) {
97
98
  filedict->error = NULL;
98
99
  filedict->fd = 0;
100
+ filedict->flags = 0;
99
101
  filedict->data_len = 0;
100
102
  filedict->data = NULL;
101
103
  filedict->hash_function = filedict_default_hash_function;
@@ -110,6 +112,7 @@ static void filedict_deinit(filedict_t *filedict) {
110
112
  if (filedict->fd) {
111
113
  close(filedict->fd);
112
114
  filedict->fd = 0;
115
+ filedict->flags = 0;
113
116
  }
114
117
  }
115
118
 
@@ -146,6 +149,7 @@ static void filedict_open_f(
146
149
  int flags,
147
150
  unsigned int initial_bucket_count
148
151
  ) {
152
+ filedict->flags = flags;
149
153
  filedict->fd = open(filename, flags, 0666);
150
154
  if (filedict->fd == -1) { filedict->error = strerror(errno); return; }
151
155
 
@@ -154,7 +158,7 @@ static void filedict_open_f(
154
158
  filedict->data = mmap(
155
159
  NULL,
156
160
  filedict->data_len,
157
- PROT_READ | PROT_WRITE,
161
+ PROT_READ | ((flags & O_RDWR) ? PROT_WRITE : 0),
158
162
  MAP_SHARED,
159
163
  filedict->fd,
160
164
  0
@@ -163,8 +167,11 @@ static void filedict_open_f(
163
167
 
164
168
  filedict_header_t *data = (filedict_header_t *)filedict->data;
165
169
  assert(initial_bucket_count <= UINT_MAX);
166
- data->initial_bucket_count = initial_bucket_count;
167
- data->hashmap_count = 1;
170
+
171
+ if (data->initial_bucket_count == 0) {
172
+ data->initial_bucket_count = initial_bucket_count;
173
+ data->hashmap_count = 1;
174
+ }
168
175
  }
169
176
 
170
177
  /*
@@ -272,7 +279,7 @@ try_again:
272
279
  filedict->data = mmap(
273
280
  filedict->data,
274
281
  new_data_len,
275
- PROT_READ | PROT_WRITE,
282
+ PROT_READ | ((filedict->flags & O_RDWR) ? PROT_WRITE : 0),
276
283
  MAP_SHARED,
277
284
  filedict->fd,
278
285
  0
@@ -286,6 +293,27 @@ try_again:
286
293
  goto try_again;
287
294
  }
288
295
 
296
+ /*
297
+ * Resizes the filedict based on the header hashmap count and initial bucket count.
298
+ * Naturally, your pointers into the map will become invalid after calling this.
299
+ */
300
+ static void filedict_resize(filedict_t *filedict) {
301
+ filedict_header_t *header = (filedict_header_t*)filedict->data;
302
+ size_t computed_size = filedict_file_size(header->initial_bucket_count, header->hashmap_count);
303
+
304
+ munmap(filedict->data, filedict->data_len);
305
+ filedict->data = mmap(
306
+ filedict->data,
307
+ computed_size,
308
+ PROT_READ | ((filedict->flags & O_RDWR) ? PROT_WRITE : 0),
309
+ MAP_SHARED,
310
+ filedict->fd,
311
+ 0
312
+ );
313
+ if (filedict->data == MAP_FAILED) { filedict->error = strerror(errno); return; }
314
+ filedict->data_len = computed_size;
315
+ }
316
+
289
317
  /*
290
318
  * There are 3 "levels" to a filedict. From top to bottom:
291
319
  * 1. Hashmap - which hashmap are we looking at? We create additional hashmaps to handle overflow.
@@ -365,19 +393,8 @@ static int filedict_read_advance_hashmap(filedict_read_t *read) {
365
393
  size_t offset = filedict_file_size(header->initial_bucket_count, read->hashmap_i);
366
394
 
367
395
  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;
396
+ filedict_resize(filedict);
397
+ if (filedict->error) log_return(0);
381
398
  header = (filedict_header_t*)filedict->data;
382
399
  }
383
400
 
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Filedict
4
- VERSION = "0.1.2"
4
+ VERSION = "0.1.3"
5
5
  end
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.2
4
+ version: 0.1.3
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-31 00:00:00.000000000 Z
11
+ date: 2022-04-03 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description:
14
14
  email:
@@ -58,7 +58,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
58
58
  - !ruby/object:Gem::Version
59
59
  version: '0'
60
60
  requirements: []
61
- rubygems_version: 3.3.3
61
+ rubygems_version: 3.1.6
62
62
  signing_key:
63
63
  specification_version: 4
64
64
  summary: Uses filedict to emulate a file-backed Hash<Set<String>>