File Coverage

Shared.xs
Criterion Covered Total %
statement 352 387 90.9
branch 393 742 52.9
condition n/a
subroutine n/a
pod n/a
total 745 1129 65.9


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              
6             #include "ppport.h"
7             #include "sync.h"
8              
9             #define EXTRACT_HANDLE(classname, sv) \
10             if (!sv_isobject(sv) || !sv_derived_from(sv, classname)) \
11             croak("Expected a %s object", classname); \
12             SyncHandle *h = INT2PTR(SyncHandle*, SvIV(SvRV(sv))); \
13             if (!h) croak("Attempted to use a destroyed %s object", classname)
14              
15             #define MAKE_OBJ(class, handle) \
16             SV *obj = newSViv(PTR2IV(handle)); \
17             SV *ref = newRV_noinc(obj); \
18             sv_bless(ref, gv_stashpv(class, GV_ADD)); \
19             RETVAL = ref
20              
21             MODULE = Data::Sync::Shared PACKAGE = Data::Sync::Shared::Semaphore
22              
23             PROTOTYPES: DISABLE
24              
25             SV *
26             new(class, path, max, ...)
27             const char *class
28             SV *path
29             UV max
30             PREINIT:
31             char errbuf[SYNC_ERR_BUFLEN];
32             CODE:
33 25 100         uint32_t initial = (items > 3) ? (uint32_t)SvUV(ST(3)) : (uint32_t)max;
34 25 100         const char *p = SvOK(path) ? SvPV_nolen(path) : NULL;
35 25           SyncHandle *h = sync_create(p, SYNC_TYPE_SEMAPHORE, (uint32_t)max, initial, errbuf);
36 25 100         if (!h) croak("Data::Sync::Shared::Semaphore->new: %s", errbuf);
37 22           MAKE_OBJ(class, h);
38             OUTPUT:
39             RETVAL
40              
41             SV *
42             new_memfd(class, name, max, ...)
43             const char *class
44             const char *name
45             UV max
46             PREINIT:
47             char errbuf[SYNC_ERR_BUFLEN];
48             CODE:
49 2 50         uint32_t initial = (items > 3) ? (uint32_t)SvUV(ST(3)) : (uint32_t)max;
50 2           SyncHandle *h = sync_create_memfd(name, SYNC_TYPE_SEMAPHORE, (uint32_t)max, initial, errbuf);
51 2 50         if (!h) croak("Data::Sync::Shared::Semaphore->new_memfd: %s", errbuf);
52 2           MAKE_OBJ(class, h);
53             OUTPUT:
54             RETVAL
55              
56             SV *
57             new_from_fd(class, fd)
58             const char *class
59             int fd
60             PREINIT:
61             char errbuf[SYNC_ERR_BUFLEN];
62             CODE:
63 2           SyncHandle *h = sync_open_fd(fd, SYNC_TYPE_SEMAPHORE, errbuf);
64 2 100         if (!h) croak("Data::Sync::Shared::Semaphore->new_from_fd: %s", errbuf);
65 1           MAKE_OBJ(class, h);
66             OUTPUT:
67             RETVAL
68              
69             void
70             DESTROY(self)
71             SV *self
72             CODE:
73 26 50         if (!SvROK(self)) return;
74 26           SyncHandle *h = INT2PTR(SyncHandle*, SvIV(SvRV(self)));
75 26 100         if (!h) return;
76 25           sv_setiv(SvRV(self), 0);
77 25           sync_destroy(h);
78              
79             bool
80             acquire(self, ...)
81             SV *self
82             PREINIT:
83 4 50         EXTRACT_HANDLE("Data::Sync::Shared::Semaphore", self);
    50          
    50          
84 4           double timeout = -1;
85             CODE:
86 4 100         if (items > 1) timeout = SvNV(ST(1));
87 4 100         RETVAL = sync_sem_acquire(h, timeout);
88             OUTPUT:
89             RETVAL
90              
91             bool
92             try_acquire(self)
93             SV *self
94             PREINIT:
95 24 50         EXTRACT_HANDLE("Data::Sync::Shared::Semaphore", self);
    50          
    50          
96             CODE:
97 24 100         RETVAL = sync_sem_try_acquire(h);
98             OUTPUT:
99             RETVAL
100              
101             bool
102             acquire_n(self, n, ...)
103             SV *self
104             UV n
105             PREINIT:
106 3 50         EXTRACT_HANDLE("Data::Sync::Shared::Semaphore", self);
    50          
    50          
107 3           double timeout = -1;
108             CODE:
109 3 100         if (items > 2) timeout = SvNV(ST(2));
110 3 100         RETVAL = sync_sem_acquire_n(h, (uint32_t)n, timeout);
111             OUTPUT:
112             RETVAL
113              
114             bool
115             try_acquire_n(self, n)
116             SV *self
117             UV n
118             PREINIT:
119 6 50         EXTRACT_HANDLE("Data::Sync::Shared::Semaphore", self);
    50          
    50          
120             CODE:
121 6 100         RETVAL = sync_sem_try_acquire_n(h, (uint32_t)n);
122             OUTPUT:
123             RETVAL
124              
125             void
126             release(self, ...)
127             SV *self
128             PREINIT:
129 17 50         EXTRACT_HANDLE("Data::Sync::Shared::Semaphore", self);
    50          
    50          
130             CODE:
131 17 100         if (items > 1) {
132 10           uint32_t n = (uint32_t)SvUV(ST(1));
133 10           sync_sem_release_n(h, n);
134             } else {
135 7           sync_sem_release(h);
136             }
137              
138             UV
139             drain(self)
140             SV *self
141             PREINIT:
142 4 50         EXTRACT_HANDLE("Data::Sync::Shared::Semaphore", self);
    50          
    50          
143             CODE:
144 4 50         RETVAL = sync_sem_drain(h);
145             OUTPUT:
146             RETVAL
147              
148             UV
149             value(self)
150             SV *self
151             PREINIT:
152 33 50         EXTRACT_HANDLE("Data::Sync::Shared::Semaphore", self);
    50          
    100          
153             CODE:
154 32 100         RETVAL = sync_sem_value(h);
155             OUTPUT:
156             RETVAL
157              
158             UV
159             max(self)
160             SV *self
161             PREINIT:
162 4 50         EXTRACT_HANDLE("Data::Sync::Shared::Semaphore", self);
    50          
    50          
