foolio 0.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (261) hide show
  1. data/.gitignore +22 -0
  2. data/Gemfile +4 -0
  3. data/LICENSE +22 -0
  4. data/README.md +29 -0
  5. data/Rakefile +21 -0
  6. data/examples/timer.rb +20 -0
  7. data/ext/foolio/extconf.rb +34 -0
  8. data/ext/foolio/foolio_ext.c +921 -0
  9. data/ext/foolio/gen.rb +50 -0
  10. data/ext/foolio/make_table.rb +12 -0
  11. data/ext/foolio/templ +243 -0
  12. data/ext/libuv/.gitignore +33 -0
  13. data/ext/libuv/.mailmap +13 -0
  14. data/ext/libuv/.travis.yml +9 -0
  15. data/ext/libuv/AUTHORS +61 -0
  16. data/ext/libuv/LICENSE +44 -0
  17. data/ext/libuv/Makefile +71 -0
  18. data/ext/libuv/README.md +90 -0
  19. data/ext/libuv/common.gypi +178 -0
  20. data/ext/libuv/gyp_uv +73 -0
  21. data/ext/libuv/include/uv-private/eio.h +403 -0
  22. data/ext/libuv/include/uv-private/ev.h +838 -0
  23. data/ext/libuv/include/uv-private/ngx-queue.h +108 -0
  24. data/ext/libuv/include/uv-private/tree.h +768 -0
  25. data/ext/libuv/include/uv-private/uv-unix.h +324 -0
  26. data/ext/libuv/include/uv-private/uv-win.h +517 -0
  27. data/ext/libuv/include/uv.h +1838 -0
  28. data/ext/libuv/src/fs-poll.c +235 -0
  29. data/ext/libuv/src/inet.c +293 -0
  30. data/ext/libuv/src/unix/async.c +148 -0
  31. data/ext/libuv/src/unix/core.c +696 -0
  32. data/ext/libuv/src/unix/cygwin.c +83 -0
  33. data/ext/libuv/src/unix/darwin.c +342 -0
  34. data/ext/libuv/src/unix/dl.c +83 -0
  35. data/ext/libuv/src/unix/eio/Changes +63 -0
  36. data/ext/libuv/src/unix/eio/LICENSE +36 -0
  37. data/ext/libuv/src/unix/eio/Makefile.am +15 -0
  38. data/ext/libuv/src/unix/eio/aclocal.m4 +8957 -0
  39. data/ext/libuv/src/unix/eio/autogen.sh +3 -0
  40. data/ext/libuv/src/unix/eio/config.h.in +86 -0
  41. data/ext/libuv/src/unix/eio/config_cygwin.h +80 -0
  42. data/ext/libuv/src/unix/eio/config_darwin.h +141 -0
  43. data/ext/libuv/src/unix/eio/config_freebsd.h +81 -0
  44. data/ext/libuv/src/unix/eio/config_linux.h +94 -0
  45. data/ext/libuv/src/unix/eio/config_netbsd.h +81 -0
  46. data/ext/libuv/src/unix/eio/config_openbsd.h +137 -0
  47. data/ext/libuv/src/unix/eio/config_sunos.h +84 -0
  48. data/ext/libuv/src/unix/eio/configure.ac +22 -0
  49. data/ext/libuv/src/unix/eio/demo.c +194 -0
  50. data/ext/libuv/src/unix/eio/ecb.h +370 -0
  51. data/ext/libuv/src/unix/eio/eio.3 +3428 -0
  52. data/ext/libuv/src/unix/eio/eio.c +2593 -0
  53. data/ext/libuv/src/unix/eio/eio.pod +969 -0
  54. data/ext/libuv/src/unix/eio/libeio.m4 +195 -0
  55. data/ext/libuv/src/unix/eio/xthread.h +164 -0
  56. data/ext/libuv/src/unix/error.c +105 -0
  57. data/ext/libuv/src/unix/ev/Changes +388 -0
  58. data/ext/libuv/src/unix/ev/LICENSE +36 -0
  59. data/ext/libuv/src/unix/ev/Makefile.am +18 -0
  60. data/ext/libuv/src/unix/ev/Makefile.in +771 -0
  61. data/ext/libuv/src/unix/ev/README +58 -0
  62. data/ext/libuv/src/unix/ev/aclocal.m4 +8957 -0
  63. data/ext/libuv/src/unix/ev/autogen.sh +6 -0
  64. data/ext/libuv/src/unix/ev/config.guess +1526 -0
  65. data/ext/libuv/src/unix/ev/config.h.in +125 -0
  66. data/ext/libuv/src/unix/ev/config.sub +1658 -0
  67. data/ext/libuv/src/unix/ev/config_cygwin.h +123 -0
  68. data/ext/libuv/src/unix/ev/config_darwin.h +122 -0
  69. data/ext/libuv/src/unix/ev/config_freebsd.h +120 -0
  70. data/ext/libuv/src/unix/ev/config_linux.h +141 -0
  71. data/ext/libuv/src/unix/ev/config_netbsd.h +120 -0
  72. data/ext/libuv/src/unix/ev/config_openbsd.h +126 -0
  73. data/ext/libuv/src/unix/ev/config_sunos.h +122 -0
  74. data/ext/libuv/src/unix/ev/configure +13037 -0
  75. data/ext/libuv/src/unix/ev/configure.ac +18 -0
  76. data/ext/libuv/src/unix/ev/depcomp +630 -0
  77. data/ext/libuv/src/unix/ev/ev++.h +816 -0
  78. data/ext/libuv/src/unix/ev/ev.3 +5311 -0
  79. data/ext/libuv/src/unix/ev/ev.c +3925 -0
  80. data/ext/libuv/src/unix/ev/ev.pod +5243 -0
  81. data/ext/libuv/src/unix/ev/ev_epoll.c +266 -0
  82. data/ext/libuv/src/unix/ev/ev_kqueue.c +235 -0
  83. data/ext/libuv/src/unix/ev/ev_poll.c +148 -0
  84. data/ext/libuv/src/unix/ev/ev_port.c +179 -0
  85. data/ext/libuv/src/unix/ev/ev_select.c +310 -0
  86. data/ext/libuv/src/unix/ev/ev_vars.h +203 -0
  87. data/ext/libuv/src/unix/ev/ev_win32.c +153 -0
  88. data/ext/libuv/src/unix/ev/ev_wrap.h +196 -0
  89. data/ext/libuv/src/unix/ev/event.c +402 -0
  90. data/ext/libuv/src/unix/ev/event.h +170 -0
  91. data/ext/libuv/src/unix/ev/install-sh +294 -0
  92. data/ext/libuv/src/unix/ev/libev.m4 +39 -0
  93. data/ext/libuv/src/unix/ev/ltmain.sh +8413 -0
  94. data/ext/libuv/src/unix/ev/missing +336 -0
  95. data/ext/libuv/src/unix/ev/mkinstalldirs +111 -0
  96. data/ext/libuv/src/unix/freebsd.c +326 -0
  97. data/ext/libuv/src/unix/fs.c +739 -0
  98. data/ext/libuv/src/unix/internal.h +188 -0
  99. data/ext/libuv/src/unix/kqueue.c +120 -0
  100. data/ext/libuv/src/unix/linux/inotify.c +239 -0
  101. data/ext/libuv/src/unix/linux/linux-core.c +557 -0
  102. data/ext/libuv/src/unix/linux/syscalls.c +388 -0
  103. data/ext/libuv/src/unix/linux/syscalls.h +124 -0
  104. data/ext/libuv/src/unix/loop-watcher.c +62 -0
  105. data/ext/libuv/src/unix/loop.c +94 -0
  106. data/ext/libuv/src/unix/netbsd.c +108 -0
  107. data/ext/libuv/src/unix/openbsd.c +295 -0
  108. data/ext/libuv/src/unix/pipe.c +259 -0
  109. data/ext/libuv/src/unix/poll.c +114 -0
  110. data/ext/libuv/src/unix/process.c +495 -0
  111. data/ext/libuv/src/unix/signal.c +269 -0
  112. data/ext/libuv/src/unix/stream.c +990 -0
  113. data/ext/libuv/src/unix/sunos.c +481 -0
  114. data/ext/libuv/src/unix/tcp.c +393 -0
  115. data/ext/libuv/src/unix/thread.c +251 -0
  116. data/ext/libuv/src/unix/timer.c +136 -0
  117. data/ext/libuv/src/unix/tty.c +145 -0
  118. data/ext/libuv/src/unix/udp.c +659 -0
  119. data/ext/libuv/src/unix/uv-eio.c +107 -0
  120. data/ext/libuv/src/unix/uv-eio.h +13 -0
  121. data/ext/libuv/src/uv-common.c +380 -0
  122. data/ext/libuv/src/uv-common.h +170 -0
  123. data/ext/libuv/src/win/async.c +100 -0
  124. data/ext/libuv/src/win/atomicops-inl.h +56 -0
  125. data/ext/libuv/src/win/core.c +278 -0
  126. data/ext/libuv/src/win/dl.c +86 -0
  127. data/ext/libuv/src/win/error.c +155 -0
  128. data/ext/libuv/src/win/fs-event.c +510 -0
  129. data/ext/libuv/src/win/fs.c +1948 -0
  130. data/ext/libuv/src/win/getaddrinfo.c +365 -0
  131. data/ext/libuv/src/win/handle-inl.h +149 -0
  132. data/ext/libuv/src/win/handle.c +154 -0
  133. data/ext/libuv/src/win/internal.h +343 -0
  134. data/ext/libuv/src/win/loop-watcher.c +122 -0
  135. data/ext/libuv/src/win/pipe.c +1672 -0
  136. data/ext/libuv/src/win/poll.c +616 -0
  137. data/ext/libuv/src/win/process-stdio.c +500 -0
  138. data/ext/libuv/src/win/process.c +1013 -0
  139. data/ext/libuv/src/win/req-inl.h +220 -0
  140. data/ext/libuv/src/win/req.c +25 -0
  141. data/ext/libuv/src/win/signal.c +57 -0
  142. data/ext/libuv/src/win/stream-inl.h +67 -0
  143. data/ext/libuv/src/win/stream.c +167 -0
  144. data/ext/libuv/src/win/tcp.c +1394 -0
  145. data/ext/libuv/src/win/thread.c +372 -0
  146. data/ext/libuv/src/win/threadpool.c +74 -0
  147. data/ext/libuv/src/win/timer.c +224 -0
  148. data/ext/libuv/src/win/tty.c +1799 -0
  149. data/ext/libuv/src/win/udp.c +716 -0
  150. data/ext/libuv/src/win/util.c +864 -0
  151. data/ext/libuv/src/win/winapi.c +132 -0
  152. data/ext/libuv/src/win/winapi.h +4452 -0
  153. data/ext/libuv/src/win/winsock.c +557 -0
  154. data/ext/libuv/src/win/winsock.h +171 -0
  155. data/ext/libuv/test/benchmark-async-pummel.c +97 -0
  156. data/ext/libuv/test/benchmark-async.c +137 -0
  157. data/ext/libuv/test/benchmark-fs-stat.c +135 -0
  158. data/ext/libuv/test/benchmark-getaddrinfo.c +94 -0
  159. data/ext/libuv/test/benchmark-list.h +127 -0
  160. data/ext/libuv/test/benchmark-loop-count.c +88 -0
  161. data/ext/libuv/test/benchmark-million-timers.c +65 -0
  162. data/ext/libuv/test/benchmark-ping-pongs.c +213 -0
  163. data/ext/libuv/test/benchmark-pound.c +324 -0
  164. data/ext/libuv/test/benchmark-pump.c +462 -0
  165. data/ext/libuv/test/benchmark-sizes.c +44 -0
  166. data/ext/libuv/test/benchmark-spawn.c +162 -0
  167. data/ext/libuv/test/benchmark-tcp-write-batch.c +140 -0
  168. data/ext/libuv/test/benchmark-thread.c +64 -0
  169. data/ext/libuv/test/benchmark-udp-packet-storm.c +247 -0
  170. data/ext/libuv/test/blackhole-server.c +118 -0
  171. data/ext/libuv/test/dns-server.c +321 -0
  172. data/ext/libuv/test/echo-server.c +378 -0
  173. data/ext/libuv/test/fixtures/empty_file +0 -0
  174. data/ext/libuv/test/fixtures/load_error.node +1 -0
  175. data/ext/libuv/test/run-benchmarks.c +64 -0
  176. data/ext/libuv/test/run-tests.c +138 -0
  177. data/ext/libuv/test/runner-unix.c +295 -0
  178. data/ext/libuv/test/runner-unix.h +36 -0
  179. data/ext/libuv/test/runner-win.c +285 -0
  180. data/ext/libuv/test/runner-win.h +42 -0
  181. data/ext/libuv/test/runner.c +355 -0
  182. data/ext/libuv/test/runner.h +159 -0
  183. data/ext/libuv/test/task.h +112 -0
  184. data/ext/libuv/test/test-async.c +118 -0
  185. data/ext/libuv/test/test-callback-order.c +76 -0
  186. data/ext/libuv/test/test-callback-stack.c +203 -0
  187. data/ext/libuv/test/test-connection-fail.c +148 -0
  188. data/ext/libuv/test/test-cwd-and-chdir.c +64 -0
  189. data/ext/libuv/test/test-delayed-accept.c +188 -0
  190. data/ext/libuv/test/test-dlerror.c +58 -0
  191. data/ext/libuv/test/test-error.c +59 -0
  192. data/ext/libuv/test/test-fail-always.c +29 -0
  193. data/ext/libuv/test/test-fs-event.c +474 -0
  194. data/ext/libuv/test/test-fs-poll.c +146 -0
  195. data/ext/libuv/test/test-fs.c +1843 -0
  196. data/ext/libuv/test/test-get-currentexe.c +63 -0
  197. data/ext/libuv/test/test-get-loadavg.c +36 -0
  198. data/ext/libuv/test/test-get-memory.c +38 -0
  199. data/ext/libuv/test/test-getaddrinfo.c +122 -0
  200. data/ext/libuv/test/test-getsockname.c +342 -0
  201. data/ext/libuv/test/test-hrtime.c +54 -0
  202. data/ext/libuv/test/test-idle.c +81 -0
  203. data/ext/libuv/test/test-ipc-send-recv.c +209 -0
  204. data/ext/libuv/test/test-ipc.c +620 -0
  205. data/ext/libuv/test/test-list.h +427 -0
  206. data/ext/libuv/test/test-loop-handles.c +336 -0
  207. data/ext/libuv/test/test-multiple-listen.c +102 -0
  208. data/ext/libuv/test/test-mutexes.c +63 -0
  209. data/ext/libuv/test/test-pass-always.c +28 -0
  210. data/ext/libuv/test/test-ping-pong.c +253 -0
  211. data/ext/libuv/test/test-pipe-bind-error.c +140 -0
  212. data/ext/libuv/test/test-pipe-connect-error.c +96 -0
  213. data/ext/libuv/test/test-platform-output.c +87 -0
  214. data/ext/libuv/test/test-poll-close.c +72 -0
  215. data/ext/libuv/test/test-poll.c +573 -0
  216. data/ext/libuv/test/test-process-title.c +49 -0
  217. data/ext/libuv/test/test-ref.c +338 -0
  218. data/ext/libuv/test/test-run-once.c +48 -0
  219. data/ext/libuv/test/test-semaphore.c +111 -0
  220. data/ext/libuv/test/test-shutdown-close.c +103 -0
  221. data/ext/libuv/test/test-shutdown-eof.c +183 -0
  222. data/ext/libuv/test/test-signal.c +162 -0
  223. data/ext/libuv/test/test-spawn.c +863 -0
  224. data/ext/libuv/test/test-stdio-over-pipes.c +246 -0
  225. data/ext/libuv/test/test-tcp-bind-error.c +191 -0
  226. data/ext/libuv/test/test-tcp-bind6-error.c +154 -0
  227. data/ext/libuv/test/test-tcp-close-while-connecting.c +80 -0
  228. data/ext/libuv/test/test-tcp-close.c +129 -0
  229. data/ext/libuv/test/test-tcp-connect-error-after-write.c +95 -0
  230. data/ext/libuv/test/test-tcp-connect-error.c +70 -0
  231. data/ext/libuv/test/test-tcp-connect-timeout.c +85 -0
  232. data/ext/libuv/test/test-tcp-connect6-error.c +68 -0
  233. data/ext/libuv/test/test-tcp-flags.c +51 -0
  234. data/ext/libuv/test/test-tcp-shutdown-after-write.c +131 -0
  235. data/ext/libuv/test/test-tcp-unexpected-read.c +113 -0
  236. data/ext/libuv/test/test-tcp-write-error.c +168 -0
  237. data/ext/libuv/test/test-tcp-write-to-half-open-connection.c +135 -0
  238. data/ext/libuv/test/test-tcp-writealot.c +170 -0
  239. data/ext/libuv/test/test-thread.c +183 -0
  240. data/ext/libuv/test/test-threadpool.c +57 -0
  241. data/ext/libuv/test/test-timer-again.c +141 -0
  242. data/ext/libuv/test/test-timer.c +152 -0
  243. data/ext/libuv/test/test-tty.c +110 -0
  244. data/ext/libuv/test/test-udp-dgram-too-big.c +86 -0
  245. data/ext/libuv/test/test-udp-ipv6.c +156 -0
  246. data/ext/libuv/test/test-udp-multicast-join.c +139 -0
  247. data/ext/libuv/test/test-udp-multicast-ttl.c +86 -0
  248. data/ext/libuv/test/test-udp-options.c +86 -0
  249. data/ext/libuv/test/test-udp-send-and-recv.c +208 -0
  250. data/ext/libuv/test/test-util.c +97 -0
  251. data/ext/libuv/test/test-walk-handles.c +77 -0
  252. data/ext/libuv/uv.gyp +375 -0
  253. data/ext/libuv/vcbuild.bat +105 -0
  254. data/foolio.gemspec +18 -0
  255. data/lib/foolio.rb +9 -0
  256. data/lib/foolio/handle.rb +27 -0
  257. data/lib/foolio/listener.rb +26 -0
  258. data/lib/foolio/loop.rb +79 -0
  259. data/lib/foolio/stream.rb +109 -0
  260. data/lib/foolio/version.rb +3 -0
  261. metadata +309 -0
