File Coverage

xs/i32.xs
Criterion Covered Total %
statement 24 141 17.0
branch 27 304 8.8
condition n/a
subroutine n/a
pod n/a
total 51 445 11.4


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)
6             CODE:
7             char errbuf[BUF_ERR_BUFLEN];
8 1           BufHandle* buf = buf_i32_create(path, (uint64_t)capacity, 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           buf_close_map(h);
21 1           sv_setiv(SvRV(self_sv), 0);
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           unlink(p);
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 (!buf_i32_get_raw(h, (uint64_t)byte_off, (uint64_t)nbytes, SvPVX(RETVAL))) {
223 0           SvREFCNT_dec(RETVAL);
224 0           croak("Data::Buffer::Shared::I32: 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 0 0         EXTRACT_BUF("Data::Buffer::Shared::I32", self_sv);
    0          
    0          
233             STRLEN dlen;
234 0           const char *dptr = SvPV(data_sv, dlen);
235 0 0         RETVAL = buf_i32_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 0 0         EXTRACT_BUF("Data::Buffer::Shared::I32", self_sv);
    0          
    0          
243 0 0         if (idx >= h->hdr->capacity) croak("Data::Buffer::Shared::I32: index out of bounds");
244 0           RETVAL = newSViv(buf_i32_cmpxchg(h, (uint64_t)idx, (int32_t)expected, (int32_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::I32", self_sv);
    0          
    0          
252 0 0         if (idx >= h->hdr->capacity) croak("Data::Buffer::Shared::I32: index out of bounds");
253 0           RETVAL = newSViv(buf_i32_atomic_and(h, (uint64_t)idx, (int32_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::I32", self_sv);
    0          
    0          
261 0 0         if (idx >= h->hdr->capacity) croak("Data::Buffer::Shared::I32: index out of bounds");
262 0           RETVAL = newSViv(buf_i32_atomic_or(h, (uint64_t)idx, (int32_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::I32", self_sv);
    0          
    0          
270 0 0         if (idx >= h->hdr->capacity) croak("Data::Buffer::Shared::I32: index out of bounds");
271 0           RETVAL = newSViv(buf_i32_atomic_xor(h, (uint64_t)idx, (int32_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 0           BufHandle* buf = buf_i32_create_memfd(name, (uint64_t)capacity, errbuf);
280 0 0         if (!buf) croak("Data::Buffer::Shared::I32: %s", errbuf[0] ? errbuf : "unknown error");
    0          
281 0           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 0           BufHandle* buf = buf_i32_open_fd(fd, errbuf);
290 0 0         if (!buf) croak("Data::Buffer::Shared::I32: %s", errbuf[0] ? errbuf : "unknown error");
    0          
291 0           RETVAL = sv_setref_pv(newSV(0), class, (void*)buf);
292             OUTPUT:
293             RETVAL
294              
295             SV*
296             fd(SV* self_sv)
297             CODE:
298 0 0         EXTRACT_BUF("Data::Buffer::Shared::I32", self_sv);
    0          
    0          
299 0 0         if (h->fd < 0) XSRETURN_UNDEF;
300 0           RETVAL = newSViv(h->fd);
301             OUTPUT:
302             RETVAL
303              
304             SV*
305             as_scalar(SV* self_sv)
306             CODE:
307 0 0         EXTRACT_BUF("Data::Buffer::Shared::I32", self_sv);
    0          
    0          
308 0           size_t len = (size_t)(h->hdr->capacity * h->hdr->elem_size);
309 0           SV *inner = newSV_type(SVt_PV);
310 0           SvPV_set(inner, (char *)h->data);
311 0           SvCUR_set(inner, len);
312 0           SvLEN_set(inner, 0);
313 0           SvPOK_on(inner);
314 0           SvREADONLY_on(inner);
315 0           MAGIC *mg = sv_magicext(inner, NULL, PERL_MAGIC_ext, &buf_scalar_magic_vtbl, NULL, 0);
316 0           mg->mg_obj = SvREFCNT_inc_simple_NN(self_sv);
317 0           RETVAL = newRV_noinc(inner);
318             OUTPUT:
319             RETVAL
320              
321             bool
322             add_slice(SV* self_sv, UV from, ...)
323             CODE:
324 0 0         EXTRACT_BUF("Data::Buffer::Shared::I32", self_sv);
    0          
    0          
325 0           UV count = items - 2;
326 0 0         if (count == 0) XSRETURN(1);
327             int32_t *tmp;
328 0 0         Newx(tmp, count, int32_t);
329 0           SAVEFREEPV(tmp);
330 0 0         for (UV i = 0; i < count; i++)
331 0           tmp[i] = (int32_t)SvIV(ST(i + 2));
332 0 0         RETVAL = buf_i32_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 0 0         EXTRACT_BUF("Data::Buffer::Shared::I32", self_sv);
    0          
    0          
340 0           RETVAL = (IV)buf_create_eventfd(h);
341 0 0         if (RETVAL < 0) croak("Data::Buffer::Shared::I32: eventfd: %s", strerror(errno));
342             OUTPUT:
343             RETVAL
344              
345             void
346             attach_eventfd(SV* self_sv, int efd)
347             CODE:
348 0 0         EXTRACT_BUF("Data::Buffer::Shared::I32", self_sv);
    0          
    0          
349 0           buf_attach_eventfd(h, efd);
350              
351             SV*
352             eventfd(SV* self_sv)
353             CODE:
354 0 0         EXTRACT_BUF("Data::Buffer::Shared::I32", self_sv);
    0          
    0          
355 0 0         if (h->efd < 0) XSRETURN_UNDEF;
356 0           RETVAL = newSViv(h->efd);
357             OUTPUT:
358             RETVAL
359              
360             bool
361             notify(SV* self_sv)
362             CODE:
363 0 0         EXTRACT_BUF("Data::Buffer::Shared::I32", self_sv);
    0          
    0          
364 0 0         RETVAL = buf_notify(h);
365             OUTPUT:
366             RETVAL
367              
368             SV*
369             wait_notify(SV* self_sv)
370             CODE:
371 0 0         EXTRACT_BUF("Data::Buffer::Shared::I32", self_sv);
    0          
    0          
372 0           int64_t val = buf_wait_notify(h);
373 0 0         if (val < 0) XSRETURN_UNDEF;
374 0           RETVAL = newSViv(val);
375             OUTPUT:
376             RETVAL