# HG changeset patch
# Parent 87996b609980490754b407be213a40f78c370433
diff -r 87996b609980 -r c03372e3a0f2 agent/src/share/classes/sun/jvm/hotspot/CommandProcessor.java
--- a/agent/src/share/classes/sun/jvm/hotspot/CommandProcessor.java
+++ b/agent/src/share/classes/sun/jvm/hotspot/CommandProcessor.java
@@ -68,6 +68,7 @@
 import sun.jvm.hotspot.runtime.CompilerThread;
 import sun.jvm.hotspot.runtime.JavaThread;
 import sun.jvm.hotspot.runtime.JavaVFrame;
+import sun.jvm.hotspot.runtime.ParkEvent;
 import sun.jvm.hotspot.runtime.Threads;
 import sun.jvm.hotspot.runtime.VM;
 import sun.jvm.hotspot.tools.ObjectHistogram;
@@ -1678,6 +1679,16 @@
                 }
             }
         },
+        new Command("parkevents", false) {
+            public void doit(Tokens t) {
+                if (t.countTokens() != 0) {
+                    usage();
+                } else {
+                    long pll = ParkEvent.getFreeList().getFreeListLength();
+                    out.println("ParkEvent list length: " + pll);
+                }
+            }
+        },
     };
 
     private boolean verboseExceptions = false;
diff -r 87996b609980 -r c03372e3a0f2 agent/src/share/classes/sun/jvm/hotspot/runtime/ParkEvent.java
--- /dev/null
+++ b/agent/src/share/classes/sun/jvm/hotspot/runtime/ParkEvent.java
@@ -0,0 +1,60 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+
+package sun.jvm.hotspot.runtime;
+
+import java.util.Observable;
+import java.util.Observer;
+import sun.jvm.hotspot.debugger.Address;
+import sun.jvm.hotspot.types.AddressField;
+import sun.jvm.hotspot.types.Type;
+import sun.jvm.hotspot.types.TypeDataBase;
+
+/**
+ *
+ * @author mgerdin
+ */
+public class ParkEvent extends VMObject {
+    
+    private static AddressField freeListField;
+    private static AddressField nextFreeField;
+    
+    private static long ParkEventSize = 0;
+    
+    static {
+        VM.registerVMInitializedObserver(new Observer() {
+
+            public void update(Observable o, Object arg) {
+                initialize(VM.getVM().getTypeDataBase());
+            }
+        });
+    }
+    
+    private static synchronized void initialize(TypeDataBase db) {
+        Type type = db.lookupType("ParkEvent");
+        ParkEventSize = type.getSize();
+        freeListField = type.getAddressField("FreeList");
+        nextFreeField = type.getAddressField("FreeNext");
+    }
+    
+    public ParkEvent(Address addr) {
+        super(addr);    
+    }
+    
+    public long getFreeListLength() {
+        Address p = freeListField.getValue();
+        int count = 0;
+        while (p != null) {
+            count += 1;
+            p = nextFreeField.getAddress(p);
+        }
+        return count * ParkEventSize;
+    }
+    
+    public static ParkEvent getFreeList() {
+        return new ParkEvent(freeListField.getAddress());
+    }
+}
diff -r 87996b609980 -r c03372e3a0f2 src/share/vm/runtime/park.cpp
--- a/src/share/vm/runtime/park.cpp
+++ b/src/share/vm/runtime/park.cpp
@@ -51,7 +51,7 @@
 // immediately.
 
 volatile int ParkEvent::ListLock = 0 ;
-ParkEvent * volatile ParkEvent::FreeList = NULL ;
+ParkEvent* ParkEvent::FreeList = NULL ;
 
 ParkEvent * ParkEvent::Allocate (Thread * t) {
   // In rare cases -- JVM_RawMonitor* operations -- we can find t == null.
diff -r 87996b609980 -r c03372e3a0f2 src/share/vm/runtime/park.hpp
--- a/src/share/vm/runtime/park.hpp
+++ b/src/share/vm/runtime/park.hpp
@@ -116,6 +116,7 @@
 
 
 class ParkEvent : public os::PlatformEvent {
+  friend class VMStructs;
   private:
     ParkEvent * FreeNext ;
 
@@ -139,7 +140,7 @@
 
 
   private:
-    static ParkEvent * volatile FreeList ;
+    static ParkEvent * FreeList ;
     static volatile int ListLock ;
 
     // It's prudent to mark the dtor as "private"
diff -r 87996b609980 -r c03372e3a0f2 src/share/vm/runtime/vmStructs.cpp
--- a/src/share/vm/runtime/vmStructs.cpp
+++ b/src/share/vm/runtime/vmStructs.cpp
@@ -936,6 +936,9 @@
                                                                                                                                      \
   volatile_nonstatic_field(OSThread,           _interrupted,                                  jint)                                  \
                                                                                                                                      \
+  static_field(ParkEvent, FreeList, ParkEvent* volatile) \
+  nonstatic_field(ParkEvent, FreeNext, ParkEvent*) \
+                                                                                                                                     \
   /************************/                                                                                                         \
   /* OopMap and OopMapSet */                                                                                                         \
   /************************/                                                                                                         \
@@ -1593,6 +1596,10 @@
   declare_toplevel_type(OSThread)                                         \
   declare_toplevel_type(JavaFrameAnchor)                                  \
                                                                           \
+  declare_toplevel_type(ParkEvent) \
+  declare_toplevel_type(ParkEvent*) \
+  declare_toplevel_type(ParkEvent* volatile) \
+                                                                          \
   /***************/                                                       \
   /* Interpreter */                                                       \
   /***************/                                                       \
