Added native unix common module
Motivation: unix common tools native C modules were not loaded in netty_io_uring_native.c ``` Caused by: java.lang.UnsatisfiedLinkError: io.netty.channel.unix.LimitsStaticallyReferencedJniMethods.udsSunPathSize()I at io.netty.channel.unix.LimitsStaticallyReferencedJniMethods.udsSunPathSize(Native Method) at io.netty.channel.unix.Socket.<clinit>(Socket.java:49) at io.netty.channel.uring.IOUringServerSocketChannel.<init>(IOUringServerSocketChannel.java:29) ... 11 more ``` Modification: Added unix common tools native in netty_io_uring_native.c and small cleanup Result: fix UnsatisfiedLinkError exception
This commit is contained in:
parent
247e14a2b1
commit
339d5f1565
@ -1,34 +0,0 @@
|
|||||||
/* SPDX-License-Identifier: MIT */
|
|
||||||
#ifndef LIBURING_BARRIER_H
|
|
||||||
#define LIBURING_BARRIER_H
|
|
||||||
|
|
||||||
#include <stdatomic.h>
|
|
||||||
|
|
||||||
/*
|
|
||||||
From the kernel documentation file refcount-vs-atomic.rst:
|
|
||||||
A RELEASE memory ordering guarantees that all prior loads and
|
|
||||||
stores (all po-earlier instructions) on the same CPU are completed
|
|
||||||
before the operation. It also guarantees that all po-earlier
|
|
||||||
stores on the same CPU and all propagated stores from other CPUs
|
|
||||||
must propagate to all other CPUs before the release operation
|
|
||||||
(A-cumulative property). This is implemented using
|
|
||||||
:c:func:`smp_store_release`.
|
|
||||||
An ACQUIRE memory ordering guarantees that all post loads and
|
|
||||||
stores (all po-later instructions) on the same CPU are
|
|
||||||
completed after the acquire operation. It also guarantees that all
|
|
||||||
po-later stores on the same CPU must propagate to all other CPUs
|
|
||||||
after the acquire operation executes. This is implemented using
|
|
||||||
:c:func:`smp_acquire__after_ctrl_dep`.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define IO_URING_WRITE_ONCE(var, val) \
|
|
||||||
atomic_store_explicit(&(var), (val), memory_order_relaxed)
|
|
||||||
#define IO_URING_READ_ONCE(var) \
|
|
||||||
atomic_load_explicit(&(var), memory_order_relaxed)
|
|
||||||
|
|
||||||
#define io_uring_smp_store_release(p, v) \
|
|
||||||
atomic_store_explicit((p), (v), memory_order_release)
|
|
||||||
#define io_uring_smp_load_acquire(p) \
|
|
||||||
atomic_load_explicit((p), memory_order_acquire)
|
|
||||||
|
|
||||||
#endif /* defined(LIBURING_BARRIER_H) */
|
|
@ -1,5 +1,4 @@
|
|||||||
/* SPDX-License-Identifier: MIT */
|
/* SPDX-License-Identifier: MIT */
|
||||||
#include "barrier.h"
|
|
||||||
#include <linux/io_uring.h>
|
#include <linux/io_uring.h>
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
@ -44,39 +43,4 @@ struct io_uring {
|
|||||||
int ring_fd;
|
int ring_fd;
|
||||||
};
|
};
|
||||||
|
|
||||||
#define io_uring_for_each_cqe(ring, head, cqe) \
|
|
||||||
/* \
|
|
||||||
* io_uring_smp_load_acquire() enforces the order of tail \
|
|
||||||
* and CQE reads. \
|
|
||||||
*/ \
|
|
||||||
for (head = *(ring)->cq.khead; \
|
|
||||||
(cqe = (head != io_uring_smp_load_acquire((ring)->cq.ktail) \
|
|
||||||
? &(ring)->cq.cqes[head & (*(ring)->cq.kring_mask)] \
|
|
||||||
: NULL)); \
|
|
||||||
head++)
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Must be called after io_uring_for_each_cqe()
|
|
||||||
*/
|
|
||||||
static inline void io_uring_cq_advance(struct io_uring *ring, unsigned nr) {
|
|
||||||
if (nr) {
|
|
||||||
struct io_uring_cq *cq = &ring->cq;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Ensure that the kernel only sees the new value of the head
|
|
||||||
* index after the CQEs have been read.
|
|
||||||
*/
|
|
||||||
io_uring_smp_store_release(cq->khead, *cq->khead + nr);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Must be called after io_uring_{peek,wait}_cqe() after the cqe has
|
|
||||||
* been processed by the application.
|
|
||||||
*/
|
|
||||||
static void io_uring_cqe_seen(struct io_uring *ring, struct io_uring_cqe *cqe) {
|
|
||||||
if (cqe)
|
|
||||||
io_uring_cq_advance(ring, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
#endif
|
@ -46,6 +46,14 @@
|
|||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
|
|
||||||
|
#include "netty_unix_buffer.h"
|
||||||
|
#include "netty_unix_errors.h"
|
||||||
|
#include "netty_unix_filedescriptor.h"
|
||||||
|
#include "netty_unix_jni.h"
|
||||||
|
#include "netty_unix_limits.h"
|
||||||
|
#include "netty_unix_socket.h"
|
||||||
|
#include "netty_unix_util.h"
|
||||||
|
|
||||||
static jmethodID ringBufferMethodId = NULL;
|
static jmethodID ringBufferMethodId = NULL;
|
||||||
static jmethodID ioUringSubmissionQueueMethodId = NULL;
|
static jmethodID ioUringSubmissionQueueMethodId = NULL;
|
||||||
static jmethodID ioUringCommpletionQueueMethodId = NULL;
|
static jmethodID ioUringCommpletionQueueMethodId = NULL;
|
||||||
@ -223,12 +231,34 @@ JNIEXPORT jint JNI_OnLoad(JavaVM *vm, void *reserved) {
|
|||||||
dlinfo.dli_fname);
|
dlinfo.dli_fname);
|
||||||
return JNI_ERR;
|
return JNI_ERR;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (netty_unix_util_register_natives(env, packagePrefix,
|
if (netty_unix_util_register_natives(env, packagePrefix,
|
||||||
"io/netty/channel/uring/Native",
|
"io/netty/channel/uring/Native",
|
||||||
method_table, method_table_size) != 0) {
|
method_table, method_table_size) != 0) {
|
||||||
printf("netty register natives error\n");
|
printf("netty register natives error\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Load all c modules that we depend upon
|
||||||
|
if (netty_unix_limits_JNI_OnLoad(env, packagePrefix) == JNI_ERR) {
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (netty_unix_errors_JNI_OnLoad(env, packagePrefix) == JNI_ERR) {
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (netty_unix_filedescriptor_JNI_OnLoad(env, packagePrefix) == JNI_ERR) {
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (netty_unix_socket_JNI_OnLoad(env, packagePrefix) == JNI_ERR) {
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (netty_unix_buffer_JNI_OnLoad(env, packagePrefix) == JNI_ERR) {
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
NETTY_PREPEND(packagePrefix, "io/netty/channel/uring/RingBuffer",
|
NETTY_PREPEND(packagePrefix, "io/netty/channel/uring/RingBuffer",
|
||||||
nettyClassName, done);
|
nettyClassName, done);
|
||||||
NETTY_LOAD_CLASS(env, ringBufferClass, nettyClassName, done);
|
NETTY_LOAD_CLASS(env, ringBufferClass, nettyClassName, done);
|
||||||
|
@ -8,32 +8,6 @@
|
|||||||
#include <sys/uio.h>
|
#include <sys/uio.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
|
||||||
#ifdef __alpha__
|
|
||||||
/*
|
|
||||||
* alpha is the only exception, all other architectures
|
|
||||||
* have common numbers for new system calls.
|
|
||||||
*/
|
|
||||||
#ifndef __NR_io_uring_setup
|
|
||||||
#define __NR_io_uring_setup 535
|
|
||||||
#endif
|
|
||||||
#ifndef __NR_io_uring_enter
|
|
||||||
#define __NR_io_uring_enter 536
|
|
||||||
#endif
|
|
||||||
#ifndef __NR_io_uring_register
|
|
||||||
#define __NR_io_uring_register 537
|
|
||||||
#endif
|
|
||||||
#else /* !__alpha__ */
|
|
||||||
#ifndef __NR_io_uring_setup
|
|
||||||
#define __NR_io_uring_setup 425
|
|
||||||
#endif
|
|
||||||
#ifndef __NR_io_uring_enter
|
|
||||||
#define __NR_io_uring_enter 426
|
|
||||||
#endif
|
|
||||||
#ifndef __NR_io_uring_register
|
|
||||||
#define __NR_io_uring_register 427
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
int sys_io_uring_register(int fd, unsigned opcode, const void *arg,
|
int sys_io_uring_register(int fd, unsigned opcode, const void *arg,
|
||||||
unsigned nr_args) {
|
unsigned nr_args) {
|
||||||
return syscall(__NR_io_uring_register, fd, opcode, arg, nr_args);
|
return syscall(__NR_io_uring_register, fd, opcode, arg, nr_args);
|
||||||
|
@ -7,7 +7,6 @@
|
|||||||
/*
|
/*
|
||||||
* System calls
|
* System calls
|
||||||
*/
|
*/
|
||||||
// extern int sys_io_uring_setup(unsigned entries, struct io_uring_params *p);
|
|
||||||
extern int sys_io_uring_setup(unsigned entries, struct io_uring_params *p);
|
extern int sys_io_uring_setup(unsigned entries, struct io_uring_params *p);
|
||||||
extern int sys_io_uring_enter(int fd, unsigned to_submit, unsigned min_complete,
|
extern int sys_io_uring_enter(int fd, unsigned to_submit, unsigned min_complete,
|
||||||
unsigned flags, sigset_t *sig);
|
unsigned flags, sigset_t *sig);
|
||||||
|
Loading…
Reference in New Issue
Block a user