[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#720188: kfreebsd: please implemente/expose waitid function & wait6 syscall



On 20 August 2013 07:26, Petr Salinger <Petr.Salinger@seznam.cz> wrote:
>>> It is planned, but (e)glibc 2.18 upload have to go first, due to changes
>>> of
>>> idtype_t values. See also 218_waitid* in
>>> http://anonscm.debian.org/viewvc/glibc-bsd/trunk/glibc-ports/
>>>
>>> We also have to provide (reasonable) fallback implementation
>>> under wheezy kernels.
>>
>>
>> Cool! Excellent stuff! I've tried applying 218_waitid* things against
>> the eglibc-package as is in the debian trunk (2.17 based) and failed
>> to compile it properly.
>> Is there a way for me to compile debs
>
>
> The 218_waitid_common.diff is against main tree,
> the 218_waitid_kbsd.diff is against kfreebsd/ subdir
> and 218_waitid.c have to be placed as waitid.c in kfreebsd/ subdir.
>
> It worked a month ago ;-)


Right, and it still "works", well at raising system errors =) I've now
tried it from the eglibc-2.18 packaging branch.

I've tried adding wait6 syscall & implementing waitid using it, but it
didn't quite managed to make it compile (i got linker errors waying it
cannot find __GI___syscall_wait6).

Can we set minimal kfreebsd kernel version when configuring/compiling
eglibc such that if compatibility with older freebsd kernels is needed
the wrapper implementation is used,
otherwise if compiled for freebsd kernels >= 9.2, wait6 version is
used? And then distributions, e.g. kfreebsd/Debian can choose where to
cut the line.

Can you see what I have done wrong? (it's my first time trying to hack on glibc)

Regards,

Dmitrijs.
--- foo/eglibc-2.18/ports/sysdeps/unix/bsd/bsd4.4/kfreebsd/syscalls-inline.h	2013-11-01 12:33:10.000000000 +0000
+++ eglibc-2.18/ports/sysdeps/unix/bsd/bsd4.4/kfreebsd/syscalls-inline.h	2013-11-01 01:12:34.000000000 +0000
@@ -45,14 +45,16 @@
 
 int __syscall_fcntl(int fd, int cmd, ...);
 int __syscall_fork(void);
 int __syscall_wait4(int pid, int *status, int options, struct rusage *rusage);
+int __syscall_wait6(idtype_t itype, id_t id, int *status, int options, struct rusage *rusage, siginfo_t *infop);
 int __syscall_sigsuspend (const sigset_t *set);
 int __syscall_sigprocmask (int how, const sigset_t *set, sigset_t *oldset);
 int __syscall_nanosleep (const struct timespec *requested_time, struct timespec *remaining);
 libc_hidden_proto (__syscall_fcntl)
 libc_hidden_proto (__syscall_fork)
 libc_hidden_proto (__syscall_wait4)
+libc_hidden_proto (__syscall_wait6)
 libc_hidden_proto (__syscall_sigsuspend)
 libc_hidden_proto (__syscall_sigprocmask)
 libc_hidden_proto (__syscall_nanosleep)
 
--- foo/eglibc-2.18/ports/sysdeps/unix/bsd/bsd4.4/kfreebsd/syscalls.list	2013-11-01 12:33:10.000000000 +0000
+++ eglibc-2.18/ports/sysdeps/unix/bsd/bsd4.4/kfreebsd/syscalls.list	2013-11-01 01:07:26.000000000 +0000
@@ -206,7 +206,8 @@
 unlinkat		-	unlinkat		i:isi		unlinkat
 unmount			-	unmount			i:si		unmount
 utrace			-	utrace			i:bn		utrace
 wait4			-	wait4			i:iWiP		__syscall_wait4 __wait4	wait4
+wait6			-	wait6			i:iiWiPP		__syscall_wait6 __wait6	wait6
 sys_write		-	write			i:ibn		__syscall_write
 sys_writev		-	writev			i:ipi		__syscall_writev
 yield			-	yield			i:		__syscall_yield
--- foo/eglibc-2.18/ports/sysdeps/unix/bsd/bsd4.4/kfreebsd/waitid.c	2013-11-01 12:33:10.000000000 +0000
+++ eglibc-2.18/ports/sysdeps/unix/bsd/bsd4.4/kfreebsd/waitid.c	2013-11-01 01:26:07.000000000 +0000
@@ -21,15 +21,33 @@
 #include <errno.h>
 #include <sys/wait.h>
 #include <sysdep.h>
 
-/* for now only the wrapper implementation */
-/* later on we will try to use wait6 when available */
+extern int __syscall_wait6 (idtype_t itype, id_t id,
+			    int *status, int options,
+			    struct rusage *rusage, siginfo_t *infop);
+libc_hidden_proto (__syscall_wait6)
 
 #define waitid __unused_waitid_alias
+static inline int
+do_waitid (idtype_t idtype, id_t id, siginfo_t *infop, int options)
+{
+  int ret;
+  int status;
+  
+  ret = INLINE_SYSCALL (wait6, 6, idtype, id, &status, options, NULL, infop);
+
+  if (ret > 0)
+    ret = 0;
+
+  return ret;
+}
+
+#define NO_DO_WAITID
 #include <sysdeps/posix/waitid.c>
 #undef waitid
 
+
 versioned_symbol (libc, __waitid, waitid, GLIBC_2_18);
 
 #if SHLIB_COMPAT (libc, GLIBC_2_1, GLIBC_2_18)
 

Reply to: