File Coverage

xs/i64.xs
Criterion Covered Total %
statement 131 141 92.9
branch 158 304 51.9
condition n/a
subroutine n/a
pod n/a
total 289 445 64.9


line stmt bran cond sub pod time code
1             MODULE = Data::Buffer::Shared PACKAGE = Data::Buffer::Shared::I64
2             PROTOTYPES: DISABLE
3              
4             SV*
5             new(char* class, char* path, UV capacity)
6             CODE:
7             char errbuf[BUF_ERR_BUFLEN];
8 24           BufHandle* buf = buf_i64_create(path, (uint64_t)capacity, errbuf);
9 24 100         if (!buf) croak("Data::Buffer::Shared::I64: %s", errbuf[0] ? errbuf : "unknown error");
    50          
10 23           RETVAL = sv_setref_pv(newSV(0), class, (void*)buf);
11             OUTPUT:
12             RETVAL
13              
14             void
15             DESTROY(SV* self_sv)
16             CODE:
17 49 50         if (!SvROK(self_sv)) return;
18 49           BufHandle* h = INT2PTR(BufHandle*, SvIV(SvRV(self_sv)));
19 49 50         if (!h) return;
20 49           buf_close_map(h);
21 49           sv_setiv(SvRV(self_sv), 0);
22              
23             SV*
24             get(SV* self_sv, UV idx)
25             CODE:
26 1202 50         EXTRACT_BUF("Data::Buffer::Shared::I64", self_sv);
    50          
    50          
27             int64_t val;
28 1202 100         if (!buf_i64_get(h, (uint64_t)idx, &val)) XSRETURN_UNDEF;
29 1199           RETVAL = newSViv(val);
30             OUTPUT:
31             RETVAL
32              
33             bool
34             set(SV* self_sv, UV idx, IV val)
35             CODE:
36 67 50         EXTRACT_BUF("Data::Buffer::Shared::I64", self_sv);
    50          
    50          
37 67 100         RETVAL = buf_i64_set(h, (uint64_t)idx, (int64_t)val);
38             OUTPUT:
39             RETVAL
40              
41             void
42             slice(SV* self_sv, UV from, UV count)
43             PPCODE:
44 7 50         EXTRACT_BUF("Data::Buffer::Shared::I64", self_sv);
    50          
    50          
45 7 50         if (count == 0) XSRETURN_EMPTY;
46             int64_t *tmp;
47 7 50         Newx(tmp, count, int64_t);
48 7           SAVEFREEPV(tmp);
49 7 100         if (!buf_i64_get_slice(h, (uint64_t)from, (uint64_t)count, tmp))
50 2           croak("Data::Buffer::Shared::I64: slice out of bounds");
51 5 50         EXTEND(SP, count);
52 20 100         for (UV i = 0; i < count; i++)
53 15           mPUSHi(tmp[i]);
54              
55             bool
56             set_slice(SV* self_sv, UV from, ...)
57             CODE:
58 4 50         EXTRACT_BUF("Data::Buffer::Shared::I64", self_sv);
    50          
    50          
59 4           UV count = items - 2;
60 4 50         if (count == 0) XSRETURN(1);
61             int64_t *tmp;
62 4 50         Newx(tmp, count, int64_t);
63 4           SAVEFREEPV(tmp);
64 18 100         for (UV i = 0; i < count; i++)
65 14           tmp[i] = (int64_t)SvIV(ST(i + 2));
66 4 100         RETVAL = buf_i64_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 8 50         EXTRACT_BUF("Data::Buffer::Shared::I64", self_sv);
    50          
    50          
74 8           buf_i64_fill(h, (int64_t)val);
75              
76             SV*
77             incr(SV* self_sv, UV idx)
78             CODE:
79 4510 50         EXTRACT_BUF("Data::Buffer::Shared::I64", self_sv);
    50          
    50          
80 4510 50         if (idx >= h->hdr->capacity) croak("Data::Buffer::Shared::I64: index out of bounds");
81 4510           RETVAL = newSViv(buf_i64_incr(h, (uint64_t)idx));
82             OUTPUT:
83             RETVAL
84              
85             SV*
86             decr(SV* self_sv, UV idx)
87             CODE:
88 4 50         EXTRACT_BUF("Data::Buffer::Shared::I64", self_sv);
    50          
    50          
