Re: J2SE compliant RE for Arm Linux

2007-06-27 Thread Andrew Haley
See also 
http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/locks/LockSupport.html



Re: J2SE compliant RE for Arm Linux

2007-06-27 Thread Christian Thalinger
On Wed, 2007-06-27 at 14:39 +0100, Robert Lougher wrote:
> Hi,
> 
> Park and unpark are empty stubs, but everything else should be
> implemented...  If anybody can tell me what park/unpark should do,
> I'll implement them too!

I saw gcj has an implementation, but I didn't have time to do it.  But
you can also look in HotSpot's code what should be done :-)

- twisti



Re: J2SE compliant RE for Arm Linux

2007-06-27 Thread Andrew Haley
Robert Lougher writes:

 > Park and unpark are empty stubs, but everything else should be
 > implemented...  If anybody can tell me what park/unpark should do,
 > I'll implement them too!

I'll bite.  

park() stops a thread until some other thread calls unpark() on that
thread or the thread is interrupted.  park() may wake up spuriously,
or indeed it may return immediately.  If unpark() is called before
park(), park() returns immediately.  Therefore, the order in which
park() and unpark() are called makes no difference.

So, empty definitions of park() and unpark() are correct but
inefficient.

I've attached the gcj POSIX definitions. 

Andrew.



/**
 * Releases the block on a thread created by _Jv_ThreadPark().  This
 * method can also be used to terminate a blockage caused by a prior
 * call to park.  This operation is unsafe, as the thread must be
 * guaranteed to be live.
 *
 * @param thread the thread to unblock.
 */
void
ParkHelper::unpark ()
{
  using namespace ::java::lang;
  volatile obj_addr_t *ptr = &permit;

  /* If this thread is in state RUNNING, give it a permit and return
 immediately.  */
  if (compare_and_swap 
  (ptr, Thread::THREAD_PARK_RUNNING, Thread::THREAD_PARK_PERMIT))
return;
  
  /* If this thread is parked, put it into state RUNNING and send it a
 signal.  */
  if (compare_and_swap 
  (ptr, Thread::THREAD_PARK_PARKED, Thread::THREAD_PARK_RUNNING))
{
  pthread_mutex_lock (&mutex);
  pthread_cond_signal (&cond);
  pthread_mutex_unlock (&mutex);
}
}

/**
 * Sets our state to dead.
 */
void
ParkHelper::deactivate ()
{
  permit = ::java::lang::Thread::THREAD_PARK_DEAD;
}

/**
 * Blocks the thread until a matching _Jv_ThreadUnpark() occurs, the
 * thread is interrupted or the optional timeout expires.  If an
 * unpark call has already occurred, this also counts.  A timeout
 * value of zero is defined as no timeout.  When isAbsolute is true,
 * the timeout is in milliseconds relative to the epoch.  Otherwise,
 * the value is the number of nanoseconds which must occur before
 * timeout.  This call may also return spuriously (i.e.  for no
 * apparent reason).
 *
 * @param isAbsolute true if the timeout is specified in milliseconds from
 *   the epoch.
 * @param time either the number of nanoseconds to wait, or a time in
 * milliseconds from the epoch to wait for.
 */
void
ParkHelper::park (jboolean isAbsolute, jlong time)
{
  using namespace ::java::lang;
  volatile obj_addr_t *ptr = &permit;

  /* If we have a permit, return immediately.  */
  if (compare_and_swap 
  (ptr, Thread::THREAD_PARK_PERMIT, Thread::THREAD_PARK_RUNNING))
return;

  struct timespec ts;
  jlong millis = 0, nanos = 0;

  if (time)
{
  if (isAbsolute)
{
  millis = time;
  nanos = 0;
}
  else
{
  millis = java::lang::System::currentTimeMillis();
  nanos = time;
}

  if (millis > 0 || nanos > 0)
{
  // Calculate the abstime corresponding to the timeout.
  // Everything is in milliseconds.
  //
  // We use `unsigned long long' rather than jlong because our
  // caller may pass up to Long.MAX_VALUE millis.  This would
  // overflow the range of a timespec.

  unsigned long long m = (unsigned long long)millis;
  unsigned long long seconds = m / 1000; 

  ts.tv_sec = seconds;
  if (ts.tv_sec < 0 || (unsigned long long)ts.tv_sec != seconds)
{
  // We treat a timeout that won't fit into a struct timespec
  // as a wait forever.
  millis = nanos = 0;
}
  else
{
  m %= 1000;
  ts.tv_nsec = m * 100 + (unsigned long long)nanos;
}
}
}
  
  if (compare_and_swap 
  (ptr, Thread::THREAD_PARK_RUNNING, Thread::THREAD_PARK_PARKED))
{
  pthread_mutex_lock (&mutex);
  if (millis == 0 && nanos == 0)
pthread_cond_wait (&cond, &mutex);
  else
pthread_cond_timedwait (&cond, &mutex, &ts);
  pthread_mutex_unlock (&mutex);
  
  /* If we were unparked by some other thread, this will already
 be in state THREAD_PARK_RUNNING.  If we timed out, we have to
 do it ourself.  */
  compare_and_swap 
(ptr, Thread::THREAD_PARK_PARKED, Thread::THREAD_PARK_RUNNING);
}
}




