File Coverage

xs/i32.xs
Criterion Covered Total %
statement 53 301 17.6
branch 67 600 11.1
condition n/a
subroutine n/a
pod n/a
total 120 901 13.3


line stmt bran cond sub pod time code
1             MODULE = Data::HashMap::Shared PACKAGE = Data::HashMap::Shared::I32
2             PROTOTYPES: DISABLE
3              
4             SV*
5             new(char* class, SV* path_sv, UV max_entries, UV lru_max = 0, UV ttl_default = 0, UV lru_skip = 0)
6             CODE:
7 4 50         char errbuf[SHM_ERR_BUFLEN]; const char* path = SvOK(path_sv) ? SvPV_nolen(path_sv) : NULL; ShmHandle* map = shm_i32_create(path, (uint32_t)max_entries, (uint32_t)lru_max, (uint32_t)ttl_default, (uint32_t)lru_skip, errbuf);
8 4 50         if (!map) croak("HashMap::Shared::I32: %s", errbuf[0] ? errbuf : "unknown error");
    0          
9 4           RETVAL = sv_setref_pv(newSV(0), class, (void*)map);
10             OUTPUT:
11             RETVAL
12              
13             SV*
14             new_sharded(char* class, char* path_prefix, UV num_shards, UV max_entries, UV lru_max = 0, UV ttl_default = 0, UV lru_skip = 0)
15             CODE:
16 0           char errbuf[SHM_ERR_BUFLEN]; ShmHandle* map = shm_i32_create_sharded(path_prefix, (uint32_t)num_shards, (uint32_t)max_entries, (uint32_t)lru_max, (uint32_t)ttl_default, (uint32_t)lru_skip, errbuf);
17 0 0         if (!map) croak("HashMap::Shared::I32: %s", errbuf[0] ? errbuf : "unknown error");
    0          
18 0           RETVAL = sv_setref_pv(newSV(0), class, (void*)map);
19             OUTPUT:
20             RETVAL
21              
22              
23             SV*
24             new_memfd(char* class, SV* name_sv, UV max_entries, UV lru_max = 0, UV ttl_default = 0, UV lru_skip = 0)
25             CODE:
26             char errbuf[SHM_ERR_BUFLEN];
27 0 0         const char* name = SvOK(name_sv) ? SvPV_nolen(name_sv) : NULL;
28 0           ShmHandle* map = shm_i32_create_memfd(name, (uint32_t)max_entries, (uint32_t)lru_max, (uint32_t)ttl_default, (uint32_t)lru_skip, errbuf);
29 0 0         if (!map) croak("Data::HashMap::Shared::I32: %s", errbuf[0] ? errbuf : "unknown error");
    0          
30 0           RETVAL = sv_setref_pv(newSV(0), class, (void*)map);
31             OUTPUT:
32             RETVAL
33              
34             SV*
35             new_from_fd(char* class, int fd)
36             CODE:
37             char errbuf[SHM_ERR_BUFLEN];
38 0           ShmHandle* map = shm_i32_open_fd(fd, errbuf);
39 0 0         if (!map) croak("Data::HashMap::Shared::I32: %s", errbuf[0] ? errbuf : "unknown error");
    0          
40 0           RETVAL = sv_setref_pv(newSV(0), class, (void*)map);
41             OUTPUT:
42             RETVAL
43              
44             IV
45             memfd(SV* self_sv)
46             CODE:
47 0 0         EXTRACT_MAP("Data::HashMap::Shared::I32", self_sv);
    0          
    0          
48 0 0         RETVAL = h->backing_fd;
49             OUTPUT:
50             RETVAL
51              
52              
53             void
54             sync(SV* self_sv)
55             CODE:
56 0 0         EXTRACT_MAP("Data::HashMap::Shared::I32", self_sv);
    0          
    0          
57 0 0         if (shm_msync(h) != 0) croak("Data::HashMap::Shared::I32 sync: %s", strerror(errno));
58              
59             void
60             DESTROY(SV* self_sv)
61             CODE:
62 4 50         if (!SvROK(self_sv)) return;
63 4           ShmHandle* h = INT2PTR(ShmHandle*, SvIV(SvRV(self_sv)));
64 4 50         if (!h) return;
65 4           sv_setiv(SvRV(self_sv), 0);
66 4           shm_close_map(h);
67              
68             bool
69             put(SV* self_sv, int32_t key, int32_t value)
70             CODE:
71 1014 50         EXTRACT_MAP("Data::HashMap::Shared::I32", self_sv);
    50          
    50          
72 1014 50         RETVAL = shm_i32_put(h, key, value);
73             OUTPUT:
74             RETVAL
75              
76             UV
77             set_multi(SV* self_sv, ...)
78             CODE:
79 0 0         EXTRACT_MAP("Data::HashMap::Shared::I32", self_sv);
    0          
    0          
80 0 0         if ((items - 1) % 2 != 0) croak("set_multi requires even number of arguments (key, value pairs)");
81 0           uint32_t count = 0;
82 0 0         if (h->shard_handles) {
83 0 0         for (int i = 1; i < items; i += 2)
84 0           count += shm_i32_put(h, (int32_t)SvIV(ST(i)), (int32_t)SvIV(ST(i + 1)));
85             } else {
86 0           ShmHeader *hdr = h->hdr;
87 0           shm_rwlock_wrlock(hdr);
88 0           shm_seqlock_write_begin(&hdr->seq);
89 0 0         for (int i = 1; i < items; i += 2)
90 0           count += shm_i32_put_inner(h, (int32_t)SvIV(ST(i)), (int32_t)SvIV(ST(i + 1)), SHM_TTL_USE_DEFAULT);
91 0           shm_seqlock_write_end(&hdr->seq);
92 0           shm_rwlock_wrunlock(hdr);
93             }
94 0 0         RETVAL = count;
95             OUTPUT:
96             RETVAL
97              
98             void
99             get_multi(SV* self_sv, ...)
100             PPCODE:
101 0 0         EXTRACT_MAP("Data::HashMap::Shared::I32", self_sv);
    0          
    0          
102 0           int nkeys = items - 1;
103 0 0         if (nkeys == 0) XSRETURN_EMPTY;
104 0 0         EXTEND(SP, nkeys);
    0          
105 0 0         if (h->shard_handles) {
106 0 0         for (int i = 0; i < nkeys; i++) {
107 0           int32_t key = (int32_t)SvIV(ST(i + 1));
108             int32_t val;
109 0 0         if (shm_i32_get(h, key, &val))
110 0           mPUSHi(val);
111             else
112 0           PUSHs(&PL_sv_undef);
113             }
114             } else {
115 0           ShmHeader *hdr = h->hdr;
116 0           ShmNodeI32 *nodes = (ShmNodeI32 *)h->nodes;
117 0           uint8_t *states = h->states;
118 0 0         uint32_t now = h->expires_at ? shm_now() : 0;
119             /* Phase 1: compute hashes and prefetch first probe positions */
120 0           uint32_t *hashes = NULL;
121 0           Newx(hashes, nkeys, uint32_t);
122 0           SAVEFREEPV(hashes);
123 0           RDLOCK_GUARD(hdr);
124 0           uint32_t mask = hdr->table_cap - 1;
125 0 0         for (int i = 0; i < nkeys; i++) {
126 0           hashes[i] = shm_hash_int64((int64_t)(int32_t)SvIV(ST(i + 1)));
127 0           __builtin_prefetch(&states[hashes[i] & mask], 0, 0);
128 0           __builtin_prefetch(&nodes[hashes[i] & mask], 0, 0);
129             }
130             /* Phase 2: probe each key */
131 0 0         for (int i = 0; i < nkeys; i++) {
132 0           int32_t key = (int32_t)SvIV(ST(i + 1));
133 0           uint32_t hash = hashes[i];
134 0           uint32_t pos = hash & mask;
135 0           uint8_t tag = SHM_MAKE_TAG(hash);
136 0           int found = 0;
137 0           int32_t val = 0;
138 0 0         for (uint32_t j = 0; j <= mask; j++) {
139 0           uint32_t idx = (pos + j) & mask;
140 0           uint8_t st = states[idx];
141 0 0         if (st == SHM_EMPTY) break;
142 0 0         if (st != tag) continue;
143 0 0         if (nodes[idx].key == key) {
144 0 0         if (h->expires_at && h->expires_at[idx] && now >= h->expires_at[idx]) break;
    0          
    0          
145 0           val = nodes[idx].value;
146 0           found = 1;
147 0           break;
148             }
149             }
150 0 0         if (found) mPUSHi(val);
151 0           else PUSHs(&PL_sv_undef);
152             /* Prefetch next key's probe position */
153 0 0         if (i + 1 < nkeys) {
154 0           uint32_t npos = hashes[i + 1] & mask;
155 0           __builtin_prefetch(&states[npos], 0, 0);
156 0           __builtin_prefetch(&nodes[npos], 0, 0);
157             }
158             }
159             }
160              
161             SV*
162             stats(SV* self_sv)
163             CODE:
164 0 0         EXTRACT_MAP("Data::HashMap::Shared::I32", self_sv);
    0          
    0          
