File Coverage

Shared.xs
Criterion Covered Total %
statement 81 90 90.0
branch 92 200 46.0
condition n/a
subroutine n/a
pod n/a
total 173 290 59.6


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             SV *
83             path(self)
84             SV *self
85             PREINIT:
86 1 50         EXTRACT_DEQ(self);
    50          
    50          
87             CODE:
88 1 50         RETVAL = h->path ? newSVpv(h->path, 0) : &PL_sv_undef;
89             OUTPUT:
90             RETVAL
91              
92             IV
93             memfd(self)
94             SV *self
95             PREINIT:
96 1 50         EXTRACT_DEQ(self);
    50          
    50          
97             CODE:
98 1 50         RETVAL = h->backing_fd;
99             OUTPUT:
100             RETVAL
101              
102             IV
103             eventfd(self)
104             SV *self
105             PREINIT:
106 1 50         EXTRACT_DEQ(self);
    50          
    50          
107             CODE:
108 1 50         RETVAL = deq_create_eventfd(h);
109             OUTPUT:
110             RETVAL
111              
112             void
113             eventfd_set(self, fd)
114             SV *self
115             int fd
116             PREINIT:
117 0 0         EXTRACT_DEQ(self);
    0          
    0          
118             CODE:
119 0 0         if (h->notify_fd >= 0 && h->notify_fd != fd) close(h->notify_fd);
    0          
120 0           h->notify_fd = fd;
121              
122             IV
123             fileno(self)
124             SV *self
125             PREINIT:
126 0 0         EXTRACT_DEQ(self);
    0          
    0          
127             CODE:
128 0 0         RETVAL = h->notify_fd;
129             OUTPUT:
130             RETVAL
131              
132             bool
133             notify(self)
134             SV *self
135             PREINIT:
136 1 50         EXTRACT_DEQ(self);
    50          
    50          
137             CODE:
138 1 50         RETVAL = deq_notify(h);
139             OUTPUT:
140             RETVAL
141              
142             SV *
143             eventfd_consume(self)
144             SV *self
145             PREINIT:
146 1 50         EXTRACT_DEQ(self);
    50          
    50          
147             CODE:
148 1           int64_t v = deq_eventfd_consume(h);
149 1 50         RETVAL = (v >= 0) ? newSViv((IV)v) : &PL_sv_undef;
150             OUTPUT:
151             RETVAL
152              
153             void
154             sync(self)
155             SV *self
156             PREINIT:
157 1 50         EXTRACT_DEQ(self);
    50          
    50          
158             CODE:
159 1           deq_msync(h);
160              
161             void
162             unlink(self_or_class, ...)
163             SV *self_or_class
164             CODE:
165             const char *p;
166 1 50         if (sv_isobject(self_or_class)) {
167 1           DeqHandle *h = INT2PTR(DeqHandle*, SvIV(SvRV(self_or_class)));
168 1 50         if (!h) croak("destroyed object");
169 1           p = h->path;
170             } else {
171 0 0         if (items < 2) croak("Usage: ...->unlink($path)");
172 0           p = SvPV_nolen(ST(1));
173             }
174 1 50         if (!p) croak("cannot unlink anonymous or memfd object");
175 1 50         if (unlink(p) != 0) croak("unlink(%s): %s", p, strerror(errno));
176              
177             SV *
178             stats(self)
179             SV *self
180             PREINIT:
181 1 50         EXTRACT_DEQ(self);
    50          
    50          
