hotspot/src/share/vm/gc_implementation/shared/markSweep.hpp

Print this page
rev 611 : Merge

@@ -1,10 +1,10 @@
 #ifdef USE_PRAGMA_IDENT_HDR
 #pragma ident "@(#)markSweep.hpp        1.67 07/05/17 15:52:55 JVM"
 #endif
 /*
- * Copyright 1997-2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * Copyright 1997-2008 Sun Microsystems, Inc.  All Rights Reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License version 2 only, as
  * published by the Free Software Foundation.

@@ -47,59 +47,63 @@
 #define VALIDATE_MARK_SWEEP_ONLY(code) code
 #else
 #define VALIDATE_MARK_SWEEP_ONLY(code)
 #endif
 
-
 // declared at end
 class PreservedMark;
 
 class MarkSweep : AllStatic {
   //
-  // In line closure decls
+  // Inline closure decls
   //
-
-  class FollowRootClosure: public OopsInGenClosure{ 
+  class FollowRootClosure: public OopsInGenClosure {
    public:
-    void do_oop(oop* p) { follow_root(p); }
+    virtual void do_oop(oop* p);
+    virtual void do_oop(narrowOop* p);
     virtual const bool do_nmethods() const { return true; }
   };
 
   class MarkAndPushClosure: public OopClosure {
    public:
-    void do_oop(oop* p) { mark_and_push(p); }
+    virtual void do_oop(oop* p);
+    virtual void do_oop(narrowOop* p);
     virtual const bool do_nmethods() const { return true; }
   };
 
   class FollowStackClosure: public VoidClosure {
    public:
-    void do_void() { follow_stack(); }
+    virtual void do_void();
   };
 
   class AdjustPointerClosure: public OopsInGenClosure {
+   private:
     bool _is_root;
    public:
     AdjustPointerClosure(bool is_root) : _is_root(is_root) {}
-    void do_oop(oop* p) { _adjust_pointer(p, _is_root); }
+    virtual void do_oop(oop* p);
+    virtual void do_oop(narrowOop* p);
   };
 
   // Used for java/lang/ref handling
   class IsAliveClosure: public BoolObjectClosure {
    public:
-    void do_object(oop p) { assert(false, "don't call"); }
-    bool do_object_b(oop p) { return p->is_gc_marked(); }
+    virtual void do_object(oop p);
+    virtual bool do_object_b(oop p);
   };
 
   class KeepAliveClosure: public OopClosure {
+   protected:
+    template <class T> void do_oop_work(T* p);
    public:
-    void do_oop(oop* p);
+    virtual void do_oop(oop* p);
+    virtual void do_oop(narrowOop* p);
   };
 
   //
   // Friend decls
   //
-
   friend class AdjustPointerClosure;
   friend class KeepAliveClosure;
   friend class VM_MarkSweep;
   friend void marksweep_init();
 

@@ -121,18 +125,18 @@
   
   // Reference processing (used in ...follow_contents)
   static ReferenceProcessor*             _ref_processor;
 
 #ifdef VALIDATE_MARK_SWEEP
-  static GrowableArray<oop*>*            _root_refs_stack;
+  static GrowableArray<void*>*           _root_refs_stack;
   static GrowableArray<oop> *            _live_oops;
   static GrowableArray<oop> *            _live_oops_moved_to;
   static GrowableArray<size_t>*          _live_oops_size;
   static size_t                          _live_oops_index;
   static size_t                          _live_oops_index_at_perm;
-  static GrowableArray<oop*>*            _other_refs_stack;
-  static GrowableArray<oop*>*            _adjusted_pointers;
+  static GrowableArray<void*>*           _other_refs_stack;
+  static GrowableArray<void*>*           _adjusted_pointers;
   static bool                            _pointer_tracking;
   static bool                            _root_tracking;
 
   // The following arrays are saved since the time of the last GC and
   // assist in tracking down problems where someone has done an errant

@@ -147,11 +151,10 @@
   static GrowableArray<HeapWord*> *      _last_gc_live_oops;
   static GrowableArray<HeapWord*> *      _last_gc_live_oops_moved_to;
   static GrowableArray<size_t>*          _last_gc_live_oops_size;
 #endif
 
-
   // Non public closures
   static IsAliveClosure is_alive;
   static KeepAliveClosure keep_alive;
 
   // Class unloading. Update subklass/sibling/implementor links at end of marking phase.

@@ -171,43 +174,33 @@
   // Reference Processing
   static ReferenceProcessor* const ref_processor() { return _ref_processor; }
 
   // Call backs for marking
   static void mark_object(oop obj);
-  static void follow_root(oop* p);        // Mark pointer and follow contents. Empty marking
-
-                                          // stack afterwards.
-
-  static void mark_and_follow(oop* p);    // Mark pointer and follow contents.
-  static void _mark_and_push(oop* p);     // Mark pointer and push obj on
-                                          // marking stack.
-
-  
-  static void mark_and_push(oop* p) {     // Check mark and maybe push on
-                                          // marking stack
-    // assert(Universe::is_reserved_heap((oop)p), "we should only be traversing objects here");
-    oop m = *p;
-    if (m != NULL && !m->mark()->is_marked()) {
-      _mark_and_push(p);
-    }
-  }
+  // Mark pointer and follow contents.  Empty marking stack afterwards.
+  template <class T> static inline void follow_root(T* p);
+  // Mark pointer and follow contents.
+  template <class T> static inline void mark_and_follow(T* p);
+  // Check mark and maybe push on marking stack
+  template <class T> static inline void mark_and_push(T* p);
 
   static void follow_stack();             // Empty marking stack.
 
-
-  static void preserve_mark(oop p, markOop mark);       // Save the mark word so it can be restored later
+  static void preserve_mark(oop p, markOop mark);
+                                // Save the mark word so it can be restored later
   static void adjust_marks();             // Adjust the pointers in the preserved marks table
   static void restore_marks();            // Restore the marks that we saved in preserve_mark
 
-  static void _adjust_pointer(oop* p, bool isroot);
+  template <class T> static inline void adjust_pointer(T* p, bool isroot);
   
-  static void adjust_root_pointer(oop* p) { _adjust_pointer(p, true); }
-  static void adjust_pointer(oop* p)      { _adjust_pointer(p, false); }
+  static void adjust_root_pointer(oop* p)  { adjust_pointer(p, true); }
+  static void adjust_pointer(oop* p)       { adjust_pointer(p, false); }
+  static void adjust_pointer(narrowOop* p) { adjust_pointer(p, false); }
 
 #ifdef VALIDATE_MARK_SWEEP
-  static void track_adjusted_pointer(oop* p, oop newobj, bool isroot);
-  static void check_adjust_pointer(oop* p);     // Adjust this pointer
+  static void track_adjusted_pointer(void* p, bool isroot);
+  static void check_adjust_pointer(void* p);
   static void track_interior_pointers(oop obj);
   static void check_interior_pointers();
 
   static void reset_live_oop_tracking(bool at_perm);
   static void register_live_oop(oop p, size_t size);

@@ -224,11 +217,10 @@
 
   // Call backs for class unloading
   static void revisit_weak_klass_link(Klass* k);  // Update subklass/sibling/implementor links at end of marking.
 };
 
-
 class PreservedMark VALUE_OBJ_CLASS_SPEC {
 private:
   oop _obj;
   markOop _mark;