Re: J2SE compliant RE for Arm Linux

2007-06-27 Thread Robert Lougher

Hi,

Park and unpark are empty stubs, but everything else should be
implemented...  If anybody can tell me what park/unpark should do,
I'll implement them too!

Rob.

On 6/27/07, Christian Thalinger <[EMAIL PROTECTED]> wrote:

On Wed, 2007-06-27 at 12:47 +0200, Christian Thalinger wrote:
> java.lang.UnsatisfiedLinkError: putObject
>
> I'll implement the missing sun.misc.Unsafe functions and get back to
> you.

Hi!

I've implemented putObject and park (only an empty stub, like jamvm).
If more is missing, let me know.

- twisti






Re: J2SE compliant RE for Arm Linux

2007-06-27 Thread Christian Thalinger
On Wed, 2007-06-27 at 12:47 +0200, Christian Thalinger wrote:
> java.lang.UnsatisfiedLinkError: putObject
> 
> I'll implement the missing sun.misc.Unsafe functions and get back to
> you.

Hi!

I've implemented putObject and park (only an empty stub, like jamvm).
If more is missing, let me know.

- twisti



Re: J2SE compliant RE for Arm Linux

2007-06-27 Thread Christian Thalinger
On Wed, 2007-06-27 at 10:16 +0200, Søren Boll Overgaard wrote:
> [EMAIL PROTECTED]:~/classes$ /usr/local/cacao/bin/cacao
> LinkedBlockingQueueTest
> Exception in thread "main" java.lang.IllegalMonitorStateException
>at java.util.concurrent.locks.ReentrantLock
> $Sync.tryRelease(ReentrantLock.java:126)
>at
> java.util.concurrent.locks.AbstractQueuedSynchronizer.release(AbstractQueuedSynchronizer.java:1139)
>at
> java.util.concurrent.locks.ReentrantLock.unlock(ReentrantLock.java:430)
>at
> java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:368)
>at LinkedBlockingQueueTest.main(LinkedBlockingQueueTest.java:9)
> [EMAIL PROTECTED]:~/classes$ 
> 
> I am using classpath 0.95 and cacao with the following options:

Hi!

Funny that the real exception is hidden somewhere:

java.lang.UnsatisfiedLinkError: putObject

I'll implement the missing sun.misc.Unsafe functions and get back to
you.

- twisti



Re: J2SE compliant RE for Arm Linux

2007-06-27 Thread Mario Torre
Il giorno mer, 27/06/2007 alle 10.16 +0200, Søren Boll Overgaard ha
scritto:

> Anyway, let me just run the error I am seeing by you, and if it's
> genuine (and not due to a screw up on my part) I will file an
> appropriate bug:
> 
> Running a simple program like this:
> 
> import java.util.concurrent.LinkedBlockingQueue;
> 
> public class LinkedBlockingQueueTest {
>   public static void main(String[] args) {
>   LinkedBlockingQueue q = new 
> LinkedBlockingQueue();
>   try {
>   q.take();
>   } catch (InterruptedException e) {
>   e.printStackTrace();
>   }
>   }
> }

Hi Søren,

Works for me on an i386 (dual core) with jamvm: The program waits
forever doing nothing :). I don't have cacao ATM to test it.

Could you give a look at jamvm, maybe this is a bug triggered with
cacao?

Mario
-- 
Lima Software - http://www.limasoftware.net/
GNU Classpath Developer - http://www.classpath.org/
Fedora Ambassador - http://fedoraproject.org/wiki/MarioTorre
Jabber: [EMAIL PROTECTED]
pgp key: http://subkeys.pgp.net/ PGP Key ID: 80F240CF
Fingerprint: BA39 9666 94EC 8B73 27FA  FC7C 4086 63E3 80F2 40CF

Please, support open standards:
http://opendocumentfellowship.org/petition/
http://www.nosoftwarepatents.com/


signature.asc
Description: Questa è una parte del messaggio	firmata digitalmente


Re: J2SE compliant RE for Arm Linux

2007-06-27 Thread Søren Boll Overgaard
Hi Andrew,

Thank you very much for your reply.

On Sun, 2007-06-24 at 22:18 +0100, Andrew John Hughes wrote:
> > As part of my switch to a new job, I've been trying to convince my
> > employers to switch from C++ to java on an embedded ARM based platform.
> >
> > However, in order for the switch to be reasonably painless, we will need
> > a J2SE compliant (although we don't need any GUI components) runtime
> > environment for the embedded platform. I've been looking at various
> > alternatives based on GNU classpath (as well as a few others). They
> > include jamvm, mika, PERC, kaffe, gcj and a few more. So far, none of
> > the the platforms I've been looking at (except PERC, which is
> > prohibitively priced) support J2SE 5.0. Thus, my question is, can you
> > provide me with a pointer to a J2SE 5.0 JRE (GNU classpath based or
> > otherwise) which will run on an ARM Linux platform?
> 
> Hi Søren,
> 
> It really depends what you mean by a 'J2SE 5.0 JRE' -- what particular 
> features have you found lacking in the solutions you've tried?  GNU Classpath 
> itself should support 95%+ of the 1.5 API, and, as of the 0.95 release, is 
> only buildable with a 1.5 supporting compiler.  Personally, I've been using 
> JamVM with 1.5 stuff for about the last three years.
>
> If there is something missing, please file a bug with the respective project 
> and let them know (GNU Classpath for library classes, the appropriate VM 
> otherwise).  Which version of gcj and kaffe did you try?  These projects 
> differ quite significantly between their current release versions and the 
> version in their source repositories, and don't (as yet) directly use GNU 
> Classpath, so there is some delay between code being written there and being 
> imported into their own local tree.
> 
> Hope that helps,

Thanks for your input.

JamVM and CACAO currently look to be the most promising candidates. I am
however having trouble with GNU classpath. Specifically, the
LinkedBlockingQueue and NetworkInterface classes. Hmm, I just now
realised that upgrading to Classpath 0.95 fixes the
NetworkInterface.getNetworkInterface() method.

Anyway, let me just run the error I am seeing by you, and if it's
genuine (and not due to a screw up on my part) I will file an
appropriate bug:

Running a simple program like this:

import java.util.concurrent.LinkedBlockingQueue;

public class LinkedBlockingQueueTest {
public static void main(String[] args) {
LinkedBlockingQueue q = new 
LinkedBlockingQueue();
try {
q.take();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

Results in the following error:

[EMAIL PROTECTED]:~/classes$ /usr/local/cacao/bin/cacao
LinkedBlockingQueueTest
Exception in thread "main" java.lang.IllegalMonitorStateException
   at java.util.concurrent.locks.ReentrantLock
$Sync.tryRelease(ReentrantLock.java:126)
   at
java.util.concurrent.locks.AbstractQueuedSynchronizer.release(AbstractQueuedSynchronizer.java:1139)
   at
java.util.concurrent.locks.ReentrantLock.unlock(ReentrantLock.java:430)
   at
java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:368)
   at LinkedBlockingQueueTest.main(LinkedBlockingQueueTest.java:9)
[EMAIL PROTECTED]:~/classes$ 

I am using classpath 0.95 and cacao with the following options:

Configure/Build options:

  ./configure:
'--with-classpath-classes=/usr/local/share/classpath/glibj.zip'
'--with-classpath-includedir=/usr/local/include/'
'--with-classpath-libdir=/usr/local/lib/' '--disable-disassembler'
  CC :  (4.1.2 (Ubuntu 4.1.2-0ubuntu4))
  CFLAGS : -O2 -g3 -D__I386__ -D__LINUX__ -ansi -pedantic -Wall
-Wno-long-long -D_POSIX_C_SOURCE=199506L -D_XOPEN_SOURCE=500
-D_XOPEN_SOURCE_EXTENDED -D_BSD_SOURCE

Default variables:

  maximum heap size  : 134217728
  initial heap size  : 2097152
  stack size : 65536

java.boot.class.path   : 
/usr/local/cacao/share/cacao/vm.zip:/usr/local/share/classpath/glibj.zip
  gnu.classpath.boot.library.path: /usr/local/lib//classpath

Runtime variables:

  maximum heap size  : 134217728
  initial heap size  : 2097152
  stack size : 65536
  libjvm.so  : /usr/local/cacao/lib/libjvm

java.boot.class.path   : 
/usr/local/cacao/share/cacao/vm.zip:/usr/local/share/classpath/glibj.zip
  gnu.classpath.boot.library.path: /usr/local/lib//classpath
  java.class.path: .

Again, thanks for your input.

-- 
Søren O.

"Oh, bother" said the Borg, "we've assimilated Pooh".