File Coverage

xs/i32.xs
Criterion Covered Total %
statement 24 152 15.7
branch 27 322 8.3
condition n/a
subroutine n/a
pod n/a
total 51 474 10.7


line stmt bran cond sub pod time code
1             MODULE = Data::Buffer::Shared PACKAGE = Data::Buffer::Shared::I32
2             PROTOTYPES: DISABLE
3              
4             SV*
5             new(char* class, char* path, UV capacity, UV file_mode = 0600)
6             CODE:
7             char errbuf[BUF_ERR_BUFLEN];
8 1           BufHandle* buf = buf_i32_create(path, (uint64_t)capacity, (mode_t)file_mode, errbuf);
9 1 50         if (!buf) croak("Data::Buffer::Shared::I32: %s", errbuf[0] ? errbuf : "unknown error");
    0          
10 1           RETVAL = sv_setref_pv(newSV(0), class, (void*)buf);
11             OUTPUT:
12             RETVAL
13              
14             void
15             DESTROY(SV* self_sv)
16             CODE:
17 1 50         if (!SvROK(self_sv)) return;
18 1           BufHandle* h = INT2PTR(BufHandle*, SvIV(SvRV(self_sv)));
19 1 50         if (!h) return;
20 1           sv_setiv(SvRV(self_sv), 0);
21 1           buf_close_map(h);
22              
23             SV*
24             get(SV* self_sv, UV idx)
25             CODE:
26 2 50         EXTRACT_BUF("Data::Buffer::Shared::I32", self_sv);
    50          
    50          
27             int32_t val;
28 2 50         if (!buf_i32_get(h, (uint64_t)idx, &val)) XSRETURN_UNDEF;
29 2           RETVAL = newSViv(val);
30             OUTPUT:
31             RETVAL
32              
33             bool
34             set(SV* self_sv, UV idx, IV val)
35             CODE:
36 1 50         EXTRACT_BUF("Data::Buffer::Shared::I32", self_sv);
    50          
    50          
37 1 50         RETVAL = buf_i32_set(h, (uint64_t)idx, (int32_t)val);
38             OUTPUT:
39             RETVAL
40              
41             void
42             slice(SV* self_sv, UV from, UV count)
43             PPCODE:
44 0 0         EXTRACT_BUF("Data::Buffer::Shared::I32", self_sv);
    0          
    0          
45 0 0         if (count == 0) XSRETURN_EMPTY;
46             int32_t *tmp;
47 0 0         Newx(tmp, count, int32_t);
48 0           SAVEFREEPV(tmp);
49 0 0         if (!buf_i32_get_slice(h, (uint64_t)from, (uint64_t)count, tmp))
50 0           croak("Data::Buffer::Shared::I32: slice out of bounds");
51 0 0         EXTEND(SP, count);
52 0 0         for (UV i = 0; i < count; i++)
53 0           mPUSHi(tmp[i]);
54              
55             bool
56             set_slice(SV* self_sv, UV from, ...)
57             CODE:
58 0 0         EXTRACT_BUF("Data::Buffer::Shared::I32", self_sv);
    0          
    0          
59 0           UV count = items - 2;
60 0 0         if (count == 0) XSRETURN(1);
61             int32_t *tmp;
62 0 0         Newx(tmp, count, int32_t);
63 0           SAVEFREEPV(tmp);
64 0 0         for (UV i = 0; i < count; i++)
65 0           tmp[i] = (int32_t)SvIV(ST(i + 2));
66 0 0         RETVAL = buf_i32_set_slice(h, (uint64_t)from, (uint64_t)count, tmp);
67             OUTPUT:
68             RETVAL
69              
70             void
71             fill(SV* self_sv, IV val)
72             CODE:
73 0 0         EXTRACT_BUF("Data::Buffer::Shared::I32", self_sv);
    0          
    0          
74 0           buf_i32_fill(h, (int32_t)val);
75              
76             SV*
77             incr(SV* self_sv, UV idx)
78             CODE:
79 1 50         EXTRACT_BUF("Data::Buffer::Shared::I32", self_sv);
    50          
    50          
80 1 50         if (idx >= h->hdr->capacity) croak("Data::Buffer::Shared::I32: index out of bounds");
81 1           RETVAL = newSViv(buf_i32_incr(h, (uint64_t)idx));
82             OUTPUT:
83             RETVAL
84              
85             SV*
86             decr(SV* self_sv, UV idx)
87             CODE:
88 1 50         EXTRACT_BUF("Data::Buffer::Shared::I32", self_sv);
    50          
    50          
89 1 50         if (idx >= h->hdr->capacity) croak("Data::Buffer::Shared::I32: index out of bounds");
90 1           RETVAL = newSViv(buf_i32_decr(h, (uint64_t)idx));
91             OUTPUT:
92             RETVAL
93              
94             SV*
95             add(SV* self_sv, UV idx, IV delta)
96             CODE:
97 1 50         EXTRACT_BUF("Data::Buffer::Shared::I32", self_sv);
    50          
    50          
98 1 50         if (idx >= h->hdr->capacity) croak("Data::Buffer::Shared::I32: index out of bounds");
99 1           RETVAL = newSViv(buf_i32_add(h, (uint64_t)idx, (int32_t)delta));
100             OUTPUT:
101             RETVAL
102              
103             bool
104             cas(SV* self_sv, UV idx, IV expected, IV desired)
105             CODE:
106 1 50         EXTRACT_BUF("Data::Buffer::Shared::I32", self_sv);
    50          
    50          
107 1 50         RETVAL = buf_i32_cas(h, (uint64_t)idx, (int32_t)expected, (int32_t)desired);
108             OUTPUT:
109             RETVAL
110              
111             UV
112             capacity(SV* self_sv)
113             CODE:
114 0 0         EXTRACT_BUF("Data::Buffer::Shared::I32", self_sv);
    0          
    0          
115 0           RETVAL = (UV)buf_i32_capacity(h);
116             OUTPUT:
117             RETVAL
118              
119             UV
120             mmap_size(SV* self_sv)
121             CODE:
122 0 0         EXTRACT_BUF("Data::Buffer::Shared::I32", self_sv);
    0          
    0          
123 0           RETVAL = (UV)buf_i32_mmap_size(h);
124             OUTPUT:
125             RETVAL
126              
127             UV
128             elem_size(SV* self_sv)
129             CODE:
130 0 0         EXTRACT_BUF("Data::Buffer::Shared::I32", self_sv);
    0          
    0          
131 0 0         RETVAL = (UV)buf_i32_elem_size(h);
132             OUTPUT:
133             RETVAL
134              
135             SV*
136             path(SV* self_sv)
137             CODE:
138 0 0         EXTRACT_BUF("Data::Buffer::Shared::I32", self_sv);
    0          
    0          
139 0 0         if (h->path) RETVAL = newSVpv(h->path, 0); else XSRETURN_UNDEF;
140             OUTPUT:
141             RETVAL
142              
143             void
144             lock_wr(SV* self_sv)
145             CODE:
146 0 0         EXTRACT_BUF("Data::Buffer::Shared::I32", self_sv);
    0          
    0          
147 0           buf_i32_lock_wr(h);
148              
149             void
150             unlock_wr(SV* self_sv)
151             CODE:
152 0 0         EXTRACT_BUF("Data::Buffer::Shared::I32", self_sv);
    0          
    0          
153 0           buf_i32_unlock_wr(h);
154              
155             void
156             lock_rd(SV* self_sv)
157             CODE:
158 0 0         EXTRACT_BUF("Data::Buffer::Shared::I32", self_sv);
    0          
    0          
159 0           buf_i32_lock_rd(h);
160              
161             void
162             unlock_rd(SV* self_sv)
163             CODE:
164 0 0         EXTRACT_BUF("Data::Buffer::Shared::I32", self_sv);
    0          
    0          
165 0           buf_i32_unlock_rd(h);
166              
167             void
168             unlink(SV* self_or_class, ...)
169             CODE:
170             const char *p;
171 0 0         if (SvROK(self_or_class)) {
172 0           BufHandle* h = INT2PTR(BufHandle*, SvIV(SvRV(self_or_class)));
173 0 0         if (h) { if (!h->path) croak("cannot unlink anonymous buffer"); p = h->path; }
    0          
174 0           else croak("Data::Buffer::Shared::I32: destroyed object");
175             } else {
176 0 0         if (items < 2) croak("Usage: Data::Buffer::Shared::I32->unlink($path)");
177 0           p = SvPV_nolen(ST(1));
178             }
179 0 0         if (unlink(p) != 0) croak("unlink(%s): %s", p, strerror(errno));
180              
181             UV
182             ptr(SV* self_sv)
183             CODE:
184 0 0         EXTRACT_BUF("Data::Buffer::Shared::I32", self_sv);
    0          
    0          
185 0 0         RETVAL = PTR2UV(buf_i32_ptr(h));
186             OUTPUT:
187             RETVAL
188              
189             UV
190             ptr_at(SV* self_sv, UV idx)
191             CODE:
192 0 0         EXTRACT_BUF("Data::Buffer::Shared::I32", self_sv);
    0          
    0          
193 0           void *p = buf_i32_ptr_at(h, (uint64_t)idx);
194 0 0         if (!p) croak("Data::Buffer::Shared::I32: index out of bounds");
195 0 0         RETVAL = PTR2UV(p);
196             OUTPUT:
197             RETVAL
198              
199             SV*
200             new_anon(char* class, UV capacity)
201             CODE:
202             char errbuf[BUF_ERR_BUFLEN];
203 0           BufHandle* buf = buf_i32_create_anon((uint64_t)capacity, errbuf);
204 0 0         if (!buf) croak("Data::Buffer::Shared::I32: %s", errbuf[0] ? errbuf : "unknown error");
    0          
205 0           RETVAL = sv_setref_pv(newSV(0), class, (void*)buf);
206             OUTPUT:
207             RETVAL
208              
209             void
210             clear(SV* self_sv)
211             CODE:
212 0 0         EXTRACT_BUF("Data::Buffer::Shared::I32", self_sv);
    0          
    0          
213 0           buf_i32_clear(h);
214              
215             SV*
216             get_raw(SV* self_sv, UV byte_off, UV nbytes)
217             CODE:
218 0 0         EXTRACT_BUF("Data::Buffer::Shared::I32", self_sv);
    0          
    0          
219 0 0         RETVAL = newSV(nbytes ? nbytes : 1);
220 0           SvPOK_on(RETVAL);
221 0           SvCUR_set(RETVAL, nbytes);
222 0 0         if (nbytes) SvPVX(RETVAL)[nbytes] = '\0'; /* NUL-terminate; newSV reserved nbytes+1 */
223 0 0         if (!buf_i32_get_raw(h, (uint64_t)byte_off, (uint64_t)nbytes, SvPVX(RETVAL))) {
224 0           SvREFCNT_dec(RETVAL);
225 0           croak("Data::Buffer::Shared::I32: get_raw out of bounds");
226             }
227             OUTPUT:
228             RETVAL
229              
230             bool
231             set_raw(SV* self_sv, UV byte_off, SV* data_sv)
232             CODE:
233 0 0         EXTRACT_BUF("Data::Buffer::Shared::I32", self_sv);
    0          
    0          
234             STRLEN dlen;
235 0           const char *dptr = SvPV(data_sv, dlen);
236 0 0         RETVAL = buf_i32_set_raw(h, (uint64_t)byte_off, (uint64_t)dlen, dptr);
237             OUTPUT:
238             RETVAL
239              
240             SV*
241             cmpxchg(SV* self_sv, UV idx, IV expected, IV desired)
242             CODE:
243 0 0         EXTRACT_BUF("Data::Buffer::Shared::I32", self_sv);
    0          
    0          
