Commit 26c09545 authored by Jason Madden's avatar Jason Madden Committed by GitHub

Merge pull request #1913 from gevent/libuv-1.44.2

Libuv 1.44.2
parents 254e7579 58c697c5
...@@ -343,7 +343,8 @@ jobs: ...@@ -343,7 +343,8 @@ jobs:
run: | run: |
python -mgevent.tests --second-chance $G_USE_COV --ignore tests_that_dont_use_resolver.txt python -mgevent.tests --second-chance $G_USE_COV --ignore tests_that_dont_use_resolver.txt
- name: "Tests: dnspython resolver" - name: "Tests: dnspython resolver"
# This has known issues on Pypy-3.6. # This has known issues on Pypy-3.6. dnspython resolver not
# supported under anything newer than 3.10, so far.
if: (matrix.python-version == '3.9') && startsWith(runner.os, 'Linux') if: (matrix.python-version == '3.9') && startsWith(runner.os, 'Linux')
env: env:
GEVENT_RESOLVER: dnspython GEVENT_RESOLVER: dnspython
...@@ -367,7 +368,7 @@ jobs: ...@@ -367,7 +368,7 @@ jobs:
run: | run: |
python -mgevent.tests --second-chance --coverage python -mgevent.tests --second-chance --coverage
- name: "Tests: libuv" - name: "Tests: libuv"
if: (matrix.python-version == 2.7 || matrix.python-version == '3.9') if: (matrix.python-version == 2.7 || startsWith(matrix.python-version, '3.11'))
env: env:
GEVENT_LOOP: libuv GEVENT_LOOP: libuv
run: | run: |
......
A. Hauptmann <andreashauptmann@t-online.de> A. Hauptmann <andreashauptmann@t-online.de>
AJ Heller <aj@drfloob.com> <hork@google.com>
Aaron Bieber <qbit@deftly.net> <deftly@gmail.com> Aaron Bieber <qbit@deftly.net> <deftly@gmail.com>
Alan Gutierrez <alan@prettyrobots.com> <alan@blogometer.com> Alan Gutierrez <alan@prettyrobots.com> <alan@blogometer.com>
Andrius Bentkus <andrius.bentkus@gmail.com> <toxedvirus@gmail.com> Andrius Bentkus <andrius.bentkus@gmail.com> <toxedvirus@gmail.com>
...@@ -12,6 +13,7 @@ Brian White <mscdex@mscdex.net> <mscdex@gmail.com> ...@@ -12,6 +13,7 @@ Brian White <mscdex@mscdex.net> <mscdex@gmail.com>
Caleb James DeLisle <cjd@hyperboria.ca> <cjd@cjdns.fr> Caleb James DeLisle <cjd@hyperboria.ca> <cjd@cjdns.fr>
Christoph Iserlohn <christoph.iserlohn@innoq.com> Christoph Iserlohn <christoph.iserlohn@innoq.com>
Darshan Sen <raisinten@gmail.com> Darshan Sen <raisinten@gmail.com>
Darshan Sen <raisinten@gmail.com> <darshan.sen@postman.com>
David Carlier <devnexen@gmail.com> David Carlier <devnexen@gmail.com>
Devchandra Meetei Leishangthem <dlmeetei@gmail.com> Devchandra Meetei Leishangthem <dlmeetei@gmail.com>
Fedor Indutny <fedor.indutny@gmail.com> <fedor@indutny.com> Fedor Indutny <fedor.indutny@gmail.com> <fedor@indutny.com>
...@@ -21,6 +23,7 @@ Isaac Z. Schlueter <i@izs.me> ...@@ -21,6 +23,7 @@ Isaac Z. Schlueter <i@izs.me>
Jason Williams <necmon@yahoo.com> Jason Williams <necmon@yahoo.com>
Jesse Gorzinski <jgorzinski@gmail.com> Jesse Gorzinski <jgorzinski@gmail.com>
Jesse Gorzinski <jgorzinski@gmail.com> <jgorzins@us.ibm.com> Jesse Gorzinski <jgorzinski@gmail.com> <jgorzins@us.ibm.com>
Juan José Arboleda <soyjuanarbol@gmail.com>
Justin Venus <justin.venus@gmail.com> <justin.venus@orbitz.com> Justin Venus <justin.venus@gmail.com> <justin.venus@orbitz.com>
Keno Fischer <kenof@stanford.edu> <kfischer+github@college.harvard.edu> Keno Fischer <kenof@stanford.edu> <kfischer+github@college.harvard.edu>
Keno Fischer <kenof@stanford.edu> <kfischer@college.harvard.edu> Keno Fischer <kenof@stanford.edu> <kfischer@college.harvard.edu>
...@@ -46,6 +49,7 @@ Santiago Gimeno <santiago.gimeno@quantion.es> <santiago.gimeno@gmail.com> ...@@ -46,6 +49,7 @@ Santiago Gimeno <santiago.gimeno@quantion.es> <santiago.gimeno@gmail.com>
Saúl Ibarra Corretgé <saghul@gmail.com> Saúl Ibarra Corretgé <saghul@gmail.com>
Saúl Ibarra Corretgé <saghul@gmail.com> <s@saghul.net> Saúl Ibarra Corretgé <saghul@gmail.com> <s@saghul.net>
Shigeki Ohtsu <ohtsu@iij.ad.jp> <ohtsu@ohtsu.org> Shigeki Ohtsu <ohtsu@iij.ad.jp> <ohtsu@ohtsu.org>
Shuowang (Wayne) Zhang <shuowang.zhang@ibm.com>
TK-one <tk5641@naver.com> TK-one <tk5641@naver.com>
Timothy J. Fontaine <tjfontaine@gmail.com> Timothy J. Fontaine <tjfontaine@gmail.com>
Yasuhiro Matsumoto <mattn.jp@gmail.com> Yasuhiro Matsumoto <mattn.jp@gmail.com>
......
...@@ -479,3 +479,41 @@ Joshua M. Clulow <josh@sysmgr.org> ...@@ -479,3 +479,41 @@ Joshua M. Clulow <josh@sysmgr.org>
Guilherme Íscaro <cabelitostos@gmail.com> Guilherme Íscaro <cabelitostos@gmail.com>
Martin Storsjö <martin@martin.st> Martin Storsjö <martin@martin.st>
Claes Nästén <pekdon@gmail.com> Claes Nästén <pekdon@gmail.com>
Mohamed Edrah <43171151+MSE99@users.noreply.github.com>
Supragya Raj <supragyaraj@gmail.com>
Ikko Ashimine <eltociear@gmail.com>
Sylvain Corlay <sylvain.corlay@gmail.com>
earnal <etienne.arnal@gmail.com>
YAKSH BARIYA <yakshbari4@gmail.com>
Ofek Lev <ofekmeister@gmail.com>
~locpyl-tidnyd <81016946+locpyl-tidnyd@users.noreply.github.com>
Evan Miller <emmiller@gmail.com>
Petr Menšík <pemensik@redhat.com>
Nicolas Noble <nicolasnoble@users.noreply.github.com>
AJ Heller <aj@drfloob.com>
Stacey Marshall <stacey.marshall@gmail.com>
Jesper Storm Bache <jsbache@users.noreply.github.com>
Campbell He <duskmoon314@users.noreply.github.com>
Andrey Hohutkin <andrey.hohutkin@gmail.com>
deal <halx99@live.com>
David Machaj <46852402+dmachaj@users.noreply.github.com>
Jessica Clarke <jrtc27@jrtc27.com>
Jeremy Rose <nornagon@nornagon.net>
woclass <git@wo-class.cn>
Luca Adrian L <info@lucalindhorst.de>
WenTao Ou <owt5008137@live.com>
jonilaitinen <joni.laitinen@iki.fi>
UMU <UMU618@users.noreply.github.com>
Paul Evans <leonerd@leonerd.org.uk>
wyckster <wyckster@hotmail.com>
Vittore F. Scolari <vittore.scolari@gmail.com>
roflcopter4 <15476346+roflcopter4@users.noreply.github.com>
V-for-Vasili <vasili.skurydzin@protonmail.com>
Denny C. Dai <dennycd@me.com>
Hannah Shi <hannahshisfb@gmail.com>
tuftedocelot <tuftedocelot@fastmail.fm>
blogdaren <blogdaren@163.com>
chucksilvers <chuq@chuq.com>
Sergey Fedorov <vital.had@gmail.com>
theanarkh <2923878201@qq.com>
Samuel Cabrero <samuelcabrero@gmail.com>
...@@ -31,13 +31,26 @@ if(QEMU) ...@@ -31,13 +31,26 @@ if(QEMU)
endif() endif()
option(ASAN "Enable AddressSanitizer (ASan)" OFF) option(ASAN "Enable AddressSanitizer (ASan)" OFF)
if(ASAN AND CMAKE_C_COMPILER_ID MATCHES "AppleClang|GNU|Clang") option(TSAN "Enable ThreadSanitizer (TSan)" OFF)
if((ASAN OR TSAN) AND NOT (CMAKE_C_COMPILER_ID MATCHES "AppleClang|GNU|Clang"))
message(SEND_ERROR "Sanitizer support requires clang or gcc. Try again with -DCMAKE_C_COMPILER.")
endif()
if(ASAN)
add_definitions(-D__ASAN__=1) add_definitions(-D__ASAN__=1)
set (CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -fno-omit-frame-pointer -fsanitize=address") set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fno-omit-frame-pointer -fsanitize=address")
set (CMAKE_SHARED_LINKER_FLAGS_DEBUG "${CMAKE_SHARED_LINKER_FLAGS_DEBUG} -fno-omit-frame-pointer -fsanitize=address") set (CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -fno-omit-frame-pointer -fsanitize=address")
set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fno-omit-frame-pointer -fsanitize=address") set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fno-omit-frame-pointer -fsanitize=address")
endif() endif()
if(TSAN)
add_definitions(-D__TSAN__=1)
set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fno-omit-frame-pointer -fsanitize=thread")
set (CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -fno-omit-frame-pointer -fsanitize=thread")
set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fno-omit-frame-pointer -fsanitize=thread")
endif()
# Compiler check # Compiler check
string(CONCAT is-msvc $<OR: string(CONCAT is-msvc $<OR:
$<C_COMPILER_ID:MSVC>, $<C_COMPILER_ID:MSVC>,
...@@ -112,6 +125,7 @@ set(uv_sources ...@@ -112,6 +125,7 @@ set(uv_sources
src/inet.c src/inet.c
src/random.c src/random.c
src/strscpy.c src/strscpy.c
src/strtok.c
src/threadpool.c src/threadpool.c
src/timer.c src/timer.c
src/uv-common.c src/uv-common.c
...@@ -202,7 +216,6 @@ if(CMAKE_SYSTEM_NAME STREQUAL "Android") ...@@ -202,7 +216,6 @@ if(CMAKE_SYSTEM_NAME STREQUAL "Android")
list(APPEND uv_defines _GNU_SOURCE) list(APPEND uv_defines _GNU_SOURCE)
list(APPEND uv_libraries dl) list(APPEND uv_libraries dl)
list(APPEND uv_sources list(APPEND uv_sources
src/unix/android-ifaddrs.c
src/unix/linux-core.c src/unix/linux-core.c
src/unix/linux-inotify.c src/unix/linux-inotify.c
src/unix/linux-syscalls.c src/unix/linux-syscalls.c
...@@ -246,6 +259,22 @@ if(APPLE) ...@@ -246,6 +259,22 @@ if(APPLE)
src/unix/fsevents.c) src/unix/fsevents.c)
endif() endif()
if(CMAKE_SYSTEM_NAME STREQUAL "GNU")
list(APPEND uv_libraries dl)
list(APPEND uv_sources
src/unix/bsd-ifaddrs.c
src/unix/no-fsevents.c
src/unix/no-proctitle.c
src/unix/posix-hrtime.c
src/unix/posix-poll.c
src/unix/hurd.c)
endif()
if(CMAKE_SYSTEM_NAME STREQUAL "kFreeBSD")
list(APPEND uv_defines _GNU_SOURCE)
list(APPEND uv_libraries dl freebsd-glue)
endif()
if(CMAKE_SYSTEM_NAME STREQUAL "Linux") if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
list(APPEND uv_defines _GNU_SOURCE _POSIX_C_SOURCE=200112) list(APPEND uv_defines _GNU_SOURCE _POSIX_C_SOURCE=200112)
list(APPEND uv_libraries dl rt) list(APPEND uv_libraries dl rt)
...@@ -405,6 +434,7 @@ if(LIBUV_BUILD_TESTS) ...@@ -405,6 +434,7 @@ if(LIBUV_BUILD_TESTS)
test/benchmark-fs-stat.c test/benchmark-fs-stat.c
test/benchmark-getaddrinfo.c test/benchmark-getaddrinfo.c
test/benchmark-loop-count.c test/benchmark-loop-count.c
test/benchmark-queue-work.c
test/benchmark-million-async.c test/benchmark-million-async.c
test/benchmark-million-timers.c test/benchmark-million-timers.c
test/benchmark-multi-accept.c test/benchmark-multi-accept.c
...@@ -418,7 +448,6 @@ if(LIBUV_BUILD_TESTS) ...@@ -418,7 +448,6 @@ if(LIBUV_BUILD_TESTS)
test/benchmark-thread.c test/benchmark-thread.c
test/benchmark-udp-pummel.c test/benchmark-udp-pummel.c
test/blackhole-server.c test/blackhole-server.c
test/dns-server.c
test/echo-server.c test/echo-server.c
test/run-benchmarks.c test/run-benchmarks.c
test/runner.c) test/runner.c)
...@@ -435,7 +464,6 @@ if(LIBUV_BUILD_TESTS) ...@@ -435,7 +464,6 @@ if(LIBUV_BUILD_TESTS)
test/test-async-null-cb.c test/test-async-null-cb.c
test/test-async.c test/test-async.c
test/test-barrier.c test/test-barrier.c
test/test-callback-order.c
test/test-callback-stack.c test/test-callback-stack.c
test/test-close-fd.c test/test-close-fd.c
test/test-close-order.c test/test-close-order.c
...@@ -477,6 +505,7 @@ if(LIBUV_BUILD_TESTS) ...@@ -477,6 +505,7 @@ if(LIBUV_BUILD_TESTS)
test/test-idna.c test/test-idna.c
test/test-ip4-addr.c test/test-ip4-addr.c
test/test-ip6-addr.c test/test-ip6-addr.c
test/test-ip-name.c
test/test-ipc-heavy-traffic-deadlock-bug.c test/test-ipc-heavy-traffic-deadlock-bug.c
test/test-ipc-send-recv.c test/test-ipc-send-recv.c
test/test-ipc.c test/test-ipc.c
...@@ -490,7 +519,6 @@ if(LIBUV_BUILD_TESTS) ...@@ -490,7 +519,6 @@ if(LIBUV_BUILD_TESTS)
test/test-multiple-listen.c test/test-multiple-listen.c
test/test-mutexes.c test/test-mutexes.c
test/test-not-readable-nor-writable-on-read-error.c test/test-not-readable-nor-writable-on-read-error.c
test/test-not-readable-on-eof.c
test/test-not-writable-after-shutdown.c test/test-not-writable-after-shutdown.c
test/test-osx-select.c test/test-osx-select.c
test/test-pass-always.c test/test-pass-always.c
...@@ -518,6 +546,7 @@ if(LIBUV_BUILD_TESTS) ...@@ -518,6 +546,7 @@ if(LIBUV_BUILD_TESTS)
test/test-process-title.c test/test-process-title.c
test/test-queue-foreach-delete.c test/test-queue-foreach-delete.c
test/test-random.c test/test-random.c
test/test-readable-on-eof.c
test/test-ref.c test/test-ref.c
test/test-run-nowait.c test/test-run-nowait.c
test/test-run-once.c test/test-run-once.c
...@@ -533,10 +562,12 @@ if(LIBUV_BUILD_TESTS) ...@@ -533,10 +562,12 @@ if(LIBUV_BUILD_TESTS)
test/test-spawn.c test/test-spawn.c
test/test-stdio-over-pipes.c test/test-stdio-over-pipes.c
test/test-strscpy.c test/test-strscpy.c
test/test-strtok.c
test/test-tcp-alloc-cb-fail.c test/test-tcp-alloc-cb-fail.c
test/test-tcp-bind-error.c test/test-tcp-bind-error.c
test/test-tcp-bind6-error.c test/test-tcp-bind6-error.c
test/test-tcp-close-accept.c test/test-tcp-close-accept.c
test/test-tcp-close-after-read-timeout.c
test/test-tcp-close-while-connecting.c test/test-tcp-close-while-connecting.c
test/test-tcp-close.c test/test-tcp-close.c
test/test-tcp-close-reset.c test/test-tcp-close-reset.c
...@@ -550,6 +581,7 @@ if(LIBUV_BUILD_TESTS) ...@@ -550,6 +581,7 @@ if(LIBUV_BUILD_TESTS)
test/test-tcp-open.c test/test-tcp-open.c
test/test-tcp-read-stop.c test/test-tcp-read-stop.c
test/test-tcp-read-stop-start.c test/test-tcp-read-stop-start.c
test/test-tcp-rst.c
test/test-tcp-shutdown-after-write.c test/test-tcp-shutdown-after-write.c
test/test-tcp-try-write.c test/test-tcp-try-write.c
test/test-tcp-try-write-error.c test/test-tcp-try-write-error.c
...@@ -574,6 +606,7 @@ if(LIBUV_BUILD_TESTS) ...@@ -574,6 +606,7 @@ if(LIBUV_BUILD_TESTS)
test/test-udp-alloc-cb-fail.c test/test-udp-alloc-cb-fail.c
test/test-udp-bind.c test/test-udp-bind.c
test/test-udp-connect.c test/test-udp-connect.c
test/test-udp-connect6.c
test/test-udp-create-socket-early.c test/test-udp-create-socket-early.c
test/test-udp-dgram-too-big.c test/test-udp-dgram-too-big.c
test/test-udp-ipv6.c test/test-udp-ipv6.c
...@@ -625,46 +658,45 @@ if(LIBUV_BUILD_TESTS) ...@@ -625,46 +658,45 @@ if(LIBUV_BUILD_TESTS)
endif() endif()
endif() endif()
if(UNIX OR MINGW) # Now for some gibbering horrors from beyond the stars...
# Now for some gibbering horrors from beyond the stars... foreach(lib IN LISTS uv_libraries)
foreach(lib IN LISTS uv_libraries)
list(APPEND LIBS "-l${lib}") list(APPEND LIBS "-l${lib}")
endforeach() endforeach()
string(REPLACE ";" " " LIBS "${LIBS}") string(REPLACE ";" " " LIBS "${LIBS}")
# Consider setting project version via project() call? # Consider setting project version via project() call?
file(STRINGS configure.ac configure_ac REGEX ^AC_INIT) file(STRINGS configure.ac configure_ac REGEX ^AC_INIT)
string(REGEX MATCH "([0-9]+)[.][0-9]+[.][0-9]+" PACKAGE_VERSION "${configure_ac}") string(REGEX MATCH "([0-9]+)[.][0-9]+[.][0-9]+" PACKAGE_VERSION "${configure_ac}")
set(UV_VERSION_MAJOR "${CMAKE_MATCH_1}") set(UV_VERSION_MAJOR "${CMAKE_MATCH_1}")
# The version in the filename is mirroring the behaviour of autotools. # The version in the filename is mirroring the behaviour of autotools.
set_target_properties(uv PROPERTIES set_target_properties(uv PROPERTIES
VERSION ${UV_VERSION_MAJOR}.0.0 VERSION ${UV_VERSION_MAJOR}.0.0
SOVERSION ${UV_VERSION_MAJOR}) SOVERSION ${UV_VERSION_MAJOR})
set(includedir ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_INCLUDEDIR}) set(includedir ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_INCLUDEDIR})
set(libdir ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}) set(libdir ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR})
set(prefix ${CMAKE_INSTALL_PREFIX}) set(prefix ${CMAKE_INSTALL_PREFIX})
configure_file(libuv.pc.in libuv.pc @ONLY) configure_file(libuv.pc.in libuv.pc @ONLY)
configure_file(libuv-static.pc.in libuv-static.pc @ONLY) configure_file(libuv-static.pc.in libuv-static.pc @ONLY)
install(DIRECTORY include/ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) install(DIRECTORY include/ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
install(FILES LICENSE DESTINATION ${CMAKE_INSTALL_DOCDIR}) install(FILES LICENSE DESTINATION ${CMAKE_INSTALL_DOCDIR})
install(FILES ${PROJECT_BINARY_DIR}/libuv.pc ${PROJECT_BINARY_DIR}/libuv-static.pc install(FILES ${PROJECT_BINARY_DIR}/libuv.pc ${PROJECT_BINARY_DIR}/libuv-static.pc
DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig) DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
install(TARGETS uv LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}) install(TARGETS uv EXPORT libuvConfig
install(TARGETS uv_a ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}) RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
endif() LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
install(TARGETS uv_a EXPORT libuvConfig
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
install(EXPORT libuvConfig DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/libuv)
if(MSVC) if(MSVC)
install(DIRECTORY include/ DESTINATION include) set(CMAKE_DEBUG_POSTFIX d)
install(FILES LICENSE DESTINATION .)
install(TARGETS uv uv_a
RUNTIME DESTINATION lib/$<CONFIG>
ARCHIVE DESTINATION lib/$<CONFIG>)
endif() endif()
message(STATUS "summary of build options: message(STATUS "summary of build options:
Install prefix: ${CMAKE_INSTALL_PREFIX} Install prefix: ${CMAKE_INSTALL_PREFIX}
Target system: ${CMAKE_SYSTEM_NAME} Target system: ${CMAKE_SYSTEM_NAME}
Compiler: Compiler:
C compiler: ${CMAKE_C_COMPILER} C compiler: ${CMAKE_C_COMPILER} (${CMAKE_C_COMPILER_ID})
CFLAGS: ${CMAKE_C_FLAGS_${_build_type}} ${CMAKE_C_FLAGS} CFLAGS: ${CMAKE_C_FLAGS_${_build_type}} ${CMAKE_C_FLAGS}
") ")
This diff is collapsed.
...@@ -64,7 +64,3 @@ The externally maintained libraries used by libuv are: ...@@ -64,7 +64,3 @@ The externally maintained libraries used by libuv are:
- pthread-fixes.c, copyright Google Inc. and Sony Mobile Communications AB. - pthread-fixes.c, copyright Google Inc. and Sony Mobile Communications AB.
Three clause BSD license. Three clause BSD license.
- android-ifaddrs.h, android-ifaddrs.c, copyright Berkeley Software Design
Inc, Kenneth MacKay and Emergya (Cloud4all, FP7/2007-2013, grant agreement
n° 289016). Three clause BSD license.
# Project Maintainers # Project Maintainers
libuv is currently managed by the following individuals: libuv is currently managed by the following individuals:
* **Anna Henningsen** ([@addaleax](https://github.com/addaleax))
* **Bartosz Sosnowski** ([@bzoz](https://github.com/bzoz))
* **Ben Noordhuis** ([@bnoordhuis](https://github.com/bnoordhuis)) * **Ben Noordhuis** ([@bnoordhuis](https://github.com/bnoordhuis))
- GPG key: D77B 1E34 243F BAF0 5F8E 9CC3 4F55 C8C8 46AB 89B9 (pubkey-bnoordhuis) - GPG key: D77B 1E34 243F BAF0 5F8E 9CC3 4F55 C8C8 46AB 89B9 (pubkey-bnoordhuis)
* **Bert Belder** ([@piscisaureus](https://github.com/piscisaureus)) * **Bert Belder** ([@piscisaureus](https://github.com/piscisaureus))
...@@ -13,11 +10,10 @@ libuv is currently managed by the following individuals: ...@@ -13,11 +10,10 @@ libuv is currently managed by the following individuals:
- GPG key: 5735 3E0D BDAA A7E8 39B6 6A1A FF47 D5E4 AD8B 4FDC (pubkey-cjihrig-kb) - GPG key: 5735 3E0D BDAA A7E8 39B6 6A1A FF47 D5E4 AD8B 4FDC (pubkey-cjihrig-kb)
* **Fedor Indutny** ([@indutny](https://github.com/indutny)) * **Fedor Indutny** ([@indutny](https://github.com/indutny))
- GPG key: AF2E EA41 EC34 47BF DD86 FED9 D706 3CCE 19B7 E890 (pubkey-indutny) - GPG key: AF2E EA41 EC34 47BF DD86 FED9 D706 3CCE 19B7 E890 (pubkey-indutny)
* **Imran Iqbal** ([@imran-iq](https://github.com/imran-iq))
- GPG key: 9DFE AA5F 481B BF77 2D90 03CE D592 4925 2F8E C41A (pubkey-iwuzhere)
* **Jameson Nash** ([@vtjnash](https://github.com/vtjnash)) * **Jameson Nash** ([@vtjnash](https://github.com/vtjnash))
- GPG key: AEAD 0A4B 6867 6775 1A0E 4AEF 34A2 5FB1 2824 6514 (pubkey-vtjnash) - GPG key: AEAD 0A4B 6867 6775 1A0E 4AEF 34A2 5FB1 2824 6514 (pubkey-vtjnash)
* **John Barboza** ([@jbarz](https://github.com/jbarz)) - GPG key: CFBB 9CA9 A5BE AFD7 0E2B 3C5A 79A6 7C55 A367 9C8B (pubkey2022-vtjnash)
* **Jiawen Geng** ([@gengjiawen](https://github.com/gengjiawen))
* **Kaoru Takanashi** ([@erw7](https://github.com/erw7)) * **Kaoru Takanashi** ([@erw7](https://github.com/erw7))
- GPG Key: 5804 F999 8A92 2AFB A398 47A0 7183 5090 6134 887F (pubkey-erw7) - GPG Key: 5804 F999 8A92 2AFB A398 47A0 7183 5090 6134 887F (pubkey-erw7)
* **Richard Lau** ([@richardlau](https://github.com/richardlau)) * **Richard Lau** ([@richardlau](https://github.com/richardlau))
...@@ -27,6 +23,13 @@ libuv is currently managed by the following individuals: ...@@ -27,6 +23,13 @@ libuv is currently managed by the following individuals:
* **Saúl Ibarra Corretgé** ([@saghul](https://github.com/saghul)) * **Saúl Ibarra Corretgé** ([@saghul](https://github.com/saghul))
- GPG key: FDF5 1936 4458 319F A823 3DC9 410E 5553 AE9B C059 (pubkey-saghul) - GPG key: FDF5 1936 4458 319F A823 3DC9 410E 5553 AE9B C059 (pubkey-saghul)
## Project Maintainers emeriti
* **Anna Henningsen** ([@addaleax](https://github.com/addaleax))
* **Bartosz Sosnowski** ([@bzoz](https://github.com/bzoz))
* **Imran Iqbal** ([@imran-iq](https://github.com/imran-iq))
* **John Barboza** ([@jbarz](https://github.com/jbarz))
## Storing a maintainer key in Git ## Storing a maintainer key in Git
It's quite handy to store a maintainer's signature as a git blob, and have It's quite handy to store a maintainer's signature as a git blob, and have
......
...@@ -27,8 +27,8 @@ uvinclude_HEADERS = include/uv/errno.h \ ...@@ -27,8 +27,8 @@ uvinclude_HEADERS = include/uv/errno.h \
CLEANFILES = CLEANFILES =
lib_LTLIBRARIES = libuv.la lib_LTLIBRARIES = libuv.la
libuv_la_CFLAGS = @CFLAGS@ libuv_la_CFLAGS = $(AM_CFLAGS)
libuv_la_LDFLAGS = -no-undefined -version-info 1:0:0 libuv_la_LDFLAGS = $(AM_LDFLAGS) -no-undefined -version-info 1:0:0
libuv_la_SOURCES = src/fs-poll.c \ libuv_la_SOURCES = src/fs-poll.c \
src/heap-inl.h \ src/heap-inl.h \
src/idna.c \ src/idna.c \
...@@ -43,7 +43,9 @@ libuv_la_SOURCES = src/fs-poll.c \ ...@@ -43,7 +43,9 @@ libuv_la_SOURCES = src/fs-poll.c \
src/uv-data-getter-setters.c \ src/uv-data-getter-setters.c \
src/uv-common.c \ src/uv-common.c \
src/uv-common.h \ src/uv-common.h \
src/version.c src/version.c \
src/strtok.c \
src/strtok.h
if SUNOS if SUNOS
# Can't be turned into a CC_CHECK_CFLAGS in configure.ac, it makes compilers # Can't be turned into a CC_CHECK_CFLAGS in configure.ac, it makes compilers
...@@ -131,7 +133,7 @@ EXTRA_DIST = test/fixtures/empty_file \ ...@@ -131,7 +133,7 @@ EXTRA_DIST = test/fixtures/empty_file \
TESTS = test/run-tests TESTS = test/run-tests
check_PROGRAMS = test/run-tests check_PROGRAMS = test/run-tests
test_run_tests_CFLAGS = test_run_tests_CFLAGS = $(AM_CFLAGS)
if SUNOS if SUNOS
# Can't be turned into a CC_CHECK_CFLAGS in configure.ac, it makes compilers # Can't be turned into a CC_CHECK_CFLAGS in configure.ac, it makes compilers
...@@ -139,9 +141,8 @@ if SUNOS ...@@ -139,9 +141,8 @@ if SUNOS
test_run_tests_CFLAGS += -pthreads test_run_tests_CFLAGS += -pthreads
endif endif
test_run_tests_LDFLAGS = test_run_tests_LDFLAGS = $(AM_LDFLAGS)
test_run_tests_SOURCES = test/blackhole-server.c \ test_run_tests_SOURCES = test/blackhole-server.c \
test/dns-server.c \
test/echo-server.c \ test/echo-server.c \
test/run-tests.c \ test/run-tests.c \
test/runner.c \ test/runner.c \
...@@ -151,7 +152,6 @@ test_run_tests_SOURCES = test/blackhole-server.c \ ...@@ -151,7 +152,6 @@ test_run_tests_SOURCES = test/blackhole-server.c \
test/test-async.c \ test/test-async.c \
test/test-async-null-cb.c \ test/test-async-null-cb.c \
test/test-barrier.c \ test/test-barrier.c \
test/test-callback-order.c \
test/test-callback-stack.c \ test/test-callback-stack.c \
test/test-close-fd.c \ test/test-close-fd.c \
test/test-close-order.c \ test/test-close-order.c \
...@@ -193,6 +193,7 @@ test_run_tests_SOURCES = test/blackhole-server.c \ ...@@ -193,6 +193,7 @@ test_run_tests_SOURCES = test/blackhole-server.c \
test/test-idna.c \ test/test-idna.c \
test/test-ip4-addr.c \ test/test-ip4-addr.c \
test/test-ip6-addr.c \ test/test-ip6-addr.c \
test/test-ip-name.c \
test/test-ipc-heavy-traffic-deadlock-bug.c \ test/test-ipc-heavy-traffic-deadlock-bug.c \
test/test-ipc-send-recv.c \ test/test-ipc-send-recv.c \
test/test-ipc.c \ test/test-ipc.c \
...@@ -207,7 +208,6 @@ test_run_tests_SOURCES = test/blackhole-server.c \ ...@@ -207,7 +208,6 @@ test_run_tests_SOURCES = test/blackhole-server.c \
test/test-multiple-listen.c \ test/test-multiple-listen.c \
test/test-mutexes.c \ test/test-mutexes.c \
test/test-not-readable-nor-writable-on-read-error.c \ test/test-not-readable-nor-writable-on-read-error.c \
test/test-not-readable-on-eof.c \
test/test-not-writable-after-shutdown.c \ test/test-not-writable-after-shutdown.c \
test/test-osx-select.c \ test/test-osx-select.c \
test/test-pass-always.c \ test/test-pass-always.c \
...@@ -235,6 +235,7 @@ test_run_tests_SOURCES = test/blackhole-server.c \ ...@@ -235,6 +235,7 @@ test_run_tests_SOURCES = test/blackhole-server.c \
test/test-process-title-threadsafe.c \ test/test-process-title-threadsafe.c \
test/test-queue-foreach-delete.c \ test/test-queue-foreach-delete.c \
test/test-random.c \ test/test-random.c \
test/test-readable-on-eof.c \
test/test-ref.c \ test/test-ref.c \
test/test-run-nowait.c \ test/test-run-nowait.c \
test/test-run-once.c \ test/test-run-once.c \
...@@ -250,11 +251,13 @@ test_run_tests_SOURCES = test/blackhole-server.c \ ...@@ -250,11 +251,13 @@ test_run_tests_SOURCES = test/blackhole-server.c \
test/test-spawn.c \ test/test-spawn.c \
test/test-stdio-over-pipes.c \ test/test-stdio-over-pipes.c \
test/test-strscpy.c \ test/test-strscpy.c \
test/test-strtok.c \
test/test-tcp-alloc-cb-fail.c \ test/test-tcp-alloc-cb-fail.c \
test/test-tcp-bind-error.c \ test/test-tcp-bind-error.c \
test/test-tcp-bind6-error.c \ test/test-tcp-bind6-error.c \
test/test-tcp-close-accept.c \ test/test-tcp-close-accept.c \
test/test-tcp-close-while-connecting.c \ test/test-tcp-close-while-connecting.c \
test/test-tcp-close-after-read-timeout.c \
test/test-tcp-close.c \ test/test-tcp-close.c \
test/test-tcp-close-reset.c \ test/test-tcp-close-reset.c \
test/test-tcp-create-socket-early.c \ test/test-tcp-create-socket-early.c \
...@@ -266,6 +269,7 @@ test_run_tests_SOURCES = test/blackhole-server.c \ ...@@ -266,6 +269,7 @@ test_run_tests_SOURCES = test/blackhole-server.c \
test/test-tcp-open.c \ test/test-tcp-open.c \
test/test-tcp-read-stop.c \ test/test-tcp-read-stop.c \
test/test-tcp-read-stop-start.c \ test/test-tcp-read-stop-start.c \
test/test-tcp-rst.c \
test/test-tcp-shutdown-after-write.c \ test/test-tcp-shutdown-after-write.c \
test/test-tcp-unexpected-read.c \ test/test-tcp-unexpected-read.c \
test/test-tcp-oob.c \ test/test-tcp-oob.c \
...@@ -291,6 +295,7 @@ test_run_tests_SOURCES = test/blackhole-server.c \ ...@@ -291,6 +295,7 @@ test_run_tests_SOURCES = test/blackhole-server.c \
test/test-udp-alloc-cb-fail.c \ test/test-udp-alloc-cb-fail.c \
test/test-udp-bind.c \ test/test-udp-bind.c \
test/test-udp-connect.c \ test/test-udp-connect.c \
test/test-udp-connect6.c \
test/test-udp-create-socket-early.c \ test/test-udp-create-socket-early.c \
test/test-udp-dgram-too-big.c \ test/test-udp-dgram-too-big.c \
test/test-udp-ipv6.c \ test/test-udp-ipv6.c \
...@@ -387,13 +392,8 @@ libuv_la_SOURCES += src/unix/aix-common.c \ ...@@ -387,13 +392,8 @@ libuv_la_SOURCES += src/unix/aix-common.c \
endif endif
if ANDROID if ANDROID
uvinclude_HEADERS += include/uv/android-ifaddrs.h
libuv_la_CFLAGS += -D_GNU_SOURCE libuv_la_CFLAGS += -D_GNU_SOURCE
libuv_la_SOURCES += src/unix/android-ifaddrs.c \ libuv_la_SOURCES += src/unix/pthread-fixes.c
src/unix/pthread-fixes.c \
src/unix/random-getrandom.c \
src/unix/random-sysctl-linux.c \
src/unix/epoll.c
endif endif
if CYGWIN if CYGWIN
...@@ -459,9 +459,16 @@ endif ...@@ -459,9 +459,16 @@ endif
if HURD if HURD
uvinclude_HEADERS += include/uv/posix.h uvinclude_HEADERS += include/uv/posix.h
libuv_la_SOURCES += src/unix/no-fsevents.c \ libuv_la_SOURCES += src/unix/bsd-ifaddrs.c \
src/unix/no-fsevents.c \
src/unix/no-proctitle.c \
src/unix/posix-hrtime.c \ src/unix/posix-hrtime.c \
src/unix/posix-poll.c src/unix/posix-poll.c \
src/unix/hurd.c
endif
if KFREEBSD
libuv_la_CFLAGS += -D_GNU_SOURCE
endif endif
if LINUX if LINUX
......
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
libuv is a multi-platform support library with a focus on asynchronous I/O. It libuv is a multi-platform support library with a focus on asynchronous I/O. It
was primarily developed for use by [Node.js][], but it's also was primarily developed for use by [Node.js][], but it's also
used by [Luvit](http://luvit.io/), [Julia](http://julialang.org/), used by [Luvit](http://luvit.io/), [Julia](http://julialang.org/),
[pyuv](https://github.com/saghul/pyuv), and [others](https://github.com/libuv/libuv/blob/v1.x/LINKS.md). [uvloop](https://github.com/MagicStack/uvloop), and [others](https://github.com/libuv/libuv/blob/v1.x/LINKS.md).
## Feature highlights ## Feature highlights
......
...@@ -3,15 +3,14 @@ ...@@ -3,15 +3,14 @@
| System | Support type | Supported versions | Notes | | System | Support type | Supported versions | Notes |
|---|---|---|---| |---|---|---|---|
| GNU/Linux | Tier 1 | Linux >= 2.6.32 with glibc >= 2.12 | | | GNU/Linux | Tier 1 | Linux >= 2.6.32 with glibc >= 2.12 | |
| macOS | Tier 1 | macOS >= 10.7 | | | macOS | Tier 1 | macOS >= 10.15 | Current and previous macOS release |
| Windows | Tier 1 | >= Windows 8 | VS 2015 and later are supported | | Windows | Tier 1 | >= Windows 8 | VS 2015 and later are supported |
| FreeBSD | Tier 1 | >= 10 | | | FreeBSD | Tier 1 | >= 10 | |
| AIX | Tier 2 | >= 6 | Maintainers: @libuv/aix | | AIX | Tier 2 | >= 6 | Maintainers: @libuv/aix |
| IBM i | Tier 2 | >= IBM i 7.2 | Maintainers: @libuv/ibmi | | IBM i | Tier 2 | >= IBM i 7.2 | Maintainers: @libuv/ibmi |
| z/OS | Tier 2 | >= V2R2 | Maintainers: @libuv/zos | | z/OS | Tier 2 | >= V2R2 | Maintainers: @libuv/zos |
| Linux with musl | Tier 2 | musl >= 1.0 | | | Linux with musl | Tier 2 | musl >= 1.0 | |
| SmartOS | Tier 2 | >= 14.4 | Maintainers: @libuv/smartos | | Android | Tier 3 | NDK >= r15b | Android 7.0, `-DANDROID_PLATFORM=android-24` |
| Android | Tier 3 | NDK >= r15b | |
| MinGW | Tier 3 | MinGW32 and MinGW-w64 | | | MinGW | Tier 3 | MinGW32 and MinGW-w64 | |
| SunOS | Tier 3 | Solaris 121 and later | | | SunOS | Tier 3 | Solaris 121 and later | |
| Other | Tier 3 | N/A | | | Other | Tier 3 | N/A | |
......
...@@ -14,9 +14,16 @@ ...@@ -14,9 +14,16 @@
# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
set -eu
cd `dirname "$0"` cd `dirname "$0"`
if [ "$LIBTOOLIZE" = "" ] && [ "`uname`" = "Darwin" ]; then if [ "${1:-dev}" == "release" ]; then
export LIBUV_RELEASE=true
else
export LIBUV_RELEASE=false
fi
if [ "${LIBTOOLIZE:-}" = "" ] && [ "`uname`" = "Darwin" ]; then
LIBTOOLIZE=glibtoolize LIBTOOLIZE=glibtoolize
fi fi
...@@ -25,9 +32,17 @@ AUTOCONF=${AUTOCONF:-autoconf} ...@@ -25,9 +32,17 @@ AUTOCONF=${AUTOCONF:-autoconf}
AUTOMAKE=${AUTOMAKE:-automake} AUTOMAKE=${AUTOMAKE:-automake}
LIBTOOLIZE=${LIBTOOLIZE:-libtoolize} LIBTOOLIZE=${LIBTOOLIZE:-libtoolize}
aclocal_version=`"$ACLOCAL" --version | head -n 1 | sed 's/[^.0-9]//g'`
autoconf_version=`"$AUTOCONF" --version | head -n 1 | sed 's/[^.0-9]//g'`
automake_version=`"$AUTOMAKE" --version | head -n 1 | sed 's/[^.0-9]//g'` automake_version=`"$AUTOMAKE" --version | head -n 1 | sed 's/[^.0-9]//g'`
automake_version_major=`echo "$automake_version" | cut -d. -f1` automake_version_major=`echo "$automake_version" | cut -d. -f1`
automake_version_minor=`echo "$automake_version" | cut -d. -f2` automake_version_minor=`echo "$automake_version" | cut -d. -f2`
libtoolize_version=`"$LIBTOOLIZE" --version | head -n 1 | sed 's/[^.0-9]//g'`
if [ $aclocal_version != $automake_version ]; then
echo "FATAL: aclocal version appears not to be from the same as automake"
exit 1
fi
UV_EXTRA_AUTOMAKE_FLAGS= UV_EXTRA_AUTOMAKE_FLAGS=
if test "$automake_version_major" -gt 1 || \ if test "$automake_version_major" -gt 1 || \
...@@ -39,8 +54,22 @@ fi ...@@ -39,8 +54,22 @@ fi
echo "m4_define([UV_EXTRA_AUTOMAKE_FLAGS], [$UV_EXTRA_AUTOMAKE_FLAGS])" \ echo "m4_define([UV_EXTRA_AUTOMAKE_FLAGS], [$UV_EXTRA_AUTOMAKE_FLAGS])" \
> m4/libuv-extra-automake-flags.m4 > m4/libuv-extra-automake-flags.m4
set -ex (set -x
"$LIBTOOLIZE" --copy "$LIBTOOLIZE" --copy --force
"$ACLOCAL" -I m4 "$ACLOCAL" -I m4
)
if $LIBUV_RELEASE; then
"$AUTOCONF" -o /dev/null m4/libuv-check-versions.m4
echo "
AC_PREREQ($autoconf_version)
AC_INIT([libuv-release-check], [0.0])
AM_INIT_AUTOMAKE([$automake_version])
LT_PREREQ($libtoolize_version)
AC_OUTPUT
" > m4/libuv-check-versions.m4
fi
(
set -x
"$AUTOCONF" "$AUTOCONF"
"$AUTOMAKE" --add-missing --copy "$AUTOMAKE" --add-missing --copy
)
#! /bin/sh #! /bin/sh
# Attempt to guess a canonical system name. # Attempt to guess a canonical system name.
# Copyright 1992-2021 Free Software Foundation, Inc. # Copyright 1992-2022 Free Software Foundation, Inc.
# shellcheck disable=SC2006,SC2268 # see below for rationale # shellcheck disable=SC2006,SC2268 # see below for rationale
timestamp='2021-06-03' timestamp='2022-09-17'
# This file is free software; you can redistribute it and/or modify it # This file is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by # under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or # the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version. # (at your option) any later version.
# #
# This program is distributed in the hope that it will be useful, but # This program is distributed in the hope that it will be useful, but
...@@ -60,7 +60,7 @@ version="\ ...@@ -60,7 +60,7 @@ version="\
GNU config.guess ($timestamp) GNU config.guess ($timestamp)
Originally written by Per Bothner. Originally written by Per Bothner.
Copyright 1992-2021 Free Software Foundation, Inc. Copyright 1992-2022 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
...@@ -437,7 +437,7 @@ case $UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION in ...@@ -437,7 +437,7 @@ case $UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION in
# This test works for both compilers. # This test works for both compilers.
if test "$CC_FOR_BUILD" != no_compiler_found; then if test "$CC_FOR_BUILD" != no_compiler_found; then
if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \
(CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ (CCOPTS="" $CC_FOR_BUILD -m64 -E - 2>/dev/null) | \
grep IS_64BIT_ARCH >/dev/null grep IS_64BIT_ARCH >/dev/null
then then
SUN_ARCH=x86_64 SUN_ARCH=x86_64
...@@ -929,6 +929,9 @@ EOF ...@@ -929,6 +929,9 @@ EOF
i*:PW*:*) i*:PW*:*)
GUESS=$UNAME_MACHINE-pc-pw32 GUESS=$UNAME_MACHINE-pc-pw32
;; ;;
*:SerenityOS:*:*)
GUESS=$UNAME_MACHINE-pc-serenity
;;
*:Interix*:*) *:Interix*:*)
case $UNAME_MACHINE in case $UNAME_MACHINE in
x86) x86)
...@@ -963,6 +966,12 @@ EOF ...@@ -963,6 +966,12 @@ EOF
GNU_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` GNU_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'`
GUESS=$UNAME_MACHINE-unknown-$GNU_SYS$GNU_REL-$LIBC GUESS=$UNAME_MACHINE-unknown-$GNU_SYS$GNU_REL-$LIBC
;; ;;
x86_64:[Mm]anagarm:*:*|i?86:[Mm]anagarm:*:*)
GUESS="$UNAME_MACHINE-pc-managarm-mlibc"
;;
*:[Mm]anagarm:*:*)
GUESS="$UNAME_MACHINE-unknown-managarm-mlibc"
;;
*:Minix:*:*) *:Minix:*:*)
GUESS=$UNAME_MACHINE-unknown-minix GUESS=$UNAME_MACHINE-unknown-minix
;; ;;
...@@ -1033,7 +1042,7 @@ EOF ...@@ -1033,7 +1042,7 @@ EOF
k1om:Linux:*:*) k1om:Linux:*:*)
GUESS=$UNAME_MACHINE-unknown-linux-$LIBC GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
;; ;;
loongarch32:Linux:*:* | loongarch64:Linux:*:* | loongarchx32:Linux:*:*) loongarch32:Linux:*:* | loongarch64:Linux:*:*)
GUESS=$UNAME_MACHINE-unknown-linux-$LIBC GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
;; ;;
m32r*:Linux:*:*) m32r*:Linux:*:*)
...@@ -1148,16 +1157,27 @@ EOF ...@@ -1148,16 +1157,27 @@ EOF
;; ;;
x86_64:Linux:*:*) x86_64:Linux:*:*)
set_cc_for_build set_cc_for_build
CPU=$UNAME_MACHINE
LIBCABI=$LIBC LIBCABI=$LIBC
if test "$CC_FOR_BUILD" != no_compiler_found; then if test "$CC_FOR_BUILD" != no_compiler_found; then
if (echo '#ifdef __ILP32__'; echo IS_X32; echo '#endif') | \ ABI=64
(CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ sed 's/^ //' << EOF > "$dummy.c"
grep IS_X32 >/dev/null #ifdef __i386__
then ABI=x86
LIBCABI=${LIBC}x32 #else
fi #ifdef __ILP32__
ABI=x32
#endif
#endif
EOF
cc_set_abi=`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^ABI' | sed 's, ,,g'`
eval "$cc_set_abi"
case $ABI in
x86) CPU=i686 ;;
x32) LIBCABI=${LIBC}x32 ;;
esac
fi fi
GUESS=$UNAME_MACHINE-pc-linux-$LIBCABI GUESS=$CPU-pc-linux-$LIBCABI
;; ;;
xtensa*:Linux:*:*) xtensa*:Linux:*:*)
GUESS=$UNAME_MACHINE-unknown-linux-$LIBC GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
...@@ -1364,8 +1384,11 @@ EOF ...@@ -1364,8 +1384,11 @@ EOF
BePC:Haiku:*:*) # Haiku running on Intel PC compatible. BePC:Haiku:*:*) # Haiku running on Intel PC compatible.
GUESS=i586-pc-haiku GUESS=i586-pc-haiku
;; ;;
x86_64:Haiku:*:*) ppc:Haiku:*:*) # Haiku running on Apple PowerPC
GUESS=x86_64-unknown-haiku GUESS=powerpc-apple-haiku
;;
*:Haiku:*:*) # Haiku modern gcc (not bound by BeOS compat)
GUESS=$UNAME_MACHINE-unknown-haiku
;; ;;
SX-4:SUPER-UX:*:*) SX-4:SUPER-UX:*:*)
GUESS=sx4-nec-superux$UNAME_RELEASE GUESS=sx4-nec-superux$UNAME_RELEASE
...@@ -1522,6 +1545,9 @@ EOF ...@@ -1522,6 +1545,9 @@ EOF
i*86:rdos:*:*) i*86:rdos:*:*)
GUESS=$UNAME_MACHINE-pc-rdos GUESS=$UNAME_MACHINE-pc-rdos
;; ;;
i*86:Fiwix:*:*)
GUESS=$UNAME_MACHINE-pc-fiwix
;;
*:AROS:*:*) *:AROS:*:*)
GUESS=$UNAME_MACHINE-unknown-aros GUESS=$UNAME_MACHINE-unknown-aros
;; ;;
......
...@@ -13,7 +13,7 @@ ...@@ -13,7 +13,7 @@
# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
AC_PREREQ(2.57) AC_PREREQ(2.57)
AC_INIT([libuv], [1.42.0], [https://github.com/libuv/libuv/issues]) AC_INIT([libuv], [1.44.2], [https://github.com/libuv/libuv/issues])
AC_CONFIG_MACRO_DIR([m4]) AC_CONFIG_MACRO_DIR([m4])
m4_include([m4/libuv-extra-automake-flags.m4]) m4_include([m4/libuv-extra-automake-flags.m4])
m4_include([m4/as_case.m4]) m4_include([m4/as_case.m4])
...@@ -28,7 +28,9 @@ AM_PROG_CC_C_O ...@@ -28,7 +28,9 @@ AM_PROG_CC_C_O
CC_ATTRIBUTE_VISIBILITY([default], [ CC_ATTRIBUTE_VISIBILITY([default], [
CC_FLAG_VISIBILITY([CFLAGS="${CFLAGS} -fvisibility=hidden"]) CC_FLAG_VISIBILITY([CFLAGS="${CFLAGS} -fvisibility=hidden"])
]) ])
CC_CHECK_CFLAGS_APPEND([-fno-strict-aliasing]) # Xlc has a flag "-f<filename>". Need to use CC_CHECK_FLAG_SUPPORTED_APPEND so
# we exclude -fno-strict-aliasing for xlc
CC_CHECK_FLAG_SUPPORTED_APPEND([-fno-strict-aliasing])
CC_CHECK_CFLAGS_APPEND([-g]) CC_CHECK_CFLAGS_APPEND([-g])
CC_CHECK_CFLAGS_APPEND([-std=gnu89]) CC_CHECK_CFLAGS_APPEND([-std=gnu89])
CC_CHECK_CFLAGS_APPEND([-Wall]) CC_CHECK_CFLAGS_APPEND([-Wall])
...@@ -60,6 +62,7 @@ AM_CONDITIONAL([CYGWIN], [AS_CASE([$host_os],[cygwin*], [true], [false]) ...@@ -60,6 +62,7 @@ AM_CONDITIONAL([CYGWIN], [AS_CASE([$host_os],[cygwin*], [true], [false])
AM_CONDITIONAL([DARWIN], [AS_CASE([$host_os],[darwin*], [true], [false])]) AM_CONDITIONAL([DARWIN], [AS_CASE([$host_os],[darwin*], [true], [false])])
AM_CONDITIONAL([DRAGONFLY],[AS_CASE([$host_os],[dragonfly*], [true], [false])]) AM_CONDITIONAL([DRAGONFLY],[AS_CASE([$host_os],[dragonfly*], [true], [false])])
AM_CONDITIONAL([FREEBSD], [AS_CASE([$host_os],[*freebsd*], [true], [false])]) AM_CONDITIONAL([FREEBSD], [AS_CASE([$host_os],[*freebsd*], [true], [false])])
AM_CONDITIONAL([KFREEBSD], [AS_CASE([$host_os],[kfreebsd*], [true], [false])])
AM_CONDITIONAL([HAIKU], [AS_CASE([$host_os],[haiku], [true], [false])]) AM_CONDITIONAL([HAIKU], [AS_CASE([$host_os],[haiku], [true], [false])])
AM_CONDITIONAL([HURD], [AS_CASE([$host_os],[gnu*], [true], [false])]) AM_CONDITIONAL([HURD], [AS_CASE([$host_os],[gnu*], [true], [false])])
AM_CONDITIONAL([LINUX], [AS_CASE([$host_os],[linux*], [true], [false])]) AM_CONDITIONAL([LINUX], [AS_CASE([$host_os],[linux*], [true], [false])])
......
...@@ -45,6 +45,8 @@ extern "C" { ...@@ -45,6 +45,8 @@ extern "C" {
# endif # endif
#elif __GNUC__ >= 4 #elif __GNUC__ >= 4
# define UV_EXTERN __attribute__((visibility("default"))) # define UV_EXTERN __attribute__((visibility("default")))
#elif defined(__SUNPRO_C) && (__SUNPRO_C >= 0x550) /* Sun Studio >= 8 */
# define UV_EXTERN __global
#else #else
# define UV_EXTERN /* nothing */ # define UV_EXTERN /* nothing */
#endif #endif
...@@ -1131,8 +1133,8 @@ struct uv_interface_address_s { ...@@ -1131,8 +1133,8 @@ struct uv_interface_address_s {
struct uv_passwd_s { struct uv_passwd_s {
char* username; char* username;
long uid; unsigned long uid;
long gid; unsigned long gid;
char* shell; char* shell;
char* homedir; char* homedir;
}; };
...@@ -1240,6 +1242,7 @@ UV_EXTERN uv_pid_t uv_os_getppid(void); ...@@ -1240,6 +1242,7 @@ UV_EXTERN uv_pid_t uv_os_getppid(void);
UV_EXTERN int uv_os_getpriority(uv_pid_t pid, int* priority); UV_EXTERN int uv_os_getpriority(uv_pid_t pid, int* priority);
UV_EXTERN int uv_os_setpriority(uv_pid_t pid, int priority); UV_EXTERN int uv_os_setpriority(uv_pid_t pid, int priority);
UV_EXTERN unsigned int uv_available_parallelism(void);
UV_EXTERN int uv_cpu_info(uv_cpu_info_t** cpu_infos, int* count); UV_EXTERN int uv_cpu_info(uv_cpu_info_t** cpu_infos, int* count);
UV_EXTERN void uv_free_cpu_info(uv_cpu_info_t* cpu_infos, int count); UV_EXTERN void uv_free_cpu_info(uv_cpu_info_t* cpu_infos, int count);
...@@ -1658,6 +1661,7 @@ UV_EXTERN int uv_ip6_addr(const char* ip, int port, struct sockaddr_in6* addr); ...@@ -1658,6 +1661,7 @@ UV_EXTERN int uv_ip6_addr(const char* ip, int port, struct sockaddr_in6* addr);
UV_EXTERN int uv_ip4_name(const struct sockaddr_in* src, char* dst, size_t size); UV_EXTERN int uv_ip4_name(const struct sockaddr_in* src, char* dst, size_t size);
UV_EXTERN int uv_ip6_name(const struct sockaddr_in6* src, char* dst, size_t size); UV_EXTERN int uv_ip6_name(const struct sockaddr_in6* src, char* dst, size_t size);
UV_EXTERN int uv_ip_name(const struct sockaddr* src, char* dst, size_t size);
UV_EXTERN int uv_inet_ntop(int af, const void* src, char* dst, size_t size); UV_EXTERN int uv_inet_ntop(int af, const void* src, char* dst, size_t size);
UV_EXTERN int uv_inet_pton(int af, const char* src, void* dst); UV_EXTERN int uv_inet_pton(int af, const char* src, void* dst);
......
/*
* Copyright (c) 1995, 1999
* Berkeley Software Design, Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* THIS SOFTWARE IS PROVIDED BY Berkeley Software Design, Inc. ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL Berkeley Software Design, Inc. BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* BSDI ifaddrs.h,v 2.5 2000/02/23 14:51:59 dab Exp
*/
#ifndef _IFADDRS_H_
#define _IFADDRS_H_
struct ifaddrs {
struct ifaddrs *ifa_next;
char *ifa_name;
unsigned int ifa_flags;
struct sockaddr *ifa_addr;
struct sockaddr *ifa_netmask;
struct sockaddr *ifa_dstaddr;
void *ifa_data;
};
/*
* This may have been defined in <net/if.h>. Note that if <net/if.h> is
* to be included it must be included before this header file.
*/
#ifndef ifa_broadaddr
#define ifa_broadaddr ifa_dstaddr /* broadcast address interface */
#endif
#include <sys/cdefs.h>
__BEGIN_DECLS
extern int getifaddrs(struct ifaddrs **ifap);
extern void freeifaddrs(struct ifaddrs *ifa);
__END_DECLS
#endif
...@@ -65,12 +65,10 @@ ...@@ -65,12 +65,10 @@
# include "uv/bsd.h" # include "uv/bsd.h"
#elif defined(__CYGWIN__) || \ #elif defined(__CYGWIN__) || \
defined(__MSYS__) || \ defined(__MSYS__) || \
defined(__HAIKU__) || \
defined(__QNX__) || \
defined(__GNU__) defined(__GNU__)
# include "uv/posix.h" # include "uv/posix.h"
#elif defined(__HAIKU__)
# include "uv/posix.h"
#elif defined(__QNX__)
# include "uv/posix.h"
#endif #endif
#ifndef NI_MAXHOST #ifndef NI_MAXHOST
......
...@@ -31,8 +31,8 @@ ...@@ -31,8 +31,8 @@
*/ */
#define UV_VERSION_MAJOR 1 #define UV_VERSION_MAJOR 1
#define UV_VERSION_MINOR 42 #define UV_VERSION_MINOR 44
#define UV_VERSION_PATCH 0 #define UV_VERSION_PATCH 2
#define UV_VERSION_IS_RELEASE 1 #define UV_VERSION_IS_RELEASE 1
#define UV_VERSION_SUFFIX "" #define UV_VERSION_SUFFIX ""
......
...@@ -45,7 +45,14 @@ typedef struct pollfd { ...@@ -45,7 +45,14 @@ typedef struct pollfd {
#endif #endif
#include <mswsock.h> #include <mswsock.h>
// Disable the typedef in mstcpip.h of MinGW.
#define _TCP_INITIAL_RTO_PARAMETERS _TCP_INITIAL_RTO_PARAMETERS__AVOID
#define TCP_INITIAL_RTO_PARAMETERS TCP_INITIAL_RTO_PARAMETERS__AVOID
#define PTCP_INITIAL_RTO_PARAMETERS PTCP_INITIAL_RTO_PARAMETERS__AVOID
#include <ws2tcpip.h> #include <ws2tcpip.h>
#undef _TCP_INITIAL_RTO_PARAMETERS
#undef TCP_INITIAL_RTO_PARAMETERS
#undef PTCP_INITIAL_RTO_PARAMETERS
#include <windows.h> #include <windows.h>
#include <process.h> #include <process.h>
...@@ -216,7 +223,7 @@ typedef struct _AFD_POLL_INFO { ...@@ -216,7 +223,7 @@ typedef struct _AFD_POLL_INFO {
AFD_POLL_HANDLE_INFO Handles[1]; AFD_POLL_HANDLE_INFO Handles[1];
} AFD_POLL_INFO, *PAFD_POLL_INFO; } AFD_POLL_INFO, *PAFD_POLL_INFO;
#define UV_MSAFD_PROVIDER_COUNT 3 #define UV_MSAFD_PROVIDER_COUNT 4
/** /**
...@@ -256,21 +263,14 @@ typedef union { ...@@ -256,21 +263,14 @@ typedef union {
} unused_; /* TODO: retained for ABI compatibility; remove me in v2.x. */ } unused_; /* TODO: retained for ABI compatibility; remove me in v2.x. */
} uv_cond_t; } uv_cond_t;
typedef union { typedef struct {
struct { SRWLOCK read_write_lock_;
unsigned int num_readers_; /* TODO: retained for ABI compatibility; remove me in v2.x */
CRITICAL_SECTION num_readers_lock_; #ifdef _WIN64
HANDLE write_semaphore_; unsigned char padding_[72];
} state_; #else
/* TODO: remove me in v2.x. */ unsigned char padding_[44];
struct { #endif
SRWLOCK unused_;
} unused1_;
/* TODO: remove me in v2.x. */
struct {
uv_mutex_t unused1_;
uv_mutex_t unused2_;
} unused2_;
} uv_rwlock_t; } uv_rwlock_t;
typedef struct { typedef struct {
...@@ -377,6 +377,12 @@ typedef struct { ...@@ -377,6 +377,12 @@ typedef struct {
OVERLAPPED overlapped; \ OVERLAPPED overlapped; \
size_t queued_bytes; \ size_t queued_bytes; \
} io; \ } io; \
/* in v2, we can move these to the UV_CONNECT_PRIVATE_FIELDS */ \
struct { \
ULONG_PTR result; /* overlapped.Internal is reused to hold the result */\
HANDLE pipeHandle; \
DWORD duplex_flags; \
} connect; \
} u; \ } u; \
struct uv_req_s* next_req; struct uv_req_s* next_req;
......
dnl Macros to check the presence of generic (non-typed) symbols. dnl Macros to check the presence of generic (non-typed) symbols.
dnl Copyright (c) 2006-2008 Diego Pettenò <flameeyes gmail com> dnl Copyright (c) 2006-2008 Diego Pettenò <flameeyes gmail com>
dnl Copyright (c) 2006-2008 xine project dnl Copyright (c) 2006-2008 xine project
dnl Copyright (c) 2021 libuv project
dnl dnl
dnl This program is free software; you can redistribute it and/or modify dnl This program is free software; you can redistribute it and/or modify
dnl it under the terms of the GNU General Public License as published by dnl it under the terms of the GNU General Public License as published by
...@@ -63,7 +64,7 @@ AC_DEFUN([CC_CHECK_CFLAGS], [ ...@@ -63,7 +64,7 @@ AC_DEFUN([CC_CHECK_CFLAGS], [
]) ])
dnl CC_CHECK_CFLAG_APPEND(FLAG, [action-if-found], [action-if-not-found]) dnl CC_CHECK_CFLAG_APPEND(FLAG, [action-if-found], [action-if-not-found])
dnl Check for CFLAG and appends them to CFLAGS if supported dnl Check for CFLAG and appends them to AM_CFLAGS if supported
AC_DEFUN([CC_CHECK_CFLAG_APPEND], [ AC_DEFUN([CC_CHECK_CFLAG_APPEND], [
AC_CACHE_CHECK([if $CC supports $1 flag], AC_CACHE_CHECK([if $CC supports $1 flag],
AS_TR_SH([cc_cv_cflags_$1]), AS_TR_SH([cc_cv_cflags_$1]),
...@@ -71,7 +72,9 @@ AC_DEFUN([CC_CHECK_CFLAG_APPEND], [ ...@@ -71,7 +72,9 @@ AC_DEFUN([CC_CHECK_CFLAG_APPEND], [
) )
AS_IF([eval test x$]AS_TR_SH([cc_cv_cflags_$1])[ = xyes], AS_IF([eval test x$]AS_TR_SH([cc_cv_cflags_$1])[ = xyes],
[CFLAGS="$CFLAGS $1"; DEBUG_CFLAGS="$DEBUG_CFLAGS $1"; $2], [$3]) [AM_CFLAGS="$AM_CFLAGS $1"; DEBUG_CFLAGS="$DEBUG_CFLAGS $1"; $2], [$3])
AC_SUBST([AM_CFLAGS])
]) ])
dnl CC_CHECK_CFLAGS_APPEND([FLAG1 FLAG2], [action-if-found], [action-if-not]) dnl CC_CHECK_CFLAGS_APPEND([FLAG1 FLAG2], [action-if-found], [action-if-not])
...@@ -101,6 +104,20 @@ AC_DEFUN([CC_CHECK_LDFLAGS], [ ...@@ -101,6 +104,20 @@ AC_DEFUN([CC_CHECK_LDFLAGS], [
[$2], [$3]) [$2], [$3])
]) ])
dnl Check if flag is supported by both compiler and linker
dnl If so, append it to AM_CFLAGS
dnl CC_CHECK_FLAG_SUPPORTED_APPEND([FLAG])
AC_DEFUN([CC_CHECK_FLAG_SUPPORTED_APPEND], [
CC_CHECK_CFLAGS([$1],
[CC_CHECK_LDFLAGS([$1],
[AM_CFLAGS="$AM_CFLAGS $1";
DEBUG_CFLAGS="$DEBUG_CFLAGS $1";
AC_SUBST([AM_CFLAGS])
])
])
])
dnl define the LDFLAGS_NOUNDEFINED variable with the correct value for dnl define the LDFLAGS_NOUNDEFINED variable with the correct value for
dnl the current linker to avoid undefined references in a shared object. dnl the current linker to avoid undefined references in a shared object.
AC_DEFUN([CC_NOUNDEFINED], [ AC_DEFUN([CC_NOUNDEFINED], [
......
AC_PREREQ(2.71)
AC_INIT([libuv-release-check], [0.0])
AM_INIT_AUTOMAKE([1.16.5])
LT_PREREQ(2.4.7)
AC_OUTPUT
...@@ -25,7 +25,7 @@ ...@@ -25,7 +25,7 @@
#ifdef _WIN32 #ifdef _WIN32
#include "win/internal.h" #include "win/internal.h"
#include "win/handle-inl.h" #include "win/handle-inl.h"
#define uv__make_close_pending(h) uv_want_endgame((h)->loop, (h)) #define uv__make_close_pending(h) uv__want_endgame((h)->loop, (h))
#else #else
#include "unix/internal.h" #include "unix/internal.h"
#endif #endif
......
...@@ -21,6 +21,7 @@ ...@@ -21,6 +21,7 @@
#include "idna.h" #include "idna.h"
#include <assert.h> #include <assert.h>
#include <string.h> #include <string.h>
#include <limits.h> /* UINT_MAX */
static unsigned uv__utf8_decode1_slow(const char** p, static unsigned uv__utf8_decode1_slow(const char** p,
const char* pe, const char* pe,
...@@ -129,7 +130,7 @@ static int uv__idna_toascii_label(const char* s, const char* se, ...@@ -129,7 +130,7 @@ static int uv__idna_toascii_label(const char* s, const char* se,
while (s < se) { while (s < se) {
c = uv__utf8_decode1(&s, se); c = uv__utf8_decode1(&s, se);
if (c == -1u) if (c == UINT_MAX)
return UV_EINVAL; return UV_EINVAL;
if (c < 128) if (c < 128)
...@@ -151,7 +152,7 @@ static int uv__idna_toascii_label(const char* s, const char* se, ...@@ -151,7 +152,7 @@ static int uv__idna_toascii_label(const char* s, const char* se,
s = ss; s = ss;
while (s < se) { while (s < se) {
c = uv__utf8_decode1(&s, se); c = uv__utf8_decode1(&s, se);
assert(c != -1u); assert(c != UINT_MAX);
if (c > 127) if (c > 127)
continue; continue;
...@@ -182,7 +183,7 @@ static int uv__idna_toascii_label(const char* s, const char* se, ...@@ -182,7 +183,7 @@ static int uv__idna_toascii_label(const char* s, const char* se,
while (s < se) { while (s < se) {
c = uv__utf8_decode1(&s, se); c = uv__utf8_decode1(&s, se);
assert(c != -1u); assert(c != UINT_MAX);
if (c >= n) if (c >= n)
if (c < m) if (c < m)
...@@ -201,7 +202,7 @@ static int uv__idna_toascii_label(const char* s, const char* se, ...@@ -201,7 +202,7 @@ static int uv__idna_toascii_label(const char* s, const char* se,
s = ss; s = ss;
while (s < se) { while (s < se) {
c = uv__utf8_decode1(&s, se); c = uv__utf8_decode1(&s, se);
assert(c != -1u); assert(c != UINT_MAX);
if (c < n) if (c < n)
if (++delta == 0) if (++delta == 0)
...@@ -280,7 +281,7 @@ long uv__idna_toascii(const char* s, const char* se, char* d, char* de) { ...@@ -280,7 +281,7 @@ long uv__idna_toascii(const char* s, const char* se, char* d, char* de) {
st = si; st = si;
c = uv__utf8_decode1(&si, se); c = uv__utf8_decode1(&si, se);
if (c == -1u) if (c == UINT_MAX)
return UV_EINVAL; return UV_EINVAL;
if (c != '.') if (c != '.')
......
...@@ -28,7 +28,7 @@ ...@@ -28,7 +28,7 @@
*/ */
#include "uv.h" #include "uv.h"
/* Copies up to |n-1| bytes from |d| to |s| and always zero-terminates /* Copies up to |n-1| bytes from |s| to |d| and always zero-terminates
* the result, except when |n==0|. Returns the number of bytes copied * the result, except when |n==0|. Returns the number of bytes copied
* or UV_E2BIG if |d| is too small. * or UV_E2BIG if |d| is too small.
* *
......
/* Copyright libuv project contributors. All rights reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to
* deal in the Software without restriction, including without limitation the
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
* sell copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
* IN THE SOFTWARE.
*/
#include <stdlib.h>
#include "strtok.h"
char* uv__strtok(char* str, const char* sep, char** itr) {
const char* sep_itr;
char* tmp;
char* start;
if (str == NULL)
start = tmp = *itr;
else
start = tmp = str;
if (tmp == NULL)
return NULL;
while (*tmp != '\0') {
sep_itr = sep;
while (*sep_itr != '\0') {
if (*tmp == *sep_itr) {
*itr = tmp + 1;
*tmp = '\0';
return start;
}
sep_itr++;
}
tmp++;
}
*itr = NULL;
return start;
}
/* Copyright libuv project contributors. All rights reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to
* deal in the Software without restriction, including without limitation the
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
* sell copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
* IN THE SOFTWARE.
*/
#ifndef UV_STRTOK_H_
#define UV_STRTOK_H_
char* uv__strtok(char* str, const char* sep, char** itr);
#endif /* UV_STRTOK_H_ */
...@@ -160,13 +160,20 @@ static void post(QUEUE* q, enum uv__work_kind kind) { ...@@ -160,13 +160,20 @@ static void post(QUEUE* q, enum uv__work_kind kind) {
} }
#ifdef __MVS__
/* TODO(itodorov) - zos: revisit when Woz compiler is available. */
__attribute__((destructor))
#endif
void uv__threadpool_cleanup(void) { void uv__threadpool_cleanup(void) {
unsigned int i; unsigned int i;
if (nthreads == 0) if (nthreads == 0)
return; return;
#ifndef __MVS__
/* TODO(gabylb) - zos: revisit when Woz compiler is available. */
post(&exit_message, UV__WORK_CPU); post(&exit_message, UV__WORK_CPU);
#endif
for (i = 0; i < nthreads; i++) for (i = 0; i < nthreads; i++)
if (uv_thread_join(threads + i)) if (uv_thread_join(threads + i))
......
This diff is collapsed.
...@@ -37,12 +37,11 @@ UV_UNUSED(static int cmpxchgi(int* ptr, int oldval, int newval)) { ...@@ -37,12 +37,11 @@ UV_UNUSED(static int cmpxchgi(int* ptr, int oldval, int newval)) {
: "memory"); : "memory");
return out; return out;
#elif defined(__MVS__) #elif defined(__MVS__)
unsigned int op4; /* Use hand-rolled assembly because codegen from builtin __plo_CSST results in
if (__plo_CSST(ptr, (unsigned int*) &oldval, newval, * a runtime bug.
(unsigned int*) ptr, *ptr, &op4)) */
__asm(" cs %0,%2,%1 \n " : "+r"(oldval), "+m"(*ptr) : "r"(newval) :);
return oldval; return oldval;
else
return op4;
#elif defined(__SUNPRO_C) || defined(__SUNPRO_CC) #elif defined(__SUNPRO_C) || defined(__SUNPRO_CC)
return atomic_cas_uint((uint_t *)ptr, (uint_t)oldval, (uint_t)newval); return atomic_cas_uint((uint_t *)ptr, (uint_t)oldval, (uint_t)newval);
#else #else
...@@ -55,7 +54,9 @@ UV_UNUSED(static void cpu_relax(void)) { ...@@ -55,7 +54,9 @@ UV_UNUSED(static void cpu_relax(void)) {
__asm__ __volatile__ ("rep; nop" ::: "memory"); /* a.k.a. PAUSE */ __asm__ __volatile__ ("rep; nop" ::: "memory"); /* a.k.a. PAUSE */
#elif (defined(__arm__) && __ARM_ARCH >= 7) || defined(__aarch64__) #elif (defined(__arm__) && __ARM_ARCH >= 7) || defined(__aarch64__)
__asm__ __volatile__ ("yield" ::: "memory"); __asm__ __volatile__ ("yield" ::: "memory");
#elif defined(__powerpc64__) || defined(__ppc64__) || defined(__PPC64__) #elif (defined(__ppc__) || defined(__ppc64__)) && defined(__APPLE__)
__asm volatile ("" : : : "memory");
#elif !defined(__APPLE__) && (defined(__powerpc64__) || defined(__ppc64__) || defined(__PPC64__))
__asm__ __volatile__ ("or 1,1,1; or 2,2,2" ::: "memory"); __asm__ __volatile__ ("or 1,1,1; or 2,2,2" ::: "memory");
#endif #endif
} }
......
...@@ -27,7 +27,7 @@ ...@@ -27,7 +27,7 @@
#include <ifaddrs.h> #include <ifaddrs.h>
#include <net/if.h> #include <net/if.h>
#if !defined(__CYGWIN__) && !defined(__MSYS__) #if !defined(__CYGWIN__) && !defined(__MSYS__) && !defined(__GNU__)
#include <net/if_dl.h> #include <net/if_dl.h>
#endif #endif
...@@ -40,7 +40,7 @@ static int uv__ifaddr_exclude(struct ifaddrs *ent, int exclude_type) { ...@@ -40,7 +40,7 @@ static int uv__ifaddr_exclude(struct ifaddrs *ent, int exclude_type) {
return 1; return 1;
if (ent->ifa_addr == NULL) if (ent->ifa_addr == NULL)
return 1; return 1;
#if !defined(__CYGWIN__) && !defined(__MSYS__) #if !defined(__CYGWIN__) && !defined(__MSYS__) && !defined(__GNU__)
/* /*
* If `exclude_type` is `UV__EXCLUDE_IFPHYS`, return whether `sa_family` * If `exclude_type` is `UV__EXCLUDE_IFPHYS`, return whether `sa_family`
* equals `AF_LINK`. Otherwise, the result depends on the operating * equals `AF_LINK`. Otherwise, the result depends on the operating
...@@ -69,7 +69,7 @@ int uv_interface_addresses(uv_interface_address_t** addresses, int* count) { ...@@ -69,7 +69,7 @@ int uv_interface_addresses(uv_interface_address_t** addresses, int* count) {
struct ifaddrs* addrs; struct ifaddrs* addrs;
struct ifaddrs* ent; struct ifaddrs* ent;
uv_interface_address_t* address; uv_interface_address_t* address;
#if !(defined(__CYGWIN__) || defined(__MSYS__)) #if !(defined(__CYGWIN__) || defined(__MSYS__)) && !defined(__GNU__)
int i; int i;
#endif #endif
...@@ -126,7 +126,7 @@ int uv_interface_addresses(uv_interface_address_t** addresses, int* count) { ...@@ -126,7 +126,7 @@ int uv_interface_addresses(uv_interface_address_t** addresses, int* count) {
address++; address++;
} }
#if !(defined(__CYGWIN__) || defined(__MSYS__)) #if !(defined(__CYGWIN__) || defined(__MSYS__)) && !defined(__GNU__)
/* Fill in physical addresses for each interface */ /* Fill in physical addresses for each interface */
for (ent = addrs; ent != NULL; ent = ent->ifa_next) { for (ent = addrs; ent != NULL; ent = ent->ifa_next) {
if (uv__ifaddr_exclude(ent, UV__EXCLUDE_IFPHYS)) if (uv__ifaddr_exclude(ent, UV__EXCLUDE_IFPHYS))
......
...@@ -38,9 +38,8 @@ static void init_process_title_mutex_once(void) { ...@@ -38,9 +38,8 @@ static void init_process_title_mutex_once(void) {
void uv__process_title_cleanup(void) { void uv__process_title_cleanup(void) {
/* TODO(bnoordhuis) uv_mutex_destroy(&process_title_mutex) uv_once(&process_title_mutex_once, init_process_title_mutex_once);
* and reset process_title_mutex_once? uv_mutex_destroy(&process_title_mutex);
*/
} }
......
This diff is collapsed.
...@@ -280,14 +280,18 @@ static int uv__get_cpu_speed(uint64_t* speed) { ...@@ -280,14 +280,18 @@ static int uv__get_cpu_speed(uint64_t* speed) {
NULL, NULL,
0); 0);
if (freq_ref) { if (freq_ref) {
uint32_t freq; const UInt8* freq_ref_ptr = pCFDataGetBytePtr(freq_ref);
CFIndex len = pCFDataGetLength(freq_ref); CFIndex len = pCFDataGetLength(freq_ref);
CFRange range; if (len == 8)
range.location = 0; memcpy(speed, freq_ref_ptr, 8);
range.length = len; else if (len == 4) {
uint32_t v;
memcpy(&v, freq_ref_ptr, 4);
*speed = v;
} else {
*speed = 0;
}
pCFDataGetBytes(freq_ref, range, (UInt8*)&freq);
*speed = freq;
pCFRelease(freq_ref); pCFRelease(freq_ref);
pCFRelease(data); pCFRelease(data);
break; break;
......
...@@ -53,7 +53,7 @@ void uv_dlclose(uv_lib_t* lib) { ...@@ -53,7 +53,7 @@ void uv_dlclose(uv_lib_t* lib) {
int uv_dlsym(uv_lib_t* lib, const char* name, void** ptr) { int uv_dlsym(uv_lib_t* lib, const char* name, void** ptr) {
dlerror(); /* Reset error status. */ dlerror(); /* Reset error status. */
*ptr = dlsym(lib->handle, name); *ptr = dlsym(lib->handle, name);
return uv__dlerror(lib); return *ptr ? 0 : uv__dlerror(lib);
} }
......
...@@ -287,3 +287,18 @@ int uv__recvmmsg(int fd, struct uv__mmsghdr* mmsg, unsigned int vlen) { ...@@ -287,3 +287,18 @@ int uv__recvmmsg(int fd, struct uv__mmsghdr* mmsg, unsigned int vlen) {
return errno = ENOSYS, -1; return errno = ENOSYS, -1;
#endif #endif
} }
ssize_t
uv__fs_copy_file_range(int fd_in,
off_t* off_in,
int fd_out,
off_t* off_out,
size_t len,
unsigned int flags)
{
#if __FreeBSD__ >= 13 && !defined(__DragonFly__)
return copy_file_range(fd_in, off_in, fd_out, off_out, len, flags);
#else
return errno = ENOSYS, -1;
#endif
}
...@@ -247,7 +247,8 @@ UV_UNUSED(static struct timeval uv__fs_to_timeval(double time)) { ...@@ -247,7 +247,8 @@ UV_UNUSED(static struct timeval uv__fs_to_timeval(double time)) {
static ssize_t uv__fs_futime(uv_fs_t* req) { static ssize_t uv__fs_futime(uv_fs_t* req) {
#if defined(__linux__) \ #if defined(__linux__) \
|| defined(_AIX71) \ || defined(_AIX71) \
|| defined(__HAIKU__) || defined(__HAIKU__) \
|| defined(__GNU__)
struct timespec ts[2]; struct timespec ts[2];
ts[0] = uv__fs_to_timespec(req->atime); ts[0] = uv__fs_to_timespec(req->atime);
ts[1] = uv__fs_to_timespec(req->mtime); ts[1] = uv__fs_to_timespec(req->mtime);
...@@ -946,6 +947,71 @@ static int uv__is_buggy_cephfs(int fd) { ...@@ -946,6 +947,71 @@ static int uv__is_buggy_cephfs(int fd) {
return uv__kernel_version() < /* 4.20.0 */ 0x041400; return uv__kernel_version() < /* 4.20.0 */ 0x041400;
} }
static int uv__is_cifs_or_smb(int fd) {
struct statfs s;
if (-1 == fstatfs(fd, &s))
return 0;
switch ((unsigned) s.f_type) {
case 0x0000517Bu: /* SMB */
case 0xFE534D42u: /* SMB2 */
case 0xFF534D42u: /* CIFS */
return 1;
}
return 0;
}
static ssize_t uv__fs_try_copy_file_range(int in_fd, off_t* off,
int out_fd, size_t len) {
static int no_copy_file_range_support;
ssize_t r;
if (uv__load_relaxed(&no_copy_file_range_support)) {
errno = ENOSYS;
return -1;
}
r = uv__fs_copy_file_range(in_fd, off, out_fd, NULL, len, 0);
if (r != -1)
return r;
switch (errno) {
case EACCES:
/* Pre-4.20 kernels have a bug where CephFS uses the RADOS
* copy-from command when it shouldn't.
*/
if (uv__is_buggy_cephfs(in_fd))
errno = ENOSYS; /* Use fallback. */
break;
case ENOSYS:
uv__store_relaxed(&no_copy_file_range_support, 1);
break;
case EPERM:
/* It's been reported that CIFS spuriously fails.
* Consider it a transient error.
*/
if (uv__is_cifs_or_smb(out_fd))
errno = ENOSYS; /* Use fallback. */
break;
case ENOTSUP:
case EXDEV:
/* ENOTSUP - it could work on another file system type.
* EXDEV - it will not work when in_fd and out_fd are not on the same
* mounted filesystem (pre Linux 5.3)
*/
errno = ENOSYS; /* Use fallback. */
break;
}
return -1;
}
#endif /* __linux__ */ #endif /* __linux__ */
...@@ -960,40 +1026,21 @@ static ssize_t uv__fs_sendfile(uv_fs_t* req) { ...@@ -960,40 +1026,21 @@ static ssize_t uv__fs_sendfile(uv_fs_t* req) {
{ {
off_t off; off_t off;
ssize_t r; ssize_t r;
size_t len;
int try_sendfile;
off = req->off; off = req->off;
len = req->bufsml[0].len;
try_sendfile = 1;
#ifdef __linux__ #ifdef __linux__
{ r = uv__fs_try_copy_file_range(in_fd, &off, out_fd, len);
static int no_copy_file_range_support; try_sendfile = (r == -1 && errno == ENOSYS);
if (uv__load_relaxed(&no_copy_file_range_support) == 0) {
r = uv__fs_copy_file_range(in_fd, &off, out_fd, NULL, req->bufsml[0].len, 0);
if (r == -1 && errno == ENOSYS) {
/* ENOSYS - it will never work */
errno = 0;
uv__store_relaxed(&no_copy_file_range_support, 1);
} else if (r == -1 && errno == EACCES && uv__is_buggy_cephfs(in_fd)) {
/* EACCES - pre-4.20 kernels have a bug where CephFS uses the RADOS
copy-from command when it shouldn't */
errno = 0;
uv__store_relaxed(&no_copy_file_range_support, 1);
} else if (r == -1 && (errno == ENOTSUP || errno == EXDEV)) {
/* ENOTSUP - it could work on another file system type */
/* EXDEV - it will not work when in_fd and out_fd are not on the same
mounted filesystem (pre Linux 5.3) */
errno = 0;
} else {
goto ok;
}
}
}
#endif #endif
r = sendfile(out_fd, in_fd, &off, req->bufsml[0].len); if (try_sendfile)
r = sendfile(out_fd, in_fd, &off, len);
ok:
/* sendfile() on SunOS returns EINVAL if the target fd is not a socket but /* sendfile() on SunOS returns EINVAL if the target fd is not a socket but
* it still writes out data. Fortunately, we can detect it by checking if * it still writes out data. Fortunately, we can detect it by checking if
* the offset has been updated. * the offset has been updated.
...@@ -1028,6 +1075,17 @@ ok: ...@@ -1028,6 +1075,17 @@ ok:
*/ */
#if defined(__FreeBSD__) || defined(__DragonFly__) #if defined(__FreeBSD__) || defined(__DragonFly__)
#if defined(__FreeBSD__)
off_t off;
off = req->off;
r = uv__fs_copy_file_range(in_fd, &off, out_fd, NULL, req->bufsml[0].len, 0);
if (r >= 0) {
r = off - req->off;
req->off = off;
return r;
}
#endif
len = 0; len = 0;
r = sendfile(in_fd, out_fd, req->off, req->bufsml[0].len, NULL, &len, 0); r = sendfile(in_fd, out_fd, req->off, req->bufsml[0].len, NULL, &len, 0);
#elif defined(__FreeBSD_kernel__) #elif defined(__FreeBSD_kernel__)
...@@ -1122,7 +1180,9 @@ static ssize_t uv__fs_lutime(uv_fs_t* req) { ...@@ -1122,7 +1180,9 @@ static ssize_t uv__fs_lutime(uv_fs_t* req) {
#if defined(__linux__) || \ #if defined(__linux__) || \
defined(_AIX71) || \ defined(_AIX71) || \
defined(__sun) || \ defined(__sun) || \
defined(__HAIKU__) defined(__HAIKU__) || \
defined(__GNU__) || \
defined(__OpenBSD__)
struct timespec ts[2]; struct timespec ts[2];
ts[0] = uv__fs_to_timespec(req->atime); ts[0] = uv__fs_to_timespec(req->atime);
ts[1] = uv__fs_to_timespec(req->mtime); ts[1] = uv__fs_to_timespec(req->mtime);
...@@ -1277,22 +1337,15 @@ static ssize_t uv__fs_copyfile(uv_fs_t* req) { ...@@ -1277,22 +1337,15 @@ static ssize_t uv__fs_copyfile(uv_fs_t* req) {
if (fchmod(dstfd, src_statsbuf.st_mode) == -1) { if (fchmod(dstfd, src_statsbuf.st_mode) == -1) {
err = UV__ERR(errno); err = UV__ERR(errno);
#ifdef __linux__ #ifdef __linux__
if (err != UV_EPERM)
goto out;
{
struct statfs s;
/* fchmod() on CIFS shares always fails with EPERM unless the share is /* fchmod() on CIFS shares always fails with EPERM unless the share is
* mounted with "noperm". As fchmod() is a meaningless operation on such * mounted with "noperm". As fchmod() is a meaningless operation on such
* shares anyway, detect that condition and squelch the error. * shares anyway, detect that condition and squelch the error.
*/ */
if (fstatfs(dstfd, &s) == -1) if (err != UV_EPERM)
goto out; goto out;
if ((unsigned) s.f_type != /* CIFS */ 0xFF534D42u) if (!uv__is_cifs_or_smb(dstfd))
goto out; goto out;
}
err = 0; err = 0;
#else /* !__linux__ */ #else /* !__linux__ */
......
/* Copyright libuv project contributors. All rights reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to
* deal in the Software without restriction, including without limitation the
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
* sell copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
* IN THE SOFTWARE.
*/
#define _GNU_SOURCE 1
#include "uv.h"
#include "internal.h"
#include <hurd.h>
#include <hurd/process.h>
#include <mach/task_info.h>
#include <mach/vm_statistics.h>
#include <mach/vm_param.h>
#include <inttypes.h>
#include <stddef.h>
#include <unistd.h>
#include <string.h>
#include <limits.h>
int uv_exepath(char* buffer, size_t* size) {
kern_return_t err;
/* XXX in current Hurd, strings are char arrays of 1024 elements */
string_t exepath;
ssize_t copied;
if (buffer == NULL || size == NULL || *size == 0)
return UV_EINVAL;
if (*size - 1 > 0) {
/* XXX limited length of buffer in current Hurd, this API will probably
* evolve in the future */
err = proc_get_exe(getproc(), getpid(), exepath);
if (err)
return UV__ERR(err);
}
copied = uv__strscpy(buffer, exepath, *size);
/* do not return error on UV_E2BIG failure */
*size = copied < 0 ? strlen(buffer) : (size_t) copied;
return 0;
}
int uv_resident_set_memory(size_t* rss) {
kern_return_t err;
struct task_basic_info bi;
mach_msg_type_number_t count;
count = TASK_BASIC_INFO_COUNT;
err = task_info(mach_task_self(), TASK_BASIC_INFO,
(task_info_t) &bi, &count);
if (err)
return UV__ERR(err);
*rss = bi.resident_size;
return 0;
}
uint64_t uv_get_free_memory(void) {
kern_return_t err;
struct vm_statistics vmstats;
err = vm_statistics(mach_task_self(), &vmstats);
if (err)
return 0;
return vmstats.free_count * vm_page_size;
}
uint64_t uv_get_total_memory(void) {
kern_return_t err;
host_basic_info_data_t hbi;
mach_msg_type_number_t cnt;
cnt = HOST_BASIC_INFO_COUNT;
err = host_info(mach_host_self(), HOST_BASIC_INFO, (host_info_t) &hbi, &cnt);
if (err)
return 0;
return hbi.memory_size;
}
int uv_uptime(double* uptime) {
char buf[128];
/* Try /proc/uptime first */
if (0 == uv__slurp("/proc/uptime", buf, sizeof(buf)))
if (1 == sscanf(buf, "%lf", uptime))
return 0;
/* Reimplement here code from procfs to calculate uptime if not mounted? */
return UV__ERR(EIO);
}
void uv_loadavg(double avg[3]) {
char buf[128]; /* Large enough to hold all of /proc/loadavg. */
if (0 == uv__slurp("/proc/loadavg", buf, sizeof(buf)))
if (3 == sscanf(buf, "%lf %lf %lf", &avg[0], &avg[1], &avg[2]))
return;
/* Reimplement here code from procfs to calculate loadavg if not mounted? */
}
int uv_cpu_info(uv_cpu_info_t** cpu_infos, int* count) {
kern_return_t err;
host_basic_info_data_t hbi;
mach_msg_type_number_t cnt;
/* Get count of cpus */
cnt = HOST_BASIC_INFO_COUNT;
err = host_info(mach_host_self(), HOST_BASIC_INFO, (host_info_t) &hbi, &cnt);
if (err) {
err = UV__ERR(err);
goto abort;
}
/* XXX not implemented on the Hurd */
*cpu_infos = uv__calloc(hbi.avail_cpus, sizeof(**cpu_infos));
if (*cpu_infos == NULL) {
err = UV_ENOMEM;
goto abort;
}
*count = hbi.avail_cpus;
return 0;
abort:
*cpu_infos = NULL;
*count = 0;
return err;
}
uint64_t uv_get_constrained_memory(void) {
return 0; /* Memory constraints are unknown. */
}
...@@ -145,7 +145,8 @@ typedef struct uv__stream_queued_fds_s uv__stream_queued_fds_t; ...@@ -145,7 +145,8 @@ typedef struct uv__stream_queued_fds_s uv__stream_queued_fds_t;
/* loop flags */ /* loop flags */
enum { enum {
UV_LOOP_BLOCK_SIGPROF = 1 UV_LOOP_BLOCK_SIGPROF = 0x1,
UV_LOOP_REAP_CHILDREN = 0x2
}; };
/* flags of excluding ifaddr */ /* flags of excluding ifaddr */
...@@ -174,11 +175,9 @@ struct uv__stream_queued_fds_s { ...@@ -174,11 +175,9 @@ struct uv__stream_queued_fds_s {
defined(__linux__) || \ defined(__linux__) || \
defined(__OpenBSD__) || \ defined(__OpenBSD__) || \
defined(__NetBSD__) defined(__NetBSD__)
#define uv__cloexec uv__cloexec_ioctl
#define uv__nonblock uv__nonblock_ioctl #define uv__nonblock uv__nonblock_ioctl
#define UV__NONBLOCK_IS_IOCTL 1 #define UV__NONBLOCK_IS_IOCTL 1
#else #else
#define uv__cloexec uv__cloexec_fcntl
#define uv__nonblock uv__nonblock_fcntl #define uv__nonblock uv__nonblock_fcntl
#define UV__NONBLOCK_IS_IOCTL 0 #define UV__NONBLOCK_IS_IOCTL 0
#endif #endif
...@@ -196,8 +195,7 @@ struct uv__stream_queued_fds_s { ...@@ -196,8 +195,7 @@ struct uv__stream_queued_fds_s {
#endif #endif
/* core */ /* core */
int uv__cloexec_ioctl(int fd, int set); int uv__cloexec(int fd, int set);
int uv__cloexec_fcntl(int fd, int set);
int uv__nonblock_ioctl(int fd, int set); int uv__nonblock_ioctl(int fd, int set);
int uv__nonblock_fcntl(int fd, int set); int uv__nonblock_fcntl(int fd, int set);
int uv__close(int fd); /* preserves errno */ int uv__close(int fd); /* preserves errno */
...@@ -241,14 +239,15 @@ void uv__server_io(uv_loop_t* loop, uv__io_t* w, unsigned int events); ...@@ -241,14 +239,15 @@ void uv__server_io(uv_loop_t* loop, uv__io_t* w, unsigned int events);
int uv__accept(int sockfd); int uv__accept(int sockfd);
int uv__dup2_cloexec(int oldfd, int newfd); int uv__dup2_cloexec(int oldfd, int newfd);
int uv__open_cloexec(const char* path, int flags); int uv__open_cloexec(const char* path, int flags);
int uv__slurp(const char* filename, char* buf, size_t len);
/* tcp */ /* tcp */
int uv_tcp_listen(uv_tcp_t* tcp, int backlog, uv_connection_cb cb); int uv__tcp_listen(uv_tcp_t* tcp, int backlog, uv_connection_cb cb);
int uv__tcp_nodelay(int fd, int on); int uv__tcp_nodelay(int fd, int on);
int uv__tcp_keepalive(int fd, int on, unsigned int delay); int uv__tcp_keepalive(int fd, int on, unsigned int delay);
/* pipe */ /* pipe */
int uv_pipe_listen(uv_pipe_t* handle, int backlog, uv_connection_cb cb); int uv__pipe_listen(uv_pipe_t* handle, int backlog, uv_connection_cb cb);
/* signal */ /* signal */
void uv__signal_close(uv_signal_t* handle); void uv__signal_close(uv_signal_t* handle);
...@@ -278,10 +277,10 @@ void uv__tcp_close(uv_tcp_t* handle); ...@@ -278,10 +277,10 @@ void uv__tcp_close(uv_tcp_t* handle);
size_t uv__thread_stack_size(void); size_t uv__thread_stack_size(void);
void uv__udp_close(uv_udp_t* handle); void uv__udp_close(uv_udp_t* handle);
void uv__udp_finish_close(uv_udp_t* handle); void uv__udp_finish_close(uv_udp_t* handle);
uv_handle_type uv__handle_type(int fd);
FILE* uv__open_file(const char* path); FILE* uv__open_file(const char* path);
int uv__getpwuid_r(uv_passwd_t* pwd); int uv__getpwuid_r(uv_passwd_t* pwd);
int uv__search_path(const char* prog, char* buf, size_t* buflen); int uv__search_path(const char* prog, char* buf, size_t* buflen);
void uv__wait_children(uv_loop_t* loop);
/* random */ /* random */
int uv__random_devurandom(void* buf, size_t buflen); int uv__random_devurandom(void* buf, size_t buflen);
...@@ -356,5 +355,15 @@ size_t strnlen(const char* s, size_t maxlen); ...@@ -356,5 +355,15 @@ size_t strnlen(const char* s, size_t maxlen);
#endif #endif
#endif #endif
#if defined(__FreeBSD__)
ssize_t
uv__fs_copy_file_range(int fd_in,
off_t* off_in,
int fd_out,
off_t* off_out,
size_t len,
unsigned int flags);
#endif
#endif /* UV_UNIX_INTERNAL_H_ */ #endif /* UV_UNIX_INTERNAL_H_ */
...@@ -117,6 +117,7 @@ void uv__io_poll(uv_loop_t* loop, int timeout) { ...@@ -117,6 +117,7 @@ void uv__io_poll(uv_loop_t* loop, int timeout) {
unsigned int revents; unsigned int revents;
QUEUE* q; QUEUE* q;
uv__io_t* w; uv__io_t* w;
uv_process_t* process;
sigset_t* pset; sigset_t* pset;
sigset_t set; sigset_t set;
uint64_t base; uint64_t base;
...@@ -285,6 +286,21 @@ void uv__io_poll(uv_loop_t* loop, int timeout) { ...@@ -285,6 +286,21 @@ void uv__io_poll(uv_loop_t* loop, int timeout) {
for (i = 0; i < nfds; i++) { for (i = 0; i < nfds; i++) {
ev = events + i; ev = events + i;
fd = ev->ident; fd = ev->ident;
/* Handle kevent NOTE_EXIT results */
if (ev->filter == EVFILT_PROC) {
QUEUE_FOREACH(q, &loop->process_handles) {
process = QUEUE_DATA(q, uv_process_t, queue);
if (process->pid == fd) {
process->flags |= UV_HANDLE_REAP;
loop->flags |= UV_LOOP_REAP_CHILDREN;
break;
}
}
nevents++;
continue;
}
/* Skip invalidated events, see uv__platform_invalidate_fd */ /* Skip invalidated events, see uv__platform_invalidate_fd */
if (fd == -1) if (fd == -1)
continue; continue;
...@@ -326,6 +342,8 @@ void uv__io_poll(uv_loop_t* loop, int timeout) { ...@@ -326,6 +342,8 @@ void uv__io_poll(uv_loop_t* loop, int timeout) {
if (errno != ENOENT) if (errno != ENOENT)
abort(); abort();
} }
if ((ev->flags & EV_EOF) && (w->pevents & UV__POLLRDHUP))
revents |= UV__POLLRDHUP;
} }
if (ev->filter == EV_OOBAND) { if (ev->filter == EV_OOBAND) {
...@@ -359,9 +377,6 @@ void uv__io_poll(uv_loop_t* loop, int timeout) { ...@@ -359,9 +377,6 @@ void uv__io_poll(uv_loop_t* loop, int timeout) {
if (ev->flags & EV_ERROR) if (ev->flags & EV_ERROR)
revents |= POLLERR; revents |= POLLERR;
if ((ev->flags & EV_EOF) && (w->pevents & UV__POLLRDHUP))
revents |= UV__POLLRDHUP;
if (revents == 0) if (revents == 0)
continue; continue;
...@@ -378,6 +393,11 @@ void uv__io_poll(uv_loop_t* loop, int timeout) { ...@@ -378,6 +393,11 @@ void uv__io_poll(uv_loop_t* loop, int timeout) {
nevents++; nevents++;
} }
if (loop->flags & UV_LOOP_REAP_CHILDREN) {
loop->flags &= ~UV_LOOP_REAP_CHILDREN;
uv__wait_children(loop);
}
if (reset_timeout != 0) { if (reset_timeout != 0) {
timeout = user_timeout; timeout = user_timeout;
reset_timeout = 0; reset_timeout = 0;
...@@ -436,7 +456,7 @@ void uv__platform_invalidate_fd(uv_loop_t* loop, int fd) { ...@@ -436,7 +456,7 @@ void uv__platform_invalidate_fd(uv_loop_t* loop, int fd) {
/* Invalidate events with same file descriptor */ /* Invalidate events with same file descriptor */
for (i = 0; i < nfds; i++) for (i = 0; i < nfds; i++)
if ((int) events[i].ident == fd) if ((int) events[i].ident == fd && events[i].filter != EVFILT_PROC)
events[i].ident = -1; events[i].ident = -1;
} }
......
...@@ -45,6 +45,10 @@ ...@@ -45,6 +45,10 @@
#define HAVE_IFADDRS_H 1 #define HAVE_IFADDRS_H 1
# if defined(__ANDROID_API__) && __ANDROID_API__ < 24
# undef HAVE_IFADDRS_H
#endif
#ifdef __UCLIBC__ #ifdef __UCLIBC__
# if __UCLIBC_MAJOR__ < 0 && __UCLIBC_MINOR__ < 9 && __UCLIBC_SUBLEVEL__ < 32 # if __UCLIBC_MAJOR__ < 0 && __UCLIBC_MINOR__ < 9 && __UCLIBC_SUBLEVEL__ < 32
# undef HAVE_IFADDRS_H # undef HAVE_IFADDRS_H
...@@ -52,11 +56,7 @@ ...@@ -52,11 +56,7 @@
#endif #endif
#ifdef HAVE_IFADDRS_H #ifdef HAVE_IFADDRS_H
# if defined(__ANDROID__)
# include "uv/android-ifaddrs.h"
# else
# include <ifaddrs.h> # include <ifaddrs.h>
# endif
# include <sys/socket.h> # include <sys/socket.h>
# include <net/ethernet.h> # include <net/ethernet.h>
# include <netpacket/packet.h> # include <netpacket/packet.h>
...@@ -211,31 +211,6 @@ err: ...@@ -211,31 +211,6 @@ err:
return UV_EINVAL; return UV_EINVAL;
} }
static int uv__slurp(const char* filename, char* buf, size_t len) {
ssize_t n;
int fd;
assert(len > 0);
fd = uv__open_cloexec(filename, O_RDONLY);
if (fd < 0)
return fd;
do
n = read(fd, buf, len - 1);
while (n == -1 && errno == EINTR);
if (uv__close_nocheckstdio(fd))
abort();
if (n < 0)
return UV__ERR(errno);
buf[n] = '\0';
return 0;
}
int uv_uptime(double* uptime) { int uv_uptime(double* uptime) {
static volatile int no_clock_boottime; static volatile int no_clock_boottime;
char buf[128]; char buf[128];
...@@ -365,24 +340,30 @@ static int read_models(unsigned int numcpus, uv_cpu_info_t* ci) { ...@@ -365,24 +340,30 @@ static int read_models(unsigned int numcpus, uv_cpu_info_t* ci) {
const char* inferred_model; const char* inferred_model;
unsigned int model_idx; unsigned int model_idx;
unsigned int speed_idx; unsigned int speed_idx;
unsigned int part_idx;
char buf[1024]; char buf[1024];
char* model; char* model;
FILE* fp; FILE* fp;
int model_id;
/* Most are unused on non-ARM, non-MIPS and non-x86 architectures. */ /* Most are unused on non-ARM, non-MIPS and non-x86 architectures. */
(void) &model_marker; (void) &model_marker;
(void) &speed_marker; (void) &speed_marker;
(void) &speed_idx; (void) &speed_idx;
(void) &part_idx;
(void) &model; (void) &model;
(void) &buf; (void) &buf;
(void) &fp; (void) &fp;
(void) &model_id;
model_idx = 0; model_idx = 0;
speed_idx = 0; speed_idx = 0;
part_idx = 0;
#if defined(__arm__) || \ #if defined(__arm__) || \
defined(__i386__) || \ defined(__i386__) || \
defined(__mips__) || \ defined(__mips__) || \
defined(__aarch64__) || \
defined(__PPC__) || \ defined(__PPC__) || \
defined(__x86_64__) defined(__x86_64__)
fp = uv__open_file("/proc/cpuinfo"); fp = uv__open_file("/proc/cpuinfo");
...@@ -402,11 +383,96 @@ static int read_models(unsigned int numcpus, uv_cpu_info_t* ci) { ...@@ -402,11 +383,96 @@ static int read_models(unsigned int numcpus, uv_cpu_info_t* ci) {
continue; continue;
} }
} }
#if defined(__arm__) || defined(__mips__) #if defined(__arm__) || defined(__mips__) || defined(__aarch64__)
if (model_idx < numcpus) { if (model_idx < numcpus) {
#if defined(__arm__) #if defined(__arm__)
/* Fallback for pre-3.8 kernels. */ /* Fallback for pre-3.8 kernels. */
static const char model_marker[] = "Processor\t: "; static const char model_marker[] = "Processor\t: ";
#elif defined(__aarch64__)
static const char part_marker[] = "CPU part\t: ";
/* Adapted from: https://github.com/karelzak/util-linux */
struct vendor_part {
const int id;
const char* name;
};
static const struct vendor_part arm_chips[] = {
{ 0x811, "ARM810" },
{ 0x920, "ARM920" },
{ 0x922, "ARM922" },
{ 0x926, "ARM926" },
{ 0x940, "ARM940" },
{ 0x946, "ARM946" },
{ 0x966, "ARM966" },
{ 0xa20, "ARM1020" },
{ 0xa22, "ARM1022" },
{ 0xa26, "ARM1026" },
{ 0xb02, "ARM11 MPCore" },
{ 0xb36, "ARM1136" },
{ 0xb56, "ARM1156" },
{ 0xb76, "ARM1176" },
{ 0xc05, "Cortex-A5" },
{ 0xc07, "Cortex-A7" },
{ 0xc08, "Cortex-A8" },
{ 0xc09, "Cortex-A9" },
{ 0xc0d, "Cortex-A17" }, /* Originally A12 */
{ 0xc0f, "Cortex-A15" },
{ 0xc0e, "Cortex-A17" },
{ 0xc14, "Cortex-R4" },
{ 0xc15, "Cortex-R5" },
{ 0xc17, "Cortex-R7" },
{ 0xc18, "Cortex-R8" },
{ 0xc20, "Cortex-M0" },
{ 0xc21, "Cortex-M1" },
{ 0xc23, "Cortex-M3" },
{ 0xc24, "Cortex-M4" },
{ 0xc27, "Cortex-M7" },
{ 0xc60, "Cortex-M0+" },
{ 0xd01, "Cortex-A32" },
{ 0xd03, "Cortex-A53" },
{ 0xd04, "Cortex-A35" },
{ 0xd05, "Cortex-A55" },
{ 0xd06, "Cortex-A65" },
{ 0xd07, "Cortex-A57" },
{ 0xd08, "Cortex-A72" },
{ 0xd09, "Cortex-A73" },
{ 0xd0a, "Cortex-A75" },
{ 0xd0b, "Cortex-A76" },
{ 0xd0c, "Neoverse-N1" },
{ 0xd0d, "Cortex-A77" },
{ 0xd0e, "Cortex-A76AE" },
{ 0xd13, "Cortex-R52" },
{ 0xd20, "Cortex-M23" },
{ 0xd21, "Cortex-M33" },
{ 0xd41, "Cortex-A78" },
{ 0xd42, "Cortex-A78AE" },
{ 0xd4a, "Neoverse-E1" },
{ 0xd4b, "Cortex-A78C" },
};
if (strncmp(buf, part_marker, sizeof(part_marker) - 1) == 0) {
model = buf + sizeof(part_marker) - 1;
errno = 0;
model_id = strtol(model, NULL, 16);
if ((errno != 0) || model_id < 0) {
fclose(fp);
return UV_EINVAL;
}
for (part_idx = 0; part_idx < ARRAY_SIZE(arm_chips); part_idx++) {
if (model_id == arm_chips[part_idx].id) {
model = uv__strdup(arm_chips[part_idx].name);
if (model == NULL) {
fclose(fp);
return UV_ENOMEM;
}
ci[model_idx++].model = model;
break;
}
}
}
#else /* defined(__mips__) */ #else /* defined(__mips__) */
static const char model_marker[] = "cpu model\t\t: "; static const char model_marker[] = "cpu model\t\t: ";
#endif #endif
...@@ -421,18 +487,18 @@ static int read_models(unsigned int numcpus, uv_cpu_info_t* ci) { ...@@ -421,18 +487,18 @@ static int read_models(unsigned int numcpus, uv_cpu_info_t* ci) {
continue; continue;
} }
} }
#else /* !__arm__ && !__mips__ */ #else /* !__arm__ && !__mips__ && !__aarch64__ */
if (speed_idx < numcpus) { if (speed_idx < numcpus) {
if (strncmp(buf, speed_marker, sizeof(speed_marker) - 1) == 0) { if (strncmp(buf, speed_marker, sizeof(speed_marker) - 1) == 0) {
ci[speed_idx++].speed = atoi(buf + sizeof(speed_marker) - 1); ci[speed_idx++].speed = atoi(buf + sizeof(speed_marker) - 1);
continue; continue;
} }
} }
#endif /* __arm__ || __mips__ */ #endif /* __arm__ || __mips__ || __aarch64__ */
} }
fclose(fp); fclose(fp);
#endif /* __arm__ || __i386__ || __mips__ || __PPC__ || __x86_64__ */ #endif /* __arm__ || __i386__ || __mips__ || __PPC__ || __x86_64__ || __aarch__ */
/* Now we want to make sure that all the models contain *something* because /* Now we want to make sure that all the models contain *something* because
* it's not safe to leave them as null. Copy the last entry unless there * it's not safe to leave them as null. Copy the last entry unless there
...@@ -550,6 +616,7 @@ static uint64_t read_cpufreq(unsigned int cpunum) { ...@@ -550,6 +616,7 @@ static uint64_t read_cpufreq(unsigned int cpunum) {
} }
#ifdef HAVE_IFADDRS_H
static int uv__ifaddr_exclude(struct ifaddrs *ent, int exclude_type) { static int uv__ifaddr_exclude(struct ifaddrs *ent, int exclude_type) {
if (!((ent->ifa_flags & IFF_UP) && (ent->ifa_flags & IFF_RUNNING))) if (!((ent->ifa_flags & IFF_UP) && (ent->ifa_flags & IFF_RUNNING)))
return 1; return 1;
...@@ -563,6 +630,7 @@ static int uv__ifaddr_exclude(struct ifaddrs *ent, int exclude_type) { ...@@ -563,6 +630,7 @@ static int uv__ifaddr_exclude(struct ifaddrs *ent, int exclude_type) {
return exclude_type; return exclude_type;
return !exclude_type; return !exclude_type;
} }
#endif
int uv_interface_addresses(uv_interface_address_t** addresses, int* count) { int uv_interface_addresses(uv_interface_address_t** addresses, int* count) {
#ifndef HAVE_IFADDRS_H #ifndef HAVE_IFADDRS_H
...@@ -697,7 +765,7 @@ uint64_t uv_get_free_memory(void) { ...@@ -697,7 +765,7 @@ uint64_t uv_get_free_memory(void) {
struct sysinfo info; struct sysinfo info;
uint64_t rc; uint64_t rc;
rc = uv__read_proc_meminfo("MemFree:"); rc = uv__read_proc_meminfo("MemAvailable:");
if (rc != 0) if (rc != 0)
return rc; return rc;
......
...@@ -136,6 +136,11 @@ static void maybe_resize(uv__os390_epoll* lst, unsigned int len) { ...@@ -136,6 +136,11 @@ static void maybe_resize(uv__os390_epoll* lst, unsigned int len) {
} }
void uv__os390_cleanup(void) {
msgctl(uv_backend_fd(uv_default_loop()), IPC_RMID, NULL);
}
static void init_message_queue(uv__os390_epoll* lst) { static void init_message_queue(uv__os390_epoll* lst) {
struct { struct {
long int header; long int header;
...@@ -279,6 +284,8 @@ int epoll_wait(uv__os390_epoll* lst, struct epoll_event* events, ...@@ -279,6 +284,8 @@ int epoll_wait(uv__os390_epoll* lst, struct epoll_event* events,
nmsgsfds_t size; nmsgsfds_t size;
struct pollfd* pfds; struct pollfd* pfds;
int pollret; int pollret;
int pollfdret;
int pollmsgret;
int reventcount; int reventcount;
int nevents; int nevents;
struct pollfd msg_fd; struct pollfd msg_fd;
...@@ -299,24 +306,24 @@ int epoll_wait(uv__os390_epoll* lst, struct epoll_event* events, ...@@ -299,24 +306,24 @@ int epoll_wait(uv__os390_epoll* lst, struct epoll_event* events,
return -1; return -1;
} }
if (lst->size > 0) assert(lst->size > 0);
_SET_FDS_MSGS(size, 1, lst->size - 1); _SET_FDS_MSGS(size, 1, lst->size - 1);
else
_SET_FDS_MSGS(size, 0, 0);
pfds = lst->items; pfds = lst->items;
pollret = poll(pfds, size, timeout); pollret = poll(pfds, size, timeout);
if (pollret <= 0) if (pollret <= 0)
return pollret; return pollret;
assert(lst->size > 0); pollfdret = _NFDS(pollret);
pollmsgret = _NMSGS(pollret);
pollret = _NFDS(pollret) + _NMSGS(pollret);
reventcount = 0; reventcount = 0;
nevents = 0; nevents = 0;
msg_fd = pfds[lst->size - 1]; msg_fd = pfds[lst->size - 1]; /* message queue is always last entry */
maxevents = maxevents - pollmsgret; /* allow spot for message queue */
for (i = 0; for (i = 0;
i < lst->size && i < maxevents && reventcount < pollret; ++i) { i < lst->size - 1 &&
nevents < maxevents &&
reventcount < pollfdret; ++i) {
struct epoll_event ev; struct epoll_event ev;
struct pollfd* pfd; struct pollfd* pfd;
...@@ -327,18 +334,18 @@ int epoll_wait(uv__os390_epoll* lst, struct epoll_event* events, ...@@ -327,18 +334,18 @@ int epoll_wait(uv__os390_epoll* lst, struct epoll_event* events,
ev.fd = pfd->fd; ev.fd = pfd->fd;
ev.events = pfd->revents; ev.events = pfd->revents;
ev.is_msg = 0; ev.is_msg = 0;
if (pfd->revents & POLLIN && pfd->revents & POLLOUT)
reventcount += 2;
else if (pfd->revents & (POLLIN | POLLOUT))
++reventcount;
pfd->revents = 0; reventcount++;
events[nevents++] = ev; events[nevents++] = ev;
} }
if (msg_fd.revents != 0 && msg_fd.fd != -1) if (pollmsgret > 0 && msg_fd.revents != 0 && msg_fd.fd != -1) {
if (i == lst->size) struct epoll_event ev;
events[nevents - 1].is_msg = 1; ev.fd = msg_fd.fd;
ev.events = msg_fd.revents;
ev.is_msg = 1;
events[nevents++] = ev;
}
return nevents; return nevents;
} }
......
...@@ -70,5 +70,6 @@ int sem_destroy(UV_PLATFORM_SEM_T* semid); ...@@ -70,5 +70,6 @@ int sem_destroy(UV_PLATFORM_SEM_T* semid);
int sem_post(UV_PLATFORM_SEM_T* semid); int sem_post(UV_PLATFORM_SEM_T* semid);
int sem_trywait(UV_PLATFORM_SEM_T* semid); int sem_trywait(UV_PLATFORM_SEM_T* semid);
int sem_wait(UV_PLATFORM_SEM_T* semid); int sem_wait(UV_PLATFORM_SEM_T* semid);
void uv__os390_cleanup(void);
#endif /* UV_OS390_SYSCALL_H_ */ #endif /* UV_OS390_SYSCALL_H_ */
This diff is collapsed.
...@@ -51,7 +51,9 @@ int uv_pipe_bind(uv_pipe_t* handle, const char* name) { ...@@ -51,7 +51,9 @@ int uv_pipe_bind(uv_pipe_t* handle, const char* name) {
/* Already bound? */ /* Already bound? */
if (uv__stream_fd(handle) >= 0) if (uv__stream_fd(handle) >= 0)
return UV_EINVAL; return UV_EINVAL;
if (uv__is_closing(handle)) {
return UV_EINVAL;
}
/* Make a copy of the file name, it outlives this function's scope. */ /* Make a copy of the file name, it outlives this function's scope. */
pipe_fname = uv__strdup(name); pipe_fname = uv__strdup(name);
if (pipe_fname == NULL) if (pipe_fname == NULL)
...@@ -91,7 +93,7 @@ err_socket: ...@@ -91,7 +93,7 @@ err_socket:
} }
int uv_pipe_listen(uv_pipe_t* handle, int backlog, uv_connection_cb cb) { int uv__pipe_listen(uv_pipe_t* handle, int backlog, uv_connection_cb cb) {
if (uv__stream_fd(handle) == -1) if (uv__stream_fd(handle) == -1)
return UV_EINVAL; return UV_EINVAL;
...@@ -319,7 +321,7 @@ uv_handle_type uv_pipe_pending_type(uv_pipe_t* handle) { ...@@ -319,7 +321,7 @@ uv_handle_type uv_pipe_pending_type(uv_pipe_t* handle) {
if (handle->accepted_fd == -1) if (handle->accepted_fd == -1)
return UV_UNKNOWN_HANDLE; return UV_UNKNOWN_HANDLE;
else else
return uv__handle_type(handle->accepted_fd); return uv_guess_handle(handle->accepted_fd);
} }
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
...@@ -184,14 +184,15 @@ int uv__tcp_bind(uv_tcp_t* tcp, ...@@ -184,14 +184,15 @@ int uv__tcp_bind(uv_tcp_t* tcp,
#endif #endif
errno = 0; errno = 0;
if (bind(tcp->io_watcher.fd, addr, addrlen) && errno != EADDRINUSE) { err = bind(tcp->io_watcher.fd, addr, addrlen);
if (err == -1 && errno != EADDRINUSE) {
if (errno == EAFNOSUPPORT) if (errno == EAFNOSUPPORT)
/* OSX, other BSDs and SunoS fail with EAFNOSUPPORT when binding a /* OSX, other BSDs and SunoS fail with EAFNOSUPPORT when binding a
* socket created with AF_INET to an AF_INET6 address or vice versa. */ * socket created with AF_INET to an AF_INET6 address or vice versa. */
return UV_EINVAL; return UV_EINVAL;
return UV__ERR(errno); return UV__ERR(errno);
} }
tcp->delayed_error = UV__ERR(errno); tcp->delayed_error = (err == -1) ? UV__ERR(errno) : 0;
tcp->flags |= UV_HANDLE_BOUND; tcp->flags |= UV_HANDLE_BOUND;
if (addr->sa_family == AF_INET6) if (addr->sa_family == AF_INET6)
...@@ -320,15 +321,23 @@ int uv_tcp_close_reset(uv_tcp_t* handle, uv_close_cb close_cb) { ...@@ -320,15 +321,23 @@ int uv_tcp_close_reset(uv_tcp_t* handle, uv_close_cb close_cb) {
return UV_EINVAL; return UV_EINVAL;
fd = uv__stream_fd(handle); fd = uv__stream_fd(handle);
if (0 != setsockopt(fd, SOL_SOCKET, SO_LINGER, &l, sizeof(l))) if (0 != setsockopt(fd, SOL_SOCKET, SO_LINGER, &l, sizeof(l))) {
if (errno == EINVAL) {
/* Open Group Specifications Issue 7, 2018 edition states that
* EINVAL may mean the socket has been shut down already.
* Behavior observed on Solaris, illumos and macOS. */
errno = 0;
} else {
return UV__ERR(errno); return UV__ERR(errno);
}
}
uv_close((uv_handle_t*) handle, close_cb); uv_close((uv_handle_t*) handle, close_cb);
return 0; return 0;
} }
int uv_tcp_listen(uv_tcp_t* tcp, int backlog, uv_connection_cb cb) { int uv__tcp_listen(uv_tcp_t* tcp, int backlog, uv_connection_cb cb) {
static int single_accept_cached = -1; static int single_accept_cached = -1;
unsigned long flags; unsigned long flags;
int single_accept; int single_accept;
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment