mirror of
https://github.com/openembedded/meta-openembedded.git
synced 2026-10-15 18:27:12 +00:00
rtc-testbench: Fix build with musl
Cast socket addresses to struct sockaddr * for bind() and sendto(), since musl has no transparent union for them like glibc, and pin threads with pthread_setaffinity_np() after creation where pthread_attr_setaffinity_np() is not available. AI-Generated: Uses Claude Code Signed-off-by: Khem Raj <khem.raj@oss.qualcomm.com>
This commit is contained in:
2 files changed
+122
No files matched your search
@@ -0,0 +1,121 @@
|
||||
From: Khem Raj <raj.khem@gmail.com>
|
||||
Subject: [PATCH] Fix build with musl
|
||||
|
||||
- bind() and sendto() take a struct sockaddr pointer. glibc accepts other
|
||||
sockaddr types in C via a transparent union, musl does not:
|
||||
|
||||
net.c:417:25: error: incompatible pointer types passing 'struct sockaddr_in *' to parameter of type 'const struct sockaddr *' [-Wincompatible-pointer-types]
|
||||
|
||||
Cast to struct sockaddr * instead.
|
||||
|
||||
- pthread_attr_setaffinity_np() is a glibc extension musl does not have:
|
||||
|
||||
thread.c:67:8: error: call to undeclared function 'pthread_attr_setaffinity_np'
|
||||
|
||||
Without it, pin the thread with pthread_setaffinity_np() right after
|
||||
creating it.
|
||||
|
||||
Upstream-Status: Pending
|
||||
Signed-off-by: Khem Raj <raj.khem@gmail.com>
|
||||
---
|
||||
diff --git a/src/log_json.c b/src/log_json.c
|
||||
index 5ac7e87..e13b1fe 100644
|
||||
--- a/src/log_json.c
|
||||
+++ b/src/log_json.c
|
||||
@@ -44,11 +44,11 @@ static void log_json_add_traffic_class(struct log_json_thread_context *ctx,
|
||||
switch (ctx->dest.ss_family) {
|
||||
case AF_INET:
|
||||
ret = sendto(ctx->socket, stat_message, strlen(stat_message), 0,
|
||||
- (struct sockaddr_in *)&ctx->dest, sizeof(struct sockaddr_in));
|
||||
+ (struct sockaddr *)&ctx->dest, sizeof(struct sockaddr_in));
|
||||
break;
|
||||
case AF_INET6:
|
||||
ret = sendto(ctx->socket, stat_message, strlen(stat_message), 0,
|
||||
- (struct sockaddr_in6 *)&ctx->dest, sizeof(struct sockaddr_in6));
|
||||
+ (struct sockaddr *)&ctx->dest, sizeof(struct sockaddr_in6));
|
||||
break;
|
||||
default:
|
||||
ret = -EINVAL;
|
||||
diff --git a/src/net.c b/src/net.c
|
||||
index 408920b..14d1e29 100644
|
||||
--- a/src/net.c
|
||||
+++ b/src/net.c
|
||||
@@ -414,10 +414,10 @@ int create_udp_socket(const char *udp_destination, const char *udp_source, const
|
||||
|
||||
switch (source.ss_family) {
|
||||
case AF_INET:
|
||||
- ret = bind(socket_fd, (struct sockaddr_in *)&source, sizeof(struct sockaddr_in));
|
||||
+ ret = bind(socket_fd, (struct sockaddr *)&source, sizeof(struct sockaddr_in));
|
||||
break;
|
||||
case AF_INET6:
|
||||
- ret = bind(socket_fd, (struct sockaddr_in6 *)&source, sizeof(struct sockaddr_in6));
|
||||
+ ret = bind(socket_fd, (struct sockaddr *)&source, sizeof(struct sockaddr_in6));
|
||||
break;
|
||||
default:
|
||||
ret = -EINVAL;
|
||||
diff --git a/src/thread.c b/src/thread.c
|
||||
index a679164..635dda7 100644
|
||||
--- a/src/thread.c
|
||||
+++ b/src/thread.c
|
||||
@@ -64,11 +64,13 @@ int create_rt_thread(pthread_t *task_id, int thread_priority, int cpu_core,
|
||||
|
||||
CPU_ZERO(&cpus);
|
||||
CPU_SET(cpu_core, &cpus);
|
||||
+#ifdef __GLIBC__
|
||||
ret = pthread_attr_setaffinity_np(&attr, sizeof(cpus), &cpus);
|
||||
if (ret) {
|
||||
pthread_error(ret, "pthread_attr_setaffinity_np() failed");
|
||||
goto err;
|
||||
}
|
||||
+#endif
|
||||
|
||||
ret = pthread_create(task_id, &attr, thread_routine, data);
|
||||
if (ret) {
|
||||
@@ -76,6 +78,15 @@ int create_rt_thread(pthread_t *task_id, int thread_priority, int cpu_core,
|
||||
goto err;
|
||||
}
|
||||
|
||||
+#ifndef __GLIBC__
|
||||
+ /* No pthread_attr_setaffinity_np() e.g. on musl, pin the new thread instead. */
|
||||
+ ret = pthread_setaffinity_np(*task_id, sizeof(cpus), &cpus);
|
||||
+ if (ret) {
|
||||
+ pthread_error(ret, "pthread_setaffinity_np() failed");
|
||||
+ goto err;
|
||||
+ }
|
||||
+#endif
|
||||
+
|
||||
ret = pthread_setname_np(*task_id, thread_name);
|
||||
if (ret) {
|
||||
pthread_error(ret, "pthread_setname_np() failed");
|
||||
diff --git a/src/udp_thread.c b/src/udp_thread.c
|
||||
index bcdd000..ffbeba9 100644
|
||||
--- a/src/udp_thread.c
|
||||
+++ b/src/udp_thread.c
|
||||
@@ -68,11 +68,11 @@ static void udp_send_frame(struct thread_context *thread_context, const unsigned
|
||||
switch (destination->ss_family) {
|
||||
case AF_INET:
|
||||
ret = sendto(socket_fd, frame_data, frame_length, 0,
|
||||
- (struct sockaddr_in *)destination, sizeof(struct sockaddr_in));
|
||||
+ (struct sockaddr *)destination, sizeof(struct sockaddr_in));
|
||||
break;
|
||||
case AF_INET6:
|
||||
ret = sendto(socket_fd, frame_data, frame_length, 0,
|
||||
- (struct sockaddr_in6 *)destination, sizeof(struct sockaddr_in6));
|
||||
+ (struct sockaddr *)destination, sizeof(struct sockaddr_in6));
|
||||
break;
|
||||
default:
|
||||
ret = -EINVAL;
|
||||
@@ -107,11 +107,11 @@ static void udp_gen_and_send_frame(struct thread_context *thread_context, unsign
|
||||
switch (destination->ss_family) {
|
||||
case AF_INET:
|
||||
ret = sendto(socket_fd, frame_data, frame_length, 0,
|
||||
- (struct sockaddr_in *)destination, sizeof(struct sockaddr_in));
|
||||
+ (struct sockaddr *)destination, sizeof(struct sockaddr_in));
|
||||
break;
|
||||
case AF_INET6:
|
||||
ret = sendto(socket_fd, frame_data, frame_length, 0,
|
||||
- (struct sockaddr_in6 *)destination, sizeof(struct sockaddr_in6));
|
||||
+ (struct sockaddr *)destination, sizeof(struct sockaddr_in6));
|
||||
break;
|
||||
default:
|
||||
ret = -EINVAL;
|
||||
@@ -15,6 +15,7 @@ LIC_FILES_CHKSUM = " \
|
||||
SRC_URI = " \
|
||||
git://github.com/Linutronix/RTC-Testbench.git;tag=v${PV};nobranch=1;protocol=https \
|
||||
file://0001-CMakeLists.txt-make-BPF-clang-and-include-paths-conf.patch \
|
||||
file://0002-Fix-build-with-musl.patch \
|
||||
"
|
||||
SRCREV = "b7541b4b93b4d9fe6f395bc53d3cb50401d406a4"
|
||||
|
||||
|
||||
Reference in new issue
Block a user