163             CODE:
164 4 50         RETVAL = h->hdr->param;
165             OUTPUT:
166             RETVAL
167              
168             SV *
169             path(self)
170             SV *self
171             PREINIT:
172 2 50         EXTRACT_HANDLE("Data::Sync::Shared::Semaphore", self);
    50          
    50          
173             CODE:
174 2 100         RETVAL = h->path ? newSVpv(h->path, 0) : &PL_sv_undef;
175             OUTPUT:
176             RETVAL
177              
178             IV
179             memfd(self)
180             SV *self
181             PREINIT:
182 2 50         EXTRACT_HANDLE("Data::Sync::Shared::Semaphore", self);
    50          
    50          
183             CODE:
184 2 50         RETVAL = h->backing_fd;
185             OUTPUT:
186             RETVAL
187              
188             IV
189             eventfd(self)
190             SV *self
191             PREINIT:
192 3 50         EXTRACT_HANDLE("Data::Sync::Shared::Semaphore", self);
    50          
    50          
193             CODE:
194 3           RETVAL = sync_create_eventfd(h);
195 3 50         if (RETVAL < 0) croak("eventfd: %s", strerror(errno));
196             OUTPUT:
197             RETVAL
198              
199             void
200             eventfd_set(self, fd)
201             SV *self
202             int fd
203             PREINIT:
204 1 50         EXTRACT_HANDLE("Data::Sync::Shared::Semaphore", self);
    50          
    50          
205             CODE:
206 1 50         if (h->notify_fd >= 0 && h->notify_fd != fd) close(h->notify_fd);
    50          
207 1           h->notify_fd = fd;
208              
209             IV
210             fileno(self)
211             SV *self
212             PREINIT:
213 3 50         EXTRACT_HANDLE("Data::Sync::Shared::Semaphore", self);
    50          
    50          
214             CODE:
215 3 50         RETVAL = h->notify_fd;
216             OUTPUT:
217             RETVAL
218              
219             bool
220             notify(self)
221             SV *self
222             PREINIT:
223 2 50         EXTRACT_HANDLE("Data::Sync::Shared::Semaphore", self);
    50          
    50          
224             CODE:
225 2 50         RETVAL = sync_notify(h);
226             OUTPUT:
227             RETVAL
228              
229             SV *
230             eventfd_consume(self)
231             SV *self
232             PREINIT:
233 3 50         EXTRACT_HANDLE("Data::Sync::Shared::Semaphore", self);
    50          
    50          
234             CODE:
235 3           int64_t v = sync_eventfd_consume(h);
236 3 100         RETVAL = (v >= 0) ? newSViv((IV)v) : &PL_sv_undef;
237             OUTPUT:
238             RETVAL
239              
240             void
241             sync(self)
242             SV *self
243             PREINIT:
244 0 0         EXTRACT_HANDLE("Data::Sync::Shared::Semaphore", self);
    0          
    0          
245             CODE:
246 0 0         if (sync_msync(h) != 0) croak("msync: %s", strerror(errno));
247              
248             void
249             unlink(self_or_class, ...)
250             SV *self_or_class
251             CODE:
252             const char *p;
253 4 100         if (sv_isobject(self_or_class)) {
254 3           SyncHandle *h = INT2PTR(SyncHandle*, SvIV(SvRV(self_or_class)));
255 3 50         if (!h) croak("Attempted to use a destroyed object");
256 3           p = h->path;
257             } else {
258 1 50         if (items < 2) croak("Usage: ...->unlink($path)");
259 0           p = SvPV_nolen(ST(1));
260             }
261 3 100         if (!p) croak("cannot unlink anonymous or memfd object");
262 2 50         if (unlink(p) != 0)
263 0           croak("unlink(%s): %s", p, strerror(errno));
264              
265             SV *
266             stats(self)
267             SV *self
268             PREINIT:
269 1 50         EXTRACT_HANDLE("Data::Sync::Shared::Semaphore", self);
    50          
    50          
270             CODE:
271 1           HV *hv = newHV();
272 1           SyncHeader *hdr = h->hdr;
273 1           hv_store(hv, "value", 5, newSVuv(sync_sem_value(h)), 0);
274 1           hv_store(hv, "max", 3, newSVuv(hdr->param), 0);
275 1           hv_store(hv, "waiters", 7, newSVuv((UV)__atomic_load_n(&hdr->waiters, __ATOMIC_RELAXED)), 0);
276 1           hv_store(hv, "mmap_size", 9, newSVuv((UV)h->mmap_size), 0);
277 1           hv_store(hv, "acquires", 8, newSVuv((UV)__atomic_load_n(&hdr->stat_acquires, __ATOMIC_RELAXED)), 0);
278 1           hv_store(hv, "releases", 8, newSVuv((UV)__atomic_load_n(&hdr->stat_releases, __ATOMIC_RELAXED)), 0);
279 1           hv_store(hv, "waits", 5, newSVuv((UV)__atomic_load_n(&hdr->stat_waits, __ATOMIC_RELAXED)), 0);
280 1           hv_store(hv, "timeouts", 8, newSVuv((UV)__atomic_load_n(&hdr->stat_timeouts, __ATOMIC_RELAXED)), 0);
281 1           hv_store(hv, "recoveries", 10, newSVuv((UV)__atomic_load_n(&hdr->stat_recoveries, __ATOMIC_RELAXED)), 0);
282 1           RETVAL = newRV_noinc((SV *)hv);
283             OUTPUT:
284             RETVAL
285              
286             MODULE = Data::Sync::Shared PACKAGE = Data::Sync::Shared::Barrier
287              
288             PROTOTYPES: DISABLE
289              
290             SV *
291             new(class, path, parties)
292             const char *class
293             SV *path
294             UV parties
295             PREINIT:
296             char errbuf[SYNC_ERR_BUFLEN];
297             CODE:
298 13 100         const char *p = SvOK(path) ? SvPV_nolen(path) : NULL;
299 13           SyncHandle *h = sync_create(p, SYNC_TYPE_BARRIER, (uint32_t)parties, 0, errbuf);
300 13 100         if (!h) croak("Data::Sync::Shared::Barrier->new: %s", errbuf);
301 10           MAKE_OBJ(class, h);
302             OUTPUT:
303             RETVAL
304              
305             SV *
306             new_memfd(class, name, parties)
307             const char *class
308             const char *name
309             UV parties
310             PREINIT:
311             char errbuf[SYNC_ERR_BUFLEN];
312             CODE:
313 1           SyncHandle *h = sync_create_memfd(name, SYNC_TYPE_BARRIER, (uint32_t)parties, 0, errbuf);
314 1 50         if (!h) croak("Data::Sync::Shared::Barrier->new_memfd: %s", errbuf);
315 1           MAKE_OBJ(class, h);
316             OUTPUT:
317             RETVAL
318              
319             SV *
320             new_from_fd(class, fd)
321             const char *class
322             int fd
323             PREINIT:
324             char errbuf[SYNC_ERR_BUFLEN];
325             CODE:
326 1           SyncHandle *h = sync_open_fd(fd, SYNC_TYPE_BARRIER, errbuf);
327 1 50         if (!h) croak("Data::Sync::Shared::Barrier->new_from_fd: %s", errbuf);
328 0           MAKE_OBJ(class, h);
329             OUTPUT:
330             RETVAL
331              
332             void
333             DESTROY(self)
334             SV *self
335             CODE:
336 11 50         if (!SvROK(self)) return;
337 11           SyncHandle *h = INT2PTR(SyncHandle*, SvIV(SvRV(self)));
338 11 50         if (!h) return;
339 11           sv_setiv(SvRV(self), 0);
340 11           sync_destroy(h);
341              
342             IV
343             wait(self, ...)
344             SV *self
345             PREINIT:
346 9 50         EXTRACT_HANDLE("Data::Sync::Shared::Barrier", self);
    50          
    50          