244 0 0         if (idx >= h->hdr->capacity) croak("Data::Buffer::Shared::I32: index out of bounds");
245 0           RETVAL = newSViv(buf_i32_cmpxchg(h, (uint64_t)idx, (int32_t)expected, (int32_t)desired));
246             OUTPUT:
247             RETVAL
248              
249             SV*
250             atomic_and(SV* self_sv, UV idx, IV mask)
251             CODE:
252 0 0         EXTRACT_BUF("Data::Buffer::Shared::I32", self_sv);
    0          
    0          
253 0 0         if (idx >= h->hdr->capacity) croak("Data::Buffer::Shared::I32: index out of bounds");
254 0           RETVAL = newSViv(buf_i32_atomic_and(h, (uint64_t)idx, (int32_t)mask));
255             OUTPUT:
256             RETVAL
257              
258             SV*
259             atomic_or(SV* self_sv, UV idx, IV mask)
260             CODE:
261 0 0         EXTRACT_BUF("Data::Buffer::Shared::I32", self_sv);
    0          
    0          
262 0 0         if (idx >= h->hdr->capacity) croak("Data::Buffer::Shared::I32: index out of bounds");
263 0           RETVAL = newSViv(buf_i32_atomic_or(h, (uint64_t)idx, (int32_t)mask));
264             OUTPUT:
265             RETVAL
266              
267             SV*
268             atomic_xor(SV* self_sv, UV idx, IV mask)
269             CODE:
270 0 0         EXTRACT_BUF("Data::Buffer::Shared::I32", self_sv);
    0          
    0          
271 0 0         if (idx >= h->hdr->capacity) croak("Data::Buffer::Shared::I32: index out of bounds");
272 0           RETVAL = newSViv(buf_i32_atomic_xor(h, (uint64_t)idx, (int32_t)mask));
273             OUTPUT:
274             RETVAL
275              
276             SV*
277             new_memfd(char* class, char* name, UV capacity)
278             CODE:
279             char errbuf[BUF_ERR_BUFLEN];
280 0           BufHandle* buf = buf_i32_create_memfd(name, (uint64_t)capacity, errbuf);
281 0 0         if (!buf) croak("Data::Buffer::Shared::I32: %s", errbuf[0] ? errbuf : "unknown error");
    0          
282 0           RETVAL = sv_setref_pv(newSV(0), class, (void*)buf);
283             OUTPUT:
284             RETVAL
285              
286             SV*
287             new_from_fd(char* class, int fd)
288             CODE:
289             char errbuf[BUF_ERR_BUFLEN];
290 0           BufHandle* buf = buf_i32_open_fd(fd, errbuf);
291 0 0         if (!buf) croak("Data::Buffer::Shared::I32: %s", errbuf[0] ? errbuf : "unknown error");
    0          
292 0           RETVAL = sv_setref_pv(newSV(0), class, (void*)buf);
293             OUTPUT:
294             RETVAL
295              
296             SV*
297             fd(SV* self_sv)
298             CODE:
299 0 0         EXTRACT_BUF("Data::Buffer::Shared::I32", self_sv);
    0          
    0          
300 0 0         if (h->fd < 0) XSRETURN_UNDEF;
301 0           RETVAL = newSViv(h->fd);
302             OUTPUT:
303             RETVAL
304              
305             SV*
306             as_scalar(SV* self_sv)
307             CODE:
308 0 0         EXTRACT_BUF("Data::Buffer::Shared::I32", self_sv);
    0          
    0          
309 0           size_t len = (size_t)(h->hdr->capacity * h->hdr->elem_size);
310 0           SV *inner = newSV_type(SVt_PV);
311 0           SvPV_set(inner, (char *)h->data);
312 0           SvCUR_set(inner, len);
313 0           SvLEN_set(inner, 0);
314 0           SvPOK_on(inner);
315 0           SvREADONLY_on(inner);
316 0           MAGIC *mg = sv_magicext(inner, NULL, PERL_MAGIC_ext, &buf_scalar_magic_vtbl, NULL, 0);
317 0           mg->mg_obj = SvREFCNT_inc_simple_NN(self_sv);
318 0           RETVAL = newRV_noinc(inner);
319             OUTPUT:
320             RETVAL
321              
322             bool
323             add_slice(SV* self_sv, UV from, ...)
324             CODE:
325 0 0         EXTRACT_BUF("Data::Buffer::Shared::I32", self_sv);
    0          
    0          
