[vmkit-commits] [vmkit] r180487 - Refactoring
Peter Senna Tschudin
peter.senna at gmail.com
Thu Apr 25 10:17:16 PDT 2013
Author: peter.senna
Date: Thu Apr 25 12:15:46 2013
New Revision: 180487
URL: http://llvm.org/viewvc/llvm-project?rev=180487&view=rev
Log:
Refactoring
(cherry picked from commit 4a9fc30758e4e76be23e9cd67f48b8056c4c90c8)
Modified:
vmkit/trunk/include/vmkit/Cond.h
vmkit/trunk/lib/j3/Compiler/JavaJITOpcodes.cpp
vmkit/trunk/lib/j3/VMCore/JavaThread.cpp
vmkit/trunk/lib/j3/VMCore/JavaThread.h
vmkit/trunk/lib/vmkit/CommonThread/ctlock.cpp
Modified: vmkit/trunk/include/vmkit/Cond.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/include/vmkit/Cond.h?rev=180487&r1=180486&r2=180487&view=diff
==============================================================================
--- vmkit/trunk/include/vmkit/Cond.h (original)
+++ vmkit/trunk/include/vmkit/Cond.h Thu Apr 25 12:15:46 2013
@@ -26,6 +26,7 @@ public:
void broadcast(void) __attribute__ ((noinline));
void wait(Lock *l) __attribute__ ((noinline));
int timedWait(Lock *l, timeval *tv) __attribute__ ((noinline));
+ int myTimeWait(Lock* l, bool isAbsolute, int64_t nsec) __attribute__ ((noinline));
void signal(void) __attribute__ ((noinline));
};
Modified: vmkit/trunk/lib/j3/Compiler/JavaJITOpcodes.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/Compiler/JavaJITOpcodes.cpp?rev=180487&r1=180486&r2=180487&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/Compiler/JavaJITOpcodes.cpp (original)
+++ vmkit/trunk/lib/j3/Compiler/JavaJITOpcodes.cpp Thu Apr 25 12:15:46 2013
@@ -139,7 +139,7 @@ void JavaJIT::findUnreachableCode(Reader
queue.push(0);
opcodeInfos[0].isReachable = true;
- for (int i = 0; i < codeLen; ++i) {
+ for (unsigned i = 0; i < codeLen; ++i) {
if (opcodeInfos[i].isReachable)
queue.push(i);
}
@@ -367,14 +367,14 @@ void JavaJIT::compileOpcodes(Reader& rea
// However, it looks as this only occur when exception handlers are presented
// I assume this is true, so I only check unreachable code if the method has exception handlers
// nbHandlers
- if (nbHandlers && !opcodeInfos[0].isReachable) {
+ if (!opcodeInfos[0].isReachable) {
findUnreachableCode(reader, codeLength);
reader.cursor = start;
}
vmkit::ThreadAllocator allocator;
for(uint32 i = 0; i < codeLength; ++i) {
- if (nbHandlers && !opcodeInfos[i].isReachable && !opcodeInfos[i].handler) {
+ if (!opcodeInfos[i].isReachable && !opcodeInfos[i].handler) {
continue;
}
reader.cursor = start + i;
Modified: vmkit/trunk/lib/j3/VMCore/JavaThread.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/VMCore/JavaThread.cpp?rev=180487&r1=180486&r2=180487&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/VMCore/JavaThread.cpp (original)
+++ vmkit/trunk/lib/j3/VMCore/JavaThread.cpp Thu Apr 25 12:15:46 2013
@@ -213,22 +213,9 @@ ParkLock::~ParkLock() {
}
-// Fill the structure t with the values from time
-// time is in nanoseconds
-void ParkLock::calculateTime(timeval* t, uint64_t time) {
- uint64_t milli = time / 10;
- //uint64_t microseconds = time; // /1000
- //uint64_t seconds = microseconds / 1000000;
- //microseconds %= 1000000;
- t->tv_sec = milli / 1000;
- t->tv_usec = (milli % 1000) * 1000 + time / 1000;
-}
-
-#include <sys/time.h>
-
// Implementation of method park, see LockSupport.java
// time is in nanoseconds if !isAboslute, otherwise it is in milliseconds
-void ParkLock::park(bool isAbsolute, uint64_t time) {
+void ParkLock::park(bool isAbsolute, int64_t time) {
JavaThread* thread = (JavaThread*)vmkit::Thread::get();
lock.lock();
if (permit == 0){
@@ -237,19 +224,10 @@ void ParkLock::park(bool isAbsolute, uin
lock.unlock(thread);
return;
}
- if (isAbsolute) {
- fprintf(stderr, "PUTA MADRE QUE LO PARIO\n");
- struct timeval tv;
- gettimeofday(&tv, NULL);
- uint64_t l = tv.tv_sec*1000L + tv.tv_usec / 1000; // to milliseconds
- if (time <= l) {
- lock.unlock(thread);
- return;
- }
- time = time - l;
- time *= 1000000; // to nanoseconds
+ if (isAbsolute && time == 0) {
+ lock.unlock(thread);
+ return;
}
-
if (time == 0) {
thread->setState(vmkit::LockingThread::StateWaiting);
permit = 2;
@@ -258,42 +236,28 @@ void ParkLock::park(bool isAbsolute, uin
permit = 1;
}
else {
- timeval t;
- calculateTime(&t, time);
thread->setState(vmkit::LockingThread::StateTimeWaiting);
permit = 2;
__sync_synchronize();
- cond.timedWait(&lock, &t);
+ cond.myTimeWait(&lock, isAbsolute, time);
permit = 1;
}
thread->setState(vmkit::LockingThread::StateRunning);
__sync_synchronize();
- //} catch (InterruptedException e) {
- // permit = 1;
- // th.interrupt();
- //}
lock.unlock(thread);
}
void ParkLock::unpark() {
JavaThread* thread = (JavaThread*)vmkit::Thread::get();
+ bool flag = false;
lock.lock();
- int p = permit;
- if (p != 0) {
- if (p == 2)
- cond.signal();
- else {
- permit = 0;
- __sync_synchronize();
- }
- }
+ if (permit != 0)
+ flag = !__sync_bool_compare_and_swap(&permit, 1, 0);
lock.unlock(thread);
+ if (flag)
+ cond.signal();
}
void ParkLock::interrupt() {
- JavaThread* thread = (JavaThread*)vmkit::Thread::get();
- lock.lock();
- if (permit == 2)
- cond.signal();
- lock.unlock(thread);
+ cond.signal();
}
Modified: vmkit/trunk/lib/j3/VMCore/JavaThread.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/VMCore/JavaThread.h?rev=180487&r1=180486&r2=180487&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/VMCore/JavaThread.h (original)
+++ vmkit/trunk/lib/j3/VMCore/JavaThread.h Thu Apr 25 12:15:46 2013
@@ -64,14 +64,11 @@ private:
vmkit::Cond cond;
int permit;
-
- void calculateTime(timeval* t, uint64_t time);
-
public:
ParkLock();
~ParkLock();
- void park(bool isAbsolute, uint64_t time);
+ void park(bool isAbsolute, int64_t time);
void unpark();
void interrupt();
};
Modified: vmkit/trunk/lib/vmkit/CommonThread/ctlock.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/vmkit/CommonThread/ctlock.cpp?rev=180487&r1=180486&r2=180487&view=diff
==============================================================================
--- vmkit/trunk/lib/vmkit/CommonThread/ctlock.cpp (original)
+++ vmkit/trunk/lib/vmkit/CommonThread/ctlock.cpp Thu Apr 25 12:15:46 2013
@@ -163,6 +163,9 @@ void Cond::signal() {
}
#define BILLION 1000000000
+#define NANOSECS_PER_SEC 1000000000
+#define NANOSECS_PER_MILLISEC 1000000
+#define MAX_SECS 100000000
int Cond::timedWait(Lock* l, struct timeval *ref) {
struct timespec timeout;
struct timeval now;
@@ -173,6 +176,10 @@ int Cond::timedWait(Lock* l, struct time
timeout.tv_sec++;
timeout.tv_nsec -= BILLION;
}
+ if (timeout.tv_sec <= now.tv_sec) {
+ timeout.tv_sec = now.tv_sec;
+ timeout.tv_nsec = NANOSECS_PER_SEC >> 1;
+ }
assert(l->selfOwner());
int n = l->unsafeUnlock();
@@ -184,10 +191,72 @@ int Cond::timedWait(Lock* l, struct time
&timeout);
th->leaveUncooperativeCode();
- //assert((!res || res == ETIMEDOUT) && "Error on timed wait");
+// if (res != 0) {
+// pthread_cond_destroy (&internalCond) ;
+// pthread_cond_init (&internalCond, NULL);
+// }
+
+ assert((!res || res == ETIMEDOUT) && "Error on timed wait");
l->unsafeLock(n);
return res;
}
+
+
+int Cond::myTimeWait(Lock* l, bool isAbsolute, int64_t nsec) {
+ struct timeval now;
+ struct timespec absTime;
+ int status = gettimeofday(&now, NULL);
+ assert(status == 0 && "gettimeofday");
+
+ time_t max_secs = now.tv_sec + MAX_SECS;
+
+ if (isAbsolute) {
+ sint64 secs = nsec / 1000;
+ if (secs > max_secs) {
+ absTime.tv_sec = max_secs;
+ }
+ else {
+ absTime.tv_sec = secs;
+ }
+ absTime.tv_nsec = (nsec % 1000) * NANOSECS_PER_MILLISEC;
+ }
+ else {
+ sint64 secs = nsec / NANOSECS_PER_SEC;
+ if (secs >= MAX_SECS) {
+ absTime.tv_sec = max_secs;
+ absTime.tv_nsec = 0;
+ }
+ else {
+ absTime.tv_sec = now.tv_sec + secs + 850;
+ absTime.tv_nsec = (nsec % NANOSECS_PER_SEC) + now.tv_usec*1000;
+ if (absTime.tv_nsec >= NANOSECS_PER_SEC) {
+ absTime.tv_nsec -= NANOSECS_PER_SEC;
+ ++absTime.tv_sec; // note: this must be <= max_secs
+ }
+ }
+ }
+
+ assert(l->selfOwner());
+ int n = l->unsafeUnlock();
+
+ Thread* th = Thread::get();
+ th->enterUncooperativeCode();
+ int res = pthread_cond_timedwait((pthread_cond_t*)&internalCond,
+ (pthread_mutex_t*)&(l->internalLock),
+ &absTime);
+ th->leaveUncooperativeCode();
+
+ //if (res != 0) {
+ // pthread_cond_destroy (&internalCond) ;
+ // pthread_cond_init (&internalCond, NULL);
+ //}
+
+ assert((!res || res == ETIMEDOUT) && "Error on timed wait");
+ l->unsafeLock(n);
+
+ return res;
+}
+
}
More information about the vmkit-commits
mailing list