[vmkit-commits] [vmkit] r60350 - in /vmkit/trunk: include/mvm/VirtualMachine.h lib/JnJVM/VMCore/JavaThread.cpp lib/JnJVM/VMCore/JavaThread.h lib/JnJVM/VMCore/Jnjvm.cpp lib/JnJVM/VMCore/Jnjvm.h lib/JnJVM/VMCore/JnjvmClassLoader.cpp lib/Mvm/GCMmap2/gccollector.h

Nicolas Geoffray nicolas.geoffray at lip6.fr
Mon Dec 1 04:30:07 PST 2008


Author: geoffray
Date: Mon Dec  1 06:30:05 2008
New Revision: 60350

URL: http://llvm.org/viewvc/llvm-project?rev=60350&view=rev
Log:
More fixes for SERVICE execution.


Modified:
    vmkit/trunk/include/mvm/VirtualMachine.h
    vmkit/trunk/lib/JnJVM/VMCore/JavaThread.cpp
    vmkit/trunk/lib/JnJVM/VMCore/JavaThread.h
    vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp
    vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.h
    vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp
    vmkit/trunk/lib/Mvm/GCMmap2/gccollector.h

Modified: vmkit/trunk/include/mvm/VirtualMachine.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/include/mvm/VirtualMachine.h?rev=60350&r1=60349&r2=60350&view=diff

==============================================================================
--- vmkit/trunk/include/mvm/VirtualMachine.h (original)
+++ vmkit/trunk/include/mvm/VirtualMachine.h Mon Dec  1 06:30:05 2008
@@ -56,7 +56,10 @@
   uint64_t executionTime;
   uint64_t numThreads;
   CompilationUnit* CU;
-  void stopService();
+  virtual void stopService() {}
+
+  uint64_t memoryLimit;
+  uint64_t executionLimit;
 #endif
 
   mvm::Allocator gcAllocator;

Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaThread.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaThread.cpp?rev=60350&r1=60349&r2=60350&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaThread.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaThread.cpp Mon Dec  1 06:30:05 2008
@@ -16,6 +16,7 @@
 #include "JavaJIT.h"
 #include "JavaObject.h"
 #include "JavaThread.h"
+#include "JavaUpcalls.h"
 #include "Jnjvm.h"
 
 
@@ -37,6 +38,11 @@
   interruptFlag = 0;
   state = StateRunning;
   pendingException = 0;
+#ifdef SERVICE
+  if (isolate->upcalls->newThrowable) {
+    ServiceException = isolate->upcalls->newThrowable->doNew(isolate);
+  }
+#endif
 }
 
 JavaThread::~JavaThread() {}

Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaThread.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaThread.h?rev=60350&r1=60349&r2=60350&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaThread.h (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaThread.h Mon Dec  1 06:30:05 2008
@@ -105,6 +105,10 @@
     print(buf);
     return buf->contents()->cString();
   }
