File Coverage

Shared.xs
Criterion Covered Total %
statement 81 92 88.0
branch 92 206 44.6
condition n/a
subroutine n/a
pod n/a
total 173 298 58.0


line stmt bran cond sub pod time code
1             #define PERL_NO_GET_CONTEXT
2             #include "EXTERN.h"
3             #include "perl.h"
4             #include "XSUB.h"
5             #include "ppport.h"
6             #include "deque.h"
7              
8             #define EXTRACT_DEQ(sv) \
9             if (!sv_isobject(sv) || !sv_derived_from(sv, "Data::Deque::Shared")) \
10             croak("Expected a Data::Deque::Shared object"); \
11             DeqHandle *h = INT2PTR(DeqHandle*, SvIV(SvRV(sv))); \
12             if (!h) croak("Attempted to use a destroyed Data::Deque::Shared object")
13              
14             #define MAKE_OBJ(class, handle) \
15             SV *obj = newSViv(PTR2IV(handle)); \
16             SV *ref = newRV_noinc(obj); \
17             sv_bless(ref, gv_stashpv(class, GV_ADD)); \
18             RETVAL = ref
19              
20             MODULE = Data::Deque::Shared PACKAGE = Data::Deque::Shared
21              
22             PROTOTYPES: DISABLE
23              
24             void
25             DESTROY(self)
26             SV *self
27             CODE:
28 7 50         if (!SvROK(self)) return;
29 7           DeqHandle *h = INT2PTR(DeqHandle*, SvIV(SvRV(self)));
30 7 50         if (!h) return;
31 7           sv_setiv(SvRV(self), 0);
32 7           deq_destroy(h);
33              
34             UV
35             size(self)
36             SV *self
37             PREINIT:
38 4 50         EXTRACT_DEQ(self);
    50          
    50          
39             CODE:
40 4           RETVAL = (UV)deq_size(h);
41             OUTPUT:
42             RETVAL
43              
44             UV
45             capacity(self)
46             SV *self
47             PREINIT:
48 0 0         EXTRACT_DEQ(self);
    0          
    0          
49             CODE:
50 0 0         RETVAL = (UV)h->hdr->capacity;
51             OUTPUT:
52             RETVAL
53              
54             bool
55             is_empty(self)
56             SV *self
57             PREINIT:
58 3 50         EXTRACT_DEQ(self);
    50          
    50          
59             CODE:
60 3 50         RETVAL = deq_size(h) == 0;
61             OUTPUT:
62             RETVAL
63              
64             bool
65             is_full(self)
66             SV *self
67             PREINIT:
68 1 50         EXTRACT_DEQ(self);
    50          
    50          
69             CODE:
70 1 50         RETVAL = deq_size(h) >= h->hdr->capacity;
71             OUTPUT:
72             RETVAL
73              
74             void
75             clear(self)
76             SV *self
77             PREINIT:
78 3 50         EXTRACT_DEQ(self);
    50          
    50          
79             CODE:
80 3           deq_clear(h);
81              
82             UV
83             drain(self)
84             SV *self
85             PREINIT:
86 0 0         EXTRACT_DEQ(self);
    0          
    0          
87             CODE:
88 0           RETVAL = (UV)deq_drain(h);
89             OUTPUT:
90             RETVAL
91              
92             SV *
93             path(self)
94             SV *self
95             PREINIT:
96 1 50         EXTRACT_DEQ(self);
    50          
    50          
97             CODE:
98 1 50         RETVAL = h->path ? newSVpv(h->path, 0) : &PL_sv_undef;
99             OUTPUT:
100             RETVAL
101              
102             IV
103             memfd(self)
104             SV *self
105             PREINIT:
106 1 50         EXTRACT_DEQ(self);
    50          
    50          
107             CODE:
108 1 50         RETVAL = h->backing_fd;
109             OUTPUT:
110             RETVAL
111              
112             IV
113             eventfd(self)
114             SV *self
115             PREINIT:
116 1 50         EXTRACT_DEQ(self);
    50          
    50          
117             CODE:
118 1 50         RETVAL = deq_create_eventfd(h);
119             OUTPUT:
120             RETVAL
121              
122             void
123             eventfd_set(self, fd)
124             SV *self
125             int fd
126             PREINIT:
127 0 0         EXTRACT_DEQ(self);
    0          
    0          
