mirror of
https://github.com/apache/nuttx-apps.git
synced 2025-07-15 04:45:51 +08:00
libuv: default select epoll backend in libuv
Signed-off-by: dongjiuzhu1 <dongjiuzhu1@xiaomi.com>
This commit is contained in:
parent
8ed046e2d6
commit
8b6e63c22d
@ -3544,3 +3544,419 @@ index bbc0c305..4e7996f5 100644
|
||||
|
||||
MAKE_VALGRIND_HAPPY(loop);
|
||||
return 0;
|
||||
diff --git a/include/uv/unix.h b/include/uv/unix.h
|
||||
index 4962b932..e6303c45 100644
|
||||
--- a/include/uv/unix.h
|
||||
+++ b/include/uv/unix.h
|
||||
@@ -45,7 +45,7 @@
|
||||
|
||||
#include "uv/threadpool.h"
|
||||
|
||||
-#if defined(__linux__)
|
||||
+#if defined(__linux__) || defined(CONFIG_LIBUV_BACKEND_EPOLL)
|
||||
# include "uv/linux.h"
|
||||
#elif defined (__MVS__)
|
||||
# include "uv/os390.h"
|
||||
diff --git a/src/unix/internal.h b/src/unix/internal.h
|
||||
index ddc744b2..7ff0c094 100644
|
||||
--- a/src/unix/internal.h
|
||||
+++ b/src/unix/internal.h
|
||||
@@ -177,7 +177,7 @@ struct uv__stream_queued_fds_s {
|
||||
int fds[1];
|
||||
};
|
||||
|
||||
-#ifdef __linux__
|
||||
+#if defined(__linux__) || defined(__NuttX__)
|
||||
struct uv__statx_timestamp {
|
||||
int64_t tv_sec;
|
||||
uint32_t tv_nsec;
|
||||
@@ -207,7 +207,7 @@ struct uv__statx {
|
||||
uint32_t stx_dev_minor;
|
||||
uint64_t unused1[14];
|
||||
};
|
||||
-#endif /* __linux__ */
|
||||
+#endif /* __linux__ || __NuttX__ */
|
||||
|
||||
#if defined(_AIX) || \
|
||||
defined(__APPLE__) || \
|
||||
diff --git a/src/unix/linux.c b/src/unix/linux.c
|
||||
index 48b9c2c4..95f0e3dc 100644
|
||||
--- a/src/unix/linux.c
|
||||
+++ b/src/unix/linux.c
|
||||
@@ -52,6 +52,7 @@
|
||||
#include <time.h>
|
||||
#include <unistd.h>
|
||||
|
||||
+#ifdef __linux__
|
||||
#ifndef __NR_io_uring_setup
|
||||
# define __NR_io_uring_setup 425
|
||||
#endif
|
||||
@@ -63,6 +64,7 @@
|
||||
#ifndef __NR_io_uring_register
|
||||
# define __NR_io_uring_register 427
|
||||
#endif
|
||||
+#endif
|
||||
|
||||
#ifndef __NR_copy_file_range
|
||||
# if defined(__x86_64__)
|
||||
@@ -335,6 +337,7 @@ unsigned uv__kernel_version(void) {
|
||||
}
|
||||
|
||||
|
||||
+#ifdef __linux__
|
||||
ssize_t
|
||||
uv__fs_copy_file_range(int fd_in,
|
||||
off_t* off_in,
|
||||
@@ -389,10 +392,15 @@ ssize_t uv__getrandom(void* buf, size_t buflen, unsigned flags) {
|
||||
return rc;
|
||||
#endif
|
||||
}
|
||||
+#endif
|
||||
|
||||
|
||||
int uv__io_uring_setup(int entries, struct uv__io_uring_params* params) {
|
||||
+#ifdef __NR_io_uring_setup
|
||||
return syscall(__NR_io_uring_setup, entries, params);
|
||||
+#else
|
||||
+ return errno = ENOSYS, -1;
|
||||
+#endif
|
||||
}
|
||||
|
||||
|
||||
@@ -404,6 +412,7 @@ int uv__io_uring_enter(int fd,
|
||||
* in newer kernels unless IORING_ENTER_EXT_ARG is set,
|
||||
* in which case it takes a struct io_uring_getevents_arg.
|
||||
*/
|
||||
+#ifdef __NR_io_uring_enter
|
||||
return syscall(__NR_io_uring_enter,
|
||||
fd,
|
||||
to_submit,
|
||||
@@ -411,16 +420,23 @@ int uv__io_uring_enter(int fd,
|
||||
flags,
|
||||
NULL,
|
||||
0L);
|
||||
+#else
|
||||
+ return errno = ENOSYS, -1;
|
||||
+#endif
|
||||
}
|
||||
|
||||
|
||||
int uv__io_uring_register(int fd, unsigned opcode, void* arg, unsigned nargs) {
|
||||
+#ifdef __NR_io_uring_register
|
||||
return syscall(__NR_io_uring_register, fd, opcode, arg, nargs);
|
||||
+#else
|
||||
+ return errno = ENOSYS, -1;
|
||||
+#endif
|
||||
}
|
||||
|
||||
|
||||
static int uv__use_io_uring(void) {
|
||||
-#if defined(__ANDROID_API__)
|
||||
+#if defined(__ANDROID_API__) || defined(__NuttX__)
|
||||
return 0; /* Possibly available but blocked by seccomp. */
|
||||
#else
|
||||
/* Ternary: unknown=0, yes=1, no=-1 */
|
||||
@@ -695,7 +711,7 @@ int uv__io_check_fd(uv_loop_t* loop, int fd) {
|
||||
return rc;
|
||||
}
|
||||
|
||||
-
|
||||
+#ifdef __linux__
|
||||
/* Caller must initialize SQE and call uv__iou_submit(). */
|
||||
static struct uv__io_uring_sqe* uv__iou_get_sqe(struct uv__iou* iou,
|
||||
uv_loop_t* loop,
|
||||
@@ -1019,6 +1035,7 @@ int uv__iou_fs_statx(uv_loop_t* loop,
|
||||
|
||||
return 1;
|
||||
}
|
||||
+#endif
|
||||
|
||||
|
||||
void uv__statx_to_stat(const struct uv__statx* statxbuf, uv_stat_t* buf) {
|
||||
@@ -1530,6 +1547,7 @@ update_timeout:
|
||||
uv__epoll_ctl_flush(epollfd, ctl, &prep);
|
||||
}
|
||||
|
||||
+#ifdef __linux__
|
||||
uint64_t uv__hrtime(uv_clocktype_t type) {
|
||||
static _Atomic clock_t fast_clock_id = -1;
|
||||
struct timespec t;
|
||||
@@ -2238,6 +2256,7 @@ void uv_loadavg(double avg[3]) {
|
||||
avg[1] = (double) info.loads[1] / 65536.0;
|
||||
avg[2] = (double) info.loads[2] / 65536.0;
|
||||
}
|
||||
+#endif
|
||||
|
||||
|
||||
static int compare_watchers(const struct watcher_list* a,
|
||||
diff --git a/src/uv-common.h b/src/uv-common.h
|
||||
index cd57e5a3..7bd628e8 100644
|
||||
--- a/src/uv-common.h
|
||||
+++ b/src/uv-common.h
|
||||
@@ -396,7 +396,7 @@ struct uv__loop_metrics_s {
|
||||
void uv__metrics_update_idle_time(uv_loop_t* loop);
|
||||
void uv__metrics_set_provider_entry_time(uv_loop_t* loop);
|
||||
|
||||
-#ifdef __linux__
|
||||
+#if defined(__linux__) || defined(CONFIG_LIBUV_BACKEND_EPOLL)
|
||||
struct uv__iou {
|
||||
uint32_t* sqhead;
|
||||
uint32_t* sqtail;
|
||||
@@ -417,17 +417,17 @@ struct uv__iou {
|
||||
uint32_t in_flight;
|
||||
uint32_t flags;
|
||||
};
|
||||
-#endif /* __linux__ */
|
||||
+#endif /* __linux__ || CONFIG_LIBUV_BACKEND_EPOLL */
|
||||
|
||||
struct uv__loop_internal_fields_s {
|
||||
unsigned int flags;
|
||||
uv__loop_metrics_t loop_metrics;
|
||||
int current_timeout;
|
||||
-#ifdef __linux__
|
||||
+#if defined(__linux__) || defined(CONFIG_LIBUV_BACKEND_EPOLL)
|
||||
struct uv__iou ctl;
|
||||
struct uv__iou iou;
|
||||
void* inv; /* used by uv__platform_invalidate_fd() */
|
||||
-#endif /* __linux__ */
|
||||
+#endif /* __linux__ || CONFIG_LIBUV_BACKEND_EPOLL */
|
||||
};
|
||||
|
||||
#endif /* UV_COMMON_H_ */
|
||||
diff --git a/test/task.h b/test/task.h
|
||||
index 25af255c..4162476a 100644
|
||||
--- a/test/task.h
|
||||
+++ b/test/task.h
|
||||
@@ -353,7 +353,7 @@ UNUSED static int can_ipv6(void) {
|
||||
return supported;
|
||||
}
|
||||
|
||||
-#if defined(__CYGWIN__) || defined(__MSYS__) || defined(__PASE__) || defined(__NuttX__)
|
||||
+#if defined(__CYGWIN__) || defined(__MSYS__) || defined(__PASE__)
|
||||
# define NO_FS_EVENTS "Filesystem watching not supported on this platform."
|
||||
#endif
|
||||
|
||||
diff --git a/test/test-fs-event.c b/test/test-fs-event.c
|
||||
index 9f231ebf..a1680989 100644
|
||||
--- a/test/test-fs-event.c
|
||||
+++ b/test/test-fs-event.c
|
||||
@@ -405,6 +405,11 @@ TEST_IMPL(fs_event_watch_dir) {
|
||||
uv_loop_t* loop = uv_default_loop();
|
||||
int r;
|
||||
|
||||
+ fs_event_cb_called = 0;
|
||||
+ fs_event_created = 0;
|
||||
+ fs_event_removed = 0;
|
||||
+ close_cb_called = 0;
|
||||
+
|
||||
/* Setup */
|
||||
fs_event_unlink_files(NULL);
|
||||
remove("watch_dir/file2");
|
||||
@@ -443,6 +448,12 @@ TEST_IMPL(fs_event_watch_dir_recursive) {
|
||||
int r;
|
||||
uv_fs_event_t fs_event_root;
|
||||
|
||||
+ fs_multievent_cb_called = 0;
|
||||
+ fs_event_cb_called = 0;
|
||||
+ fs_event_created = 0;
|
||||
+ fs_event_removed = 0;
|
||||
+ close_cb_called = 0;
|
||||
+
|
||||
/* Setup */
|
||||
loop = uv_default_loop();
|
||||
fs_event_unlink_files(NULL);
|
||||
@@ -558,6 +569,9 @@ TEST_IMPL(fs_event_watch_file) {
|
||||
|
||||
uv_loop_t* loop = uv_default_loop();
|
||||
int r;
|
||||
+ fs_event_cb_called = 0;
|
||||
+ timer_cb_called = 0;
|
||||
+ close_cb_called = 0;
|
||||
|
||||
/* Setup */
|
||||
remove("watch_dir/file2");
|
||||
@@ -605,6 +619,7 @@ TEST_IMPL(fs_event_watch_file_exact_path) {
|
||||
int r;
|
||||
|
||||
loop = uv_default_loop();
|
||||
+ timer_cb_exact_called = 0;
|
||||
|
||||
/* Setup */
|
||||
remove("watch_dir/file.js");
|
||||
@@ -653,6 +668,10 @@ TEST_IMPL(fs_event_watch_file_twice) {
|
||||
uv_timer_t timer;
|
||||
uv_loop_t* loop;
|
||||
|
||||
+ create_dir("test/");
|
||||
+ create_dir("test/fixtures/");
|
||||
+ create_file("test/fixtures/empty_file");
|
||||
+
|
||||
loop = uv_default_loop();
|
||||
timer.data = watchers;
|
||||
|
||||
@@ -664,6 +683,10 @@ TEST_IMPL(fs_event_watch_file_twice) {
|
||||
ASSERT(0 == uv_timer_start(&timer, timer_cb_watch_twice, 10, 0));
|
||||
ASSERT(0 == uv_run(loop, UV_RUN_DEFAULT));
|
||||
|
||||
+ remove("test/fixtures/empty_file");
|
||||
+ remove("test/fixtures/");
|
||||
+ remove("test/");
|
||||
+
|
||||
MAKE_VALGRIND_HAPPY(loop);
|
||||
return 0;
|
||||
}
|
||||
@@ -677,6 +700,9 @@ TEST_IMPL(fs_event_watch_file_current_dir) {
|
||||
int r;
|
||||
|
||||
loop = uv_default_loop();
|
||||
+ timer_cb_touch_called = 0;
|
||||
+ fs_event_cb_called = 0;
|
||||
+ close_cb_called = 0;
|
||||
|
||||
/* Setup */
|
||||
remove("watch_file");
|
||||
@@ -758,6 +784,9 @@ TEST_IMPL(fs_event_no_callback_after_close) {
|
||||
uv_loop_t* loop = uv_default_loop();
|
||||
int r;
|
||||
|
||||
+ fs_event_cb_called = 0;
|
||||
+ close_cb_called = 0;
|
||||
+
|
||||
/* Setup */
|
||||
remove("watch_dir/file1");
|
||||
remove("watch_dir/");
|
||||
@@ -796,6 +825,9 @@ TEST_IMPL(fs_event_no_callback_on_close) {
|
||||
uv_loop_t* loop = uv_default_loop();
|
||||
int r;
|
||||
|
||||
+ fs_event_cb_called = 0;
|
||||
+ close_cb_called = 0;
|
||||
+
|
||||
/* Setup */
|
||||
remove("watch_dir/file1");
|
||||
remove("watch_dir/");
|
||||
@@ -848,6 +880,7 @@ TEST_IMPL(fs_event_immediate_close) {
|
||||
int r;
|
||||
|
||||
loop = uv_default_loop();
|
||||
+ close_cb_called = 0;
|
||||
|
||||
r = uv_timer_init(loop, &timer);
|
||||
ASSERT(r == 0);
|
||||
@@ -873,6 +906,8 @@ TEST_IMPL(fs_event_close_with_pending_event) {
|
||||
|
||||
loop = uv_default_loop();
|
||||
|
||||
+ close_cb_called = 0;
|
||||
+
|
||||
create_dir("watch_dir");
|
||||
create_file("watch_dir/file");
|
||||
|
||||
@@ -946,6 +981,9 @@ TEST_IMPL(fs_event_close_in_callback) {
|
||||
int r;
|
||||
|
||||
loop = uv_default_loop();
|
||||
+ close_cb_called = 0;
|
||||
+ fs_event_cb_called = 0;
|
||||
+ fs_event_created = 0;
|
||||
|
||||
fs_event_unlink_files(NULL);
|
||||
create_dir("watch_dir");
|
||||
@@ -987,6 +1025,7 @@ TEST_IMPL(fs_event_start_and_close) {
|
||||
int r;
|
||||
|
||||
loop = uv_default_loop();
|
||||
+ close_cb_called = 0;
|
||||
|
||||
create_dir("watch_dir");
|
||||
|
||||
@@ -1031,6 +1070,7 @@ TEST_IMPL(fs_event_getpath) {
|
||||
|
||||
create_dir("watch_dir");
|
||||
create_dir("watch_dir/subfolder");
|
||||
+ close_cb_called = 0;
|
||||
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(watch_dir); i++) {
|
||||
@@ -1097,6 +1137,8 @@ TEST_IMPL(fs_event_error_reporting) {
|
||||
uv_loop_t* loop;
|
||||
uv_fs_event_t* event;
|
||||
|
||||
+ fs_event_error_reported = 0;
|
||||
+
|
||||
TEST_FILE_LIMIT(ARRAY_SIZE(loops) * 3);
|
||||
|
||||
remove("watch_dir/");
|
||||
diff --git a/test/test-fs-event.c b/test/test-fs-event.c
|
||||
index a1680989..ab7b5941 100644
|
||||
--- a/test/test-fs-event.c
|
||||
+++ b/test/test-fs-event.c
|
||||
@@ -668,8 +668,8 @@ TEST_IMPL(fs_event_watch_file_twice) {
|
||||
uv_timer_t timer;
|
||||
uv_loop_t* loop;
|
||||
|
||||
- create_dir("test/");
|
||||
- create_dir("test/fixtures/");
|
||||
+ create_dir("test");
|
||||
+ create_dir("test/fixtures");
|
||||
create_file("test/fixtures/empty_file");
|
||||
|
||||
loop = uv_default_loop();
|
||||
@@ -684,8 +684,8 @@ TEST_IMPL(fs_event_watch_file_twice) {
|
||||
ASSERT(0 == uv_run(loop, UV_RUN_DEFAULT));
|
||||
|
||||
remove("test/fixtures/empty_file");
|
||||
- remove("test/fixtures/");
|
||||
- remove("test/");
|
||||
+ remove("test/fixtures");
|
||||
+ remove("test");
|
||||
|
||||
MAKE_VALGRIND_HAPPY(loop);
|
||||
return 0;
|
||||
@@ -941,6 +941,7 @@ TEST_IMPL(fs_event_close_with_pending_delete_event) {
|
||||
int r;
|
||||
|
||||
loop = uv_default_loop();
|
||||
+ close_cb_called = 0;
|
||||
|
||||
create_dir("watch_dir");
|
||||
create_file("watch_dir/file");
|
||||
@@ -1240,6 +1241,8 @@ TEST_IMPL(fs_event_stop_in_cb) {
|
||||
uv_fs_event_t fs;
|
||||
uv_timer_t timer;
|
||||
char path[] = "fs_event_stop_in_cb.txt";
|
||||
+ timer_cb_touch_called = 0;
|
||||
+ fs_event_cb_stop_calls = 0;
|
||||
|
||||
#if defined(NO_FS_EVENTS)
|
||||
RETURN_SKIP(NO_FS_EVENTS);
|
||||
diff --git a/src/unix/nuttx.c b/src/unix/nuttx.c
|
||||
index 57afeb2c..ec8eeb08 100644
|
||||
--- a/src/unix/nuttx.c
|
||||
+++ b/src/unix/nuttx.c
|
||||
@@ -360,3 +360,25 @@ uv__global_t* uv__global_get(void) {
|
||||
ASSERT(global != NULL);
|
||||
return global;
|
||||
}
|
||||
+
|
||||
+#ifndef CONFIG_FS_NOTIFY
|
||||
+int inotify_init(void)
|
||||
+{
|
||||
+ return UV_ENOTSUP;
|
||||
+}
|
||||
+
|
||||
+int inotify_init1(int flags)
|
||||
+{
|
||||
+ return UV_ENOTSUP;
|
||||
+}
|
||||
+
|
||||
+int inotify_add_watch(int fd, FAR const char *pathname, uint32_t mask)
|
||||
+{
|
||||
+ return UV_ENOTSUP;
|
||||
+}
|
||||
+
|
||||
+int inotify_rm_watch(int fd, int wd)
|
||||
+{
|
||||
+ return UV_ENOTSUP;
|
||||
+}
|
||||
+#endif
|
||||
|
@ -20,6 +20,11 @@ config LIBUV_THREAD_STACKSIZE
|
||||
int "libuv worker thread stack size"
|
||||
default PTHREAD_STACK_DEFAULT
|
||||
|
||||
config LIBUV_BACKEND_EPOLL
|
||||
bool "Using epoll backend in libuv"
|
||||
select FS_NOTIFY
|
||||
default y
|
||||
|
||||
choice
|
||||
prompt "libuv utils"
|
||||
default LIBUV_UTILS_NONE
|
||||
|
@ -74,7 +74,11 @@ CSRCS += loop.c
|
||||
CSRCS += thread.c
|
||||
CSRCS += thread-common.c
|
||||
CSRCS += posix-hrtime.c
|
||||
ifneq ($(CONFIG_LIBUV_BACKEND_EPOLL),)
|
||||
CSRCS += linux.c
|
||||
else
|
||||
CSRCS += posix-poll.c
|
||||
endif
|
||||
CSRCS += uv-data-getter-setters.c
|
||||
CSRCS += version.c
|
||||
ifeq ($(CONFIG_LIBUV_UTILS_TEST),)
|
||||
|
Loading…
x
Reference in New Issue
Block a user