[llvm-commits] [vmkit] r50413 - in /vmkit/trunk/lib/Mvm: Allocator/gcchunk.h GCMmap2/MvmGC.h GCMmap2/gc.cpp GCMmap2/gccollector.cpp GCMmap2/gccollector.h GCMmap2/gcinit.cpp

Nicolas Geoffray nicolas.geoffray at lip6.fr
Tue Apr 29 02:47:51 PDT 2008


Author: geoffray
Date: Tue Apr 29 04:47:44 2008
New Revision: 50413

URL: http://llvm.org/viewvc/llvm-project?rev=50413&view=rev
Log:
Improvements for a service environment: 
- A chunk has to know its allocator.
- Statistics are collected when allocating, collecting and destroying
- The GC interface exposes new functions to know if an object has been
  allocated by a specified GC.


Modified:
    vmkit/trunk/lib/Mvm/Allocator/gcchunk.h
    vmkit/trunk/lib/Mvm/GCMmap2/MvmGC.h
    vmkit/trunk/lib/Mvm/GCMmap2/gc.cpp
    vmkit/trunk/lib/Mvm/GCMmap2/gccollector.cpp
    vmkit/trunk/lib/Mvm/GCMmap2/gccollector.h
    vmkit/trunk/lib/Mvm/GCMmap2/gcinit.cpp

Modified: vmkit/trunk/lib/Mvm/Allocator/gcchunk.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/Mvm/Allocator/gcchunk.h?rev=50413&r1=50412&r2=50413&view=diff

==============================================================================
--- vmkit/trunk/lib/Mvm/Allocator/gcchunk.h (original)
+++ vmkit/trunk/lib/Mvm/Allocator/gcchunk.h Tue Apr 29 04:47:44 2008
@@ -24,8 +24,10 @@
  	uintptr_t			 _nbb_mark;	/* nbb = 0 <=> ce chunk est libre */
 	                        /* bit 0-2: la marque */
 	                        /* bit 3: est-on collectable */
-
 public:
+#ifdef SERVICE_GC
+  void* meta; // who allocated me
+#endif
  	static const signed int maskCollectable    = 8;
  	static const signed int maskNotCollectable = 0;
 

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

==============================================================================
--- vmkit/trunk/lib/Mvm/GCMmap2/MvmGC.h (original)
+++ vmkit/trunk/lib/Mvm/GCMmap2/MvmGC.h Tue Apr 29 04:47:44 2008
@@ -13,6 +13,7 @@
 
 #include <sys/types.h>
 #include "mvm/GC/GC.h"
+#include "types.h"
 
 #define gc_allocator std::allocator
 #define gc_new(Class)  __gc_new(Class::VT) Class
@@ -63,7 +64,12 @@
 
 class Collector {
 public:
-
+#ifdef SERVICE_GC
+  uint64 memoryUsed;
+  uint64 gcTriggered;
+  bool isMyObject(const void* o) { return getCollectorFromObject(o) == this; }
+  static Collector* getCollectorFromObject(const void*o);
+#endif
   typedef void (*markerFn)(void*);
   
   static void  initialise(markerFn mark, void *base_sp);

Modified: vmkit/trunk/lib/Mvm/GCMmap2/gc.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/Mvm/GCMmap2/gc.cpp?rev=50413&r1=50412&r2=50413&view=diff

==============================================================================
--- vmkit/trunk/lib/Mvm/GCMmap2/gc.cpp (original)
+++ vmkit/trunk/lib/Mvm/GCMmap2/gc.cpp Tue Apr 29 04:47:44 2008
@@ -254,3 +254,9 @@
   return GC;
 }
 #endif // MULTIPLE_GC
+
+#ifdef SERVICE_GC
+Collector* Collector::getCollectorFromObject(const void* o) {
+  return (Collector*)GCCollector::o2node((void*)o)->meta;
+}
+#endif

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

==============================================================================
--- vmkit/trunk/lib/Mvm/GCMmap2/gccollector.cpp (original)
+++ vmkit/trunk/lib/Mvm/GCMmap2/gccollector.cpp Tue Apr 29 04:47:44 2008
@@ -87,6 +87,9 @@
   GCChunkNode *next;
 
   for(cur=finalizable.next(); cur!=&finalizable; cur=next) {
+#ifdef SERVICE_GC
+    ((Collector*)cur->meta)->memoryUsed -= real_nbb(cur);
+#endif
     register gc_header *c = cur->chunk();
     next = cur->next();
     

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

==============================================================================
--- vmkit/trunk/lib/Mvm/GCMmap2/gccollector.h (original)
+++ vmkit/trunk/lib/Mvm/GCMmap2/gccollector.h Tue Apr 29 04:47:44 2008
@@ -38,6 +38,7 @@
 namespace mvm {
 
 class GCCollector : public Collector {
+  friend class Collector;
 #ifdef HAVE_PTHREAD
   friend class GCThread;
 #endif
@@ -165,17 +166,23 @@
   STATIC inline void *gcmalloc(VirtualTable *vt, size_t n) {
     lock();
     register GCChunkNode *header = allocator->alloc_chunk(n + sizeof(gc_header), 1, current_mark & 1);
-    
+#ifdef SERVICE_GC
+    header->meta = this;
+    memoryUsed += n;
+#endif
     header->append(used_nodes);
     //printf("Allocate %d bytes at %p [%p] %d %d\n", n, header->chunk()->_2gc(),
     //       header, header->nbb(), real_nbb(header));
-    
     register struct gc_header *p = header->chunk();
     p->_XXX_vt = vt;
 
     _since_last_collection -= n;
-    if(_enable_auto && (_since_last_collection <= 0))
+    if(_enable_auto && (_since_last_collection <= 0)) {
+#ifdef SERVICE_GC
+      ++gcTriggered;
+#endif
       collect_unprotect();
+    }
 
     unlock();
     return p->_2gc();
@@ -192,6 +199,10 @@
 
     size_t      old_sz = node->nbb();
     GCChunkNode  *res = allocator->realloc_chunk(desc, node, n+sizeof(gc_header));
+#ifdef SERVICE_GC
+    res->meta = this;
+    memoryUsed += (n - old_sz);
+#endif
 
     if(res != node) {
       res->append(used_nodes);
@@ -201,8 +212,12 @@
     gc_header *obj = res->chunk();
      _since_last_collection -= (n - old_sz);
 
-    if(_enable_auto && (_since_last_collection <= 0))
+    if(_enable_auto && (_since_last_collection <= 0)) {
+#ifdef SERVICE_GC
+      ++gcTriggered;
+#endif
       collect_unprotect();
+    }
 
     unlock();
     return obj->_2gc();

Modified: vmkit/trunk/lib/Mvm/GCMmap2/gcinit.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/Mvm/GCMmap2/gcinit.cpp?rev=50413&r1=50412&r2=50413&view=diff

==============================================================================
--- vmkit/trunk/lib/Mvm/GCMmap2/gcinit.cpp (original)
+++ vmkit/trunk/lib/Mvm/GCMmap2/gcinit.cpp Tue Apr 29 04:47:44 2008
@@ -28,6 +28,8 @@
 void GCCollector::initialise(Collector::markerFn marker) {
  
 #ifdef SERVICE_GC
+  gcTriggered = 0;
+  memoryUsed = 0;
   if (this == bootstrapGC) {
 #endif
   used_nodes = new GCChunkNode();





More information about the llvm-commits mailing list