Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 26 Jul 2000 01:12:38 +0930 (CST)
From:      Greg Lewis <glewis@trc.adelaide.edu.au>
To:        Fuyuhiko Maruyama <fuyuhik8@is.titech.ac.jp>
Cc:        freebsd-java@FreeBSD.ORG
Subject:   Re: Patches to allow timing based profiling.
Message-ID:  <200007251542.BAA22456@ares.trc.adelaide.edu.au>
In-Reply-To: <55ittv41lx.wl@is.titech.ac.jp> from Fuyuhiko Maruyama at "Jul 25, 2000 07:14:50 am"

next in thread | previous in thread | raw e-mail | index | archive | help

--ELM964539758-18521-0_
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: 7bit

Fuyuhiko Maruyama wrote:
> Hi, all.
> 
> I made a patches to allow timing based profiling (using hprof)
> on FreeBSD JDK 1.2.2 (with patchset-9).

Arigato Maruyama-san!

> Patches attached this mail make two contributions:
>   1. On pentium-platform (not PentiumPro, PentiumII, K6...), there
>      was problem JVM causes Segmentation Fault when profiling is
>      enabled.  This is assembler version interpretter's bug (may be in
>      Solaris/Win32 version).  The patch for executeJava_p5.inc fix
>      this bug.

Good catch :).

>   2. Patchset-9 doesn't give meaningful value for sysThreadCPUTime()
>      function.  On Solaris, the function is implemented using
>      gethrvtime() which doesn't exist on FreeBSD, so patchset-9 used
>      to simply return 0.  This is not so serious problem whenever
>      timing based profiling isn't used.  The patch for threads_md.c
>      implement the function using getrusage(...).  This may be too
>      heavy function, but I don't know any other simple alternatives.
>      The good news is, it will be used *only when* timing based
>      profiling is enabled, so I believe the heavyness of
>      sysThreadCPUTime() doesn't affect the efficiency of non-profiling
>      run.

I've done this one slightly differently.  I just named the function you
implemented gethrvtime, which simplified the code a little bit.  I don't
think this has any adverse affects.  I will attach a diff so you can look
it over.

-- 
Greg Lewis 				glewis@trc.adelaide.edu.au
Computing Officer			+61 8 8303 5083
Teletraffic Research Centre

--ELM964539758-18521-0_
Content-Type: text/plain; charset=US-ASCII
Content-Disposition: attachment; filename=threads_md.diff
Content-Description: threads_md.diff
Content-Transfer-Encoding: 7bit

--- threads_md.c.orig	Wed Jul 26 00:01:35 2000
+++ threads_md.c	Wed Jul 26 00:08:15 2000
@@ -20,7 +20,9 @@
 
 #include <string.h>
 #ifdef __FreeBSD__
+#include <sys/types.h>
 #include <sys/time.h>
+#include <sys/resource.h>
 #else
 #include <ucontext.h>
 #endif
@@ -953,15 +955,29 @@
 
 static jlong sliceStartTime = -1;
 
+#ifdef __FreeBSD__
+/*
+ * FreeBSD doesn't have gethrvtime(), so implement it using getrusage().
+ */
+static inline jlong
+gethrvtime()
+{
+	struct rusage rusage;
+	jlong time;
+	getrusage(RUSAGE_SELF, &rusage);
+	return ((jlong)rusage.ru_utime.tv_sec) * (jlong)1000000000
+	  + ((jlong)rusage.ru_utime.tv_usec * (jlong)1000)
+	  + ((jlong)rusage.ru_stime.tv_sec) * (jlong)1000000000
+	  + ((jlong)rusage.ru_stime.tv_usec * (jlong)1000);
+}
+#endif
+
+
 jlong
 sysThreadCPUTime()
 {
 	sys_thread_t * t = greenThreadSelf();
-#ifdef __FreeBSD__
-	jlong time = 0LL;
-#else
 	jlong time = gethrvtime();
-#endif
 	if (sliceStartTime == -1)
 	    sliceStartTime = time;
 	time += t->elapsedCPUTime - sliceStartTime;
@@ -972,11 +988,7 @@
 updateSliceStart()
 {
 	sys_thread_t * t = greenThreadSelf();
-#ifdef __FreeBSD__
-	jlong time = 0LL;
-#else
 	jlong time = gethrvtime();
-#endif
 	if (sliceStartTime == -1)
 	    sliceStartTime = time;
         t->elapsedCPUTime +=  time - sliceStartTime;

--ELM964539758-18521-0_--


To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-java" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200007251542.BAA22456>