128             CODE:
129 0 0         if (h->notify_fd >= 0 && h->notify_fd != fd) close(h->notify_fd);
    0          
130 0           h->notify_fd = fd;
131              
132             IV
133             fileno(self)
134             SV *self
135             PREINIT:
136 0 0         EXTRACT_DEQ(self);
    0          
    0          
137             CODE:
138 0 0         RETVAL = h->notify_fd;
139             OUTPUT:
140             RETVAL
141              
142             bool
143             notify(self)
144             SV *self
145             PREINIT:
146 1 50         EXTRACT_DEQ(self);
    50          
    50          
147             CODE:
148 1 50         RETVAL = deq_notify(h);
149             OUTPUT:
150             RETVAL
151              
152             SV *
153             eventfd_consume(self)
154             SV *self
155             PREINIT:
156 1 50         EXTRACT_DEQ(self);
    50          
    50          
157             CODE:
158 1           int64_t v = deq_eventfd_consume(h);
159 1 50         RETVAL = (v >= 0) ? newSViv((IV)v) : &PL_sv_undef;
160             OUTPUT:
161             RETVAL
162              
163             void
164             sync(self)
165             SV *self
166             PREINIT:
167 1 50         EXTRACT_DEQ(self);
    50          
    50          
168             CODE:
169 1           deq_msync(h);
170              
171             void
172             unlink(self_or_class, ...)
173             SV *self_or_class
174             CODE:
175             const char *p;
176 1 50         if (sv_isobject(self_or_class)) {
177 1           DeqHandle *h = INT2PTR(DeqHandle*, SvIV(SvRV(self_or_class)));
178 1 50         if (!h) croak("destroyed object");
179 1           p = h->path;
180             } else {
181 0 0         if (items < 2) croak("Usage: ...->unlink($path)");
182 0           p = SvPV_nolen(ST(1));
183             }
184 1 50         if (!p) croak("cannot unlink anonymous or memfd object");
185 1 50         if (unlink(p) != 0) croak("unlink(%s): %s", p, strerror(errno));
186              
187             SV *
188             stats(self)
189             SV *self
190             PREINIT:
191 1 50         EXTRACT_DEQ(self);
    50          
    50          
192             CODE:
193 1           HV *hv = newHV();
194 1           DeqHeader *hdr = h->hdr;
195 1           hv_store(hv, "size", 4, newSVuv((UV)deq_size(h)), 0);
196 1           hv_store(hv, "capacity", 8, newSVuv((UV)hdr->capacity), 0);
197 1           hv_store(hv, "pushes", 6, newSVuv((UV)hdr->stat_pushes), 0);
198 1           hv_store(hv, "pops", 4, newSVuv((UV)hdr->stat_pops), 0);
199 1           hv_store(hv, "waits", 5, newSVuv((UV)hdr->stat_waits), 0);
200 1           hv_store(hv, "timeouts", 8, newSVuv((UV)hdr->stat_timeouts), 0);
201 1           hv_store(hv, "mmap_size", 9, newSVuv((UV)h->mmap_size), 0);
202 1           RETVAL = newRV_noinc((SV *)hv);
203             OUTPUT:
204             RETVAL
205              
206              
207             MODULE = Data::Deque::Shared PACKAGE = Data::Deque::Shared::Int
208              
209             PROTOTYPES: DISABLE
210              
211             SV *
212             new(class, path, capacity)
213             const char *class
214             SV *path
215             UV capacity
216             PREINIT:
217             char errbuf[DEQ_ERR_BUFLEN];
218             CODE:
219 5 100         const char *p = SvOK(path) ? SvPV_nolen(path) : NULL;
220 5           DeqHandle *h = deq_create(p, capacity, sizeof(int64_t), DEQ_VAR_INT, errbuf);
221 5 50         if (!h) croak("Data::Deque::Shared::Int->new: %s", errbuf);
222 5           MAKE_OBJ(class, h);
223             OUTPUT:
224             RETVAL
225              
226             SV *
227             new_memfd(class, name, capacity)
228             const char *class
229             const char *name
230             UV capacity
231             PREINIT:
232             char errbuf[DEQ_ERR_BUFLEN];
233             CODE:
234 1           DeqHandle *h = deq_create_memfd(name, capacity, sizeof(int64_t), DEQ_VAR_INT, errbuf);
235 1 50         if (!h) croak("Data::Deque::Shared::Int->new_memfd: %s", errbuf);
236 1           MAKE_OBJ(class, h);
237             OUTPUT:
238             RETVAL
239              
240             SV *
241             new_from_fd(class, fd)
242             const char *class
243             int fd
244             PREINIT:
245             char errbuf[DEQ_ERR_BUFLEN];
246             CODE:
247 1           DeqHandle *h = deq_open_fd(fd, DEQ_VAR_INT, errbuf);
248 1 50         if (!h) croak("Data::Deque::Shared::Int->new_from_fd: %s", errbuf);
249 1           MAKE_OBJ(class, h);
250             OUTPUT:
251             RETVAL
252              
253             bool
254             push_back(self, val)
255             SV *self
256             IV val
257             PREINIT:
258 44 50         EXTRACT_DEQ(self);
    50          
    50          