165 0           HV *hv = newHV();
166 0           hv_store(hv, "size", 4, newSVuv(shm_i32_size(h)), 0);
167 0           hv_store(hv, "capacity", 8, newSVuv(shm_i32_capacity(h)), 0);
168 0           hv_store(hv, "max_entries", 11, newSVuv(shm_i32_max_entries(h)), 0);
169 0           hv_store(hv, "tombstones", 10, newSVuv(shm_i32_tombstones(h)), 0);
170 0           hv_store(hv, "mmap_size", 9, newSVuv(shm_i32_mmap_size(h)), 0);
171 0           hv_store(hv, "arena_used", 10, newSVuv(shm_i32_arena_used(h)), 0);
172 0           hv_store(hv, "arena_cap", 9, newSVuv(shm_i32_arena_cap(h)), 0);
173 0           hv_store(hv, "evictions", 9, newSVuv(shm_i32_stat_evictions(h)), 0);
174 0           hv_store(hv, "expired", 7, newSVuv(shm_i32_stat_expired(h)), 0);
175 0           hv_store(hv, "recoveries", 10, newSVuv(shm_i32_stat_recoveries(h)), 0);
176 0           hv_store(hv, "max_size", 8, newSVuv(shm_i32_max_size(h)), 0);
177 0           hv_store(hv, "ttl", 3, newSVuv(shm_i32_ttl(h)), 0);
178 0           RETVAL = newRV_noinc((SV*)hv);
179             OUTPUT:
180             RETVAL
181              
182             bool
183             cas(SV* self_sv, int32_t key, int32_t expected, int32_t desired)
184             CODE:
185 1 50         EXTRACT_MAP("Data::HashMap::Shared::I32", self_sv);
    50          
    50          
186 1 50         RETVAL = shm_i32_cas(h, key, expected, desired);
187             OUTPUT:
188             RETVAL
189              
190             bool
191             persist(SV* self_sv, int32_t key)
192             CODE:
193 0 0         EXTRACT_MAP("Data::HashMap::Shared::I32", self_sv);
    0          
    0          
194 0 0         RETVAL = shm_i32_persist(h, key);
195             OUTPUT:
196             RETVAL
197              
198             bool
199             set_ttl(SV* self_sv, int32_t key, UV ttl_sec)
200             CODE:
201 0 0         EXTRACT_MAP("Data::HashMap::Shared::I32", self_sv);
    0          
    0          
202 0 0         RETVAL = shm_i32_set_ttl(h, key, (uint32_t)ttl_sec);
203             OUTPUT:
204             RETVAL
205              
206             SV*
207             get(SV* self_sv, int32_t key)
208             CODE:
209 7 50         EXTRACT_MAP("Data::HashMap::Shared::I32", self_sv);
    50          
    50          
210             int32_t value;
211 7 50         if (!shm_i32_get(h, key, &value)) XSRETURN_UNDEF;
212 7           RETVAL = newSViv(value);
213             OUTPUT:
214             RETVAL
215              
216             bool
217             remove(SV* self_sv, int32_t key)
218             CODE:
219 500 50         EXTRACT_MAP("Data::HashMap::Shared::I32", self_sv);
    50          
    50          
220 500 50         RETVAL = shm_i32_remove(h, key);
221             OUTPUT:
222             RETVAL
223              
224             bool
225             exists(SV* self_sv, int32_t key)
226             CODE:
227 0 0         EXTRACT_MAP("Data::HashMap::Shared::I32", self_sv);
    0          
    0          