182             CODE:
183 1           HV *hv = newHV();
184 1           DeqHeader *hdr = h->hdr;
185 1           hv_store(hv, "size", 4, newSVuv((UV)deq_size(h)), 0);
186 1           hv_store(hv, "capacity", 8, newSVuv((UV)hdr->capacity), 0);
187 1           hv_store(hv, "pushes", 6, newSVuv((UV)hdr->stat_pushes), 0);
188 1           hv_store(hv, "pops", 4, newSVuv((UV)hdr->stat_pops), 0);
189 1           hv_store(hv, "waits", 5, newSVuv((UV)hdr->stat_waits), 0);
190 1           hv_store(hv, "timeouts", 8, newSVuv((UV)hdr->stat_timeouts), 0);
191 1           hv_store(hv, "mmap_size", 9, newSVuv((UV)h->mmap_size), 0);
192 1           RETVAL = newRV_noinc((SV *)hv);
193             OUTPUT:
194             RETVAL
195              
196              
197             MODULE = Data::Deque::Shared PACKAGE = Data::Deque::Shared::Int
198              
199             PROTOTYPES: DISABLE
200              
201             SV *
202             new(class, path, capacity)
203             const char *class
204             SV *path
205             UV capacity
206             PREINIT:
207             char errbuf[DEQ_ERR_BUFLEN];
208             CODE:
209 5 100         const char *p = SvOK(path) ? SvPV_nolen(path) : NULL;
210 5           DeqHandle *h = deq_create(p, capacity, sizeof(int64_t), DEQ_VAR_INT, errbuf);
211 5 50         if (!h) croak("Data::Deque::Shared::Int->new: %s", errbuf);
212 5           MAKE_OBJ(class, h);
213             OUTPUT:
214             RETVAL
215              
216             SV *
217             new_memfd(class, name, capacity)
218             const char *class
219             const char *name
220             UV capacity
221             PREINIT:
222             char errbuf[DEQ_ERR_BUFLEN];
223             CODE:
224 1           DeqHandle *h = deq_create_memfd(name, capacity, sizeof(int64_t), DEQ_VAR_INT, errbuf);
225 1 50         if (!h) croak("Data::Deque::Shared::Int->new_memfd: %s", errbuf);
226 1           MAKE_OBJ(class, h);
227             OUTPUT:
228             RETVAL
229              
230             SV *
231             new_from_fd(class, fd)
232             const char *class
233             int fd
234             PREINIT:
235             char errbuf[DEQ_ERR_BUFLEN];
236             CODE:
237 1           DeqHandle *h = deq_open_fd(fd, DEQ_VAR_INT, errbuf);
238 1 50         if (!h) croak("Data::Deque::Shared::Int->new_from_fd: %s", errbuf);
239 1           MAKE_OBJ(class, h);
240             OUTPUT:
241             RETVAL
242              
243             bool
244             push_back(self, val)
245             SV *self
246             IV val
247             PREINIT:
248 44 50         EXTRACT_DEQ(self);
    50          
    50          
249             CODE:
250 44           int64_t v = (int64_t)val;
251 44 100         RETVAL = deq_try_push_back(h, &v, sizeof(v));
252             OUTPUT:
253             RETVAL
254              
255             bool
256             push_front(self, val)
257             SV *self
258             IV val
259             PREINIT:
260 8 50         EXTRACT_DEQ(self);
    50          
    50          
261             CODE:
262 8           int64_t v = (int64_t)val;
263 8 100         RETVAL = deq_try_push_front(h, &v, sizeof(v));
264             OUTPUT:
265             RETVAL
266              
267             bool
268             push_back_wait(self, val, ...)
269             SV *self
270             IV val
271             PREINIT:
272 1 50         EXTRACT_DEQ(self);
    50          
    50          
273 1           double timeout = -1;
274             CODE:
275 1 50         if (items > 2) timeout = SvNV(ST(2));
276 1           int64_t v = (int64_t)val;
277 1 50         RETVAL = deq_push_wait(h, &v, sizeof(v), 0, timeout);
278             OUTPUT:
279             RETVAL
280              
281             bool
282             push_front_wait(self, val, ...)
283             SV *self
284             IV val
285             PREINIT:
286 1 50         EXTRACT_DEQ(self);
    50          
    50          
287 1           double timeout = -1;
288             CODE:
289 1 50         if (items > 2) timeout = SvNV(ST(2));
290 1           int64_t v = (int64_t)val;
291 1 50         RETVAL = deq_push_wait(h, &v, sizeof(v), 1, timeout);
292             OUTPUT:
293             RETVAL
294              
295             SV *
296             pop_front(self)
297             SV *self
298             PREINIT:
299 11 50         EXTRACT_DEQ(self);
    50          
    50          
300             CODE:
301             int64_t v;
302 11 100         RETVAL = deq_try_pop_front(h, &v) ? newSViv((IV)v) : &PL_sv_undef;
303             OUTPUT:
304             RETVAL
305              
306             SV *
307             pop_back(self)
308             SV *self
309             PREINIT:
310 9 50         EXTRACT_DEQ(self);
    50          
    50          
311             CODE:
312             int64_t v;
313 9 100         RETVAL = deq_try_pop_back(h, &v) ? newSViv((IV)v) : &PL_sv_undef;
314             OUTPUT:
315             RETVAL
316              
317             SV *
318             pop_front_wait(self, ...)
319             SV *self
320             PREINIT:
321 2 50         EXTRACT_DEQ(self);
    50          
    50          
322 2           double timeout = -1;
323             CODE:
324 2 50         if (items > 1) timeout = SvNV(ST(1));
325             int64_t v;
326 2 100         RETVAL = deq_pop_wait(h, &v, 0, timeout) ? newSViv((IV)v) : &PL_sv_undef;
327             OUTPUT:
328             RETVAL
329              
330             SV *
331             pop_back_wait(self, ...)
332             SV *self
333             PREINIT:
334 1 50         EXTRACT_DEQ(self);
    50          
    50          
335 1           double timeout = -1;
336             CODE:
337 1 50         if (items > 1) timeout = SvNV(ST(1));
338             int64_t v;
339 1 50         RETVAL = deq_pop_wait(h, &v, 1, timeout) ? newSViv((IV)v) : &PL_sv_undef;
340             OUTPUT:
341             RETVAL