@@ -0,0 +1,557 @@
1
+ /* Copyright Joyent, Inc. and other Node contributors. All rights reserved.
2
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
3
+ * of this software and associated documentation files (the "Software"), to
4
+ * deal in the Software without restriction, including without limitation the
5
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
6
+ * sell copies of the Software, and to permit persons to whom the Software is
7
+ * furnished to do so, subject to the following conditions:
8
+ *
9
+ * The above copyright notice and this permission notice shall be included in
10
+ * all copies or substantial portions of the Software.
11
+ *
12
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
13
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
14
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
15
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
16
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
17
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
18
+ * IN THE SOFTWARE.
19
+ */
20
+
21
+ #include "uv.h"
22
+ #include "../internal.h"
23
+
24
+ #include <stdint.h>
25
+ #include <stdio.h>
26
+ #include <stdlib.h>
27
+ #include <string.h>
28
+ #include <assert.h>
29
+ #include <errno.h>
30
+
31
+ #include <net/if.h>
32
+ #include <sys/param.h>
33
+ #include <sys/sysinfo.h>
34
+ #include <unistd.h>
35
+ #include <fcntl.h>
36
+ #include <time.h>
37
+
38
+ #define HAVE_IFADDRS_H 1
39
+ #ifdef __UCLIBC__
40
+ # if __UCLIBC_MAJOR__ < 0 || __UCLIBC_MINOR__ < 9 || __UCLIBC_SUBLEVEL__ < 32
41
+ # undef HAVE_IFADDRS_H
42
+ # endif
43
+ #endif
44
+ #ifdef HAVE_IFADDRS_H
45
+ # include <ifaddrs.h>
46
+ #endif
47
+
48
+ #undef NANOSEC
49
+ #define NANOSEC ((uint64_t) 1e9)
50
+
51
+ /* This is rather annoying: CLOCK_BOOTTIME lives in <linux/time.h> but we can't
52
+ * include that file because it conflicts with <time.h>. We'll just have to
53
+ * define it ourselves.
54
+ */
55
+ #ifndef CLOCK_BOOTTIME
56
+ # define CLOCK_BOOTTIME 7
57
+ #endif
58
+
59
+ static char buf[MAXPATHLEN + 1];
60
+
61
+ static struct {
62
+ char *str;
63
+ size_t len;
64
+ } process_title;
65
+
66
+ static void read_models(unsigned int numcpus, uv_cpu_info_t* ci);
67
+ static void read_speeds(unsigned int numcpus, uv_cpu_info_t* ci);
68
+ static void read_times(unsigned int numcpus, uv_cpu_info_t* ci);
69
+ static unsigned long read_cpufreq(unsigned int cpunum);
70
+
71
+
72
+ uint64_t uv_hrtime() {
73
+ struct timespec ts;
74
+ clock_gettime(CLOCK_MONOTONIC, &ts);
75
+ return (ts.tv_sec * NANOSEC + ts.tv_nsec);
76
+ }
77
+
78
+
79
+ void uv_loadavg(double avg[3]) {
80
+ struct sysinfo info;
81
+
82
+ if (sysinfo(&info) < 0) return;
83
+
84
+ avg[0] = (double) info.loads[0] / 65536.0;
85
+ avg[1] = (double) info.loads[1] / 65536.0;
86
+ avg[2] = (double) info.loads[2] / 65536.0;
87
+ }
88
+
89
+
90
+ int uv_exepath(char* buffer, size_t* size) {
91
+ ssize_t n;
92
+
93
+ if (!buffer || !size) {
94
+ return -1;
95
+ }
96
+
97
+ n = readlink("/proc/self/exe", buffer, *size - 1);
98
+ if (n <= 0) return -1;
99
+ buffer[n] = '\0';
100
+ *size = n;
101
+
102
+ return 0;
103
+ }
104
+
105
+
106
+ uint64_t uv_get_free_memory(void) {
107
+ return (uint64_t) sysconf(_SC_PAGESIZE) * sysconf(_SC_AVPHYS_PAGES);
108
+ }
109
+
110
+
111
+ uint64_t uv_get_total_memory(void) {
112
+ return (uint64_t) sysconf(_SC_PAGESIZE) * sysconf(_SC_PHYS_PAGES);
113
+ }
114
+
115
+
116
+ char** uv_setup_args(int argc, char** argv) {
117
+ char **new_argv;
118
+ char **new_env;
119
+ size_t size;
120
+ int envc;
121
+ char *s;
122
+ int i;
123
+
124
+ for (envc = 0; environ[envc]; envc++);
125
+
126
+ s = envc ? environ[envc - 1] : argv[argc - 1];
127
+
128
+ process_title.str = argv[0];
129
+ process_title.len = s + strlen(s) + 1 - argv[0];
130
+
131
+ size = process_title.len;
132
+ size += (argc + 1) * sizeof(char **);
133
+ size += (envc + 1) * sizeof(char **);
134
+
135
+ if ((s = (char *) malloc(size)) == NULL) {
136
+ process_title.str = NULL;
137
+ process_title.len = 0;
138
+ return argv;
139
+ }
140
+
141
+ new_argv = (char **) s;
142
+ new_env = new_argv + argc + 1;
143
+ s = (char *) (new_env + envc + 1);
144
+ memcpy(s, process_title.str, process_title.len);
145
+
146
+ for (i = 0; i < argc; i++)
147
+ new_argv[i] = s + (argv[i] - argv[0]);
148
+ new_argv[argc] = NULL;
149
+
150
+ s += environ[0] - argv[0];
151
+
152
+ for (i = 0; i < envc; i++)
153
+ new_env[i] = s + (environ[i] - environ[0]);
154
+ new_env[envc] = NULL;
155
+
156
+ environ = new_env;
157
+ return new_argv;
158
+ }
159
+
160
+
161
+ uv_err_t uv_set_process_title(const char* title) {
162
+ /* No need to terminate, last char is always '\0'. */
163
+ if (process_title.len)
164
+ strncpy(process_title.str, title, process_title.len - 1);
165
+
166
+ return uv_ok_;
167
+ }
168
+
169
+
170
+ uv_err_t uv_get_process_title(char* buffer, size_t size) {
171
+ if (process_title.str) {
172
+ strncpy(buffer, process_title.str, size);
173
+ } else {
174
+ if (size > 0) {
175
+ buffer[0] = '\0';
176
+ }
177
+ }
178
+
179
+ return uv_ok_;
180
+ }
181
+
182
+
183
+ uv_err_t uv_resident_set_memory(size_t* rss) {
184
+ FILE* f;
185
+ int itmp;
186
+ char ctmp;
187
+ unsigned int utmp;
188
+ size_t page_size = getpagesize();
189
+ char *cbuf;
190
+ int foundExeEnd;
191
+
192
+ f = fopen("/proc/self/stat", "r");
193
+ if (!f) return uv__new_sys_error(errno);
194
+
195
+ /* PID */
196
+ if (fscanf(f, "%d ", &itmp) == 0) goto error; /* coverity[secure_coding] */
197
+ /* Exec file */
198
+ cbuf = buf;
199
+ foundExeEnd = 0;
200
+ if (fscanf (f, "%c", cbuf++) == 0) goto error;
201
+ while (1) {
202
+ if (fscanf(f, "%c", cbuf) == 0) goto error;
203
+ if (*cbuf == ')') {
204
+ foundExeEnd = 1;
205
+ } else if (foundExeEnd && *cbuf == ' ') {
206
+ *cbuf = 0;
207
+ break;
208
+ }
209
+
210
+ cbuf++;
211
+ }
212
+ /* State */
213
+ if (fscanf (f, "%c ", &ctmp) == 0) goto error; /* coverity[secure_coding] */
214
+ /* Parent process */
215
+ if (fscanf (f, "%d ", &itmp) == 0) goto error; /* coverity[secure_coding] */
216
+ /* Process group */
217
+ if (fscanf (f, "%d ", &itmp) == 0) goto error; /* coverity[secure_coding] */
218
+ /* Session id */
219
+ if (fscanf (f, "%d ", &itmp) == 0) goto error; /* coverity[secure_coding] */
220
+ /* TTY */
221
+ if (fscanf (f, "%d ", &itmp) == 0) goto error; /* coverity[secure_coding] */
222
+ /* TTY owner process group */
223
+ if (fscanf (f, "%d ", &itmp) == 0) goto error; /* coverity[secure_coding] */
224
+ /* Flags */
225
+ if (fscanf (f, "%u ", &utmp) == 0) goto error; /* coverity[secure_coding] */
226
+ /* Minor faults (no memory page) */
227
+ if (fscanf (f, "%u ", &utmp) == 0) goto error; /* coverity[secure_coding] */
228
+ /* Minor faults, children */
229
+ if (fscanf (f, "%u ", &utmp) == 0) goto error; /* coverity[secure_coding] */
230
+ /* Major faults (memory page faults) */
231
+ if (fscanf (f, "%u ", &utmp) == 0) goto error; /* coverity[secure_coding] */
232
+ /* Major faults, children */
233
+ if (fscanf (f, "%u ", &utmp) == 0) goto error; /* coverity[secure_coding] */
234
+ /* utime */
235
+ if (fscanf (f, "%d ", &itmp) == 0) goto error; /* coverity[secure_coding] */
236
+ /* stime */
237
+ if (fscanf (f, "%d ", &itmp) == 0) goto error; /* coverity[secure_coding] */
238
+ /* utime, children */
239
+ if (fscanf (f, "%d ", &itmp) == 0) goto error; /* coverity[secure_coding] */
240
+ /* stime, children */
241
+ if (fscanf (f, "%d ", &itmp) == 0) goto error; /* coverity[secure_coding] */
242
+ /* jiffies remaining in current time slice */
243
+ if (fscanf (f, "%d ", &itmp) == 0) goto error; /* coverity[secure_coding] */
244
+ /* 'nice' value */
245
+ if (fscanf (f, "%d ", &itmp) == 0) goto error; /* coverity[secure_coding] */
246
+ /* jiffies until next timeout */
247
+ if (fscanf (f, "%u ", &utmp) == 0) goto error; /* coverity[secure_coding] */
248
+ /* jiffies until next SIGALRM */
249
+ if (fscanf (f, "%u ", &utmp) == 0) goto error; /* coverity[secure_coding] */
250
+ /* start time (jiffies since system boot) */
251
+ if (fscanf (f, "%d ", &itmp) == 0) goto error; /* coverity[secure_coding] */
252
+
253
+ /* Virtual memory size */
254
+ if (fscanf (f, "%u ", &utmp) == 0) goto error; /* coverity[secure_coding] */
255
+
256
+ /* Resident set size */
257
+ if (fscanf (f, "%u ", &utmp) == 0) goto error; /* coverity[secure_coding] */
258
+ *rss = (size_t) utmp * page_size;
259
+
260
+ /* rlim */
261
+ if (fscanf (f, "%u ", &utmp) == 0) goto error; /* coverity[secure_coding] */
262
+ /* Start of text */
263
+ if (fscanf (f, "%u ", &utmp) == 0) goto error; /* coverity[secure_coding] */
264
+ /* End of text */
265
+ if (fscanf (f, "%u ", &utmp) == 0) goto error; /* coverity[secure_coding] */
266
+ /* Start of stack */
267
+ if (fscanf (f, "%u ", &utmp) == 0) goto error; /* coverity[secure_coding] */
268
+
269
+ fclose (f);
270
+ return uv_ok_;
271
+
272
+ error:
273
+ fclose (f);
274
+ return uv__new_sys_error(errno);
275
+ }
276
+
277
+
278
+ uv_err_t uv_uptime(double* uptime) {
279
+ static volatile int no_clock_boottime;
280
+ struct timespec now;
281
+ int r;
282
+
283
+ /* Try CLOCK_BOOTTIME first, fall back to CLOCK_MONOTONIC if not available
284
+ * (pre-2.6.39 kernels). CLOCK_MONOTONIC doesn't increase when the system
285
+ * is suspended.
286
+ */
287
+ if (no_clock_boottime) {
288
+ retry: r = clock_gettime(CLOCK_MONOTONIC, &now);
289
+ }
290
+ else if ((r = clock_gettime(CLOCK_BOOTTIME, &now)) && errno == EINVAL) {
291
+ no_clock_boottime = 1;
292
+ goto retry;
293
+ }
294
+
295
+ if (r)
296
+ return uv__new_sys_error(errno);
297
+
298
+ *uptime = now.tv_sec;
299
+ *uptime += (double)now.tv_nsec / 1000000000.0;
300
+ return uv_ok_;
301
+ }
302
+
303
+
304
+ uv_err_t uv_cpu_info(uv_cpu_info_t** cpu_infos, int* count) {
305
+ unsigned int numcpus;
306
+ uv_cpu_info_t* ci;
307
+
308
+ *cpu_infos = NULL;
309
+ *count = 0;
310
+
311
+ numcpus = sysconf(_SC_NPROCESSORS_ONLN);
312
+ assert(numcpus != (unsigned int) -1);
313
+ assert(numcpus != 0);
314
+
315
+ ci = calloc(numcpus, sizeof(*ci));
316
+ if (ci == NULL)
317
+ return uv__new_sys_error(ENOMEM);
318
+
319
+ read_speeds(numcpus, ci);
320
+ read_models(numcpus, ci);
321
+ read_times(numcpus, ci);
322
+
323
+ *cpu_infos = ci;
324
+ *count = numcpus;
325
+
326
+ return uv_ok_;
327
+ }
328
+
329
+
330
+ static void read_speeds(unsigned int numcpus, uv_cpu_info_t* ci) {
331
+ unsigned int num;
332
+
333
+ for (num = 0; num < numcpus; num++)
334
+ ci[num].speed = read_cpufreq(num) / 1000;
335
+ }
336
+
337
+
338
+ static void read_models(unsigned int numcpus, uv_cpu_info_t* ci) {
339
+ #if defined(__i386__) || defined(__x86_64__)
340
+ static const char marker[] = "model name\t: ";
341
+ #elif defined(__arm__)
342
+ static const char marker[] = "Processor\t: ";
343
+ #elif defined(__mips__)
344
+ static const char marker[] = "cpu model\t\t: ";
345
+ #else
346
+ # warning uv_cpu_info() is not supported on this architecture.
347
+ static const char marker[] = "(dummy)";
348
+ #endif
349
+ unsigned int num;
350
+ char buf[1024];
351
+ char* model;
352
+ FILE* fp;
353
+
354
+ fp = fopen("/proc/cpuinfo", "r");
355
+ if (fp == NULL)
356
+ return;
357
+
358
+ num = 0;
359
+
360
+ while (fgets(buf, sizeof(buf), fp)) {
361
+ if (num >= numcpus)
362
+ break;
363
+
364
+ if (strncmp(buf, marker, sizeof(marker) - 1))
365
+ continue;
366
+
367
+ model = buf + sizeof(marker) - 1;
368
+ model = strndup(model, strlen(model) - 1); /* strip newline */
369
+ ci[num++].model = model;
370
+ }
371
+ fclose(fp);
372
+ }
373
+
374
+
375
+ static void read_times(unsigned int numcpus, uv_cpu_info_t* ci) {
376
+ unsigned long clock_ticks;
377
+ struct uv_cpu_times_s ts;
378
+ unsigned long user;
379
+ unsigned long nice;
380
+ unsigned long sys;
381
+ unsigned long idle;
382
+ unsigned long dummy;
383
+ unsigned long irq;
384
+ unsigned int num;
385
+ unsigned int len;
386
+ char buf[1024];
387
+ FILE* fp;
388
+
389
+ clock_ticks = sysconf(_SC_CLK_TCK);
390
+ assert(clock_ticks != (unsigned long) -1);
391
+ assert(clock_ticks != 0);
392
+
393
+ fp = fopen("/proc/stat", "r");
394
+ if (fp == NULL)
395
+ return;
396
+
397
+ if (!fgets(buf, sizeof(buf), fp))
398
+ abort();
399
+
400
+ num = 0;
401
+
402
+ while (fgets(buf, sizeof(buf), fp)) {
403
+ if (num >= numcpus)
404
+ break;
405
+
406
+ if (strncmp(buf, "cpu", 3))
407
+ break;
408
+
409
+ /* skip "cpu<num> " marker */
410
+ {
411
+ unsigned int n = num;
412
+ for (len = sizeof("cpu0"); n /= 10; len++);
413
+ assert(sscanf(buf, "cpu%u ", &n) == 1 && n == num);
414
+ }
415
+
416
+ /* Line contains user, nice, system, idle, iowait, irq, softirq, steal,
417
+ * guest, guest_nice but we're only interested in the first four + irq.
418
+ *
419
+ * Don't use %*s to skip fields or %ll to read straight into the uint64_t
420
+ * fields, they're not allowed in C89 mode.
421
+ */
422
+ if (6 != sscanf(buf + len,
423
+ "%lu %lu %lu %lu %lu %lu",
424
+ &user,
425
+ &nice,
426
+ &sys,
427
+ &idle,
428
+ &dummy,
429
+ &irq))
430
+ abort();
431
+
432
+ ts.user = clock_ticks * user;
433
+ ts.nice = clock_ticks * nice;
434
+ ts.sys = clock_ticks * sys;
435
+ ts.idle = clock_ticks * idle;
436
+ ts.irq = clock_ticks * irq;
437
+ ci[num++].cpu_times = ts;
438
+ }
439
+ fclose(fp);
440
+ }
441
+
442
+
443
+ static unsigned long read_cpufreq(unsigned int cpunum) {
444
+ unsigned long val;
445
+ char buf[1024];
446
+ FILE* fp;
447
+
448
+ snprintf(buf,
449
+ sizeof(buf),
450
+ "/sys/devices/system/cpu/cpu%u/cpufreq/scaling_cur_freq",
451
+ cpunum);
452
+
453
+ fp = fopen(buf, "r");
454
+ if (fp == NULL)
455
+ return 0;
456
+
457
+ val = 0;
458
+ fscanf(fp, "%lu", &val);
459
+ fclose(fp);
460
+
461
+ return val;
462
+ }
463
+
464
+
465
+ void uv_free_cpu_info(uv_cpu_info_t* cpu_infos, int count) {
466
+ int i;
467
+
468
+ for (i = 0; i < count; i++) {
469
+ free(cpu_infos[i].model);
470
+ }
471
+
472
+ free(cpu_infos);
473
+ }
474
+
475
+
476
+ uv_err_t uv_interface_addresses(uv_interface_address_t** addresses,
477
+ int* count) {
478
+ #ifndef HAVE_IFADDRS_H
479
+ return uv__new_artificial_error(UV_ENOSYS);
480
+ #else
481
+ struct ifaddrs *addrs, *ent;
482
+ char ip[INET6_ADDRSTRLEN];
483
+ uv_interface_address_t* address;
484
+
485
+ if (getifaddrs(&addrs) != 0) {
486
+ return uv__new_sys_error(errno);
487
+ }
488
+
489
+ *count = 0;
490
+
491
+ /* Count the number of interfaces */
492
+ for (ent = addrs; ent != NULL; ent = ent->ifa_next) {
493
+ if (!(ent->ifa_flags & IFF_UP && ent->ifa_flags & IFF_RUNNING) ||
494
+ (ent->ifa_addr == NULL) ||
495
+ (ent->ifa_addr->sa_family == PF_PACKET)) {
496
+ continue;
497
+ }
498
+
499
+ (*count)++;
500
+ }
501
+
502
+ *addresses = (uv_interface_address_t*)
503
+ malloc(*count * sizeof(uv_interface_address_t));
504
+ if (!(*addresses)) {
505
+ return uv__new_artificial_error(UV_ENOMEM);
506
+ }
507
+
508
+ address = *addresses;
509
+
510
+ for (ent = addrs; ent != NULL; ent = ent->ifa_next) {
511
+ bzero(&ip, sizeof (ip));
512
+ if (!(ent->ifa_flags & IFF_UP && ent->ifa_flags & IFF_RUNNING)) {
513
+ continue;
514
+ }
515
+
516
+ if (ent->ifa_addr == NULL) {
517
+ continue;
518
+ }
519
+
520
+ /*
521
+ * On Linux getifaddrs returns information related to the raw underlying
522
+ * devices. We're not interested in this information.
523
+ */
524
+ if (ent->ifa_addr->sa_family == PF_PACKET) {
525
+ continue;
526
+ }
527
+
528
+ address->name = strdup(ent->ifa_name);
529
+
530
+ if (ent->ifa_addr->sa_family == AF_INET6) {
531
+ address->address.address6 = *((struct sockaddr_in6 *)ent->ifa_addr);
532
+ } else {
533
+ address->address.address4 = *((struct sockaddr_in *)ent->ifa_addr);
534
+ }
535
+
536
+ address->is_internal = ent->ifa_flags & IFF_LOOPBACK ? 1 : 0;
537
+
538
+ address++;
539
+ }
540
+
541
+ freeifaddrs(addrs);
542
+
543
+ return uv_ok_;
544
+ #endif
545
+ }
546
+
547
+
548
+ void uv_free_interface_addresses(uv_interface_address_t* addresses,
549
+ int count) {
550
+ int i;
551
+
552
+ for (i = 0; i < count; i++) {
553
+ free(addresses[i].name);
554
+ }
555
+
556
+ free(addresses);
557
+ }