228 0 0         RETVAL = shm_i32_exists(h, key);
229             OUTPUT:
230             RETVAL
231              
232             SV*
233             incr(SV* self_sv, int32_t key)
234             CODE:
235 1 50         EXTRACT_MAP("Data::HashMap::Shared::I32", self_sv);
    50          
    50          
236             int ok;
237 1           int32_t val = shm_i32_incr_by(h, key, 1, &ok);
238 1 50         if (!ok) croak("HashMap::Shared::I32: increment failed");
239 1           RETVAL = newSViv(val);
240             OUTPUT:
241             RETVAL
242              
243             SV*
244             decr(SV* self_sv, int32_t key)
245             CODE:
246 0 0         EXTRACT_MAP("Data::HashMap::Shared::I32", self_sv);
    0          
    0          
247             int ok;
248 0           int32_t val = shm_i32_incr_by(h, key, -1, &ok);
249 0 0         if (!ok) croak("HashMap::Shared::I32: decrement failed");
250 0           RETVAL = newSViv(val);
251             OUTPUT:
252             RETVAL
253              
254             SV*
255             incr_by(SV* self_sv, int32_t key, int32_t delta)
256             CODE:
257 1 50         EXTRACT_MAP("Data::HashMap::Shared::I32", self_sv);
    50          
    50          
258             int ok;
259 1           int32_t val = shm_i32_incr_by(h, key, delta, &ok);
260 1 50         if (!ok) croak("HashMap::Shared::I32: incr_by failed");
261 1           RETVAL = newSViv(val);
262             OUTPUT:
263             RETVAL
264              
265             UV
266             size(SV* self_sv)
267             CODE:
268 2 50         EXTRACT_MAP("Data::HashMap::Shared::I32", self_sv);
    50          
    50          
269 2 50         RETVAL = (UV)shm_i32_size(h);
270             OUTPUT:
271             RETVAL
272              
273             UV
274             max_entries(SV* self_sv)
275             CODE:
276 0 0         EXTRACT_MAP("Data::HashMap::Shared::I32", self_sv);
    0          
    0          
277 0 0         RETVAL = (UV)shm_i32_max_entries(h);
278             OUTPUT:
279             RETVAL
280              
281             void
282             keys(SV* self_sv)
283             PPCODE:
284 0 0         EXTRACT_MAP("Data::HashMap::Shared::I32", self_sv);
    0          
    0          
285 0 0         uint32_t ns = h->shard_handles ? h->num_shards : 1;
286 0 0         for (uint32_t si = 0; si < ns; si++) {
287 0 0         ShmHandle *sh = h->shard_handles ? h->shard_handles[si] : h;
288 0           ShmHeader *hdr = sh->hdr;
289 0           ShmNodeI32 *nodes = (ShmNodeI32 *)sh->nodes;
290 0 0         uint32_t now = sh->expires_at ? shm_now() : 0;
291 0           RDLOCK_GUARD(hdr);
292 0 0         EXTEND(SP, hdr->size);
293 0 0         for (uint32_t i = 0; i < hdr->table_cap; i++) {
294 0 0         if (SHM_IS_LIVE(sh->states[i]) && !SHM_IS_EXPIRED(sh, i, now))
    0          
    0          
    0          
295 0 0         mXPUSHi(nodes[i].key);
296             }
297             }
298              
299             void
300             values(SV* self_sv)
301             PPCODE:
302 1 50         EXTRACT_MAP("Data::HashMap::Shared::I32", self_sv);
    50          
    50          
303 1 50         uint32_t ns = h->shard_handles ? h->num_shards : 1;
304 2 100         for (uint32_t si = 0; si < ns; si++) {
305 1 50         ShmHandle *sh = h->shard_handles ? h->shard_handles[si] : h;
306 1           ShmHeader *hdr = sh->hdr;
307 1           ShmNodeI32 *nodes = (ShmNodeI32 *)sh->nodes;
308 1 50         uint32_t now = sh->expires_at ? shm_now() : 0;
309 1           RDLOCK_GUARD(hdr);
310 1 50         EXTEND(SP, hdr->size);
311 17 100         for (uint32_t i = 0; i < hdr->table_cap; i++) {
312 16 100         if (SHM_IS_LIVE(sh->states[i]) && !SHM_IS_EXPIRED(sh, i, now))
    50          
    0          
    0          
313 10 50         mXPUSHi(nodes[i].value);
314             }
315             }
316              
317             void
318             items(SV* self_sv)
319             PPCODE:
320 0 0         EXTRACT_MAP("Data::HashMap::Shared::I32", self_sv);
    0          
    0          