89 4 50         if (idx >= h->hdr->capacity) croak("Data::Buffer::Shared::I64: index out of bounds");
90 4           RETVAL = newSViv(buf_i64_decr(h, (uint64_t)idx));
91             OUTPUT:
92             RETVAL
93              
94             SV*
95             add(SV* self_sv, UV idx, IV delta)
96             CODE:
97 7 50         EXTRACT_BUF("Data::Buffer::Shared::I64", self_sv);
    50          
    50          
98 7 50         if (idx >= h->hdr->capacity) croak("Data::Buffer::Shared::I64: index out of bounds");
99 7           RETVAL = newSViv(buf_i64_add(h, (uint64_t)idx, (int64_t)delta));
100             OUTPUT:
101             RETVAL
102              
103             bool
104             cas(SV* self_sv, UV idx, IV expected, IV desired)
105             CODE:
106 1119 50         EXTRACT_BUF("Data::Buffer::Shared::I64", self_sv);
    50          
    50          
107 1119 100         RETVAL = buf_i64_cas(h, (uint64_t)idx, (int64_t)expected, (int64_t)desired);
108             OUTPUT:
109             RETVAL
110              
111             UV
112             capacity(SV* self_sv)
113             CODE:
114 8 50         EXTRACT_BUF("Data::Buffer::Shared::I64", self_sv);
    50          
    50          
115 8           RETVAL = (UV)buf_i64_capacity(h);
116             OUTPUT:
117             RETVAL
118              
119             UV
120             mmap_size(SV* self_sv)
121             CODE:
122 1 50         EXTRACT_BUF("Data::Buffer::Shared::I64", self_sv);
    50          
    50          
123 1           RETVAL = (UV)buf_i64_mmap_size(h);
124             OUTPUT:
125             RETVAL
126              
127             UV
128             elem_size(SV* self_sv)
129             CODE:
130 4 50         EXTRACT_BUF("Data::Buffer::Shared::I64", self_sv);
    50          
    50          
131 4 50         RETVAL = (UV)buf_i64_elem_size(h);
132             OUTPUT:
133             RETVAL
134              
135             SV*
136             path(SV* self_sv)
137             CODE:
138 2 50         EXTRACT_BUF("Data::Buffer::Shared::I64", self_sv);
    50          
    50          
139 2 100         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 6 50         EXTRACT_BUF("Data::Buffer::Shared::I64", self_sv);
    50          
    50          
147 6           buf_i64_lock_wr(h);
148              
149             void
150             unlock_wr(SV* self_sv)
151             CODE:
152 6 50         EXTRACT_BUF("Data::Buffer::Shared::I64", self_sv);
    50          
    50          
153 6           buf_i64_unlock_wr(h);
154              
155             void
156             lock_rd(SV* self_sv)
157             CODE:
158 1 50         EXTRACT_BUF("Data::Buffer::Shared::I64", self_sv);
    50          
    50          
159 1           buf_i64_lock_rd(h);
160              
161             void
162             unlock_rd(SV* self_sv)
163             CODE:
164 1 50         EXTRACT_BUF("Data::Buffer::Shared::I64", self_sv);
    50          
    50          
165 1           buf_i64_unlock_rd(h);
166              
167             void
168             unlink(SV* self_or_class, ...)
169             CODE:
170             const char *p;
171 4 100         if (SvROK(self_or_class)) {
172 3           BufHandle* h = INT2PTR(BufHandle*, SvIV(SvRV(self_or_class)));
173 3 50         if (h) { if (!h->path) croak("cannot unlink anonymous buffer"); p = h->path; }
    100          
174 0           else croak("Data::Buffer::Shared::I64: destroyed object");
175             } else {
176 1 50         if (items < 2) croak("Usage: Data::Buffer::Shared::I64->unlink($path)");
177 1           p = SvPV_nolen(ST(1));
178             }
179 2           unlink(p);
180              
181             UV
182             ptr(SV* self_sv)
183             CODE:
184 2 50         EXTRACT_BUF("Data::Buffer::Shared::I64", self_sv);
    50          
    50          
185 2 50         RETVAL = PTR2UV(buf_i64_ptr(h));
186             OUTPUT:
187             RETVAL
188              
189             UV
190             ptr_at(SV* self_sv, UV idx)
191             CODE:
192 4 50         EXTRACT_BUF("Data::Buffer::Shared::I64", self_sv);
    50          
    50          
193 4           void *p = buf_i64_ptr_at(h, (uint64_t)idx);
194 4 100         if (!p) croak("Data::Buffer::Shared::I64: index out of bounds");
195 3 50         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 21           BufHandle* buf = buf_i64_create_anon((uint64_t)capacity, errbuf);
204 21 50         if (!buf) croak("Data::Buffer::Shared::I64: %s", errbuf[0] ? errbuf : "unknown error");
    0          
205 21           RETVAL = sv_setref_pv(newSV(0), class, (void*)buf);
206             OUTPUT:
207             RETVAL
208              
209             void
210             clear(SV* self_sv)
211             CODE:
212 5 50         EXTRACT_BUF("Data::Buffer::Shared::I64", self_sv);
    50          
    50          
213 5           buf_i64_clear(h);
214              
215             SV*
216             get_raw(SV* self_sv, UV byte_off, UV nbytes)
217             CODE:
218 7 50         EXTRACT_BUF("Data::Buffer::Shared::I64", self_sv);
    50          
    50          
219 7 100         RETVAL = newSV(nbytes ? nbytes : 1);
220 7           SvPOK_on(RETVAL);
221 7           SvCUR_set(RETVAL, nbytes);
222 7 100         if (!buf_i64_get_raw(h, (uint64_t)byte_off, (uint64_t)nbytes, SvPVX(RETVAL))) {
223 2           SvREFCNT_dec(RETVAL);
224 2           croak("Data::Buffer::Shared::I64: get_raw out of bounds");
225             }
226             OUTPUT:
227             RETVAL
228              
229             bool
230             set_raw(SV* self_sv, UV byte_off, SV* data_sv)
231             CODE:
232 7 50         EXTRACT_BUF("Data::Buffer::Shared::I64", self_sv);
    50          
    50          
233             STRLEN dlen;
234 7           const char *dptr = SvPV(data_sv, dlen);
235 7 100         RETVAL = buf_i64_set_raw(h, (uint64_t)byte_off, (uint64_t)dlen, dptr);
236             OUTPUT:
237             RETVAL
238              
239             SV*
240             cmpxchg(SV* self_sv, UV idx, IV expected, IV desired)
241             CODE:
242 6 50         EXTRACT_BUF("Data::Buffer::Shared::I64", self_sv);
    50          
    50          
243 6 50         if (idx >= h->hdr->capacity) croak("Data::Buffer::Shared::I64: index out of bounds");
244 6           RETVAL = newSViv(buf_i64_cmpxchg(h, (uint64_t)idx, (int64_t)expected, (int64_t)desired));
245             OUTPUT:
246             RETVAL
247              
248             SV*
249             atomic_and(SV* self_sv, UV idx, IV mask)
250             CODE:
251 0 0         EXTRACT_BUF("Data::Buffer::Shared::I64", self_sv);
    0          
    0          
252 0 0         if (idx >= h->hdr->capacity) croak("Data::Buffer::Shared::I64: index out of bounds");
253 0           RETVAL = newSViv(buf_i64_atomic_and(h, (uint64_t)idx, (int64_t)mask));
254             OUTPUT:
255             RETVAL
256              
257             SV*
258             atomic_or(SV* self_sv, UV idx, IV mask)
259             CODE:
260 0 0         EXTRACT_BUF("Data::Buffer::Shared::I64", self_sv);
    0          
    0          
261 0 0         if (idx >= h->hdr->capacity) croak("Data::Buffer::Shared::I64: index out of bounds");
262 0           RETVAL = newSViv(buf_i64_atomic_or(h, (uint64_t)idx, (int64_t)mask));
263             OUTPUT:
264             RETVAL
265              
266             SV*
267             atomic_xor(SV* self_sv, UV idx, IV mask)
268             CODE:
269 0 0         EXTRACT_BUF("Data::Buffer::Shared::I64", self_sv);
    0          
    0          
270 0 0         if (idx >= h->hdr->capacity) croak("Data::Buffer::Shared::I64: index out of bounds");
271 0           RETVAL = newSViv(buf_i64_atomic_xor(h, (uint64_t)idx, (int64_t)mask));
272             OUTPUT:
273             RETVAL
274              
275             SV*
276             new_memfd(char* class, char* name, UV capacity)
277             CODE:
278             char errbuf[BUF_ERR_BUFLEN];
279 4           BufHandle* buf = buf_i64_create_memfd(name, (uint64_t)capacity, errbuf);
280 4 50         if (!buf) croak("Data::Buffer::Shared::I64: %s", errbuf[0] ? errbuf : "unknown error");
    0          