347 9 50         double timeout = -1;
348             CODE:
349 9 50         if (items > 1) timeout = SvNV(ST(1));
350 9 100         RETVAL = sync_barrier_wait(h, timeout);
351             OUTPUT:
352             RETVAL
353              
354             UV
355             generation(self)
356             SV *self
357             PREINIT:
358 5 50         EXTRACT_HANDLE("Data::Sync::Shared::Barrier", self);
    50          
    50          
359             CODE:
360 5 100         RETVAL = sync_barrier_generation(h);
361             OUTPUT:
362             RETVAL
363              
364             UV
365             arrived(self)
366             SV *self
367             PREINIT:
368 3 50         EXTRACT_HANDLE("Data::Sync::Shared::Barrier", self);
    50          
    50          
369             CODE:
370 3 50         RETVAL = sync_barrier_arrived(h);
371             OUTPUT:
372             RETVAL
373              
374             UV
375             parties(self)
376             SV *self
377             PREINIT:
378 1 50         EXTRACT_HANDLE("Data::Sync::Shared::Barrier", self);
    50          
    50          
379             CODE:
380 1 50         RETVAL = h->hdr->param;
381             OUTPUT:
382             RETVAL
383              
384             bool
385             is_broken(self)
386             SV *self
387             PREINIT:
388 2 50         EXTRACT_HANDLE("Data::Sync::Shared::Barrier", self);
    50          
    50          
389             CODE:
390 2 100         RETVAL = sync_barrier_is_broken(h) ? 1 : 0;
391             OUTPUT:
392             RETVAL
393              
394             void
395             reset(self)
396             SV *self
397             PREINIT:
398 2 50         EXTRACT_HANDLE("Data::Sync::Shared::Barrier", self);
    50          
    50          
399             CODE:
400 2           sync_barrier_reset(h);
401              
402             SV *
403             path(self)
404             SV *self
405             PREINIT:
406 2 50         EXTRACT_HANDLE("Data::Sync::Shared::Barrier", self);
    50          
    50          
407             CODE:
408 2 100         RETVAL = h->path ? newSVpv(h->path, 0) : &PL_sv_undef;
409             OUTPUT:
410             RETVAL
411              
412             IV
413             memfd(self)
414             SV *self
415             PREINIT:
416 1 50         EXTRACT_HANDLE("Data::Sync::Shared::Barrier", self);
    50          
    50          
417             CODE:
418 1 50         RETVAL = h->backing_fd;
419             OUTPUT:
420             RETVAL
421              
422             IV
423             eventfd(self)
424             SV *self
425             PREINIT:
426 2 50         EXTRACT_HANDLE("Data::Sync::Shared::Barrier", self);
    50          
    50          
427             CODE:
428 2           RETVAL = sync_create_eventfd(h);
429 2 50         if (RETVAL < 0) croak("eventfd: %s", strerror(errno));
430             OUTPUT:
431             RETVAL
432              
433             void
434             eventfd_set(self, fd)
435             SV *self
436             int fd
437             PREINIT:
438 1 50         EXTRACT_HANDLE("Data::Sync::Shared::Barrier", self);
    50          
    50          
439             CODE:
440 1 50         if (h->notify_fd >= 0 && h->notify_fd != fd) close(h->notify_fd);
    50          
441 1           h->notify_fd = fd;
442              
443             IV
444             fileno(self)
445             SV *self
446             PREINIT:
447 3 50         EXTRACT_HANDLE("Data::Sync::Shared::Barrier", self);
    50          
    50          
448             CODE:
449 3 50         RETVAL = h->notify_fd;
450             OUTPUT:
451             RETVAL
452              
453             bool
454             notify(self)
455             SV *self
456             PREINIT:
457 2 50         EXTRACT_HANDLE("Data::Sync::Shared::Barrier", self);
    50          
    50          
458             CODE:
459 2 50         RETVAL = sync_notify(h);
460             OUTPUT:
461             RETVAL
462              
463             SV *
464             eventfd_consume(self)
465             SV *self
466             PREINIT:
467 2 50         EXTRACT_HANDLE("Data::Sync::Shared::Barrier", self);
    50          
    50          
468             CODE:
469 2           int64_t v = sync_eventfd_consume(h);
470 2 100         RETVAL = (v >= 0) ? newSViv((IV)v) : &PL_sv_undef;
471             OUTPUT:
472             RETVAL
473              
474             void
475             sync(self)
476             SV *self
477             PREINIT:
478 0 0         EXTRACT_HANDLE("Data::Sync::Shared::Barrier", self);
    0          
    0          
479             CODE:
480 0 0         if (sync_msync(h) != 0) croak("msync: %s", strerror(errno));
481              
482             void
483             unlink(self_or_class, ...)
484             SV *self_or_class
485             CODE:
486             const char *p;
487 1 50         if (sv_isobject(self_or_class)) {
488 1           SyncHandle *h = INT2PTR(SyncHandle*, SvIV(SvRV(self_or_class)));
489 1 50         if (!h) croak("Attempted to use a destroyed object");
490 1           p = h->path;
491             } else {
492 0 0         if (items < 2) croak("Usage: ...->unlink($path)");
493 0           p = SvPV_nolen(ST(1));
494             }
495 1 50         if (!p) croak("cannot unlink anonymous or memfd object");
496 1 50         if (unlink(p) != 0)
497 0           croak("unlink(%s): %s", p, strerror(errno));
498              
499             SV *
500             stats(self)
501             SV *self
502             PREINIT:
503 1 50         EXTRACT_HANDLE("Data::Sync::Shared::Barrier", self);
    50          
    50          
