File Coverage

lib/UV/Util.xs
Criterion Covered Total %
statement 81 92 88.0
branch 15 28 53.5
condition n/a
subroutine n/a
pod n/a
total 96 120 80.0


line stmt bran cond sub pod time code
1             #define PERL_NO_GET_CONTEXT 1
2              
3             #include "EXTERN.h"
4             #include "perl.h"
5             #include "XSUB.h"
6             #include "string.h"
7             #include "ppport.h"
8              
9             #include "p5uv_constants.h"
10             #include "uv.h"
11              
12             #define P5LUV_DOUBLETIME(TV) ((double)(TV).tv_sec + 1e-6*(TV).tv_usec)
13              
14             MODULE = UV::Util PACKAGE = UV::Util PREFIX = luv_
15              
16             PROTOTYPES: DISABLE
17              
18             BOOT:
19             {
20 1           constants_export_uv_util(aTHX);
21             }
22              
23              
24             SV * luv_cpu_info()
25             INIT:
26             AV * results;
27             int i, count, err;
28             uv_cpu_info_t* cpus;
29             CODE:
30 1           err = uv_cpu_info(&cpus, &count);
31 1 50         if (err != 0) {
32 0           croak("Error getting CPU info (%i): %s", err, uv_strerror(err));
33             }
34              
35 1           results = newAV();
36 17 100         for (i = 0; i < count; i++) {
37             HV *info, *time;
38              
39 16           info = newHV();
40 16           hv_stores(info, "model", newSVpvn(cpus[i].model, strlen(cpus[i].model)));
41 16           hv_stores(info, "speed", newSVuv((size_t) cpus[i].speed));
42              
43 16           time = newHV();
44 16           hv_stores(time, "sys", newSVuv((size_t) cpus[i].cpu_times.sys));
45 16           hv_stores(time, "user", newSVuv((size_t) cpus[i].cpu_times.user));
46 16           hv_stores(time, "idle", newSVuv((size_t) cpus[i].cpu_times.idle));
47 16           hv_stores(time, "irq", newSVuv((size_t) cpus[i].cpu_times.irq));
48 16           hv_stores(time, "nice", newSVuv((size_t) cpus[i].cpu_times.nice));
49              
50             /* add time as a href within info */
51 16           hv_stores(info, "cpu_times", newRV_noinc((SV *)time));
52              
53             /* push info href onto results array */
54 16           av_push(results, newRV_noinc((SV *)info));
55             }
56 1           uv_free_cpu_info(cpus, count);
57 1           RETVAL = newRV_noinc((SV *)results);
58             OUTPUT:
59             RETVAL
60              
61             size_t luv_get_free_memory()
62             CODE:
63 2           RETVAL = uv_get_free_memory();
64             OUTPUT:
65             RETVAL
66              
67             size_t luv_get_total_memory()
68             CODE:
69 2           RETVAL = uv_get_total_memory();
70             OUTPUT:
71             RETVAL
72              
73             SV * luv_getrusage()
74             INIT:
75             int err;
76             uv_rusage_t ru;
77             HV * result;
78             CODE:
79 1           err = uv_getrusage(&ru);
80 1 50         if (err < 0) {
81 0           croak("Error getting rusage (%i): %s", err, uv_strerror(err));
82             }
83              
84 1           result = newHV();
85 1           hv_stores(result, "ru_utime", newSVnv(P5LUV_DOUBLETIME(ru.ru_utime)));
86 1           hv_stores(result, "ru_stime", newSVnv(P5LUV_DOUBLETIME(ru.ru_stime)));
87 1           hv_stores(result, "ru_maxrss", newSVuv((size_t) ru.ru_maxrss));
88 1           hv_stores(result, "ru_ixrss", newSVuv((size_t) ru.ru_ixrss));
89 1           hv_stores(result, "ru_idrss", newSVuv((size_t) ru.ru_idrss));
90 1           hv_stores(result, "ru_isrss", newSVuv((size_t) ru.ru_isrss));
91 1           hv_stores(result, "ru_minflt", newSVuv((size_t) ru.ru_minflt));
92 1           hv_stores(result, "ru_majflt", newSVuv((size_t) ru.ru_majflt));
93 1           hv_stores(result, "ru_nswap", newSVuv((size_t) ru.ru_nswap));
94 1           hv_stores(result, "ru_inblock", newSVuv((size_t) ru.ru_inblock));
95 1           hv_stores(result, "ru_oublock", newSVuv((size_t) ru.ru_oublock));
96 1           hv_stores(result, "ru_msgsnd", newSVuv((size_t) ru.ru_msgsnd));
97 1           hv_stores(result, "ru_msgrcv", newSVuv((size_t) ru.ru_msgrcv));
98 1           hv_stores(result, "ru_nsignals", newSVuv((size_t) ru.ru_nsignals));
99 1           hv_stores(result, "ru_nvcsw", newSVuv((size_t) ru.ru_nvcsw));
100 1           hv_stores(result, "ru_nivcsw", newSVuv((size_t) ru.ru_nivcsw));
101              
102 1           RETVAL = newRV_noinc((SV *)result);
103             OUTPUT:
104             RETVAL
105              
106             int luv_guess_handle_type(FILE *fh)
107             INIT:
108             int fn;
109             CODE:
110 1 50         if (!fh) {
111 0           croak("A file handle is required");
112             }
113 1           fn = fileno(fh);
114 1 50         if (fn == -1) {
115 0           croak("Expected a file handle");
116             }
117 1           RETVAL = (int)(long) uv_guess_handle(fn);
118             OUTPUT:
119             RETVAL
120              
121             size_t luv_hrtime()
122             CODE:
123 1           RETVAL = uv_hrtime();
124             OUTPUT:
125             RETVAL
126              
127             SV * luv_interface_addresses()
128             INIT:
129             static char buf[INET6_ADDRSTRLEN+1];
130             AV * results;
131             uv_interface_address_t* interfaces;
132             int i, count, err;
133             CODE:
134 1           err = uv_interface_addresses(&interfaces, &count);
135 1 50         if (err != 0) {
136 0           croak("Error getting interface addresses (%i): %s", err, uv_strerror(err));
137             }
138              
139 1           results = newAV();
140 3 100         for (i = 0; i < count; i++) {
141             HV *info;
142 2           info = newHV();
143              
144 2           hv_stores(info, "name", newSVpvn(interfaces[i].name, strlen(interfaces[i].name)));
145 2           hv_stores(info, "is_internal", newSVnv(interfaces[i].is_internal));
146              
147             /* IP info */
148 2 50         if (interfaces[i].address.address4.sin_family == AF_INET) {
149 2           uv_ip4_name(&interfaces[i].address.address4, buf, sizeof(buf));
150 0 0         } else if (interfaces[i].address.address4.sin_family == AF_INET6) {
151 0           uv_ip6_name(&interfaces[i].address.address6, buf, sizeof(buf));
152             }
153 2           hv_stores(info, "address", newSVpvn(buf, strlen(buf)));
154              
155             /* Netmask Info */
156 2 50         if (interfaces[i].netmask.netmask4.sin_family == AF_INET) {
157 2           uv_ip4_name(&interfaces[i].netmask.netmask4, buf, sizeof(buf));
158 0 0         } else if (interfaces[i].netmask.netmask4.sin_family == AF_INET6) {
159 0           uv_ip6_name(&interfaces[i].netmask.netmask6, buf, sizeof(buf));
160             }
161 2           hv_stores(info, "netmask", newSVpvn(buf, strlen(buf)));
162              
163 12           sprintf(buf, "%02x:%02x:%02x:%02x:%02x:%02x",
164 2           (unsigned char)interfaces[i].phys_addr[0],
165 2           (unsigned char)interfaces[i].phys_addr[1],
166 2           (unsigned char)interfaces[i].phys_addr[2],
167 2           (unsigned char)interfaces[i].phys_addr[3],
168 2           (unsigned char)interfaces[i].phys_addr[4],
169 2           (unsigned char)interfaces[i].phys_addr[5]);
170 2           hv_stores(info, "mac", newSVpvn(buf, strlen(buf)));
171              
172 2           av_push(results, newRV_noinc((SV *)info));
173             }
174 1           uv_free_interface_addresses(interfaces, count);
175 1           RETVAL = newRV_noinc((SV *)results);
176             OUTPUT:
177             RETVAL
178              
179             SV * luv_loadavg()
180             INIT:
181             AV * results;
182             double avg[3];
183             size_t i;
184             CODE:
185 1           uv_loadavg(avg);
186 1           results = newAV();
187 4 100         for (i = 0; i < 3; i++) {
188 3           av_push(results, newSVnv(avg[i]));
189             }
190 1           RETVAL = newRV_noinc((SV *)results);
191             OUTPUT:
192             RETVAL
193              
194             size_t luv_resident_set_memory()
195             INIT:
196             size_t rss;
197             int err;
198             CODE:
199 1           err = uv_resident_set_memory(&rss);
200 1 50         if (err==0) {
201 1           RETVAL=rss;
202             }
203             else {
204 0           croak("Error getting RSS (%i): %s", err, uv_strerror(err));
205             }
206             OUTPUT:
207             RETVAL
208              
209             double luv_uptime()
210             INIT:
211             double uptime;
212             int err;
213             CODE:
214 1           err = uv_uptime(&uptime);
215 1 50         if (err==0) {
216 1           RETVAL=uptime;
217             }
218             else {
219 0           croak("Error getting uptime (%i): %s", err, uv_strerror(err));
220             }
221             OUTPUT:
222             RETVAL
223              
224             const char * luv_version()
225             CODE:
226 2           RETVAL = uv_version_string();
227             OUTPUT:
228             RETVAL