File Coverage

xs/str.xs
Criterion Covered Total %
statement 95 122 77.8
branch 87 230 37.8
condition n/a
subroutine n/a
pod n/a
total 182 352 51.7


line stmt bran cond sub pod time code
1             MODULE = Data::Buffer::Shared PACKAGE = Data::Buffer::Shared::Str
2             PROTOTYPES: DISABLE
3              
4             SV*
5             new(char* class, char* path, UV capacity, UV str_len)
6             CODE:
7             char errbuf[BUF_ERR_BUFLEN];
8 4           BufHandle* buf = buf_str_create(path, (uint64_t)capacity, (uint32_t)str_len, errbuf);
9 4 50         if (!buf) croak("Data::Buffer::Shared::Str: %s", errbuf[0] ? errbuf : "unknown error");
    0          
10 4           RETVAL = sv_setref_pv(newSV(0), class, (void*)buf);
11             OUTPUT:
12             RETVAL
13              
14             void
15             DESTROY(SV* self_sv)
16             CODE:
17 13 50         if (!SvROK(self_sv)) return;
18 13           BufHandle* h = INT2PTR(BufHandle*, SvIV(SvRV(self_sv)));
19 13 50         if (!h) return;
20 13           buf_close_map(h);
21 13           sv_setiv(SvRV(self_sv), 0);
22              
23             SV*
24             get(SV* self_sv, UV idx)
25             CODE:
26 20 50         EXTRACT_BUF("Data::Buffer::Shared::Str", self_sv);
    50          
    50          
27 20           uint32_t esz = h->hdr->elem_size;
28             char *tmp;
29 20           Newx(tmp, esz + 1, char);
30 20           SAVEFREEPV(tmp);
31             uint32_t out_len;
32 20 50         if (!buf_str_get(h, (uint64_t)idx, tmp, &out_len)) XSRETURN_UNDEF;
33 20           RETVAL = newSVpvn(tmp, out_len);
34             OUTPUT:
35             RETVAL
36              
37             bool
38             set(SV* self_sv, UV idx, SV* val_sv)
39             CODE:
40 519 50         EXTRACT_BUF("Data::Buffer::Shared::Str", self_sv);
    50          
    50          
41             STRLEN vlen;
42 519           const char *vstr = SvPV(val_sv, vlen);
43 519 50         RETVAL = buf_str_set(h, (uint64_t)idx, vstr, (uint32_t)vlen);
44             OUTPUT:
45             RETVAL
46              
47             void
48             slice(SV* self_sv, UV from, UV count)
49             PPCODE:
50 2 50         EXTRACT_BUF("Data::Buffer::Shared::Str", self_sv);
    50          
    50          
51 2 50         if (count == 0) XSRETURN_EMPTY;
52 2           uint32_t esz = h->hdr->elem_size;
53             char *tmp;
54 2           Newx(tmp, count * esz, char);
55 2           SAVEFREEPV(tmp);
56 2 50         if (!buf_str_get_slice(h, (uint64_t)from, (uint64_t)count, tmp))
57 0           croak("Data::Buffer::Shared::Str: slice out of bounds");
58 2 50         EXTEND(SP, count);
59 6 100         for (UV i = 0; i < count; i++) {
60 4           char *elem = tmp + i * esz;
61 4           uint32_t len = esz;
62 54 50         while (len > 0 && elem[len - 1] == '\0') len--;
    100          
63 4 50         mXPUSHp(elem, len);
64             }
65              
66             bool
67             set_slice(SV* self_sv, UV from, ...)
68             CODE:
69 1 50         EXTRACT_BUF("Data::Buffer::Shared::Str", self_sv);
    50          
    50          
70 1           UV count = items - 2;
71 1 50         if (count == 0) XSRETURN(1);
72 1           uint32_t esz = h->hdr->elem_size;
73             char *tmp;
74 1           Newxz(tmp, count * esz, char);
75 1           SAVEFREEPV(tmp);
76 4 100         for (UV i = 0; i < count; i++) {
77             STRLEN vlen;
78 3           const char *vstr = SvPV(ST(i + 2), vlen);
79 3 50         uint32_t copy_len = (uint32_t)(vlen < esz ? vlen : esz);
80 3           memcpy(tmp + i * esz, vstr, copy_len);
81             }
82 1 50         RETVAL = buf_str_set_slice(h, (uint64_t)from, (uint64_t)count, tmp);
83             OUTPUT:
84             RETVAL
85              
86             void
87             fill(SV* self_sv, SV* val_sv)
88             CODE:
89 2 50         EXTRACT_BUF("Data::Buffer::Shared::Str", self_sv);
    50          
    50          
90             STRLEN vlen;
91 2           const char *vstr = SvPV(val_sv, vlen);
92 2           buf_str_fill(h, vstr, (uint32_t)vlen);
93              
94             UV
95             capacity(SV* self_sv)
96             CODE:
97 1 50         EXTRACT_BUF("Data::Buffer::Shared::Str", self_sv);
    50          
    50          