504             CODE:
505 1           HV *hv = newHV();
506 1           SyncHeader *hdr = h->hdr;
507 1           hv_store(hv, "parties", 7, newSVuv(hdr->param), 0);
508 1           hv_store(hv, "arrived", 7, newSVuv(sync_barrier_arrived(h)), 0);
509 1           hv_store(hv, "generation", 10, newSVuv(sync_barrier_generation(h)), 0);
510 1           hv_store(hv, "waiters", 7, newSVuv((UV)__atomic_load_n(&hdr->waiters, __ATOMIC_RELAXED)), 0);
511 1           hv_store(hv, "mmap_size", 9, newSVuv((UV)h->mmap_size), 0);
512 1           hv_store(hv, "waits", 5, newSVuv((UV)__atomic_load_n(&hdr->stat_waits, __ATOMIC_RELAXED)), 0);
513 1           hv_store(hv, "releases", 8, newSVuv((UV)__atomic_load_n(&hdr->stat_releases, __ATOMIC_RELAXED)), 0);
514 1           hv_store(hv, "timeouts", 8, newSVuv((UV)__atomic_load_n(&hdr->stat_timeouts, __ATOMIC_RELAXED)), 0);
515 1           RETVAL = newRV_noinc((SV *)hv);
516             OUTPUT:
517             RETVAL
518              
519             MODULE = Data::Sync::Shared PACKAGE = Data::Sync::Shared::RWLock
520              
521             PROTOTYPES: DISABLE
522              
523             SV *
524             new(class, path)
525             const char *class
526             SV *path
527             PREINIT:
528             char errbuf[SYNC_ERR_BUFLEN];
529             CODE:
530 14 100         const char *p = SvOK(path) ? SvPV_nolen(path) : NULL;
531 14           SyncHandle *h = sync_create(p, SYNC_TYPE_RWLOCK, 0, 0, errbuf);
532 14 100         if (!h) croak("Data::Sync::Shared::RWLock->new: %s", errbuf);
533 13           MAKE_OBJ(class, h);
534             OUTPUT:
535             RETVAL
536              
537             SV *
538             new_memfd(class, name)
539             const char *class
540             const char *name
541             PREINIT:
542             char errbuf[SYNC_ERR_BUFLEN];
543             CODE:
544 1           SyncHandle *h = sync_create_memfd(name, SYNC_TYPE_RWLOCK, 0, 0, errbuf);
545 1 50         if (!h) croak("Data::Sync::Shared::RWLock->new_memfd: %s", errbuf);
546 1           MAKE_OBJ(class, h);
547             OUTPUT:
548             RETVAL
549              
550             SV *
551             new_from_fd(class, fd)
552             const char *class
553             int fd
554             PREINIT:
555             char errbuf[SYNC_ERR_BUFLEN];
556             CODE:
557 1           SyncHandle *h = sync_open_fd(fd, SYNC_TYPE_RWLOCK, errbuf);
558 1 50         if (!h) croak("Data::Sync::Shared::RWLock->new_from_fd: %s", errbuf);
559 1           MAKE_OBJ(class, h);
560             OUTPUT:
561             RETVAL
562              
563             void
564             DESTROY(self)
565             SV *self
566             CODE:
567 16 50         if (!SvROK(self)) return;
568 16           SyncHandle *h = INT2PTR(SyncHandle*, SvIV(SvRV(self)));
569 16 100         if (!h) return;
570 15           sv_setiv(SvRV(self), 0);
571 15           sync_destroy(h);
572              
573             void
574             rdlock(self, ...)
575             SV *self
576             PREINIT:
577 8 50         EXTRACT_HANDLE("Data::Sync::Shared::RWLock", self);
    50          
    100          
578             CODE:
579 7 50         if (items > 1) {
580 0           double timeout = SvNV(ST(1));
581 0 0         if (!sync_rwlock_rdlock_timed(h->hdr, timeout))
582 0           croak("rdlock: timeout");
583             } else {
584 7           sync_rwlock_rdlock(h->hdr);
585             }
586 7           __atomic_add_fetch(&h->hdr->stat_acquires, 1, __ATOMIC_RELAXED);
587              
588             bool
589             try_rdlock(self)
590             SV *self
591             PREINIT:
592 3 50         EXTRACT_HANDLE("Data::Sync::Shared::RWLock", self);
    50          
    50          
593             CODE:
594 3           RETVAL = sync_rwlock_try_rdlock(h->hdr);
595 3 100         if (RETVAL)
596 2           __atomic_add_fetch(&h->hdr->stat_acquires, 1, __ATOMIC_RELAXED);
597             OUTPUT:
598             RETVAL
599              
600             bool
601             rdlock_timed(self, timeout)
602             SV *self
603             double timeout
604             PREINIT:
605 3 50         EXTRACT_HANDLE("Data::Sync::Shared::RWLock", self);
    50          
    50          
606             CODE:
607 3           RETVAL = sync_rwlock_rdlock_timed(h->hdr, timeout);
608 3 100         if (RETVAL)
609 2           __atomic_add_fetch(&h->hdr->stat_acquires, 1, __ATOMIC_RELAXED);
610             OUTPUT:
611             RETVAL
612              
613             void
614             rdunlock(self)
615             SV *self
616             PREINIT:
617 12 50         EXTRACT_HANDLE("Data::Sync::Shared::RWLock", self);
    50          
    50          
618             CODE:
619 12           sync_rwlock_rdunlock(h->hdr);
620 12           __atomic_add_fetch(&h->hdr->stat_releases, 1, __ATOMIC_RELAXED);
621              
622             void
623             wrlock(self, ...)
624             SV *self
625             PREINIT:
626 5 50         EXTRACT_HANDLE("Data::Sync::Shared::RWLock", self);
    50          
    50          
627             CODE:
628 5 50         if (items > 1) {
629 0           double timeout = SvNV(ST(1));
630 0 0         if (!sync_rwlock_wrlock_timed(h->hdr, timeout))
631 0           croak("wrlock: timeout");
632             } else {
633 5           sync_rwlock_wrlock(h->hdr);
634             }
635 5           __atomic_add_fetch(&h->hdr->stat_acquires, 1, __ATOMIC_RELAXED);
636              
637             bool
638             try_wrlock(self)
639             SV *self
640             PREINIT:
641 3 50         EXTRACT_HANDLE("Data::Sync::Shared::RWLock", self);
    50          
    50          