259             CODE:
260 44           int64_t v = (int64_t)val;
261 44 100         RETVAL = deq_try_push_back(h, &v, sizeof(v));
262             OUTPUT:
263             RETVAL
264              
265             bool
266             push_front(self, val)
267             SV *self
268             IV val
269             PREINIT:
270 8 50         EXTRACT_DEQ(self);
    50          
    50          
271             CODE:
272 8           int64_t v = (int64_t)val;
273 8 100         RETVAL = deq_try_push_front(h, &v, sizeof(v));
274             OUTPUT:
275             RETVAL
276              
277             bool
278             push_back_wait(self, val, ...)
279             SV *self
280             IV val
281             PREINIT:
282 1 50         EXTRACT_DEQ(self);
    50          
    50          
283 1           double timeout = -1;
284             CODE:
285 1 50         if (items > 2) timeout = SvNV(ST(2));
286 1           int64_t v = (int64_t)val;
287 1 50         RETVAL = deq_push_wait(h, &v, sizeof(v), 0, timeout);
288             OUTPUT:
289             RETVAL
290              
291             bool
292             push_front_wait(self, val, ...)
293             SV *self
294             IV val
295             PREINIT:
296 1 50         EXTRACT_DEQ(self);
    50          
    50          
297 1           double timeout = -1;
298             CODE:
299 1 50         if (items > 2) timeout = SvNV(ST(2));
300 1           int64_t v = (int64_t)val;
301 1 50         RETVAL = deq_push_wait(h, &v, sizeof(v), 1, timeout);
302             OUTPUT:
303             RETVAL
304              
305             SV *
306             pop_front(self)
307             SV *self
308             PREINIT:
309 11 50         EXTRACT_DEQ(self);
    50          
    50          
310             CODE:
311             int64_t v;
312 11 100         RETVAL = deq_try_pop_front(h, &v) ? newSViv((IV)v) : &PL_sv_undef;
313             OUTPUT:
314             RETVAL
315              
316             SV *
317             pop_back(self)
318             SV *self
319             PREINIT:
320 9 50         EXTRACT_DEQ(self);
    50          
    50          
321             CODE:
322             int64_t v;
323 9 100         RETVAL = deq_try_pop_back(h, &v) ? newSViv((IV)v) : &PL_sv_undef;
324             OUTPUT:
325             RETVAL
326              
327             SV *
328             pop_front_wait(self, ...)
329             SV *self
330             PREINIT:
331 2 50         EXTRACT_DEQ(self);
    50          
    50          
332 2           double timeout = -1;
333             CODE:
334 2 50         if (items > 1) timeout = SvNV(ST(1));
335             int64_t v;
336 2 100         RETVAL = deq_pop_wait(h, &v, 0, timeout) ? newSViv((IV)v) : &PL_sv_undef;
337             OUTPUT:
338             RETVAL
339              
340             SV *
341             pop_back_wait(self, ...)
342             SV *self
343             PREINIT:
344 1 50         EXTRACT_DEQ(self);
    50          
    50          
345 1           double timeout = -1;
346             CODE:
347 1 50         if (items > 1) timeout = SvNV(ST(1));
348             int64_t v;
349 1 50         RETVAL = deq_pop_wait(h, &v, 1, timeout) ? newSViv((IV)v) : &PL_sv_undef;
350             OUTPUT:
351             RETVAL