foolio 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +22 -0
- data/Gemfile +4 -0
- data/LICENSE +22 -0
- data/README.md +29 -0
- data/Rakefile +21 -0
- data/examples/timer.rb +20 -0
- data/ext/foolio/extconf.rb +34 -0
- data/ext/foolio/foolio_ext.c +921 -0
- data/ext/foolio/gen.rb +50 -0
- data/ext/foolio/make_table.rb +12 -0
- data/ext/foolio/templ +243 -0
- data/ext/libuv/.gitignore +33 -0
- data/ext/libuv/.mailmap +13 -0
- data/ext/libuv/.travis.yml +9 -0
- data/ext/libuv/AUTHORS +61 -0
- data/ext/libuv/LICENSE +44 -0
- data/ext/libuv/Makefile +71 -0
- data/ext/libuv/README.md +90 -0
- data/ext/libuv/common.gypi +178 -0
- data/ext/libuv/gyp_uv +73 -0
- data/ext/libuv/include/uv-private/eio.h +403 -0
- data/ext/libuv/include/uv-private/ev.h +838 -0
- data/ext/libuv/include/uv-private/ngx-queue.h +108 -0
- data/ext/libuv/include/uv-private/tree.h +768 -0
- data/ext/libuv/include/uv-private/uv-unix.h +324 -0
- data/ext/libuv/include/uv-private/uv-win.h +517 -0
- data/ext/libuv/include/uv.h +1838 -0
- data/ext/libuv/src/fs-poll.c +235 -0
- data/ext/libuv/src/inet.c +293 -0
- data/ext/libuv/src/unix/async.c +148 -0
- data/ext/libuv/src/unix/core.c +696 -0
- data/ext/libuv/src/unix/cygwin.c +83 -0
- data/ext/libuv/src/unix/darwin.c +342 -0
- data/ext/libuv/src/unix/dl.c +83 -0
- data/ext/libuv/src/unix/eio/Changes +63 -0
- data/ext/libuv/src/unix/eio/LICENSE +36 -0
- data/ext/libuv/src/unix/eio/Makefile.am +15 -0
- data/ext/libuv/src/unix/eio/aclocal.m4 +8957 -0
- data/ext/libuv/src/unix/eio/autogen.sh +3 -0
- data/ext/libuv/src/unix/eio/config.h.in +86 -0
- data/ext/libuv/src/unix/eio/config_cygwin.h +80 -0
- data/ext/libuv/src/unix/eio/config_darwin.h +141 -0
- data/ext/libuv/src/unix/eio/config_freebsd.h +81 -0
- data/ext/libuv/src/unix/eio/config_linux.h +94 -0
- data/ext/libuv/src/unix/eio/config_netbsd.h +81 -0
- data/ext/libuv/src/unix/eio/config_openbsd.h +137 -0
- data/ext/libuv/src/unix/eio/config_sunos.h +84 -0
- data/ext/libuv/src/unix/eio/configure.ac +22 -0
- data/ext/libuv/src/unix/eio/demo.c +194 -0
- data/ext/libuv/src/unix/eio/ecb.h +370 -0
- data/ext/libuv/src/unix/eio/eio.3 +3428 -0
- data/ext/libuv/src/unix/eio/eio.c +2593 -0
- data/ext/libuv/src/unix/eio/eio.pod +969 -0
- data/ext/libuv/src/unix/eio/libeio.m4 +195 -0
- data/ext/libuv/src/unix/eio/xthread.h +164 -0
- data/ext/libuv/src/unix/error.c +105 -0
- data/ext/libuv/src/unix/ev/Changes +388 -0
- data/ext/libuv/src/unix/ev/LICENSE +36 -0
- data/ext/libuv/src/unix/ev/Makefile.am +18 -0
- data/ext/libuv/src/unix/ev/Makefile.in +771 -0
- data/ext/libuv/src/unix/ev/README +58 -0
- data/ext/libuv/src/unix/ev/aclocal.m4 +8957 -0
- data/ext/libuv/src/unix/ev/autogen.sh +6 -0
- data/ext/libuv/src/unix/ev/config.guess +1526 -0
- data/ext/libuv/src/unix/ev/config.h.in +125 -0
- data/ext/libuv/src/unix/ev/config.sub +1658 -0
- data/ext/libuv/src/unix/ev/config_cygwin.h +123 -0
- data/ext/libuv/src/unix/ev/config_darwin.h +122 -0
- data/ext/libuv/src/unix/ev/config_freebsd.h +120 -0
- data/ext/libuv/src/unix/ev/config_linux.h +141 -0
- data/ext/libuv/src/unix/ev/config_netbsd.h +120 -0
- data/ext/libuv/src/unix/ev/config_openbsd.h +126 -0
- data/ext/libuv/src/unix/ev/config_sunos.h +122 -0
- data/ext/libuv/src/unix/ev/configure +13037 -0
- data/ext/libuv/src/unix/ev/configure.ac +18 -0
- data/ext/libuv/src/unix/ev/depcomp +630 -0
- data/ext/libuv/src/unix/ev/ev++.h +816 -0
- data/ext/libuv/src/unix/ev/ev.3 +5311 -0
- data/ext/libuv/src/unix/ev/ev.c +3925 -0
- data/ext/libuv/src/unix/ev/ev.pod +5243 -0
- data/ext/libuv/src/unix/ev/ev_epoll.c +266 -0
- data/ext/libuv/src/unix/ev/ev_kqueue.c +235 -0
- data/ext/libuv/src/unix/ev/ev_poll.c +148 -0
- data/ext/libuv/src/unix/ev/ev_port.c +179 -0
- data/ext/libuv/src/unix/ev/ev_select.c +310 -0
- data/ext/libuv/src/unix/ev/ev_vars.h +203 -0
- data/ext/libuv/src/unix/ev/ev_win32.c +153 -0
- data/ext/libuv/src/unix/ev/ev_wrap.h +196 -0
- data/ext/libuv/src/unix/ev/event.c +402 -0
- data/ext/libuv/src/unix/ev/event.h +170 -0
- data/ext/libuv/src/unix/ev/install-sh +294 -0
- data/ext/libuv/src/unix/ev/libev.m4 +39 -0
- data/ext/libuv/src/unix/ev/ltmain.sh +8413 -0
- data/ext/libuv/src/unix/ev/missing +336 -0
- data/ext/libuv/src/unix/ev/mkinstalldirs +111 -0
- data/ext/libuv/src/unix/freebsd.c +326 -0
- data/ext/libuv/src/unix/fs.c +739 -0
- data/ext/libuv/src/unix/internal.h +188 -0
- data/ext/libuv/src/unix/kqueue.c +120 -0
- data/ext/libuv/src/unix/linux/inotify.c +239 -0
- data/ext/libuv/src/unix/linux/linux-core.c +557 -0
- data/ext/libuv/src/unix/linux/syscalls.c +388 -0
- data/ext/libuv/src/unix/linux/syscalls.h +124 -0
- data/ext/libuv/src/unix/loop-watcher.c +62 -0
- data/ext/libuv/src/unix/loop.c +94 -0
- data/ext/libuv/src/unix/netbsd.c +108 -0
- data/ext/libuv/src/unix/openbsd.c +295 -0
- data/ext/libuv/src/unix/pipe.c +259 -0
- data/ext/libuv/src/unix/poll.c +114 -0
- data/ext/libuv/src/unix/process.c +495 -0
- data/ext/libuv/src/unix/signal.c +269 -0
- data/ext/libuv/src/unix/stream.c +990 -0
- data/ext/libuv/src/unix/sunos.c +481 -0
- data/ext/libuv/src/unix/tcp.c +393 -0
- data/ext/libuv/src/unix/thread.c +251 -0
- data/ext/libuv/src/unix/timer.c +136 -0
- data/ext/libuv/src/unix/tty.c +145 -0
- data/ext/libuv/src/unix/udp.c +659 -0
- data/ext/libuv/src/unix/uv-eio.c +107 -0
- data/ext/libuv/src/unix/uv-eio.h +13 -0
- data/ext/libuv/src/uv-common.c +380 -0
- data/ext/libuv/src/uv-common.h +170 -0
- data/ext/libuv/src/win/async.c +100 -0
- data/ext/libuv/src/win/atomicops-inl.h +56 -0
- data/ext/libuv/src/win/core.c +278 -0
- data/ext/libuv/src/win/dl.c +86 -0
- data/ext/libuv/src/win/error.c +155 -0
- data/ext/libuv/src/win/fs-event.c +510 -0
- data/ext/libuv/src/win/fs.c +1948 -0
- data/ext/libuv/src/win/getaddrinfo.c +365 -0
- data/ext/libuv/src/win/handle-inl.h +149 -0
- data/ext/libuv/src/win/handle.c +154 -0
- data/ext/libuv/src/win/internal.h +343 -0
- data/ext/libuv/src/win/loop-watcher.c +122 -0
- data/ext/libuv/src/win/pipe.c +1672 -0
- data/ext/libuv/src/win/poll.c +616 -0
- data/ext/libuv/src/win/process-stdio.c +500 -0
- data/ext/libuv/src/win/process.c +1013 -0
- data/ext/libuv/src/win/req-inl.h +220 -0
- data/ext/libuv/src/win/req.c +25 -0
- data/ext/libuv/src/win/signal.c +57 -0
- data/ext/libuv/src/win/stream-inl.h +67 -0
- data/ext/libuv/src/win/stream.c +167 -0
- data/ext/libuv/src/win/tcp.c +1394 -0
- data/ext/libuv/src/win/thread.c +372 -0
- data/ext/libuv/src/win/threadpool.c +74 -0
- data/ext/libuv/src/win/timer.c +224 -0
- data/ext/libuv/src/win/tty.c +1799 -0
- data/ext/libuv/src/win/udp.c +716 -0
- data/ext/libuv/src/win/util.c +864 -0
- data/ext/libuv/src/win/winapi.c +132 -0
- data/ext/libuv/src/win/winapi.h +4452 -0
- data/ext/libuv/src/win/winsock.c +557 -0
- data/ext/libuv/src/win/winsock.h +171 -0
- data/ext/libuv/test/benchmark-async-pummel.c +97 -0
- data/ext/libuv/test/benchmark-async.c +137 -0
- data/ext/libuv/test/benchmark-fs-stat.c +135 -0
- data/ext/libuv/test/benchmark-getaddrinfo.c +94 -0
- data/ext/libuv/test/benchmark-list.h +127 -0
- data/ext/libuv/test/benchmark-loop-count.c +88 -0
- data/ext/libuv/test/benchmark-million-timers.c +65 -0
- data/ext/libuv/test/benchmark-ping-pongs.c +213 -0
- data/ext/libuv/test/benchmark-pound.c +324 -0
- data/ext/libuv/test/benchmark-pump.c +462 -0
- data/ext/libuv/test/benchmark-sizes.c +44 -0
- data/ext/libuv/test/benchmark-spawn.c +162 -0
- data/ext/libuv/test/benchmark-tcp-write-batch.c +140 -0
- data/ext/libuv/test/benchmark-thread.c +64 -0
- data/ext/libuv/test/benchmark-udp-packet-storm.c +247 -0
- data/ext/libuv/test/blackhole-server.c +118 -0
- data/ext/libuv/test/dns-server.c +321 -0
- data/ext/libuv/test/echo-server.c +378 -0
- data/ext/libuv/test/fixtures/empty_file +0 -0
- data/ext/libuv/test/fixtures/load_error.node +1 -0
- data/ext/libuv/test/run-benchmarks.c +64 -0
- data/ext/libuv/test/run-tests.c +138 -0
- data/ext/libuv/test/runner-unix.c +295 -0
- data/ext/libuv/test/runner-unix.h +36 -0
- data/ext/libuv/test/runner-win.c +285 -0
- data/ext/libuv/test/runner-win.h +42 -0
- data/ext/libuv/test/runner.c +355 -0
- data/ext/libuv/test/runner.h +159 -0
- data/ext/libuv/test/task.h +112 -0
- data/ext/libuv/test/test-async.c +118 -0
- data/ext/libuv/test/test-callback-order.c +76 -0
- data/ext/libuv/test/test-callback-stack.c +203 -0
- data/ext/libuv/test/test-connection-fail.c +148 -0
- data/ext/libuv/test/test-cwd-and-chdir.c +64 -0
- data/ext/libuv/test/test-delayed-accept.c +188 -0
- data/ext/libuv/test/test-dlerror.c +58 -0
- data/ext/libuv/test/test-error.c +59 -0
- data/ext/libuv/test/test-fail-always.c +29 -0
- data/ext/libuv/test/test-fs-event.c +474 -0
- data/ext/libuv/test/test-fs-poll.c +146 -0
- data/ext/libuv/test/test-fs.c +1843 -0
- data/ext/libuv/test/test-get-currentexe.c +63 -0
- data/ext/libuv/test/test-get-loadavg.c +36 -0
- data/ext/libuv/test/test-get-memory.c +38 -0
- data/ext/libuv/test/test-getaddrinfo.c +122 -0
- data/ext/libuv/test/test-getsockname.c +342 -0
- data/ext/libuv/test/test-hrtime.c +54 -0
- data/ext/libuv/test/test-idle.c +81 -0
- data/ext/libuv/test/test-ipc-send-recv.c +209 -0
- data/ext/libuv/test/test-ipc.c +620 -0
- data/ext/libuv/test/test-list.h +427 -0
- data/ext/libuv/test/test-loop-handles.c +336 -0
- data/ext/libuv/test/test-multiple-listen.c +102 -0
- data/ext/libuv/test/test-mutexes.c +63 -0
- data/ext/libuv/test/test-pass-always.c +28 -0
- data/ext/libuv/test/test-ping-pong.c +253 -0
- data/ext/libuv/test/test-pipe-bind-error.c +140 -0
- data/ext/libuv/test/test-pipe-connect-error.c +96 -0
- data/ext/libuv/test/test-platform-output.c +87 -0
- data/ext/libuv/test/test-poll-close.c +72 -0
- data/ext/libuv/test/test-poll.c +573 -0
- data/ext/libuv/test/test-process-title.c +49 -0
- data/ext/libuv/test/test-ref.c +338 -0
- data/ext/libuv/test/test-run-once.c +48 -0
- data/ext/libuv/test/test-semaphore.c +111 -0
- data/ext/libuv/test/test-shutdown-close.c +103 -0
- data/ext/libuv/test/test-shutdown-eof.c +183 -0
- data/ext/libuv/test/test-signal.c +162 -0
- data/ext/libuv/test/test-spawn.c +863 -0
- data/ext/libuv/test/test-stdio-over-pipes.c +246 -0
- data/ext/libuv/test/test-tcp-bind-error.c +191 -0
- data/ext/libuv/test/test-tcp-bind6-error.c +154 -0
- data/ext/libuv/test/test-tcp-close-while-connecting.c +80 -0
- data/ext/libuv/test/test-tcp-close.c +129 -0
- data/ext/libuv/test/test-tcp-connect-error-after-write.c +95 -0
- data/ext/libuv/test/test-tcp-connect-error.c +70 -0
- data/ext/libuv/test/test-tcp-connect-timeout.c +85 -0
- data/ext/libuv/test/test-tcp-connect6-error.c +68 -0
- data/ext/libuv/test/test-tcp-flags.c +51 -0
- data/ext/libuv/test/test-tcp-shutdown-after-write.c +131 -0
- data/ext/libuv/test/test-tcp-unexpected-read.c +113 -0
- data/ext/libuv/test/test-tcp-write-error.c +168 -0
- data/ext/libuv/test/test-tcp-write-to-half-open-connection.c +135 -0
- data/ext/libuv/test/test-tcp-writealot.c +170 -0
- data/ext/libuv/test/test-thread.c +183 -0
- data/ext/libuv/test/test-threadpool.c +57 -0
- data/ext/libuv/test/test-timer-again.c +141 -0
- data/ext/libuv/test/test-timer.c +152 -0
- data/ext/libuv/test/test-tty.c +110 -0
- data/ext/libuv/test/test-udp-dgram-too-big.c +86 -0
- data/ext/libuv/test/test-udp-ipv6.c +156 -0
- data/ext/libuv/test/test-udp-multicast-join.c +139 -0
- data/ext/libuv/test/test-udp-multicast-ttl.c +86 -0
- data/ext/libuv/test/test-udp-options.c +86 -0
- data/ext/libuv/test/test-udp-send-and-recv.c +208 -0
- data/ext/libuv/test/test-util.c +97 -0
- data/ext/libuv/test/test-walk-handles.c +77 -0
- data/ext/libuv/uv.gyp +375 -0
- data/ext/libuv/vcbuild.bat +105 -0
- data/foolio.gemspec +18 -0
- data/lib/foolio.rb +9 -0
- data/lib/foolio/handle.rb +27 -0
- data/lib/foolio/listener.rb +26 -0
- data/lib/foolio/loop.rb +79 -0
- data/lib/foolio/stream.rb +109 -0
- data/lib/foolio/version.rb +3 -0
- metadata +309 -0
data/ext/libuv/Makefile
ADDED
@@ -0,0 +1,71 @@
|
|
1
|
+
# Copyright Joyent, Inc. and other Node contributors. All rights reserved.
|
2
|
+
#
|
3
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
4
|
+
# of this software and associated documentation files (the "Software"), to
|
5
|
+
# deal in the Software without restriction, including without limitation the
|
6
|
+
# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
7
|
+
# sell copies of the Software, and to permit persons to whom the Software is
|
8
|
+
# furnished to do so, subject to the following conditions:
|
9
|
+
#
|
10
|
+
# The above copyright notice and this permission notice shall be included in
|
11
|
+
# all copies or substantial portions of the Software.
|
12
|
+
#
|
13
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
14
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
15
|
+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
16
|
+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
17
|
+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
18
|
+
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
19
|
+
# IN THE SOFTWARE.
|
20
|
+
|
21
|
+
uname_S := $(shell sh -c 'uname -s 2>/dev/null || echo not')
|
22
|
+
|
23
|
+
ifdef MSVC
|
24
|
+
uname_S := MINGW
|
25
|
+
endif
|
26
|
+
|
27
|
+
CPPFLAGS += -Iinclude -Iinclude/uv-private
|
28
|
+
|
29
|
+
ifneq (,$(findstring MINGW,$(uname_S)))
|
30
|
+
include config-mingw.mk
|
31
|
+
else
|
32
|
+
include config-unix.mk
|
33
|
+
endif
|
34
|
+
|
35
|
+
TESTS=test/blackhole-server.c test/echo-server.c test/test-*.c
|
36
|
+
BENCHMARKS=test/blackhole-server.c test/echo-server.c test/dns-server.c test/benchmark-*.c
|
37
|
+
|
38
|
+
all: uv.a
|
39
|
+
|
40
|
+
test/run-tests$(E): test/*.h test/run-tests.c $(RUNNER_SRC) test/runner-unix.c $(TESTS) uv.a
|
41
|
+
$(CC) $(CPPFLAGS) $(RUNNER_CFLAGS) -o test/run-tests test/run-tests.c \
|
42
|
+
test/runner.c $(RUNNER_SRC) $(TESTS) uv.a $(RUNNER_LIBS) $(RUNNER_LINKFLAGS)
|
43
|
+
|
44
|
+
test/run-benchmarks$(E): test/*.h test/run-benchmarks.c test/runner.c $(RUNNER_SRC) $(BENCHMARKS) uv.a
|
45
|
+
$(CC) $(CPPFLAGS) $(RUNNER_CFLAGS) -o test/run-benchmarks test/run-benchmarks.c \
|
46
|
+
test/runner.c $(RUNNER_SRC) $(BENCHMARKS) uv.a $(RUNNER_LIBS) $(RUNNER_LINKFLAGS)
|
47
|
+
|
48
|
+
test/echo.o: test/echo.c test/echo.h
|
49
|
+
$(CC) $(CPPFLAGS) $(CFLAGS) -c test/echo.c -o test/echo.o
|
50
|
+
|
51
|
+
|
52
|
+
.PHONY: clean clean-platform distclean distclean-platform test bench
|
53
|
+
|
54
|
+
|
55
|
+
test: test/run-tests$(E)
|
56
|
+
test/run-tests
|
57
|
+
|
58
|
+
#test-%: test/run-tests$(E)
|
59
|
+
# test/run-tests $(@:test-%=%)
|
60
|
+
|
61
|
+
bench: test/run-benchmarks$(E)
|
62
|
+
test/run-benchmarks
|
63
|
+
|
64
|
+
#bench-%: test/run-benchmarks$(E)
|
65
|
+
# test/run-benchmarks $(@:bench-%=%)
|
66
|
+
|
67
|
+
clean: clean-platform
|
68
|
+
$(RM) -f src/*.o *.a test/run-tests$(E) test/run-benchmarks$(E)
|
69
|
+
|
70
|
+
distclean: distclean-platform
|
71
|
+
$(RM) -f src/*.o *.a test/run-tests$(E) test/run-benchmarks$(E)
|
data/ext/libuv/README.md
ADDED
@@ -0,0 +1,90 @@
|
|
1
|
+
# libuv [![Build Status](https://secure.travis-ci.org/joyent/libuv.png)](http://travis-ci.org/joyent/libuv)
|
2
|
+
|
3
|
+
libuv is a new platform layer for Node. Its purpose is to abstract IOCP on
|
4
|
+
Windows and libev on Unix systems. We intend to eventually contain all
|
5
|
+
platform differences in this library.
|
6
|
+
|
7
|
+
http://nodejs.org/
|
8
|
+
|
9
|
+
## Features
|
10
|
+
|
11
|
+
* Non-blocking TCP sockets
|
12
|
+
|
13
|
+
* Non-blocking named pipes
|
14
|
+
|
15
|
+
* UDP
|
16
|
+
|
17
|
+
* Timers
|
18
|
+
|
19
|
+
* Child process spawning
|
20
|
+
|
21
|
+
* Asynchronous DNS via `uv_getaddrinfo`.
|
22
|
+
|
23
|
+
* Asynchronous file system APIs `uv_fs_*`
|
24
|
+
|
25
|
+
* High resolution time `uv_hrtime`
|
26
|
+
|
27
|
+
* Current executable path look up `uv_exepath`
|
28
|
+
|
29
|
+
* Thread pool scheduling `uv_queue_work`
|
30
|
+
|
31
|
+
* ANSI escape code controlled TTY `uv_tty_t`
|
32
|
+
|
33
|
+
* File system events Currently supports inotify, `ReadDirectoryChangesW`
|
34
|
+
and kqueue. Event ports in the near future.
|
35
|
+
`uv_fs_event_t`
|
36
|
+
|
37
|
+
* IPC and socket sharing between processes `uv_write2`
|
38
|
+
|
39
|
+
|
40
|
+
## Documentation
|
41
|
+
|
42
|
+
* [include/uv.h](https://github.com/joyent/libuv/blob/master/include/uv.h)
|
43
|
+
— API documentation in the form of detailed header comments.
|
44
|
+
* [An Introduction to libuv](http://nikhilm.github.com/uvbook/) — An
|
45
|
+
overview of libuv with tutorials.
|
46
|
+
|
47
|
+
## Build Instructions
|
48
|
+
|
49
|
+
For GCC (including MinGW) there are two methods building: via normal
|
50
|
+
makefiles or via GYP. GYP is a meta-build system which can generate MSVS,
|
51
|
+
Makefile, and XCode backends. It is best used for integration into other
|
52
|
+
projects. The old (more stable) system is using Makefiles.
|
53
|
+
|
54
|
+
To build via Makefile simply execute:
|
55
|
+
|
56
|
+
make
|
57
|
+
|
58
|
+
To build with Visual Studio run the vcbuilds.bat file which will
|
59
|
+
checkout the GYP code into build/gyp and generate the uv.sln and
|
60
|
+
related files.
|
61
|
+
|
62
|
+
Windows users can also build from cmd-line using msbuild. This is
|
63
|
+
done by running vcbuild.bat from Visual Studio command prompt.
|
64
|
+
|
65
|
+
To have GYP generate build script for another system you will need to
|
66
|
+
checkout GYP into the project tree manually:
|
67
|
+
|
68
|
+
svn co http://gyp.googlecode.com/svn/trunk build/gyp
|
69
|
+
|
70
|
+
Unix users run
|
71
|
+
|
72
|
+
./gyp_uv -f make
|
73
|
+
make
|
74
|
+
|
75
|
+
Macintosh users run
|
76
|
+
|
77
|
+
./gyp_uv -f xcode
|
78
|
+
xcodebuild -project uv.xcodeproj -configuration Release -target All
|
79
|
+
|
80
|
+
|
81
|
+
## Supported Platforms
|
82
|
+
|
83
|
+
Microsoft Windows operating systems since Windows XP SP2. It can be built
|
84
|
+
with either Visual Studio or MinGW.
|
85
|
+
|
86
|
+
Linux 2.6 using the GCC toolchain.
|
87
|
+
|
88
|
+
MacOS using the GCC or XCode toolchain.
|
89
|
+
|
90
|
+
Solaris 121 and later using GCC toolchain.
|
@@ -0,0 +1,178 @@
|
|
1
|
+
{
|
2
|
+
'variables': {
|
3
|
+
'visibility%': 'hidden', # V8's visibility setting
|
4
|
+
'target_arch%': 'ia32', # set v8's target architecture
|
5
|
+
'host_arch%': 'ia32', # set v8's host architecture
|
6
|
+
'library%': 'static_library', # allow override to 'shared_library' for DLL/.so builds
|
7
|
+
'component%': 'static_library', # NB. these names match with what V8 expects
|
8
|
+
'msvs_multi_core_compile': '0', # we do enable multicore compiles, but not using the V8 way
|
9
|
+
'gcc_version%': 'unknown',
|
10
|
+
'clang%': 0,
|
11
|
+
},
|
12
|
+
|
13
|
+
'target_defaults': {
|
14
|
+
'default_configuration': 'Debug',
|
15
|
+
'configurations': {
|
16
|
+
'Debug': {
|
17
|
+
'defines': [ 'DEBUG', '_DEBUG' ],
|
18
|
+
'cflags': [ '-g', '-O0' ],
|
19
|
+
'msvs_settings': {
|
20
|
+
'VCCLCompilerTool': {
|
21
|
+
'target_conditions': [
|
22
|
+
['library=="static_library"', {
|
23
|
+
'RuntimeLibrary': 1, # static debug
|
24
|
+
}, {
|
25
|
+
'RuntimeLibrary': 3, # DLL debug
|
26
|
+
}],
|
27
|
+
],
|
28
|
+
'Optimization': 0, # /Od, no optimization
|
29
|
+
'MinimalRebuild': 'false',
|
30
|
+
'OmitFramePointers': 'false',
|
31
|
+
'BasicRuntimeChecks': 3, # /RTC1
|
32
|
+
},
|
33
|
+
'VCLinkerTool': {
|
34
|
+
'LinkIncremental': 2, # enable incremental linking
|
35
|
+
},
|
36
|
+
},
|
37
|
+
'xcode_settings': {
|
38
|
+
'GCC_OPTIMIZATION_LEVEL': '0',
|
39
|
+
},
|
40
|
+
'conditions': [
|
41
|
+
['OS != "win"', {
|
42
|
+
'defines': [ 'EV_VERIFY=2' ],
|
43
|
+
}],
|
44
|
+
]
|
45
|
+
},
|
46
|
+
'Release': {
|
47
|
+
'defines': [ 'NDEBUG' ],
|
48
|
+
'cflags': [ '-O3', '-fomit-frame-pointer', '-fdata-sections', '-ffunction-sections' ],
|
49
|
+
'msvs_settings': {
|
50
|
+
'VCCLCompilerTool': {
|
51
|
+
'target_conditions': [
|
52
|
+
['library=="static_library"', {
|
53
|
+
'RuntimeLibrary': 0, # static release
|
54
|
+
}, {
|
55
|
+
'RuntimeLibrary': 2, # debug release
|
56
|
+
}],
|
57
|
+
],
|
58
|
+
'Optimization': 3, # /Ox, full optimization
|
59
|
+
'FavorSizeOrSpeed': 1, # /Ot, favour speed over size
|
60
|
+
'InlineFunctionExpansion': 2, # /Ob2, inline anything eligible
|
61
|
+
'WholeProgramOptimization': 'true', # /GL, whole program optimization, needed for LTCG
|
62
|
+
'OmitFramePointers': 'true',
|
63
|
+
'EnableFunctionLevelLinking': 'true',
|
64
|
+
'EnableIntrinsicFunctions': 'true',
|
65
|
+
},
|
66
|
+
'VCLibrarianTool': {
|
67
|
+
'AdditionalOptions': [
|
68
|
+
'/LTCG', # link time code generation
|
69
|
+
],
|
70
|
+
},
|
71
|
+
'VCLinkerTool': {
|
72
|
+
'LinkTimeCodeGeneration': 1, # link-time code generation
|
73
|
+
'OptimizeReferences': 2, # /OPT:REF
|
74
|
+
'EnableCOMDATFolding': 2, # /OPT:ICF
|
75
|
+
'LinkIncremental': 1, # disable incremental linking
|
76
|
+
},
|
77
|
+
},
|
78
|
+
}
|
79
|
+
},
|
80
|
+
'msvs_settings': {
|
81
|
+
'VCCLCompilerTool': {
|
82
|
+
'StringPooling': 'true', # pool string literals
|
83
|
+
'DebugInformationFormat': 3, # Generate a PDB
|
84
|
+
'WarningLevel': 3,
|
85
|
+
'BufferSecurityCheck': 'true',
|
86
|
+
'ExceptionHandling': 1, # /EHsc
|
87
|
+
'SuppressStartupBanner': 'true',
|
88
|
+
'WarnAsError': 'false',
|
89
|
+
'AdditionalOptions': [
|
90
|
+
'/MP', # compile across multiple CPUs
|
91
|
+
],
|
92
|
+
},
|
93
|
+
'VCLibrarianTool': {
|
94
|
+
},
|
95
|
+
'VCLinkerTool': {
|
96
|
+
'GenerateDebugInformation': 'true',
|
97
|
+
'RandomizedBaseAddress': 2, # enable ASLR
|
98
|
+
'DataExecutionPrevention': 2, # enable DEP
|
99
|
+
'AllowIsolation': 'true',
|
100
|
+
'SuppressStartupBanner': 'true',
|
101
|
+
'target_conditions': [
|
102
|
+
['_type=="executable"', {
|
103
|
+
'SubSystem': 1, # console executable
|
104
|
+
}],
|
105
|
+
],
|
106
|
+
},
|
107
|
+
},
|
108
|
+
'conditions': [
|
109
|
+
['OS == "win"', {
|
110
|
+
'msvs_cygwin_shell': 0, # prevent actions from trying to use cygwin
|
111
|
+
'defines': [
|
112
|
+
'WIN32',
|
113
|
+
# we don't really want VC++ warning us about
|
114
|
+
# how dangerous C functions are...
|
115
|
+
'_CRT_SECURE_NO_DEPRECATE',
|
116
|
+
# ... or that C implementations shouldn't use
|
117
|
+
# POSIX names
|
118
|
+
'_CRT_NONSTDC_NO_DEPRECATE',
|
119
|
+
],
|
120
|
+
}],
|
121
|
+
[ 'OS=="linux" or OS=="freebsd" or OS=="openbsd" or OS=="solaris"', {
|
122
|
+
'cflags': [ '-Wall' ],
|
123
|
+
'cflags_cc': [ '-fno-rtti', '-fno-exceptions' ],
|
124
|
+
'conditions': [
|
125
|
+
[ 'host_arch != target_arch and target_arch=="ia32"', {
|
126
|
+
'cflags': [ '-m32' ],
|
127
|
+
'ldflags': [ '-m32' ],
|
128
|
+
}],
|
129
|
+
[ 'OS=="linux"', {
|
130
|
+
'cflags': [ '-ansi' ],
|
131
|
+
}],
|
132
|
+
[ 'OS=="solaris"', {
|
133
|
+
'cflags': [ '-pthreads' ],
|
134
|
+
'ldflags': [ '-pthreads' ],
|
135
|
+
}, {
|
136
|
+
'cflags': [ '-pthread' ],
|
137
|
+
'ldflags': [ '-pthread' ],
|
138
|
+
}],
|
139
|
+
[ 'visibility=="hidden" and (clang==1 or gcc_version >= 40)', {
|
140
|
+
'cflags': [ '-fvisibility=hidden' ],
|
141
|
+
}],
|
142
|
+
],
|
143
|
+
}],
|
144
|
+
['OS=="mac"', {
|
145
|
+
'xcode_settings': {
|
146
|
+
'ALWAYS_SEARCH_USER_PATHS': 'NO',
|
147
|
+
'GCC_CW_ASM_SYNTAX': 'NO', # No -fasm-blocks
|
148
|
+
'GCC_DYNAMIC_NO_PIC': 'NO', # No -mdynamic-no-pic
|
149
|
+
# (Equivalent to -fPIC)
|
150
|
+
'GCC_ENABLE_CPP_EXCEPTIONS': 'NO', # -fno-exceptions
|
151
|
+
'GCC_ENABLE_CPP_RTTI': 'NO', # -fno-rtti
|
152
|
+
'GCC_ENABLE_PASCAL_STRINGS': 'NO', # No -mpascal-strings
|
153
|
+
# GCC_INLINES_ARE_PRIVATE_EXTERN maps to -fvisibility-inlines-hidden
|
154
|
+
'GCC_INLINES_ARE_PRIVATE_EXTERN': 'YES',
|
155
|
+
'GCC_SYMBOLS_PRIVATE_EXTERN': 'YES', # -fvisibility=hidden
|
156
|
+
'GCC_THREADSAFE_STATICS': 'NO', # -fno-threadsafe-statics
|
157
|
+
'GCC_WARN_ABOUT_MISSING_NEWLINE': 'YES', # -Wnewline-eof
|
158
|
+
'PREBINDING': 'NO', # No -Wl,-prebind
|
159
|
+
'USE_HEADERMAP': 'NO',
|
160
|
+
'OTHER_CFLAGS': [
|
161
|
+
'-fno-strict-aliasing',
|
162
|
+
],
|
163
|
+
'WARNING_CFLAGS': [
|
164
|
+
'-Wall',
|
165
|
+
'-Wendif-labels',
|
166
|
+
'-W',
|
167
|
+
'-Wno-unused-parameter',
|
168
|
+
],
|
169
|
+
},
|
170
|
+
'target_conditions': [
|
171
|
+
['_type!="static_library"', {
|
172
|
+
'xcode_settings': {'OTHER_LDFLAGS': ['-Wl,-search_paths_first']},
|
173
|
+
}],
|
174
|
+
],
|
175
|
+
}],
|
176
|
+
],
|
177
|
+
},
|
178
|
+
}
|
data/ext/libuv/gyp_uv
ADDED
@@ -0,0 +1,73 @@
|
|
1
|
+
#!/usr/bin/env python
|
2
|
+
|
3
|
+
import glob
|
4
|
+
import os
|
5
|
+
import subprocess
|
6
|
+
import sys
|
7
|
+
|
8
|
+
CC = os.environ.get('CC', 'cc')
|
9
|
+
script_dir = os.path.dirname(__file__)
|
10
|
+
uv_root = os.path.normpath(script_dir)
|
11
|
+
output_dir = os.path.join(os.path.abspath(uv_root), 'out')
|
12
|
+
|
13
|
+
sys.path.insert(0, os.path.join(uv_root, 'build', 'gyp', 'pylib'))
|
14
|
+
try:
|
15
|
+
import gyp
|
16
|
+
except ImportError:
|
17
|
+
print('You need to install gyp in build/gyp first. See the README.')
|
18
|
+
sys.exit(42)
|
19
|
+
|
20
|
+
|
21
|
+
def compiler_version():
|
22
|
+
proc = subprocess.Popen(CC.split() + ['--version'], stdout=subprocess.PIPE)
|
23
|
+
is_clang = 'clang' in proc.communicate()[0].split('\n')[0]
|
24
|
+
proc = subprocess.Popen(CC.split() + ['-dumpversion'], stdout=subprocess.PIPE)
|
25
|
+
version = tuple(map(int, proc.communicate()[0].split('.')))
|
26
|
+
return (version, is_clang)
|
27
|
+
|
28
|
+
|
29
|
+
def run_gyp(args):
|
30
|
+
rc = gyp.main(args)
|
31
|
+
if rc != 0:
|
32
|
+
print 'Error running GYP'
|
33
|
+
sys.exit(rc)
|
34
|
+
|
35
|
+
|
36
|
+
if __name__ == '__main__':
|
37
|
+
args = sys.argv[1:]
|
38
|
+
|
39
|
+
# GYP bug.
|
40
|
+
# On msvs it will crash if it gets an absolute path.
|
41
|
+
# On Mac/make it will crash if it doesn't get an absolute path.
|
42
|
+
if sys.platform == 'win32':
|
43
|
+
args.append(os.path.join(uv_root, 'uv.gyp'))
|
44
|
+
common_fn = os.path.join(uv_root, 'common.gypi')
|
45
|
+
options_fn = os.path.join(uv_root, 'options.gypi')
|
46
|
+
else:
|
47
|
+
args.append(os.path.join(os.path.abspath(uv_root), 'uv.gyp'))
|
48
|
+
common_fn = os.path.join(os.path.abspath(uv_root), 'common.gypi')
|
49
|
+
options_fn = os.path.join(os.path.abspath(uv_root), 'options.gypi')
|
50
|
+
|
51
|
+
if os.path.exists(common_fn):
|
52
|
+
args.extend(['-I', common_fn])
|
53
|
+
|
54
|
+
if os.path.exists(options_fn):
|
55
|
+
args.extend(['-I', options_fn])
|
56
|
+
|
57
|
+
args.append('--depth=' + uv_root)
|
58
|
+
|
59
|
+
# There's a bug with windows which doesn't allow this feature.
|
60
|
+
if sys.platform != 'win32':
|
61
|
+
args.extend(['--generator-output', output_dir])
|
62
|
+
args.extend(['-Goutput_dir=' + output_dir])
|
63
|
+
args.extend('-f make'.split())
|
64
|
+
(major, minor), is_clang = compiler_version()
|
65
|
+
args.append('-Dgcc_version=%d' % (10 * major + minor))
|
66
|
+
args.append('-Dclang=%d' % int(is_clang))
|
67
|
+
|
68
|
+
args.append('-Dtarget_arch=ia32')
|
69
|
+
args.append('-Dcomponent=static_library')
|
70
|
+
args.append('-Dlibrary=static_library')
|
71
|
+
gyp_args = list(args)
|
72
|
+
print gyp_args
|
73
|
+
run_gyp(gyp_args)
|
@@ -0,0 +1,403 @@
|
|
1
|
+
/*
|
2
|
+
* libeio API header
|
3
|
+
*
|
4
|
+
* Copyright (c) 2007,2008,2009,2010,2011 Marc Alexander Lehmann <libeio@schmorp.de>
|
5
|
+
* All rights reserved.
|
6
|
+
*
|
7
|
+
* Redistribution and use in source and binary forms, with or without modifica-
|
8
|
+
* tion, are permitted provided that the following conditions are met:
|
9
|
+
*
|
10
|
+
* 1. Redistributions of source code must retain the above copyright notice,
|
11
|
+
* this list of conditions and the following disclaimer.
|
12
|
+
*
|
13
|
+
* 2. Redistributions in binary form must reproduce the above copyright
|
14
|
+
* notice, this list of conditions and the following disclaimer in the
|
15
|
+
* documentation and/or other materials provided with the distribution.
|
16
|
+
*
|
17
|
+
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
18
|
+
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MER-
|
19
|
+
* CHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
20
|
+
* EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPE-
|
21
|
+
* CIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
22
|
+
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
23
|
+
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
24
|
+
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTH-
|
25
|
+
* ERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
26
|
+
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
27
|
+
*
|
28
|
+
* Alternatively, the contents of this file may be used under the terms of
|
29
|
+
* the GNU General Public License ("GPL") version 2 or any later version,
|
30
|
+
* in which case the provisions of the GPL are applicable instead of
|
31
|
+
* the above. If you wish to allow the use of your version of this file
|
32
|
+
* only under the terms of the GPL and not to allow others to use your
|
33
|
+
* version of this file under the BSD license, indicate your decision
|
34
|
+
* by deleting the provisions above and replace them with the notice
|
35
|
+
* and other provisions required by the GPL. If you do not delete the
|
36
|
+
* provisions above, a recipient may use your version of this file under
|
37
|
+
* either the BSD or the GPL.
|
38
|
+
*/
|
39
|
+
|
40
|
+
#ifndef EIO_H_
|
41
|
+
#define EIO_H_
|
42
|
+
|
43
|
+
#ifdef __cplusplus
|
44
|
+
extern "C" {
|
45
|
+
#endif
|
46
|
+
|
47
|
+
#include <stddef.h>
|
48
|
+
#include <signal.h>
|
49
|
+
#include <sys/types.h>
|
50
|
+
|
51
|
+
typedef struct eio_req eio_req;
|
52
|
+
typedef struct eio_dirent eio_dirent;
|
53
|
+
|
54
|
+
typedef int (*eio_cb)(eio_req *req);
|
55
|
+
|
56
|
+
#ifndef EIO_REQ_MEMBERS
|
57
|
+
# define EIO_REQ_MEMBERS
|
58
|
+
#endif
|
59
|
+
|
60
|
+
#ifndef EIO_STRUCT_STAT
|
61
|
+
# ifdef _WIN32
|
62
|
+
# define EIO_STRUCT_STAT struct _stati64
|
63
|
+
# define EIO_STRUCT_STATI64
|
64
|
+
# else
|
65
|
+
# define EIO_STRUCT_STAT struct stat
|
66
|
+
# endif
|
67
|
+
#endif
|
68
|
+
|
69
|
+
#ifdef _WIN32
|
70
|
+
typedef int eio_uid_t;
|
71
|
+
typedef int eio_gid_t;
|
72
|
+
typedef int eio_mode_t;
|
73
|
+
#ifdef __MINGW32__ /* no intptr_t */
|
74
|
+
typedef ssize_t eio_ssize_t;
|
75
|
+
#else
|
76
|
+
typedef intptr_t eio_ssize_t; /* or SSIZE_T */
|
77
|
+
#endif
|
78
|
+
#if __GNUC__
|
79
|
+
typedef long long eio_ino_t;
|
80
|
+
#else
|
81
|
+
typedef __int64 eio_ino_t; /* unsigned not supported by msvc */
|
82
|
+
#endif
|
83
|
+
#else
|
84
|
+
typedef uid_t eio_uid_t;
|
85
|
+
typedef gid_t eio_gid_t;
|
86
|
+
typedef ssize_t eio_ssize_t;
|
87
|
+
typedef ino_t eio_ino_t;
|
88
|
+
typedef mode_t eio_mode_t;
|
89
|
+
#endif
|
90
|
+
|
91
|
+
#ifndef EIO_STRUCT_STATVFS
|
92
|
+
# define EIO_STRUCT_STATVFS struct statvfs
|
93
|
+
#endif
|
94
|
+
|
95
|
+
/* for readdir */
|
96
|
+
|
97
|
+
/* eio_readdir flags */
|
98
|
+
enum
|
99
|
+
{
|
100
|
+
EIO_READDIR_DENTS = 0x01, /* ptr2 contains eio_dirents, not just the (unsorted) names */
|
101
|
+
EIO_READDIR_DIRS_FIRST = 0x02, /* dirents gets sorted into a good stat() ing order to find directories first */
|
102
|
+
EIO_READDIR_STAT_ORDER = 0x04, /* dirents gets sorted into a good stat() ing order to quickly stat all files */
|
103
|
+
EIO_READDIR_FOUND_UNKNOWN = 0x80, /* set by eio_readdir when *_ARRAY was set and any TYPE=UNKNOWN's were found */
|
104
|
+
|
105
|
+
EIO_READDIR_CUSTOM1 = 0x100, /* for use by apps */
|
106
|
+
EIO_READDIR_CUSTOM2 = 0x200 /* for use by apps */
|
107
|
+
};
|
108
|
+
|
109
|
+
/* using "typical" values in the hope that the compiler will do something sensible */
|
110
|
+
enum eio_dtype
|
111
|
+
{
|
112
|
+
EIO_DT_UNKNOWN = 0,
|
113
|
+
EIO_DT_FIFO = 1,
|
114
|
+
EIO_DT_CHR = 2,
|
115
|
+
EIO_DT_MPC = 3, /* multiplexed char device (v7+coherent) */
|
116
|
+
EIO_DT_DIR = 4,
|
117
|
+
EIO_DT_NAM = 5, /* xenix special named file */
|
118
|
+
EIO_DT_BLK = 6,
|
119
|
+
EIO_DT_MPB = 7, /* multiplexed block device (v7+coherent) */
|
120
|
+
EIO_DT_REG = 8,
|
121
|
+
EIO_DT_NWK = 9, /* HP-UX network special */
|
122
|
+
EIO_DT_CMP = 9, /* VxFS compressed */
|
123
|
+
EIO_DT_LNK = 10,
|
124
|
+
/* DT_SHAD = 11,*/
|
125
|
+
EIO_DT_SOCK = 12,
|
126
|
+
EIO_DT_DOOR = 13, /* solaris door */
|
127
|
+
EIO_DT_WHT = 14,
|
128
|
+
EIO_DT_MAX = 15 /* highest DT_VALUE ever, hopefully */
|
129
|
+
};
|
130
|
+
|
131
|
+
struct eio_dirent
|
132
|
+
{
|
133
|
+
int nameofs; /* offset of null-terminated name string in (char *)req->ptr2 */
|
134
|
+
unsigned short namelen; /* size of filename without trailing 0 */
|
135
|
+
unsigned char type; /* one of EIO_DT_* */
|
136
|
+
signed char score; /* internal use */
|
137
|
+
eio_ino_t inode; /* the inode number, if available, otherwise unspecified */
|
138
|
+
};
|
139
|
+
|
140
|
+
/* eio_msync flags */
|
141
|
+
enum
|
142
|
+
{
|
143
|
+
EIO_MS_ASYNC = 1,
|
144
|
+
EIO_MS_INVALIDATE = 2,
|
145
|
+
EIO_MS_SYNC = 4
|
146
|
+
};
|
147
|
+
|
148
|
+
/* eio_mtouch flags */
|
149
|
+
enum
|
150
|
+
{
|
151
|
+
EIO_MT_MODIFY = 1
|
152
|
+
};
|
153
|
+
|
154
|
+
/* eio_sync_file_range flags */
|
155
|
+
enum
|
156
|
+
{
|
157
|
+
EIO_SYNC_FILE_RANGE_WAIT_BEFORE = 1,
|
158
|
+
EIO_SYNC_FILE_RANGE_WRITE = 2,
|
159
|
+
EIO_SYNC_FILE_RANGE_WAIT_AFTER = 4
|
160
|
+
};
|
161
|
+
|
162
|
+
/* eio_fallocate flags */
|
163
|
+
enum
|
164
|
+
{
|
165
|
+
EIO_FALLOC_FL_KEEP_SIZE = 1 /* MUST match the value in linux/falloc.h */
|
166
|
+
};
|
167
|
+
|
168
|
+
/* timestamps and differences - feel free to use double in your code directly */
|
169
|
+
typedef double eio_tstamp;
|
170
|
+
|
171
|
+
/* the eio request structure */
|
172
|
+
enum
|
173
|
+
{
|
174
|
+
EIO_CUSTOM,
|
175
|
+
EIO_OPEN, EIO_CLOSE, EIO_DUP2,
|
176
|
+
EIO_READ, EIO_WRITE,
|
177
|
+
EIO_READAHEAD, EIO_SENDFILE,
|
178
|
+
EIO_STAT, EIO_LSTAT, EIO_FSTAT,
|
179
|
+
EIO_STATVFS, EIO_FSTATVFS,
|
180
|
+
EIO_TRUNCATE, EIO_FTRUNCATE,
|
181
|
+
EIO_UTIME, EIO_FUTIME,
|
182
|
+
EIO_CHMOD, EIO_FCHMOD,
|
183
|
+
EIO_CHOWN, EIO_FCHOWN,
|
184
|
+
EIO_SYNC, EIO_FSYNC, EIO_FDATASYNC, EIO_SYNCFS,
|
185
|
+
EIO_MSYNC, EIO_MTOUCH, EIO_SYNC_FILE_RANGE, EIO_FALLOCATE,
|
186
|
+
EIO_MLOCK, EIO_MLOCKALL,
|
187
|
+
EIO_UNLINK, EIO_RMDIR, EIO_MKDIR, EIO_RENAME,
|
188
|
+
EIO_MKNOD, EIO_READDIR,
|
189
|
+
EIO_LINK, EIO_SYMLINK, EIO_READLINK, EIO_REALPATH,
|
190
|
+
EIO_GROUP, EIO_NOP,
|
191
|
+
EIO_BUSY
|
192
|
+
};
|
193
|
+
|
194
|
+
/* mlockall constants */
|
195
|
+
enum
|
196
|
+
{
|
197
|
+
EIO_MCL_CURRENT = 1,
|
198
|
+
EIO_MCL_FUTURE = 2
|
199
|
+
};
|
200
|
+
|
201
|
+
/* request priorities */
|
202
|
+
|
203
|
+
enum {
|
204
|
+
EIO_PRI_MIN = -4,
|
205
|
+
EIO_PRI_MAX = 4,
|
206
|
+
EIO_PRI_DEFAULT = 0
|
207
|
+
};
|
208
|
+
|
209
|
+
#define ETP_PRI_MIN EIO_PRI_MIN
|
210
|
+
#define ETP_PRI_MAX EIO_PRI_MAX
|
211
|
+
|
212
|
+
#define ETP_NUM_PRI (ETP_PRI_MAX - ETP_PRI_MIN + 1)
|
213
|
+
|
214
|
+
#define ETP_REQ eio_req
|
215
|
+
|
216
|
+
/*
|
217
|
+
* a somewhat faster data structure might be nice, but
|
218
|
+
* with 8 priorities this actually needs <20 insns
|
219
|
+
* per shift, the most expensive operation.
|
220
|
+
*/
|
221
|
+
typedef struct {
|
222
|
+
ETP_REQ *qs[ETP_NUM_PRI], *qe[ETP_NUM_PRI]; /* qstart, qend */
|
223
|
+
int size;
|
224
|
+
} etp_reqq;
|
225
|
+
|
226
|
+
typedef struct {
|
227
|
+
etp_reqq res_queue; /* queue of outstanding responses for this channel */
|
228
|
+
void *data; /* use this for what you want */
|
229
|
+
} eio_channel;
|
230
|
+
|
231
|
+
/* eio request structure */
|
232
|
+
/* this structure is mostly read-only */
|
233
|
+
/* when initialising it, all members must be zero-initialised */
|
234
|
+
struct eio_req
|
235
|
+
{
|
236
|
+
eio_req volatile *next; /* private ETP */
|
237
|
+
|
238
|
+
eio_ssize_t result; /* result of syscall, e.g. result = read (... */
|
239
|
+
off_t offs; /* read, write, truncate, readahead, sync_file_range, fallocate: file offset, mknod: dev_t */
|
240
|
+
size_t size; /* read, write, readahead, sendfile, msync, mlock, sync_file_range, fallocate: length */
|
241
|
+
void *ptr1; /* all applicable requests: pathname, old name; readdir: optional eio_dirents */
|
242
|
+
void *ptr2; /* all applicable requests: new name or memory buffer; readdir: name strings */
|
243
|
+
eio_tstamp nv1; /* utime, futime: atime; busy: sleep time */
|
244
|
+
eio_tstamp nv2; /* utime, futime: mtime */
|
245
|
+
|
246
|
+
int type; /* EIO_xxx constant ETP */
|
247
|
+
int int1; /* all applicable requests: file descriptor; sendfile: output fd; open, msync, mlockall, readdir: flags */
|
248
|
+
long int2; /* chown, fchown: uid; sendfile: input fd; open, chmod, mkdir, mknod: file mode, sync_file_range, fallocate: flags */
|
249
|
+
long int3; /* chown, fchown: gid */
|
250
|
+
int errorno; /* errno value on syscall return */
|
251
|
+
|
252
|
+
eio_channel *channel; /* data used to direct poll callbacks arising from this req */
|
253
|
+
|
254
|
+
#if defined(__i386) || defined(__amd64)
|
255
|
+
unsigned char cancelled;
|
256
|
+
#else
|
257
|
+
sig_atomic_t cancelled;
|
258
|
+
#endif
|
259
|
+
|
260
|
+
unsigned char flags; /* private */
|
261
|
+
signed char pri; /* the priority */
|
262
|
+
|
263
|
+
void *data;
|
264
|
+
eio_cb finish;
|
265
|
+
void (*destroy)(eio_req *req); /* called when request no longer needed */
|
266
|
+
void (*feed)(eio_req *req); /* only used for group requests */
|
267
|
+
|
268
|
+
EIO_REQ_MEMBERS
|
269
|
+
|
270
|
+
eio_req *grp, *grp_prev, *grp_next, *grp_first; /* private */
|
271
|
+
};
|
272
|
+
|
273
|
+
/* _private_ request flags */
|
274
|
+
enum {
|
275
|
+
EIO_FLAG_PTR1_FREE = 0x01, /* need to free(ptr1) */
|
276
|
+
EIO_FLAG_PTR2_FREE = 0x02, /* need to free(ptr2) */
|
277
|
+
EIO_FLAG_GROUPADD = 0x04 /* some request was added to the group */
|
278
|
+
};
|
279
|
+
|
280
|
+
/* undocumented/unsupported/private helper */
|
281
|
+
/*void eio_page_align (void **addr, size_t *length);*/
|
282
|
+
|
283
|
+
/* returns < 0 on error, errno set
|
284
|
+
* need_poll, if non-zero, will be called when results are available
|
285
|
+
* and eio_poll_cb needs to be invoked (it MUST NOT call eio_poll_cb itself).
|
286
|
+
* done_poll is called when the need to poll is gone.
|
287
|
+
*/
|
288
|
+
int eio_init (void (*want_poll)(eio_channel *), void (*done_poll)(eio_channel *));
|
289
|
+
|
290
|
+
/* initialises a channel */
|
291
|
+
void eio_channel_init(eio_channel *, void *data);
|
292
|
+
|
293
|
+
/* must be called regularly to handle pending requests */
|
294
|
+
/* returns 0 if all requests were handled, -1 if not, or the value of EIO_FINISH if != 0 */
|
295
|
+
int eio_poll (eio_channel *channel);
|
296
|
+
|
297
|
+
/* stop polling if poll took longer than duration seconds */
|
298
|
+
void eio_set_max_poll_time (eio_tstamp nseconds);
|
299
|
+
/* do not handle more then count requests in one call to eio_poll_cb */
|
300
|
+
void eio_set_max_poll_reqs (unsigned int nreqs);
|
301
|
+
|
302
|
+
/* set minimum required number
|
303
|
+
* maximum wanted number
|
304
|
+
* or maximum idle number of threads */
|
305
|
+
void eio_set_min_parallel (unsigned int nthreads);
|
306
|
+
void eio_set_max_parallel (unsigned int nthreads);
|
307
|
+
void eio_set_max_idle (unsigned int nthreads);
|
308
|
+
void eio_set_idle_timeout (unsigned int seconds);
|
309
|
+
|
310
|
+
unsigned int eio_nreqs (void); /* number of requests in-flight */
|
311
|
+
unsigned int eio_nready (void); /* number of not-yet handled requests */
|
312
|
+
unsigned int eio_npending (void); /* number of finished but unhandled requests */
|
313
|
+
unsigned int eio_nthreads (void); /* number of worker threads in use currently */
|
314
|
+
|
315
|
+
/*****************************************************************************/
|
316
|
+
/* convenience wrappers */
|
317
|
+
|
318
|
+
#ifndef EIO_NO_WRAPPERS
|
319
|
+
eio_req *eio_nop (int pri, eio_cb cb, void *data, eio_channel *channel); /* does nothing except go through the whole process */
|
320
|
+
eio_req *eio_busy (eio_tstamp delay, int pri, eio_cb cb, void *data, eio_channel *channel); /* ties a thread for this long, simulating busyness */
|
321
|
+
eio_req *eio_sync (int pri, eio_cb cb, void *data, eio_channel *channel);
|
322
|
+
eio_req *eio_fsync (int fd, int pri, eio_cb cb, void *data, eio_channel *channel);
|
323
|
+
eio_req *eio_fdatasync (int fd, int pri, eio_cb cb, void *data, eio_channel *channel);
|
324
|
+
eio_req *eio_syncfs (int fd, int pri, eio_cb cb, void *data, eio_channel *channel);
|
325
|
+
eio_req *eio_msync (void *addr, size_t length, int flags, int pri, eio_cb cb, void *data, eio_channel *channel);
|
326
|
+
eio_req *eio_mtouch (void *addr, size_t length, int flags, int pri, eio_cb cb, void *data, eio_channel *channel);
|
327
|
+
eio_req *eio_mlock (void *addr, size_t length, int pri, eio_cb cb, void *data, eio_channel *channel);
|
328
|
+
eio_req *eio_mlockall (int flags, int pri, eio_cb cb, void *data, eio_channel *channel);
|
329
|
+
eio_req *eio_sync_file_range (int fd, off_t offset, size_t nbytes, unsigned int flags, int pri, eio_cb cb, void *data, eio_channel *channel);
|
330
|
+
eio_req *eio_fallocate (int fd, int mode, off_t offset, size_t len, int pri, eio_cb cb, void *data, eio_channel *channel);
|
331
|
+
eio_req *eio_close (int fd, int pri, eio_cb cb, void *data, eio_channel *channel);
|
332
|
+
eio_req *eio_readahead (int fd, off_t offset, size_t length, int pri, eio_cb cb, void *data, eio_channel *channel);
|
333
|
+
eio_req *eio_read (int fd, void *buf, size_t length, off_t offset, int pri, eio_cb cb, void *data, eio_channel *channel);
|
334
|
+
eio_req *eio_write (int fd, void *buf, size_t length, off_t offset, int pri, eio_cb cb, void *data, eio_channel *channel);
|
335
|
+
eio_req *eio_fstat (int fd, int pri, eio_cb cb, void *data, eio_channel *channel); /* stat buffer=ptr2 allocated dynamically */
|
336
|
+
eio_req *eio_fstatvfs (int fd, int pri, eio_cb cb, void *data, eio_channel *channel); /* stat buffer=ptr2 allocated dynamically */
|
337
|
+
eio_req *eio_futime (int fd, eio_tstamp atime, eio_tstamp mtime, int pri, eio_cb cb, void *data, eio_channel *channel);
|
338
|
+
eio_req *eio_ftruncate (int fd, off_t offset, int pri, eio_cb cb, void *data, eio_channel *channel);
|
339
|
+
eio_req *eio_fchmod (int fd, eio_mode_t mode, int pri, eio_cb cb, void *data, eio_channel *channel);
|
340
|
+
eio_req *eio_fchown (int fd, eio_uid_t uid, eio_gid_t gid, int pri, eio_cb cb, void *data, eio_channel *channel);
|
341
|
+
eio_req *eio_dup2 (int fd, int fd2, int pri, eio_cb cb, void *data, eio_channel *channel);
|
342
|
+
eio_req *eio_sendfile (int out_fd, int in_fd, off_t in_offset, size_t length, int pri, eio_cb cb, void *data, eio_channel *channel);
|
343
|
+
eio_req *eio_open (const char *path, int flags, eio_mode_t mode, int pri, eio_cb cb, void *data, eio_channel *channel);
|
344
|
+
eio_req *eio_utime (const char *path, eio_tstamp atime, eio_tstamp mtime, int pri, eio_cb cb, void *data, eio_channel *channel);
|
345
|
+
eio_req *eio_truncate (const char *path, off_t offset, int pri, eio_cb cb, void *data, eio_channel *channel);
|
346
|
+
eio_req *eio_chown (const char *path, eio_uid_t uid, eio_gid_t gid, int pri, eio_cb cb, void *data, eio_channel *channel);
|
347
|
+
eio_req *eio_chmod (const char *path, eio_mode_t mode, int pri, eio_cb cb, void *data, eio_channel *channel);
|
348
|
+
eio_req *eio_mkdir (const char *path, eio_mode_t mode, int pri, eio_cb cb, void *data, eio_channel *channel);
|
349
|
+
eio_req *eio_readdir (const char *path, int flags, int pri, eio_cb cb, void *data, eio_channel *channel); /* result=ptr2 allocated dynamically */
|
350
|
+
eio_req *eio_rmdir (const char *path, int pri, eio_cb cb, void *data, eio_channel *channel);
|
351
|
+
eio_req *eio_unlink (const char *path, int pri, eio_cb cb, void *data, eio_channel *channel);
|
352
|
+
eio_req *eio_readlink (const char *path, int pri, eio_cb cb, void *data, eio_channel *channel); /* result=ptr2 allocated dynamically */
|
353
|
+
eio_req *eio_realpath (const char *path, int pri, eio_cb cb, void *data, eio_channel *channel); /* result=ptr2 allocated dynamically */
|
354
|
+
eio_req *eio_stat (const char *path, int pri, eio_cb cb, void *data, eio_channel *channel); /* stat buffer=ptr2 allocated dynamically */
|
355
|
+
eio_req *eio_lstat (const char *path, int pri, eio_cb cb, void *data, eio_channel *channel); /* stat buffer=ptr2 allocated dynamically */
|
356
|
+
eio_req *eio_statvfs (const char *path, int pri, eio_cb cb, void *data, eio_channel *channel); /* stat buffer=ptr2 allocated dynamically */
|
357
|
+
eio_req *eio_mknod (const char *path, eio_mode_t mode, dev_t dev, int pri, eio_cb cb, void *data, eio_channel *channel);
|
358
|
+
eio_req *eio_link (const char *path, const char *new_path, int pri, eio_cb cb, void *data, eio_channel *channel);
|
359
|
+
eio_req *eio_symlink (const char *path, const char *new_path, int pri, eio_cb cb, void *data, eio_channel *channel);
|
360
|
+
eio_req *eio_rename (const char *path, const char *new_path, int pri, eio_cb cb, void *data, eio_channel *channel);
|
361
|
+
eio_req *eio_custom (void (*execute)(eio_req *), int pri, eio_cb cb, void *data, eio_channel *channel);
|
362
|
+
#endif
|
363
|
+
|
364
|
+
/*****************************************************************************/
|
365
|
+
/* groups */
|
366
|
+
|
367
|
+
eio_req *eio_grp (eio_cb cb, void *data, eio_channel *channel);
|
368
|
+
void eio_grp_feed (eio_req *grp, void (*feed)(eio_req *req), int limit);
|
369
|
+
void eio_grp_limit (eio_req *grp, int limit);
|
370
|
+
void eio_grp_add (eio_req *grp, eio_req *req);
|
371
|
+
void eio_grp_cancel (eio_req *grp); /* cancels all sub requests but not the group */
|
372
|
+
|
373
|
+
/*****************************************************************************/
|
374
|
+
/* request api */
|
375
|
+
|
376
|
+
/* true if the request was cancelled, useful in the invoke callback */
|
377
|
+
#define EIO_CANCELLED(req) ((req)->cancelled)
|
378
|
+
|
379
|
+
#define EIO_RESULT(req) ((req)->result)
|
380
|
+
/* returns a pointer to the result buffer allocated by eio */
|
381
|
+
#define EIO_BUF(req) ((req)->ptr2)
|
382
|
+
#define EIO_STAT_BUF(req) ((EIO_STRUCT_STAT *)EIO_BUF(req))
|
383
|
+
#define EIO_STATVFS_BUF(req) ((EIO_STRUCT_STATVFS *)EIO_BUF(req))
|
384
|
+
#define EIO_PATH(req) ((char *)(req)->ptr1)
|
385
|
+
|
386
|
+
/* submit a request for execution */
|
387
|
+
void eio_submit (eio_req *req);
|
388
|
+
/* cancel a request as soon fast as possible, if possible */
|
389
|
+
void eio_cancel (eio_req *req);
|
390
|
+
|
391
|
+
/*****************************************************************************/
|
392
|
+
/* convenience functions */
|
393
|
+
|
394
|
+
eio_ssize_t eio_sendfile_sync (int ofd, int ifd, off_t offset, size_t count);
|
395
|
+
eio_ssize_t eio__pread (int fd, void *buf, size_t count, off_t offset);
|
396
|
+
eio_ssize_t eio__pwrite (int fd, void *buf, size_t count, off_t offset);
|
397
|
+
|
398
|
+
#ifdef __cplusplus
|
399
|
+
}
|
400
|
+
#endif
|
401
|
+
|
402
|
+
#endif
|
403
|
+
|