642             CODE:
643 3           RETVAL = sync_rwlock_try_wrlock(h->hdr);
644 3 100         if (RETVAL)
645 1           __atomic_add_fetch(&h->hdr->stat_acquires, 1, __ATOMIC_RELAXED);
646             OUTPUT:
647             RETVAL
648              
649             bool
650             wrlock_timed(self, timeout)
651             SV *self
652             double timeout
653             PREINIT:
654 4 50         EXTRACT_HANDLE("Data::Sync::Shared::RWLock", self);
    50          
    50          
655             CODE:
656 4           RETVAL = sync_rwlock_wrlock_timed(h->hdr, timeout);
657 4 100         if (RETVAL)
658 3           __atomic_add_fetch(&h->hdr->stat_acquires, 1, __ATOMIC_RELAXED);
659             OUTPUT:
660             RETVAL
661              
662             void
663             wrunlock(self)
664             SV *self
665             PREINIT:
666 8 50         EXTRACT_HANDLE("Data::Sync::Shared::RWLock", self);
    50          
    50          
667             CODE:
668 8           sync_rwlock_wrunlock(h->hdr);
669 8           __atomic_add_fetch(&h->hdr->stat_releases, 1, __ATOMIC_RELAXED);
670              
671             void
672             downgrade(self)
673             SV *self
674             PREINIT:
675 1 50         EXTRACT_HANDLE("Data::Sync::Shared::RWLock", self);
    50          
    50          
676             CODE:
677 1           sync_rwlock_downgrade(h->hdr);
678 1           __atomic_add_fetch(&h->hdr->stat_releases, 1, __ATOMIC_RELAXED);
679 1           __atomic_add_fetch(&h->hdr->stat_acquires, 1, __ATOMIC_RELAXED);
680              
681             SV *
682             path(self)
683             SV *self
684             PREINIT:
685 2 50         EXTRACT_HANDLE("Data::Sync::Shared::RWLock", self);
    50          
    50          
686             CODE:
687 2 100         RETVAL = h->path ? newSVpv(h->path, 0) : &PL_sv_undef;
688             OUTPUT:
689             RETVAL
690              
691             IV
692             memfd(self)
693             SV *self
694             PREINIT:
695 2 50         EXTRACT_HANDLE("Data::Sync::Shared::RWLock", self);
    50          
    50          
696             CODE:
697 2 50         RETVAL = h->backing_fd;
698             OUTPUT:
699             RETVAL
700              
701             IV
702             eventfd(self)
703             SV *self
704             PREINIT:
705 2 50         EXTRACT_HANDLE("Data::Sync::Shared::RWLock", self);
    50          
    50          
706             CODE:
707 2           RETVAL = sync_create_eventfd(h);
708 2 50         if (RETVAL < 0) croak("eventfd: %s", strerror(errno));
709             OUTPUT:
710             RETVAL
711              
712             void
713             eventfd_set(self, fd)
714             SV *self
715             int fd
716             PREINIT:
717 1 50         EXTRACT_HANDLE("Data::Sync::Shared::RWLock", self);
    50          
    50          
718             CODE:
719 1 50         if (h->notify_fd >= 0 && h->notify_fd != fd) close(h->notify_fd);
    50          
720 1           h->notify_fd = fd;
721              
722             IV
723             fileno(self)
724             SV *self
725             PREINIT:
726 3 50         EXTRACT_HANDLE("Data::Sync::Shared::RWLock", self);
    50          
    50          
727             CODE:
728 3 50         RETVAL = h->notify_fd;
729             OUTPUT:
730             RETVAL
731              
732             bool
733             notify(self)
734             SV *self
735             PREINIT:
736 2 50         EXTRACT_HANDLE("Data::Sync::Shared::RWLock", self);
    50          
    50          
737             CODE:
738 2 50         RETVAL = sync_notify(h);
739             OUTPUT:
740             RETVAL
741              
742             SV *
743             eventfd_consume(self)
744             SV *self
745             PREINIT:
746 2 50         EXTRACT_HANDLE("Data::Sync::Shared::RWLock", self);
    50          
    50          
747             CODE:
748 2           int64_t v = sync_eventfd_consume(h);
749 2 100         RETVAL = (v >= 0) ? newSViv((IV)v) : &PL_sv_undef;
750             OUTPUT:
751             RETVAL
752              
753             void
754             sync(self)
755             SV *self
756             PREINIT:
757 0 0         EXTRACT_HANDLE("Data::Sync::Shared::RWLock", self);
    0          
    0          
758             CODE:
759 0 0         if (sync_msync(h) != 0) croak("msync: %s", strerror(errno));
760              
761             void
762             unlink(self_or_class, ...)
763             SV *self_or_class
764             CODE:
765             const char *p;
766 1 50         if (sv_isobject(self_or_class)) {
767 1           SyncHandle *h = INT2PTR(SyncHandle*, SvIV(SvRV(self_or_class)));
768 1 50         if (!h) croak("Attempted to use a destroyed object");
769 1           p = h->path;
770             } else {
771 0 0         if (items < 2) croak("Usage: ...->unlink($path)");
772 0           p = SvPV_nolen(ST(1));
773             }
774 1 50         if (!p) croak("cannot unlink anonymous or memfd object");
775 1 50         if (unlink(p) != 0)
776 0           croak("unlink(%s): %s", p, strerror(errno));
777              
778             SV *
779             stats(self)
780             SV *self
781             PREINIT:
782 13 50         EXTRACT_HANDLE("Data::Sync::Shared::RWLock", self);
    50          
    50          