326 0           UV count = items - 2;
327 0 0         if (count == 0) XSRETURN(1);
328             int32_t *tmp;
329 0 0         Newx(tmp, count, int32_t);
330 0           SAVEFREEPV(tmp);
331 0 0         for (UV i = 0; i < count; i++)
332 0           tmp[i] = (int32_t)SvIV(ST(i + 2));
333 0 0         RETVAL = buf_i32_add_slice(h, (uint64_t)from, (uint64_t)count, tmp);
334             OUTPUT:
335             RETVAL
336              
337             IV
338             create_eventfd(SV* self_sv)
339             CODE:
340 0 0         EXTRACT_BUF("Data::Buffer::Shared::I32", self_sv);
    0          
    0          
341 0           RETVAL = (IV)buf_create_eventfd(h);
342 0 0         if (RETVAL < 0) croak("Data::Buffer::Shared::I32: eventfd: %s", strerror(errno));
343             OUTPUT:
344             RETVAL
345              
346             void
347             attach_eventfd(SV* self_sv, int efd)
348             CODE:
349 0 0         EXTRACT_BUF("Data::Buffer::Shared::I32", self_sv);
    0          
    0          
350 0           buf_attach_eventfd(h, efd);
351              
352             SV*
353             eventfd(SV* self_sv)
354             CODE:
355 0 0         EXTRACT_BUF("Data::Buffer::Shared::I32", self_sv);
    0          
    0          
356 0 0         if (h->efd < 0) XSRETURN_UNDEF;
357 0           RETVAL = newSViv(h->efd);
358             OUTPUT:
359             RETVAL
360              
361             bool
362             notify(SV* self_sv)
363             CODE:
364 0 0         EXTRACT_BUF("Data::Buffer::Shared::I32", self_sv);
    0          
    0          
365 0 0         RETVAL = buf_notify(h);
366             OUTPUT:
367             RETVAL
368              
369             SV*
370             wait_notify(SV* self_sv)
371             CODE:
372 0 0         EXTRACT_BUF("Data::Buffer::Shared::I32", self_sv);
    0          
    0          
373 0           int64_t val = buf_wait_notify(h);
374 0 0         if (val < 0) XSRETURN_UNDEF;
375 0           RETVAL = newSViv(val);
376             OUTPUT:
377             RETVAL
378              
379             void
380             sync(SV* self_sv)
381             CODE:
382 0 0         EXTRACT_BUF("Data::Buffer::Shared::I32", self_sv);
    0          
    0          
383 0 0         if (buf_msync(h) != 0) croak("Data::Buffer::Shared::I32 sync: %s", strerror(errno));
384              
385             SV*
386             stats(SV* self_sv)
387             CODE:
388 0 0         EXTRACT_BUF("Data::Buffer::Shared::I32", self_sv);
    0          
    0          
389 0           HV *hv = newHV();
390 0           hv_store(hv, "capacity", 8, newSVuv((UV)h->hdr->capacity), 0);
391 0           hv_store(hv, "elem_size", 9, newSVuv((UV)h->hdr->elem_size), 0);
392 0           hv_store(hv, "mmap_size", 9, newSVuv((UV)h->mmap_size), 0);
393 0           hv_store(hv, "variant_id",10, newSVuv((UV)h->hdr->variant_id), 0);
394 0           hv_store(hv, "recoveries",10, newSVuv((UV)__atomic_load_n(&h->hdr->stat_recoveries, __ATOMIC_RELAXED)), 0);
395 0           RETVAL = newRV_noinc((SV*)hv);
396             OUTPUT:
397             RETVAL