Hi!
I build VMKit and run some programs successfully. But when
using java.util.concurrent.locks.ReentrantLock and
java.util.concurrent.locks.Condition,
I catch a Throwable :
java.lang.UnsatisfiedLinkError:
sun.misc.Unsafe.unpark(Ljava/lang/Object;)V
after using the function :
void java.util.concurrent.locks.Condition.await()
My test program is as follows:
*import* *java.lang*.*;
*import* *java.util.Map*;
*import* *java.io*.*;
*import* java.util.concurrent.locks.*;
*class* BoundedBuffer {
Lock lock;
Condition notFull;
Condition notEmpty;
*final* Object[] items = *new* Object[100];
*int* putptr, takeptr, count;
*public* BoundedBuffer(*int* init_count)
{
lock = *new* ReentrantLock();
notFull = lock.newCondition();
notEmpty = lock.newCondition();
count = init_count;
putptr = takeptr = 0;
}
*public* *void* put(Object x) *throws* InterruptedException {
lock.lock();
*try* {
*while* (count == items.length)
notFull.await();
items[putptr] = x;
*if* (++putptr == items.length)
putptr = 0;
++count;
notEmpty.signal();
} *finally* {
lock.unlock();
}
}
*public* Object take() *throws* InterruptedException {
Object x = *null*;
lock.lock();
*try* {
*while* (count == 0)
notEmpty.await();
x = items[takeptr];
*if* (++takeptr == items.length)
takeptr = 0;
--count;
notFull.signal();
} *catch* (Throwable t){
System.*out*.println("BoundedBuffer.catch
" +
t.toString());
} *finally* {
lock.unlock();
}
*return* x;
}
*public* *static* *void* main(String[] args)
*throws*InterruptedException
{
BoundedBuffer buffer = *new* BoundedBuffer(0);
buffer.take();
*return* ;
}
}
Can anyone please tell me why the error?
Thanks!
Li Li
-------------- next part --------------
An HTML attachment was scrubbed...
URL:
<http://lists.llvm.org/pipermail/llvm-dev/attachments/20110112/e588b9c6/attachment.html>
Hi Lilissun, VMKit does not implement all sun.misc.Unsafe methods. Looking at your example, it looks like GNU Classpath (the library that provides java.* classes) rely on sun.misc.Unsafe.unpark, and that the method must be implemented by the VM. Implementing them is not trivial and requires a good understanding of the threading library in VMKit, but I will be happy to help if you want to take a look at it. Cheers, Nicolas On Wed, Jan 12, 2011 at 1:04 PM, Lilissun Li <lilissun at gmail.com> wrote:> Hi! > > I build VMKit and run some programs successfully. But when > using java.util.concurrent.locks.ReentrantLock and java.util.concurrent.locks.Condition, > I catch a Throwable : > > java.lang.UnsatisfiedLinkError: > sun.misc.Unsafe.unpark(Ljava/lang/Object;)V > > after using the function : > > void java.util.concurrent.locks.Condition.await() > > My test program is as follows: > > *import* *java.lang*.*; > > *import* *java.util.Map*; > > *import* *java.io*.*; > > *import* java.util.concurrent.locks.*; > > > > *class* BoundedBuffer { > > Lock lock; > > Condition notFull; > > Condition notEmpty; > > > > *final* Object[] items = *new* Object[100]; > > *int* putptr, takeptr, count; > > > > *public* BoundedBuffer(*int* init_count) > > { > > lock = *new* ReentrantLock(); > > notFull = lock.newCondition(); > > notEmpty = lock.newCondition(); > > > > count = init_count; > > putptr = takeptr = 0; > > } > > > > *public* *void* put(Object x) *throws* InterruptedException { > > lock.lock(); > > *try* { > > *while* (count == items.length) > > notFull.await(); > > items[putptr] = x; > > *if* (++putptr == items.length) > > putptr = 0; > > ++count; > > notEmpty.signal(); > > } *finally* { > > lock.unlock(); > > } > > } > > > > *public* Object take() *throws* InterruptedException { > > Object x = *null*; > > lock.lock(); > > *try* { > > *while* (count == 0) > > notEmpty.await(); > > x = items[takeptr]; > > *if* (++takeptr == items.length) > > takeptr = 0; > > --count; > > notFull.signal(); > > } *catch* (Throwable t){ > > System.*out*.println("BoundedBuffer.catch " + > t.toString()); > > } *finally* { > > lock.unlock(); > > } > > > > *return* x; > > } > > > > *public* *static* *void* main(String[] args) *throws*InterruptedException > > { > > BoundedBuffer buffer = *new* BoundedBuffer(0); > > buffer.take(); > > > > *return* ; > > } > > } > > > Can anyone please tell me why the error? > > Thanks! > > Li Li > > _______________________________________________ > LLVM Developers mailing list > LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev > >-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20110112/0e429336/attachment.html>