783             CODE:
784 13           HV *hv = newHV();
785 13           SyncHeader *hdr = h->hdr;
786 13           uint32_t val = __atomic_load_n(&hdr->value, __ATOMIC_RELAXED);
787             const char *state;
788 13 100         if (val == 0) state = "unlocked";
789 8 100         else if (val < SYNC_RWLOCK_WRITER_BIT) state = "read_locked";
790 3           else state = "write_locked";
791 13           hv_store(hv, "state", 5, newSVpv(state, 0), 0);
792 13           hv_store(hv, "readers", 7,
793             newSVuv(val < SYNC_RWLOCK_WRITER_BIT ? val : 0), 0);
794 13           hv_store(hv, "waiters", 7, newSVuv((UV)__atomic_load_n(&hdr->waiters, __ATOMIC_RELAXED)), 0);
795 13           hv_store(hv, "mmap_size", 9, newSVuv((UV)h->mmap_size), 0);
796 13           hv_store(hv, "acquires", 8, newSVuv((UV)__atomic_load_n(&hdr->stat_acquires, __ATOMIC_RELAXED)), 0);
797 13           hv_store(hv, "releases", 8, newSVuv((UV)__atomic_load_n(&hdr->stat_releases, __ATOMIC_RELAXED)), 0);
798 13           hv_store(hv, "recoveries", 10, newSVuv((UV)__atomic_load_n(&hdr->stat_recoveries, __ATOMIC_RELAXED)), 0);
799 13           RETVAL = newRV_noinc((SV *)hv);
800             OUTPUT:
801             RETVAL
802              
803             MODULE = Data::Sync::Shared PACKAGE = Data::Sync::Shared::Condvar
804              
805             PROTOTYPES: DISABLE
806              
807             SV *
808             new(class, path)
809             const char *class
810             SV *path
811             PREINIT:
812             char errbuf[SYNC_ERR_BUFLEN];
813             CODE:
814 13 100         const char *p = SvOK(path) ? SvPV_nolen(path) : NULL;
815 13           SyncHandle *h = sync_create(p, SYNC_TYPE_CONDVAR, 0, 0, errbuf);
816 13 50         if (!h) croak("Data::Sync::Shared::Condvar->new: %s", errbuf);
817 13           MAKE_OBJ(class, h);
818             OUTPUT:
819             RETVAL
820              
821             SV *
822             new_memfd(class, name)
823             const char *class
824             const char *name
825             PREINIT:
826             char errbuf[SYNC_ERR_BUFLEN];
827             CODE:
828 1           SyncHandle *h = sync_create_memfd(name, SYNC_TYPE_CONDVAR, 0, 0, errbuf);
829 1 50         if (!h) croak("Data::Sync::Shared::Condvar->new_memfd: %s", errbuf);
830 1           MAKE_OBJ(class, h);
831             OUTPUT:
832             RETVAL
833              
834             SV *
835             new_from_fd(class, fd)
836             const char *class
837             int fd
838             PREINIT:
839             char errbuf[SYNC_ERR_BUFLEN];
840             CODE:
841 0           SyncHandle *h = sync_open_fd(fd, SYNC_TYPE_CONDVAR, errbuf);
842 0 0         if (!h) croak("Data::Sync::Shared::Condvar->new_from_fd: %s", errbuf);
843 0           MAKE_OBJ(class, h);
844             OUTPUT:
845             RETVAL
846              
847             void
848             DESTROY(self)
849             SV *self
850             CODE:
851 14 50         if (!SvROK(self)) return;
852 14           SyncHandle *h = INT2PTR(SyncHandle*, SvIV(SvRV(self)));
853 14 50         if (!h) return;
854 14           sv_setiv(SvRV(self), 0);
855 14           sync_destroy(h);
856              
857             void
858             lock(self)
859             SV *self
860             PREINIT:
861 12 50         EXTRACT_HANDLE("Data::Sync::Shared::Condvar", self);
    50          
    50          
862             CODE:
863 12           sync_condvar_lock(h);
864              
865             bool
866             try_lock(self)
867             SV *self
868             PREINIT:
869 1 50         EXTRACT_HANDLE("Data::Sync::Shared::Condvar", self);
    50          
    50          
870             CODE:
871 1 50         RETVAL = sync_condvar_try_lock(h);
872             OUTPUT:
873             RETVAL
874              
875             void
876             unlock(self)
877             SV *self
878             PREINIT:
879 13 50         EXTRACT_HANDLE("Data::Sync::Shared::Condvar", self);
    50          
    50          
880             CODE:
881 13           sync_condvar_unlock(h);
882              
883             bool
884             wait(self, ...)
885             SV *self
886             PREINIT:
887 4 50         EXTRACT_HANDLE("Data::Sync::Shared::Condvar", self);
    50          
    50          
888 4           double timeout = -1;
889             CODE:
890 4 50         if (items > 1) timeout = SvNV(ST(1));
891 4 100         RETVAL = sync_condvar_wait(h, timeout);
892             OUTPUT:
893             RETVAL
894              
895             void
896             signal(self)
897             SV *self
898             PREINIT:
899 1 50         EXTRACT_HANDLE("Data::Sync::Shared::Condvar", self);
    50          
    50          
900             CODE:
901 1           sync_condvar_signal(h);
902              
903             void
904             broadcast(self)
905             SV *self
906             PREINIT:
907 1 50         EXTRACT_HANDLE("Data::Sync::Shared::Condvar", self);
    50          
    50          
908             CODE:
909 1           sync_condvar_broadcast(h);
910              
911             SV *
912             path(self)
913             SV *self
914             PREINIT:
915 2 50         EXTRACT_HANDLE("Data::Sync::Shared::Condvar", self);
    50          
    50          
916             CODE:
917 2 100         RETVAL = h->path ? newSVpv(h->path, 0) : &PL_sv_undef;
918             OUTPUT:
919             RETVAL
920              
921             IV
922             memfd(self)
923             SV *self
924             PREINIT:
925 1 50         EXTRACT_HANDLE("Data::Sync::Shared::Condvar", self);
    50          
    50          
926             CODE:
927 1 50         RETVAL = h->backing_fd;
928             OUTPUT:
929             RETVAL
930              
931             IV
932             eventfd(self)
933             SV *self
934             PREINIT:
935 2 50         EXTRACT_HANDLE("Data::Sync::Shared::Condvar", self);
    50          
    50          
936             CODE:
937 2           RETVAL = sync_create_eventfd(h);
938 2 50         if (RETVAL < 0) croak("eventfd: %s", strerror(errno));
939             OUTPUT:
940             RETVAL
941              
942             void
943             eventfd_set(self, fd)
944             SV *self
945             int fd
946             PREINIT:
947 1 50         EXTRACT_HANDLE("Data::Sync::Shared::Condvar", self);
    50          
    50          
948             CODE:
949 1 50         if (h->notify_fd >= 0 && h->notify_fd != fd) close(h->notify_fd);
    50          
950 1           h->notify_fd = fd;
951              
952             IV
953             fileno(self)
954             SV *self
955             PREINIT:
956 3 50         EXTRACT_HANDLE("Data::Sync::Shared::Condvar", self);
    50          
    50          