98 1           RETVAL = (UV)buf_str_capacity(h);
99             OUTPUT:
100             RETVAL
101              
102             UV
103             mmap_size(SV* self_sv)
104             CODE:
105 0 0         EXTRACT_BUF("Data::Buffer::Shared::Str", self_sv);
    0          
    0          
106 0           RETVAL = (UV)buf_str_mmap_size(h);
107             OUTPUT:
108             RETVAL
109              
110             UV
111             elem_size(SV* self_sv)
112             CODE:
113 3 50         EXTRACT_BUF("Data::Buffer::Shared::Str", self_sv);
    50          
    50          
114 3 50         RETVAL = (UV)buf_str_elem_size(h);
115             OUTPUT:
116             RETVAL
117              
118             SV*
119             path(SV* self_sv)
120             CODE:
121 0 0         EXTRACT_BUF("Data::Buffer::Shared::Str", self_sv);
    0          
    0          
122 0 0         if (h->path) RETVAL = newSVpv(h->path, 0); else XSRETURN_UNDEF;
123             OUTPUT:
124             RETVAL
125              
126             void
127             lock_wr(SV* self_sv)
128             CODE:
129 2 50         EXTRACT_BUF("Data::Buffer::Shared::Str", self_sv);
    50          
    50          
130 2           buf_str_lock_wr(h);
131              
132             void
133             unlock_wr(SV* self_sv)
134             CODE:
135 2 50         EXTRACT_BUF("Data::Buffer::Shared::Str", self_sv);
    50          
    50          
136 2           buf_str_unlock_wr(h);
137              
138             void
139             lock_rd(SV* self_sv)
140             CODE:
141 0 0         EXTRACT_BUF("Data::Buffer::Shared::Str", self_sv);
    0          
    0          
142 0           buf_str_lock_rd(h);
143              
144             void
145             unlock_rd(SV* self_sv)
146             CODE:
147 0 0         EXTRACT_BUF("Data::Buffer::Shared::Str", self_sv);
    0          
    0          
148 0           buf_str_unlock_rd(h);
149              
150             void
151             unlink(SV* self_or_class, ...)
152             CODE:
153             const char *p;
154 0 0         if (SvROK(self_or_class)) {
155 0           BufHandle* h = INT2PTR(BufHandle*, SvIV(SvRV(self_or_class)));
156 0 0         if (h) { if (!h->path) croak("cannot unlink anonymous buffer"); p = h->path; }
    0          
157 0           else croak("Data::Buffer::Shared::Str: destroyed object");
158             } else {
159 0 0         if (items < 2) croak("Usage: Data::Buffer::Shared::Str->unlink($path)");
160 0           p = SvPV_nolen(ST(1));
161             }
162 0           unlink(p);
163              
164             UV
165             ptr(SV* self_sv)
166             CODE:
167 0 0         EXTRACT_BUF("Data::Buffer::Shared::Str", self_sv);
    0          
    0          
168 0 0         RETVAL = PTR2UV(buf_str_ptr(h));
169             OUTPUT:
170             RETVAL
171              
172             UV
173             ptr_at(SV* self_sv, UV idx)
174             CODE:
175 0 0         EXTRACT_BUF("Data::Buffer::Shared::Str", self_sv);
    0          
    0          
176 0           void *p = buf_str_ptr_at(h, (uint64_t)idx);
177 0 0         if (!p) croak("Data::Buffer::Shared::Str: index out of bounds");
178 0 0         RETVAL = PTR2UV(p);
179             OUTPUT:
180             RETVAL
181              
182             SV*
183             new_anon(char* class, UV capacity, UV str_len)
184             CODE:
185             char errbuf[BUF_ERR_BUFLEN];
186 8           BufHandle* buf = buf_str_create_anon((uint64_t)capacity, (uint32_t)str_len, errbuf);
187 8 50         if (!buf) croak("Data::Buffer::Shared::Str: %s", errbuf[0] ? errbuf : "unknown error");
    0          
188 8           RETVAL = sv_setref_pv(newSV(0), class, (void*)buf);
189             OUTPUT:
190             RETVAL
191              
192             void
193             clear(SV* self_sv)
194             CODE:
195 1 50         EXTRACT_BUF("Data::Buffer::Shared::Str", self_sv);
    50          
    50          
196 1           buf_str_clear(h);
197              
198             SV*
199             get_raw(SV* self_sv, UV byte_off, UV nbytes)
200             CODE:
201 1 50         EXTRACT_BUF("Data::Buffer::Shared::Str", self_sv);
    50          
    50          
