[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