957             CODE:
958 3 50         RETVAL = h->notify_fd;
959             OUTPUT:
960             RETVAL
961              
962             bool
963             notify(self)
964             SV *self
965             PREINIT:
966 2 50         EXTRACT_HANDLE("Data::Sync::Shared::Condvar", self);
    50          
    50          
967             CODE:
968 2 50         RETVAL = sync_notify(h);
969             OUTPUT:
970             RETVAL
971              
972             SV *
973             eventfd_consume(self)
974             SV *self
975             PREINIT:
976 2 50         EXTRACT_HANDLE("Data::Sync::Shared::Condvar", self);
    50          
    50          
977             CODE:
978 2           int64_t v = sync_eventfd_consume(h);
979 2 100         RETVAL = (v >= 0) ? newSViv((IV)v) : &PL_sv_undef;
980             OUTPUT:
981             RETVAL
982              
983             void
984             sync(self)
985             SV *self
986             PREINIT:
987 0 0         EXTRACT_HANDLE("Data::Sync::Shared::Condvar", self);
    0          
    0          
988             CODE:
989 0 0         if (sync_msync(h) != 0) croak("msync: %s", strerror(errno));
990              
991             void
992             unlink(self_or_class, ...)
993             SV *self_or_class
994             CODE:
995             const char *p;
996 1 50         if (sv_isobject(self_or_class)) {
997 1           SyncHandle *h = INT2PTR(SyncHandle*, SvIV(SvRV(self_or_class)));
998 1 50         if (!h) croak("Attempted to use a destroyed object");
999 1           p = h->path;
1000             } else {
1001 0 0         if (items < 2) croak("Usage: ...->unlink($path)");
1002 0           p = SvPV_nolen(ST(1));
1003             }
1004 1 50         if (!p) croak("cannot unlink anonymous or memfd object");
1005 1 50         if (unlink(p) != 0)
1006 0           croak("unlink(%s): %s", p, strerror(errno));
1007              
1008             SV *
1009             stats(self)
1010             SV *self
1011             PREINIT:
1012 1 50         EXTRACT_HANDLE("Data::Sync::Shared::Condvar", self);
    50          
    50          
1013             CODE:
1014 1           HV *hv = newHV();
1015 1           SyncHeader *hdr = h->hdr;
1016 1           hv_store(hv, "waiters", 7, newSVuv((UV)__atomic_load_n(&hdr->waiters, __ATOMIC_RELAXED)), 0);
1017 1           hv_store(hv, "signals", 7, newSVuv((UV)__atomic_load_n(&hdr->stat_signals, __ATOMIC_RELAXED)), 0);
1018 1           hv_store(hv, "mmap_size", 9, newSVuv((UV)h->mmap_size), 0);
1019 1           hv_store(hv, "acquires", 8, newSVuv((UV)__atomic_load_n(&hdr->stat_acquires, __ATOMIC_RELAXED)), 0);
1020 1           hv_store(hv, "releases", 8, newSVuv((UV)__atomic_load_n(&hdr->stat_releases, __ATOMIC_RELAXED)), 0);
1021 1           hv_store(hv, "waits", 5, newSVuv((UV)__atomic_load_n(&hdr->stat_waits, __ATOMIC_RELAXED)), 0);
1022 1           hv_store(hv, "timeouts", 8, newSVuv((UV)__atomic_load_n(&hdr->stat_timeouts, __ATOMIC_RELAXED)), 0);
1023 1           hv_store(hv, "recoveries", 10, newSVuv((UV)__atomic_load_n(&hdr->stat_recoveries, __ATOMIC_RELAXED)), 0);
1024 1           RETVAL = newRV_noinc((SV *)hv);
1025             OUTPUT:
1026             RETVAL
1027              
1028             MODULE = Data::Sync::Shared PACKAGE = Data::Sync::Shared::Once
1029              
1030             PROTOTYPES: DISABLE
1031              
1032             SV *
1033             new(class, path)
1034             const char *class
1035             SV *path
1036             PREINIT:
1037             char errbuf[SYNC_ERR_BUFLEN];
1038             CODE:
1039 9 100         const char *p = SvOK(path) ? SvPV_nolen(path) : NULL;
1040 9           SyncHandle *h = sync_create(p, SYNC_TYPE_ONCE, 0, 0, errbuf);
1041 9 100         if (!h) croak("Data::Sync::Shared::Once->new: %s", errbuf);
1042 8           MAKE_OBJ(class, h);
1043             OUTPUT:
1044             RETVAL
1045              
1046             SV *
1047             new_memfd(class, name)
1048             const char *class
1049             const char *name
1050             PREINIT:
1051             char errbuf[SYNC_ERR_BUFLEN];
1052             CODE:
1053 1           SyncHandle *h = sync_create_memfd(name, SYNC_TYPE_ONCE, 0, 0, errbuf);
1054 1 50         if (!h) croak("Data::Sync::Shared::Once->new_memfd: %s", errbuf);
1055 1           MAKE_OBJ(class, h);
1056             OUTPUT:
1057             RETVAL
1058              
1059             SV *
1060             new_from_fd(class, fd)
1061             const char *class
1062             int fd
1063             PREINIT:
1064             char errbuf[SYNC_ERR_BUFLEN];
1065             CODE:
1066 1           SyncHandle *h = sync_open_fd(fd, SYNC_TYPE_ONCE, errbuf);
1067 1 50         if (!h) croak("Data::Sync::Shared::Once->new_from_fd: %s", errbuf);
1068 1           MAKE_OBJ(class, h);
1069             OUTPUT:
1070             RETVAL
1071              
1072             void
1073             DESTROY(self)
1074             SV *self
1075             CODE:
1076 10 50         if (!SvROK(self)) return;
1077 10           SyncHandle *h = INT2PTR(SyncHandle*, SvIV(SvRV(self)));
1078 10 50         if (!h) return;
1079 10           sv_setiv(SvRV(self), 0);
1080 10           sync_destroy(h);
1081              
1082             bool
1083             enter(self, ...)
1084             SV *self
1085             PREINIT:
1086 6 50         EXTRACT_HANDLE("Data::Sync::Shared::Once", self);
    50          
    50          
1087 6           double timeout = -1;
1088             CODE:
1089 6 100         if (items > 1) timeout = SvNV(ST(1));
1090 6 100         RETVAL = sync_once_enter(h, timeout);
1091             OUTPUT:
1092             RETVAL
1093              
1094             void
1095             done(self)
1096             SV *self
1097             PREINIT:
1098 4 50         EXTRACT_HANDLE("Data::Sync::Shared::Once", self);
    50          
    50          