202 1 50         RETVAL = newSV(nbytes ? nbytes : 1);
203 1           SvPOK_on(RETVAL);
204 1           SvCUR_set(RETVAL, nbytes);
205 1 50         if (!buf_str_get_raw(h, (uint64_t)byte_off, (uint64_t)nbytes, SvPVX(RETVAL))) {
206 0           SvREFCNT_dec(RETVAL);
207 0           croak("Data::Buffer::Shared::Str: get_raw out of bounds");
208             }
209             OUTPUT:
210             RETVAL
211              
212             bool
213             set_raw(SV* self_sv, UV byte_off, SV* data_sv)
214             CODE:
215 1 50         EXTRACT_BUF("Data::Buffer::Shared::Str", self_sv);
    50          
    50          
216             STRLEN dlen;
217 1           const char *dptr = SvPV(data_sv, dlen);
218 1 50         RETVAL = buf_str_set_raw(h, (uint64_t)byte_off, (uint64_t)dlen, dptr);
219             OUTPUT:
220             RETVAL
221              
222             SV*
223             new_memfd(char* class, char* name, UV capacity, UV str_len)
224             CODE:
225             char errbuf[BUF_ERR_BUFLEN];
226 1           BufHandle* buf = buf_str_create_memfd(name, (uint64_t)capacity, (uint32_t)str_len, errbuf);
227 1 50         if (!buf) croak("Data::Buffer::Shared::Str: %s", errbuf[0] ? errbuf : "unknown error");
    0          
228 1           RETVAL = sv_setref_pv(newSV(0), class, (void*)buf);
229             OUTPUT:
230             RETVAL
231              
232             SV*
233             new_from_fd(char* class, int fd, UV str_len)
234             CODE:
235             char errbuf[BUF_ERR_BUFLEN];
236 0           BufHandle* buf = buf_str_open_fd(fd, (uint32_t)str_len, errbuf);
237 0 0         if (!buf) croak("Data::Buffer::Shared::Str: %s", errbuf[0] ? errbuf : "unknown error");
    0          
238 0           RETVAL = sv_setref_pv(newSV(0), class, (void*)buf);
239             OUTPUT:
240             RETVAL
241              
242             SV*
243             fd(SV* self_sv)
244             CODE:
245 1 50         EXTRACT_BUF("Data::Buffer::Shared::Str", self_sv);
    50          
    50          
246 1 50         if (h->fd < 0) XSRETURN_UNDEF;
247 1           RETVAL = newSViv(h->fd);
248             OUTPUT:
249             RETVAL
250              
251             SV*
252             as_scalar(SV* self_sv)
253             CODE:
254 1 50         EXTRACT_BUF("Data::Buffer::Shared::Str", self_sv);
    50          
    50          
255 1           size_t len = (size_t)(h->hdr->capacity * h->hdr->elem_size);
256 1           SV *inner = newSV_type(SVt_PV);
257 1           SvPV_set(inner, (char *)h->data);
258 1           SvCUR_set(inner, len);
259 1           SvLEN_set(inner, 0);
260 1           SvPOK_on(inner);
261 1           SvREADONLY_on(inner);
262 1           MAGIC *mg = sv_magicext(inner, NULL, PERL_MAGIC_ext, &buf_scalar_magic_vtbl, NULL, 0);
263 1           mg->mg_obj = SvREFCNT_inc_simple_NN(self_sv);
264 1           RETVAL = newRV_noinc(inner);
265             OUTPUT:
266             RETVAL
267              
268             IV
269             create_eventfd(SV* self_sv)
270             CODE:
271 1 50         EXTRACT_BUF("Data::Buffer::Shared::Str", self_sv);
    50          
    50          
272 1           RETVAL = (IV)buf_create_eventfd(h);
273 1 50         if (RETVAL < 0) croak("Data::Buffer::Shared::Str: eventfd: %s", strerror(errno));
274             OUTPUT:
275             RETVAL
276              
277             void
278             attach_eventfd(SV* self_sv, int efd)
279             CODE:
280 1 50         EXTRACT_BUF("Data::Buffer::Shared::Str", self_sv);
    50          
    50          
281 1           buf_attach_eventfd(h, efd);
282              
283             SV*
284             eventfd(SV* self_sv)
285             CODE:
286 2 50         EXTRACT_BUF("Data::Buffer::Shared::Str", self_sv);
    50          
    50          
287 2 50         if (h->efd < 0) XSRETURN_UNDEF;
288 2           RETVAL = newSViv(h->efd);
289             OUTPUT:
290             RETVAL
291              
292             bool
293             notify(SV* self_sv)
294             CODE:
295 1 50         EXTRACT_BUF("Data::Buffer::Shared::Str", self_sv);
    50          
    50          
296 1 50         RETVAL = buf_notify(h);
297             OUTPUT:
298             RETVAL
299              
300             SV*
301             wait_notify(SV* self_sv)
302             CODE:
303 1 50         EXTRACT_BUF("Data::Buffer::Shared::Str", self_sv);
    50          
    50          
304 1           int64_t val = buf_wait_notify(h);
305 1 50         if (val < 0) XSRETURN_UNDEF;
306 1           RETVAL = newSViv(val);
307             OUTPUT:
308             RETVAL