281 4           RETVAL = sv_setref_pv(newSV(0), class, (void*)buf);
282             OUTPUT:
283             RETVAL
284              
285             SV*
286             new_from_fd(char* class, int fd)
287             CODE:
288             char errbuf[BUF_ERR_BUFLEN];
289 1           BufHandle* buf = buf_i64_open_fd(fd, errbuf);
290 1 50         if (!buf) croak("Data::Buffer::Shared::I64: %s", errbuf[0] ? errbuf : "unknown error");
    0          
291 1           RETVAL = sv_setref_pv(newSV(0), class, (void*)buf);
292             OUTPUT:
293             RETVAL
294              
295             SV*
296             fd(SV* self_sv)
297             CODE:
298 5 50         EXTRACT_BUF("Data::Buffer::Shared::I64", self_sv);
    50          
    50          
299 5 100         if (h->fd < 0) XSRETURN_UNDEF;
300 3           RETVAL = newSViv(h->fd);
301             OUTPUT:
302             RETVAL
303              
304             SV*
305             as_scalar(SV* self_sv)
306             CODE:
307 2 50         EXTRACT_BUF("Data::Buffer::Shared::I64", self_sv);
    50          
    50          
308 2           size_t len = (size_t)(h->hdr->capacity * h->hdr->elem_size);
309 2           SV *inner = newSV_type(SVt_PV);
310 2           SvPV_set(inner, (char *)h->data);
311 2           SvCUR_set(inner, len);
312 2           SvLEN_set(inner, 0);
313 2           SvPOK_on(inner);
314 2           SvREADONLY_on(inner);
315 2           MAGIC *mg = sv_magicext(inner, NULL, PERL_MAGIC_ext, &buf_scalar_magic_vtbl, NULL, 0);
316 2           mg->mg_obj = SvREFCNT_inc_simple_NN(self_sv);
317 2           RETVAL = newRV_noinc(inner);
318             OUTPUT:
319             RETVAL
320              
321             bool
322             add_slice(SV* self_sv, UV from, ...)
323             CODE:
324 1002 50         EXTRACT_BUF("Data::Buffer::Shared::I64", self_sv);
    50          
    50          
325 1002           UV count = items - 2;
326 1002 50         if (count == 0) XSRETURN(1);
327             int64_t *tmp;
328 1002 50         Newx(tmp, count, int64_t);
329 1002           SAVEFREEPV(tmp);
330 4008 100         for (UV i = 0; i < count; i++)
331 3006           tmp[i] = (int64_t)SvIV(ST(i + 2));
332 1002 100         RETVAL = buf_i64_add_slice(h, (uint64_t)from, (uint64_t)count, tmp);
333             OUTPUT:
334             RETVAL
335              
336             IV
337             create_eventfd(SV* self_sv)
338             CODE:
339 6 50         EXTRACT_BUF("Data::Buffer::Shared::I64", self_sv);
    50          
    50          
340 6           RETVAL = (IV)buf_create_eventfd(h);
341 6 50         if (RETVAL < 0) croak("Data::Buffer::Shared::I64: eventfd: %s", strerror(errno));
342             OUTPUT:
343             RETVAL
344              
345             void
346             attach_eventfd(SV* self_sv, int efd)
347             CODE:
348 1 50         EXTRACT_BUF("Data::Buffer::Shared::I64", self_sv);
    50          
    50          
349 1           buf_attach_eventfd(h, efd);
350              
351             SV*
352             eventfd(SV* self_sv)
353             CODE:
354 4 50         EXTRACT_BUF("Data::Buffer::Shared::I64", self_sv);
    50          
    50          
355 4 100         if (h->efd < 0) XSRETURN_UNDEF;
356 3           RETVAL = newSViv(h->efd);
357             OUTPUT:
358             RETVAL
359              
360             bool
361             notify(SV* self_sv)
362             CODE:
363 5 50         EXTRACT_BUF("Data::Buffer::Shared::I64", self_sv);
    50          
    50          
364 5 100         RETVAL = buf_notify(h);
365             OUTPUT:
366             RETVAL
367              
368             SV*
369             wait_notify(SV* self_sv)
370             CODE:
371 7 50         EXTRACT_BUF("Data::Buffer::Shared::I64", self_sv);
    50          
    50          
372 7           int64_t val = buf_wait_notify(h);
373 7 100         if (val < 0) XSRETURN_UNDEF;
374 3           RETVAL = newSViv(val);
375             OUTPUT:
376             RETVAL