1099             CODE:
1100 4           sync_once_done(h);
1101              
1102             bool
1103             is_done(self)
1104             SV *self
1105             PREINIT:
1106 8 50         EXTRACT_HANDLE("Data::Sync::Shared::Once", self);
    50          
    50          
1107             CODE:
1108 8 100         RETVAL = sync_once_is_done(h);
1109             OUTPUT:
1110             RETVAL
1111              
1112             void
1113             reset(self)
1114             SV *self
1115             PREINIT:
1116 2 50         EXTRACT_HANDLE("Data::Sync::Shared::Once", self);
    50          
    50          
1117             CODE:
1118 2           sync_once_reset(h);
1119              
1120             SV *
1121             path(self)
1122             SV *self
1123             PREINIT:
1124 2 50         EXTRACT_HANDLE("Data::Sync::Shared::Once", self);
    50          
    50          
1125             CODE:
1126 2 100         RETVAL = h->path ? newSVpv(h->path, 0) : &PL_sv_undef;
1127             OUTPUT:
1128             RETVAL
1129              
1130             IV
1131             memfd(self)
1132             SV *self
1133             PREINIT:
1134 2 50         EXTRACT_HANDLE("Data::Sync::Shared::Once", self);
    50          
    50          
1135             CODE:
1136 2 50         RETVAL = h->backing_fd;
1137             OUTPUT:
1138             RETVAL
1139              
1140             IV
1141             eventfd(self)
1142             SV *self
1143             PREINIT:
1144 2 50         EXTRACT_HANDLE("Data::Sync::Shared::Once", self);
    50          
    50          
1145             CODE:
1146 2           RETVAL = sync_create_eventfd(h);
1147 2 50         if (RETVAL < 0) croak("eventfd: %s", strerror(errno));
1148             OUTPUT:
1149             RETVAL
1150              
1151             void
1152             eventfd_set(self, fd)
1153             SV *self
1154             int fd
1155             PREINIT:
1156 1 50         EXTRACT_HANDLE("Data::Sync::Shared::Once", self);
    50          
    50          
1157             CODE:
1158 1 50         if (h->notify_fd >= 0 && h->notify_fd != fd) close(h->notify_fd);
    50          
1159 1           h->notify_fd = fd;
1160              
1161             IV
1162             fileno(self)
1163             SV *self
1164             PREINIT:
1165 3 50         EXTRACT_HANDLE("Data::Sync::Shared::Once", self);
    50          
    50          
1166             CODE:
1167 3 50         RETVAL = h->notify_fd;
1168             OUTPUT:
1169             RETVAL
1170              
1171             bool
1172             notify(self)
1173             SV *self
1174             PREINIT:
1175 2 50         EXTRACT_HANDLE("Data::Sync::Shared::Once", self);
    50          
    50          
1176             CODE:
1177 2 50         RETVAL = sync_notify(h);
1178             OUTPUT:
1179             RETVAL
1180              
1181             SV *
1182             eventfd_consume(self)
1183             SV *self
1184             PREINIT:
1185 2 50         EXTRACT_HANDLE("Data::Sync::Shared::Once", self);
    50          
    50          
1186             CODE:
1187 2           int64_t v = sync_eventfd_consume(h);
1188 2 100         RETVAL = (v >= 0) ? newSViv((IV)v) : &PL_sv_undef;
1189             OUTPUT:
1190             RETVAL
1191              
1192             void
1193             sync(self)
1194             SV *self
1195             PREINIT:
1196 0 0         EXTRACT_HANDLE("Data::Sync::Shared::Once", self);
    0          
    0          
1197             CODE:
1198 0 0         if (sync_msync(h) != 0) croak("msync: %s", strerror(errno));
1199              
1200             void
1201             unlink(self_or_class, ...)
1202             SV *self_or_class
1203             CODE:
1204             const char *p;
1205 1 50         if (sv_isobject(self_or_class)) {
1206 1           SyncHandle *h = INT2PTR(SyncHandle*, SvIV(SvRV(self_or_class)));
1207 1 50         if (!h) croak("Attempted to use a destroyed object");
1208 1           p = h->path;
1209             } else {
1210 0 0         if (items < 2) croak("Usage: ...->unlink($path)");
1211 0           p = SvPV_nolen(ST(1));
1212             }
1213 1 50         if (!p) croak("cannot unlink anonymous or memfd object");
1214 1 50         if (unlink(p) != 0)
1215 0           croak("unlink(%s): %s", p, strerror(errno));
1216              
1217             SV *
1218             stats(self)
1219             SV *self
1220             PREINIT:
1221 2 50         EXTRACT_HANDLE("Data::Sync::Shared::Once", self);
    50          
    50          
1222             CODE:
1223 2           HV *hv = newHV();
1224 2           SyncHeader *hdr = h->hdr;
1225             const char *state;
1226 2           uint32_t val = __atomic_load_n(&hdr->value, __ATOMIC_RELAXED);
1227 2 100         if (val == SYNC_ONCE_INIT) state = "init";
1228 1 50         else if (val == SYNC_ONCE_DONE) state = "done";
1229 0           else state = "running";
1230 2           hv_store(hv, "state", 5, newSVpv(state, 0), 0);
1231 2           hv_store(hv, "is_done", 7, newSVuv(val == SYNC_ONCE_DONE), 0);
1232 2           hv_store(hv, "waiters", 7, newSVuv((UV)__atomic_load_n(&hdr->waiters, __ATOMIC_RELAXED)), 0);
1233 2           hv_store(hv, "mmap_size", 9, newSVuv((UV)h->mmap_size), 0);
1234 2           hv_store(hv, "acquires", 8, newSVuv((UV)__atomic_load_n(&hdr->stat_acquires, __ATOMIC_RELAXED)), 0);
1235 2           hv_store(hv, "releases", 8, newSVuv((UV)__atomic_load_n(&hdr->stat_releases, __ATOMIC_RELAXED)), 0);
1236 2           hv_store(hv, "waits", 5, newSVuv((UV)__atomic_load_n(&hdr->stat_waits, __ATOMIC_RELAXED)), 0);
1237 2           hv_store(hv, "timeouts", 8, newSVuv((UV)__atomic_load_n(&hdr->stat_timeouts, __ATOMIC_RELAXED)), 0);
1238 2           hv_store(hv, "recoveries", 10, newSVuv((UV)__atomic_load_n(&hdr->stat_recoveries, __ATOMIC_RELAXED)), 0);
1239 2           RETVAL = newRV_noinc((SV *)hv);
1240             OUTPUT:
1241             RETVAL