+
+#ifdef SERVICE
+  JavaObject* ServiceException;
+#endif
   
 private:
   virtual void internalClearException() {

Modified: vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp?rev=60350&r1=60349&r2=60350&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp Mon Dec  1 06:30:05 2008
@@ -751,10 +751,12 @@
   upcalls->newString->resolveClass();
   void* stringVT = ((void*)upcalls->newString->getVirtualVT());
   uint32 size = upcalls->newString->virtualTableSize * sizeof(void*);
-  JavaString::internStringVT = bootstrapLoader->allocator.Allocate(size);
-  memcpy(JavaString::internStringVT, stringVT, size);
-  ((void**)(JavaString::internStringVT))[VT_DESTRUCTOR_OFFSET] = 
-    (void*)(uintptr_t)JavaString::stringDestructor;
+  if (!JavaString::internStringVT) {
+    JavaString::internStringVT = bootstrapLoader->allocator.Allocate(size);
+    memcpy(JavaString::internStringVT, stringVT, size);
+    ((void**)(JavaString::internStringVT))[VT_DESTRUCTOR_OFFSET] = 
+      (void*)(uintptr_t)JavaString::stringDestructor;
+  }
   upcalls->newString->initialiseClass(this);
 
   // To make classes non GC-allocated, we have to bypass the tracer
@@ -888,6 +890,10 @@
 
   vm->loadBootstrap();
 
+#ifdef SERVICE
+  thread->ServiceException = vm->upcalls->newThrowable->doNew(vm);
+#endif
+
   ClArgumentsInfo& info = vm->argumentsInfo;
   
   if (info.agents.size()) {
@@ -920,7 +926,7 @@
 
 #include <signal.h>
 
-extern void terminationHandler(int, siginfo_t*, void*);
+extern void terminationHandler(int);
 
 static void serviceCPUMonitor(mvm::Thread* th) {
   while (true) {
@@ -944,16 +950,22 @@
     
     argumentsInfo.argv = argumentsInfo.argv + pos - 1;
     argumentsInfo.argc = argumentsInfo.argc - pos + 1;
-    
-    bootstrapThread = new JavaThread(0, 0, this);
-    bootstrapThread->start((void (*)(mvm::Thread*))mainJavaStart);
 #ifdef SERVICE
-    mvm::Thread* th = new JavaThread(0, 0, this);
-    th->start(serviceCPUMonitor);
     struct sigaction sa;
-    sa.sa_sigaction = terminationHandler;
+    sigset_t mask;
+    sigfillset(&mask);
+    sigaction(SIGUSR1, 0, &sa);
+    sa.sa_mask = mask;
+    sa.sa_handler = terminationHandler;
+    sa.sa_flags |= SA_RESTART;
     sigaction(SIGUSR1, &sa, NULL);
+
+    mvm::Thread* th = new JavaThread(0, 0, this);
+    th->start(serviceCPUMonitor);
 #endif
+    
+    bootstrapThread = new JavaThread(0, 0, this);
+    bootstrapThread->start((void (*)(mvm::Thread*))mainJavaStart);
   } else {
     threadSystem.nonDaemonThreads = 0;
   }
@@ -986,6 +998,11 @@
   IsolateLock.unlock();
 #endif
 
+#ifdef SERVICE
+  memoryLimit = ~0;
+  executionLimit = ~0;
+#endif
+
 }
 
 Jnjvm::~Jnjvm() {

Modified: vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.h?rev=60350&r1=60349&r2=60350&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.h (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.h Mon Dec  1 06:30:05 2008
@@ -332,6 +332,10 @@
   static mvm::LockNormal IsolateLock;
 #endif
 
+#ifdef SERVICE
+  virtual void stopService();
+#endif
+
 };
 
 } // end namespace jnjvm

Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp?rev=60350&r1=60349&r2=60350&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp Mon Dec  1 06:30:05 2008
@@ -254,6 +254,7 @@
   /// a new one each time a class loader is allocated.
   if (isolate->appClassLoader) {
     isolate = gc_new(Jnjvm)(bootstrapLoader);
+    isolate->memoryLimit = 4000000;
     isolate->CU = this;
     mvm::Thread* th = mvm::Thread::get();
     mvm::VirtualMachine* OldVM = th->MyVM;

Modified: vmkit/trunk/lib/Mvm/GCMmap2/gccollector.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/Mvm/GCMmap2/gccollector.h?rev=60350&r1=60349&r2=60350&view=diff

==============================================================================
--- vmkit/trunk/lib/Mvm/GCMmap2/gccollector.h (original)
+++ vmkit/trunk/lib/Mvm/GCMmap2/gccollector.h Mon Dec  1 06:30:05 2008
@@ -157,7 +157,19 @@
 #endif
       collect_unprotect();
     }
-    
+   
+#ifdef SERVICE
+    if (threads->get_nb_threads()) {
+      VirtualMachine* vm = mvm::Thread::get()->MyVM;
+      if (vm->memoryUsed + n > vm->memoryLimit) {
+        fprintf(stderr, "Limite atteinte, tue le bundle\n");
+        unlock();
+        vm->stopService();
+        return 0;
+      }
+    }
+#endif
+
     register GCChunkNode *header = allocator->alloc_chunk(n, 1, current_mark & 1);
 #ifdef SERVICE
     if (threads->get_nb_threads()) {





More information about the vmkit-commits mailing list