321 0 0         uint32_t ns = h->shard_handles ? h->num_shards : 1;
322 0 0         for (uint32_t si = 0; si < ns; si++) {
323 0 0         ShmHandle *sh = h->shard_handles ? h->shard_handles[si] : h;
324 0           ShmHeader *hdr = sh->hdr;
325 0           ShmNodeI32 *nodes = (ShmNodeI32 *)sh->nodes;
326 0 0         uint32_t now = sh->expires_at ? shm_now() : 0;
327 0           RDLOCK_GUARD(hdr);
328 0 0         EXTEND(SP, hdr->size * 2);
329 0 0         for (uint32_t i = 0; i < hdr->table_cap; i++) {
330 0 0         if (SHM_IS_LIVE(sh->states[i]) && !SHM_IS_EXPIRED(sh, i, now)) {
    0          
    0          
    0          
331 0 0         mXPUSHi(nodes[i].key);
332 0 0         mXPUSHi(nodes[i].value);
333             }
334             }
335             }
336            
337              
338             void
339             each(SV* self_sv)
340             PPCODE:
341 0 0         EXTRACT_MAP("Data::HashMap::Shared::I32", self_sv);
    0          
    0          
342             int32_t out_key, out_value;
343 0 0         if (shm_i32_each(h, &out_key, &out_value)) {
344 0 0         EXTEND(SP, 2);
345 0 0         mXPUSHi(out_key);
346 0 0         mXPUSHi(out_value);
347 0           XSRETURN(2);
348             }
349 0           shm_i32_flush_deferred(h);
350 0           XSRETURN_EMPTY;
351              
352             void
353             iter_reset(SV* self_sv)
354             CODE:
355 0 0         EXTRACT_MAP("Data::HashMap::Shared::I32", self_sv);
    0          
    0          
356 0           shm_i32_iter_reset(h);
357 0           shm_i32_flush_deferred(h);
358              
359             void
360             clear(SV* self_sv)
361             CODE:
362 1 50         EXTRACT_MAP("Data::HashMap::Shared::I32", self_sv);
    50          
    50          
363 1           shm_i32_clear(h);
364              
365             SV*
366             to_hash(SV* self_sv)
367             CODE:
368 0 0         EXTRACT_MAP("Data::HashMap::Shared::I32", self_sv);
    0          
    0          
369 0           HV* hv = newHV();
370 0 0         uint32_t ns = h->shard_handles ? h->num_shards : 1;
371 0 0         for (uint32_t si = 0; si < ns; si++) {
372 0 0         ShmHandle *sh = h->shard_handles ? h->shard_handles[si] : h;
373 0           ShmHeader *hdr = sh->hdr;
374 0           ShmNodeI32 *nodes = (ShmNodeI32 *)sh->nodes;
375 0 0         uint32_t now = sh->expires_at ? shm_now() : 0;
376 0           RDLOCK_GUARD(hdr);
377 0 0         for (uint32_t i = 0; i < hdr->table_cap; i++) {
378 0 0         if (SHM_IS_LIVE(sh->states[i]) && !SHM_IS_EXPIRED(sh, i, now)) {
    0          
    0          
    0          
379 0           SV* val = newSViv(nodes[i].value);
380             char kbuf[24];
381 0           int klen = my_snprintf(kbuf, sizeof(kbuf), "%" IVdf, (IV)nodes[i].key);
382 0 0         if (!hv_store(hv, kbuf, klen, val, 0)) SvREFCNT_dec(val);
383             }
384             }
385             }
386            
387 0           RETVAL = newRV_noinc((SV*)hv);
388             OUTPUT:
389             RETVAL
390              
391             SV*
392             get_or_set(SV* self_sv, int32_t key, int32_t default_value)
393             CODE:
394 2 50         EXTRACT_MAP("Data::HashMap::Shared::I32", self_sv);
    50          
    50          
