Date: Mon, 19 Jul 2004 23:47:15 +0200 From: "Georg-W. Koltermann" <gwk@rahn-koltermann.de> To: freebsd-emulation@freebsd.org Subject: how to implement linux_gettid Message-ID: <1090273635.1511.15.camel@localhost.muc.eu.mscsoftware.com>
next in thread | raw e-mail | index | archive | help
Hi,
I am trying to get SUNs Linux JRE 1.5 beta2 to work, which currently
fails with unsupported system call #224, which is gettid(). In the
Linux kernel this call returns the pid, which makes sense as their
threading model allocates a proc structure per thread.
I first tried to simply return a unique number for the gettid() call by
returning (int)td. That seemed to work, although I sometimes got JVM
crashes with negative thread ids.
Interestingly I observed that with the JRE 1.5 I also seem to get one
proc per thread in our Linux emulation on FreeBSD; ps(1) shows multiple
processes for one java invocation. So my current attempt is to return
td->td_proc->p_pid, which is the pid just as in the Linux kernel. This
also works, just as fine, for simple cases.
I still get JVM crashes easily when I start a Swing GUI application and
resize the window a couple times. So I suppose returning the pid is not
really the correct solution.
Could someone explain how our threading works when accessed from Linux,
and maybe give me a hint how gettid() should be implemented correctly?
--
Thanks,
Regards,
Georg.
------------------------------------------
FreeBSD 5.2.1-p5
linux_base-8
linprocfs is mounted
Index: linux_misc.c
===================================================================
RCS file: /usr/ncvs/src/sys/compat/linux/linux_misc.c,v
retrieving revision 1.150
diff -u -r1.150 linux_misc.c
--- linux_misc.c 16 Nov 2003 15:07:10 -0000 1.150
+++ linux_misc.c 14 Jul 2004 18:57:55 -0000
@@ -1328,6 +1328,20 @@
return (0);
}
+/*
+ * A trial implementation of linux gettid(2).
+ *
+ * We'll see if it works. The linux source returns the pid
+ * for this call.
+ */
+int
+linux_gettid(struct thread *td, struct linux_gettid_args *args)
+{
+ /* td->td_retval[0] = (int)td; */
+ td->td_retval[0] = td->td_proc->p_pid;
+ return (0);
+}
+
int
linux_getgid(struct thread *td, struct linux_getgid_args *args)
{
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?1090273635.1511.15.camel>