395             int32_t out;
396 2           int rc = shm_i32_get_or_set(h, key, default_value, &out);
397 2 50         if (!rc) XSRETURN_UNDEF;
398 2           RETVAL = newSViv(out);
399             OUTPUT:
400             RETVAL
401              
402             bool
403             put_ttl(SV* self_sv, int32_t key, int32_t value, UV ttl_sec)
404             CODE:
405 0 0         EXTRACT_MAP("Data::HashMap::Shared::I32", self_sv);
    0          
    0          
406 0 0         REQUIRE_TTL(h);
    0          
407 0 0         RETVAL = shm_i32_put_ttl(h, key, value, (uint32_t)ttl_sec);
408             OUTPUT:
409             RETVAL
410              
411             UV
412             max_size(SV* self_sv)
413             CODE:
414 0 0         EXTRACT_MAP("Data::HashMap::Shared::I32", self_sv);
    0          
    0          
415 0 0         RETVAL = (UV)shm_i32_max_size(h);
416             OUTPUT:
417             RETVAL
418              
419             UV
420             ttl(SV* self_sv)
421             CODE:
422 0 0         EXTRACT_MAP("Data::HashMap::Shared::I32", self_sv);
    0          
    0          
423 0 0         RETVAL = (UV)shm_i32_ttl(h);
424             OUTPUT:
425             RETVAL
426              
427             SV*
428             take(SV* self_sv, int32_t key)
429             CODE:
430 0 0         EXTRACT_MAP("Data::HashMap::Shared::I32", self_sv);
    0          
    0          
431             int32_t out_value;
432 0 0         if (!shm_i32_take(h, key, &out_value)) XSRETURN_UNDEF;
433 0           RETVAL = newSViv(out_value);
434             OUTPUT:
435             RETVAL
436              
437             void
438             pop(SV* self_sv)
439             PPCODE:
440 0 0         EXTRACT_MAP("Data::HashMap::Shared::I32", self_sv);
    0          
    0          
441             int32_t out_key;
442             int32_t out_val;
443 0 0         if (!shm_i32_pop(h, &out_key, &out_val)) XSRETURN_EMPTY;
444 0 0         EXTEND(SP, 2);
445 0           mPUSHi(out_key);
446 0           mPUSHi(out_val);
447              
448             void
449             shift(SV* self_sv)
450             PPCODE:
451 0 0         EXTRACT_MAP("Data::HashMap::Shared::I32", self_sv);
    0          
    0          
452             int32_t out_key;
453             int32_t out_val;
454 0 0         if (!shm_i32_shift(h, &out_key, &out_val)) XSRETURN_EMPTY;
455 0 0         EXTEND(SP, 2);
456 0           mPUSHi(out_key);
457 0           mPUSHi(out_val);
458              
459             void
460             drain(SV* self_sv, UV limit)
461             PPCODE:
462 0 0         EXTRACT_MAP("Data::HashMap::Shared::I32", self_sv);
    0          
    0          
463 0 0         if (limit == 0) XSRETURN_EMPTY;
464             shm_i32_drain_entry *entries;
465 0 0         Newxz(entries, limit, shm_i32_drain_entry);
466            
467 0           SAVEFREEPV(entries);
468 0           char *buf = NULL; uint32_t buf_cap = 0;
469 0           uint32_t n = shm_i32_drain(h, (uint32_t)limit, entries, &buf, &buf_cap);
470            
471 0 0         EXTEND(SP, n * 2);
472 0 0         for (uint32_t i = 0; i < n; i++) {
473 0           mPUSHi(entries[i].key);
474 0           mPUSHi(entries[i].value);
475             }
476 0 0         if (buf) free(buf);
477            
478              
479             UV
480             flush_expired(SV* self_sv)
481             CODE:
482 0 0         EXTRACT_MAP("Data::HashMap::Shared::I32", self_sv);
    0          
    0          
483 0 0         RETVAL = (UV)shm_i32_flush_expired(h);
484             OUTPUT:
485             RETVAL
486              
487             void
488             flush_expired_partial(SV* self_sv, UV limit)
489             PPCODE:
490 0 0         EXTRACT_MAP("Data::HashMap::Shared::I32", self_sv);
    0          
    0          
491 0           int done = 0;
492 0           uint32_t flushed = shm_i32_flush_expired_partial(h, (uint32_t)limit, &done);
493 0 0         EXTEND(SP, 2);
494 0           mPUSHu(flushed);
495 0           mPUSHi(done);
496              
497             UV
498             mmap_size(SV* self_sv)
499             CODE:
500 0 0         EXTRACT_MAP("Data::HashMap::Shared::I32", self_sv);
    0          
    0          
501 0           RETVAL = (UV)shm_i32_mmap_size(h);
502             OUTPUT:
503             RETVAL
504              
505             bool
506             touch(SV* self_sv, int32_t key)
507             CODE:
508 0 0         EXTRACT_MAP("Data::HashMap::Shared::I32", self_sv);
    0          
    0          
509 0 0         RETVAL = shm_i32_touch(h, key);
510             OUTPUT:
511             RETVAL
512              
513             bool
514             reserve(SV* self_sv, UV target)
515             CODE:
516 0 0         EXTRACT_MAP("Data::HashMap::Shared::I32", self_sv);
    0          
    0          
517 0 0         RETVAL = shm_i32_reserve(h, (uint32_t)target);
518             OUTPUT:
519             RETVAL
520              
521             UV
522             stat_evictions(SV* self_sv)
523             CODE:
524 0 0         EXTRACT_MAP("Data::HashMap::Shared::I32", self_sv);
    0          
    0          
525 0           RETVAL = (UV)shm_i32_stat_evictions(h);
526             OUTPUT:
527             RETVAL
528              
529             UV
530             stat_expired(SV* self_sv)
531             CODE:
532 0 0         EXTRACT_MAP("Data::HashMap::Shared::I32", self_sv);
    0          
    0          
533 0           RETVAL = (UV)shm_i32_stat_expired(h);
534             OUTPUT:
535             RETVAL
536              
537             UV
538             stat_recoveries(SV* self_sv)
539             CODE:
540 0 0         EXTRACT_MAP("Data::HashMap::Shared::I32", self_sv);
    0          
    0          
541 0 0         RETVAL = (UV)shm_i32_stat_recoveries(h);
542             OUTPUT:
543             RETVAL
544              
545             UV
546             arena_used(SV* self_sv)
547             CODE:
548 0 0         EXTRACT_MAP("Data::HashMap::Shared::I32", self_sv);
    0          
    0          
549 0           RETVAL = (UV)shm_i32_arena_used(h);
550             OUTPUT:
551             RETVAL
552              
553             UV
554             arena_cap(SV* self_sv)
555             CODE:
556 0 0         EXTRACT_MAP("Data::HashMap::Shared::I32", self_sv);
    0          
    0          
557 0           RETVAL = (UV)shm_i32_arena_cap(h);
558             OUTPUT:
559             RETVAL
560              
561             bool
562             add(SV* self_sv, int32_t key, int32_t value)
563             CODE:
564 2 50         EXTRACT_MAP("Data::HashMap::Shared::I32", self_sv);
    50          
    50          
565 2 100         RETVAL = shm_i32_add(h, key, value);
566             OUTPUT:
567             RETVAL
568              
569             bool
570             update(SV* self_sv, int32_t key, int32_t value)
571             CODE:
572 1 50         EXTRACT_MAP("Data::HashMap::Shared::I32", self_sv);
    50          
    50          
573 1 50         RETVAL = shm_i32_update(h, key, value);
574             OUTPUT:
575             RETVAL
576              
577             SV*
578             swap(SV* self_sv, int32_t key, int32_t value)
579             CODE:
580 1 50         EXTRACT_MAP("Data::HashMap::Shared::I32", self_sv);
    50          
    50          
581             int32_t out_value;
582 1           int rc = shm_i32_swap(h, key, value, &out_value);
583 1 50         if (rc != 1) XSRETURN_UNDEF;
584 1           RETVAL = newSViv(out_value);
585             OUTPUT:
586             RETVAL
587              
588             SV*
589             path(SV* self_sv)
590             CODE:
591 0 0         EXTRACT_MAP("Data::HashMap::Shared::I32", self_sv);
    0          
    0          
592 0 0         RETVAL = h->path ? newSVpv(h->path, 0) : &PL_sv_undef;
593             OUTPUT:
594             RETVAL
595              
596             bool
597             unlink(SV* self_or_class, ...)
598             CODE:
599             const char *p;
600 0 0         if (SvROK(self_or_class) && SvOBJECT(SvRV(self_or_class))) {
    0          
601 0           ShmHandle* h = INT2PTR(ShmHandle*, SvIV(SvRV(self_or_class)));
602 0 0         if (!h) croak("Attempted to use a destroyed Data::HashMap::Shared::I32 object");
603 0           p = h->path;
604             } else {
605 0 0         if (items < 2) croak("Usage: Data::HashMap::Shared::I32->unlink($path)");
606 0           p = SvPV_nolen(ST(1));
607             }
608 0 0         RETVAL = (SvROK(self_or_class) && SvOBJECT(SvRV(self_or_class))) ?
    0          
609 0 0         shm_unlink_sharded(INT2PTR(ShmHandle*, SvIV(SvRV(self_or_class)))) :
610 0           shm_unlink_path(p);
611             OUTPUT:
612             RETVAL
613              
614             SV*
615             ttl_remaining(SV* self_sv, int32_t key)
616             CODE:
617 0 0         EXTRACT_MAP("Data::HashMap::Shared::I32", self_sv);
    0          
    0          
618 0           int64_t remaining = shm_i32_ttl_remaining(h, key);
619 0 0         if (remaining < 0) XSRETURN_UNDEF;
620 0           RETVAL = newSViv(remaining);
621             OUTPUT:
622             RETVAL
623              
624             UV
625             capacity(SV* self_sv)
626             CODE:
627 0 0         EXTRACT_MAP("Data::HashMap::Shared::I32", self_sv);
    0          
    0          
628 0 0         RETVAL = (UV)shm_i32_capacity(h);
629             OUTPUT:
630             RETVAL
631              
632             UV
633             tombstones(SV* self_sv)
634             CODE:
635 0 0         EXTRACT_MAP("Data::HashMap::Shared::I32", self_sv);
    0          
    0          
636 0 0         RETVAL = (UV)shm_i32_tombstones(h);
637             OUTPUT:
638             RETVAL
639              
640             SV*
641             cursor(SV* self_sv)
642             CODE:
643 0 0         EXTRACT_MAP("Data::HashMap::Shared::I32", self_sv);
    0          
    0          
644 0           ShmCursor* c = shm_cursor_create(h);
645 0 0         if (!c) croak("Failed to allocate cursor");
646 0           RETVAL = sv_setref_pv(newSV(0), "Data::HashMap::Shared::I32::Cursor", (void*)c);
647             OUTPUT:
648             RETVAL
649              
650             MODULE = Data::HashMap::Shared PACKAGE = Data::HashMap::Shared::I32::Cursor
651             PROTOTYPES: DISABLE
652              
653             void
654             DESTROY(SV* self_sv)
655             CODE:
656 0 0         if (!SvROK(self_sv)) return;
657 0           ShmCursor* c = INT2PTR(ShmCursor*, SvIV(SvRV(self_sv)));
658 0 0         if (!c) return;
659 0           ShmHandle* h = c->current;
660 0           shm_cursor_destroy(c);
661 0 0         if (h) shm_i32_flush_deferred(h);
662 0           sv_setiv(SvRV(self_sv), 0);
663              
664             void
665             next(SV* self_sv)
666             PPCODE:
667 0 0         EXTRACT_CURSOR("Data::HashMap::Shared::I32::Cursor", self_sv);
    0          
    0          
668             int32_t out_key; int32_t out_value;
669 0 0         if (shm_i32_cursor_next(c, &out_key, &out_value)) {
670 0 0         EXTEND(SP, 2);
671 0 0         mXPUSHi(out_key);
672 0 0         mXPUSHi(out_value);
673 0           XSRETURN(2);
674             }
675 0           XSRETURN_EMPTY;
676              
677             void
678             reset(SV* self_sv)
679             CODE:
680 0 0         EXTRACT_CURSOR("Data::HashMap::Shared::I32::Cursor", self_sv);
    0          
    0          
681 0           shm_i32_cursor_reset(c);
682              
683             bool
684             seek(SV* self_sv, int32_t key)
685             CODE:
686 0 0         EXTRACT_CURSOR("Data::HashMap::Shared::I32::Cursor", self_sv);
    0          
    0          
687 0 0         RETVAL = shm_i32_cursor_seek(c, key);
688             OUTPUT:
689             RETVAL
690