changeset 3674:8035e71ac3f6 jdk7u2-b08

Merge
author jcoomes
date Mon, 19 Sep 2011 13:17:12 -0700
parents 299ef5b2915d 5a3c2bc614ca
children 17a87e00a541
files .hgtags agent/src/os/solaris/dbx/Makefile agent/src/os/solaris/dbx/README agent/src/os/solaris/dbx/README-commands.txt agent/src/os/solaris/dbx/helloWorld.cpp agent/src/os/solaris/dbx/proc_service_2.h agent/src/os/solaris/dbx/shell_imp.h agent/src/os/solaris/dbx/svc_agent_dbx.cpp agent/src/os/solaris/dbx/svc_agent_dbx.hpp agent/src/os/win32/BasicList.hpp agent/src/os/win32/Buffer.cpp agent/src/os/win32/Buffer.hpp agent/src/os/win32/Dispatcher.cpp agent/src/os/win32/Dispatcher.hpp agent/src/os/win32/Handler.hpp agent/src/os/win32/IOBuf.cpp agent/src/os/win32/IOBuf.hpp agent/src/os/win32/LockableList.hpp agent/src/os/win32/Makefile agent/src/os/win32/Message.hpp agent/src/os/win32/Monitor.cpp agent/src/os/win32/Monitor.hpp agent/src/os/win32/README-commands.txt agent/src/os/win32/README.txt agent/src/os/win32/Reaper.cpp agent/src/os/win32/Reaper.hpp agent/src/os/win32/SwDbgSrv.cpp agent/src/os/win32/SwDbgSrv.dsp agent/src/os/win32/SwDbgSrv.dsw agent/src/os/win32/SwDbgSub.cpp agent/src/os/win32/SwDbgSub.dsp agent/src/os/win32/initWinsock.cpp agent/src/os/win32/initWinsock.hpp agent/src/os/win32/ioUtils.cpp agent/src/os/win32/ioUtils.hpp agent/src/os/win32/isNT4.cpp agent/src/os/win32/isNT4.hpp agent/src/os/win32/libInfo.cpp agent/src/os/win32/libInfo.hpp agent/src/os/win32/nt4internals.cpp agent/src/os/win32/nt4internals.hpp agent/src/os/win32/ports.h agent/src/os/win32/procList.cpp agent/src/os/win32/procList.hpp agent/src/os/win32/serverLists.cpp agent/src/os/win32/serverLists.hpp agent/src/os/win32/toolHelp.cpp agent/src/os/win32/toolHelp.hpp agent/src/share/classes/sun/jvm/hotspot/debugger/dbx/DbxAddress.java agent/src/share/classes/sun/jvm/hotspot/debugger/dbx/DbxDebugger.java agent/src/share/classes/sun/jvm/hotspot/debugger/dbx/DbxDebuggerLocal.java agent/src/share/classes/sun/jvm/hotspot/debugger/dbx/DbxOopHandle.java agent/src/share/classes/sun/jvm/hotspot/debugger/dbx/DbxThreadFactory.java agent/src/share/classes/sun/jvm/hotspot/debugger/dbx/sparc/DbxSPARCThread.java agent/src/share/classes/sun/jvm/hotspot/debugger/dbx/sparc/DbxSPARCThreadContext.java agent/src/share/classes/sun/jvm/hotspot/debugger/dbx/sparc/DbxSPARCThreadFactory.java agent/src/share/classes/sun/jvm/hotspot/debugger/dbx/x86/DbxX86Thread.java agent/src/share/classes/sun/jvm/hotspot/debugger/dbx/x86/DbxX86ThreadContext.java agent/src/share/classes/sun/jvm/hotspot/debugger/dbx/x86/DbxX86ThreadFactory.java agent/src/share/classes/sun/jvm/hotspot/debugger/win32/AddressDataSource.java agent/src/share/classes/sun/jvm/hotspot/debugger/win32/DLL.java agent/src/share/classes/sun/jvm/hotspot/debugger/win32/TestDebugger.java agent/src/share/classes/sun/jvm/hotspot/debugger/win32/TestHelloWorld.java agent/src/share/classes/sun/jvm/hotspot/debugger/win32/Win32Address.java agent/src/share/classes/sun/jvm/hotspot/debugger/win32/Win32CDebugInfoBuilder.java agent/src/share/classes/sun/jvm/hotspot/debugger/win32/Win32CDebugger.java agent/src/share/classes/sun/jvm/hotspot/debugger/win32/Win32Debugger.java agent/src/share/classes/sun/jvm/hotspot/debugger/win32/Win32DebuggerLocal.java agent/src/share/classes/sun/jvm/hotspot/debugger/win32/Win32LDTEntry.java agent/src/share/classes/sun/jvm/hotspot/debugger/win32/Win32LDTEntryConstants.java agent/src/share/classes/sun/jvm/hotspot/debugger/win32/Win32OopHandle.java agent/src/share/classes/sun/jvm/hotspot/debugger/win32/Win32Thread.java agent/src/share/classes/sun/jvm/hotspot/debugger/win32/Win32ThreadContext.java agent/src/share/classes/sun/jvm/hotspot/runtime/amd64/AMD64Frame.java agent/src/share/classes/sun/jvm/hotspot/runtime/amd64/AMD64RegisterMap.java make/hotspot_version make/solaris/makefiles/mapfile-vers-nonproduct src/os/windows/vm/os_windows.cpp src/share/vm/prims/methodHandleWalk.cpp src/share/vm/runtime/reflectionCompat.hpp
diffstat 411 files changed, 12886 insertions(+), 18310 deletions(-) [+]
line wrap: on
line diff
--- a/.hgtags	Wed Sep 14 13:23:54 2011 -0700
+++ b/.hgtags	Mon Sep 19 13:17:12 2011 -0700
@@ -186,6 +186,8 @@
 0cc8a70952c368e06de2adab1f2649a408f5e577 jdk8-b01
 31e253c1da429124bb87570ab095d9bc89850d0a jdk8-b02
 3a2fb61165dfc72e398179a2796d740c8da5b8c0 jdk8-b03
+0fa3ace511fe98fe948e751531f3e2b7c60c8376 jdk8-b04
+dce7d24674f4d0bed00de24f00119057fdce7cfb jdk8-b05
 0cc8a70952c368e06de2adab1f2649a408f5e577 hs22-b01
 7c29742c41b44fb0cd5a13c7ac8834f3f2ca649e hs22-b02
 3a2fb61165dfc72e398179a2796d740c8da5b8c0 hs22-b03
@@ -194,3 +196,5 @@
 2c820a7d4f304ebb6d310187eae20c15d6ced3b0 jdk7u2-b05
 43252bd4c09d30254de3b35148e5ea05e15f2cfb jdk7u2-b06
 8bab8fb7adb060d2dfcf4bb6b19281905fc0edb3 jdk7u2-b07
+513a84dd0f8b56dc0836b4e0bdd5dd0a778fc634 hs22-b05
+650d15d8f37255d3b805aa00c5bd1c30984b203d hs22-b06
--- a/agent/make/Makefile	Wed Sep 14 13:23:54 2011 -0700
+++ b/agent/make/Makefile	Mon Sep 19 13:17:12 2011 -0700
@@ -48,6 +48,7 @@
 sun.jvm.hotspot.bugspot \
 sun.jvm.hotspot.bugspot.tree \
 sun.jvm.hotspot.c1 \
+sun.jvm.hotspot.ci \
 sun.jvm.hotspot.code \
 sun.jvm.hotspot.compiler \
 sun.jvm.hotspot.debugger \
@@ -56,9 +57,6 @@
 sun.jvm.hotspot.debugger.cdbg.basic \
 sun.jvm.hotspot.debugger.cdbg.basic.amd64 \
 sun.jvm.hotspot.debugger.cdbg.basic.x86 \
-sun.jvm.hotspot.debugger.dbx \
-sun.jvm.hotspot.debugger.dbx.sparc \
-sun.jvm.hotspot.debugger.dbx.x86 \
 sun.jvm.hotspot.debugger.dummy \
 sun.jvm.hotspot.debugger.ia64 \
 sun.jvm.hotspot.debugger.linux \
@@ -76,7 +74,6 @@
 sun.jvm.hotspot.debugger.remote.sparc \
 sun.jvm.hotspot.debugger.remote.x86 \
 sun.jvm.hotspot.debugger.sparc \
-sun.jvm.hotspot.debugger.win32 \
 sun.jvm.hotspot.debugger.win32.coff \
 sun.jvm.hotspot.debugger.windbg \
 sun.jvm.hotspot.debugger.windbg.amd64 \
@@ -91,7 +88,9 @@
 sun.jvm.hotspot.jdi \
 sun.jvm.hotspot.livejvm \
 sun.jvm.hotspot.memory \
+sun.jvm.hotspot.opto \
 sun.jvm.hotspot.oops \
+sun.jvm.hotspot.prims \
 sun.jvm.hotspot.runtime \
 sun.jvm.hotspot.runtime.amd64 \
 sun.jvm.hotspot.runtime.ia64 \
@@ -139,6 +138,7 @@
 sun/jvm/hotspot/bugspot/*.java \
 sun/jvm/hotspot/bugspot/tree/*.java \
 sun/jvm/hotspot/c1/*.java \
+sun/jvm/hotspot/ci/*.java \
 sun/jvm/hotspot/code/*.java \
 sun/jvm/hotspot/compiler/*.java \
 sun/jvm/hotspot/debugger/*.java \
@@ -147,9 +147,6 @@
 sun/jvm/hotspot/debugger/cdbg/basic/*.java \
 sun/jvm/hotspot/debugger/cdbg/basic/amd64/*.java \
 sun/jvm/hotspot/debugger/cdbg/basic/x86/*.java \
-sun/jvm/hotspot/debugger/dbx/*.java \
-sun/jvm/hotspot/debugger/dbx/sparc/*.java \
-sun/jvm/hotspot/debugger/dbx/x86/*.java \
 sun/jvm/hotspot/debugger/dummy/*.java \
 sun/jvm/hotspot/debugger/ia64/*.java \
 sun/jvm/hotspot/debugger/linux/*.java \
@@ -165,7 +162,6 @@
 sun/jvm/hotspot/debugger/remote/sparc/*.java \
 sun/jvm/hotspot/debugger/remote/x86/*.java \
 sun/jvm/hotspot/debugger/sparc/*.java \
-sun/jvm/hotspot/debugger/win32/*.java \
 sun/jvm/hotspot/debugger/win32/coff/*.java \
 sun/jvm/hotspot/debugger/windbg/*.java \
 sun/jvm/hotspot/debugger/windbg/ia64/*.java \
@@ -176,6 +172,8 @@
 sun/jvm/hotspot/livejvm/*.java \
 sun/jvm/hotspot/memory/*.java \
 sun/jvm/hotspot/oops/*.java \
+sun/jvm/hotspot/opto/*.java \
+sun/jvm/hotspot/prims/*.java \
 sun/jvm/hotspot/runtime/*.java \
 sun/jvm/hotspot/runtime/amd64/*.java \
 sun/jvm/hotspot/runtime/ia64/*.java \
--- a/agent/make/saenv.sh	Wed Sep 14 13:23:54 2011 -0700
+++ b/agent/make/saenv.sh	Mon Sep 19 13:17:12 2011 -0700
@@ -70,6 +70,14 @@
 
 SA_CLASSPATH=$STARTDIR/../build/classes:$STARTDIR/../src/share/lib/js.jar:$STARTDIR/sa.jar:$STARTDIR/lib/js.jar
 
+if [ ! -z "$SA_TYPEDB" ]; then
+  if [ ! -f $SA_TYPEDB ]; then
+    echo "$SA_TYPEDB is unreadable"
+    exit 1
+  fi
+  OPTIONS="-Dsun.jvm.hotspot.typedb=$SA_TYPEDB ${OPTIONS}"
+fi
+
 OPTIONS="-Djava.system.class.loader=sun.jvm.hotspot.SALauncherLoader ${OPTIONS}"
 
 SA_JAVA_CMD="$SA_PREFIX_CMD $SA_JAVA -showversion ${OPTIONS} -cp $SA_CLASSPATH $SA_OPTIONS"
--- a/agent/make/saenv64.sh	Wed Sep 14 13:23:54 2011 -0700
+++ b/agent/make/saenv64.sh	Mon Sep 19 13:17:12 2011 -0700
@@ -67,6 +67,14 @@
 
 SA_CLASSPATH=$STARTDIR/../build/classes:$STARTDIR/../src/share/lib/js.jar:$STARTDIR/sa.jar::$STARTDIR/lib/js.jar
 
+if [ ! -z "$SA_TYPEDB" ]; then
+  if [ ! -f $SA_TYPEDB ]; then
+    echo "$SA_TYPEDB is unreadable"
+    exit 1
+  fi
+  OPTIONS="-Dsun.jvm.hotspot.typedb=$SA_TYPEDB ${OPTIONS}"
+fi
+
 OPTIONS="-Djava.system.class.loader=sun.jvm.hotspot.SALauncherLoader ${OPTIONS}"
 
 SA_JAVA_CMD="$SA_PREFIX_CMD $SA_JAVA -d64 -showversion ${OPTIONS} -cp $SA_CLASSPATH $SA_OPTIONS"
--- a/agent/src/os/solaris/Makefile	Wed Sep 14 13:23:54 2011 -0700
+++ b/agent/src/os/solaris/Makefile	Mon Sep 19 13:17:12 2011 -0700
@@ -24,9 +24,7 @@
 
 
 all:
-	cd dbx; $(MAKE) all
 	cd proc; $(MAKE) all
 
 clean:
-	cd dbx; $(MAKE) clean
 	cd proc; $(MAKE) clean
--- a/agent/src/os/solaris/dbx/Makefile	Wed Sep 14 13:23:54 2011 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,91 +0,0 @@
-#
-# Copyright (c) 2000, 2003, Oracle and/or its affiliates. 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.
-#
-# This code is distributed in the hope that it will be useful, but WITHOUT
-# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
-# version 2 for more details (a copy is included in the LICENSE file that
-# accompanied this code).
-#
-# You should have received a copy of the GNU General Public License version
-# 2 along with this work; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-#
-# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
-# or visit www.oracle.com if you need additional information or have any
-# questions.
-#  
-#
-
-
-# Targets are:
-#   32bit:  Build the 32 bit version in ./32bit
-#   64bit:  Build the 64 bit version in ./64bit
-#   helloWorld:  Build the helloWorld test program
-#   all:    Build all of the above.  This is the default.
-#
-# NOTE: This makefile uses IOBuf.cpp, IOBuf.hpp, Buffer.cpp, and
-#           Buffer.hpp from the src/os/win32/agent directory.
-
-.PHONY: 32bit 64bit
-
-ARCH_ORIG = $(shell uname -p)
-
-# C++    := /java/devtools/$(ARCH_ORIG)/SUNWspro/SC6.1/bin/CC
-
-C++    := CC
-RM     := /usr/bin/rm
-MKDIRS := /usr/bin/mkdir -p
-
-
-WIN32_DIR := ../../win32
-ARCH     := $(subst i386,i486,$(ARCH_ORIG))
-# INCLUDES := -I/net/sparcworks.eng/export/set/sparcworks5/dbx_62_intg/dev/src/dbx -I$(WIN32_DIR)
-INCLUDES := -I. -I$(WIN32_DIR)
-CFLAGS_32bit := -xarch=v8
-CFLAGS_64bit := -xarch=v9
-CFLAGS   := -PIC -xO3 $(INCLUDES)
-LIBS     := -lsocket -lnsl -lrtld_db
-LDFLAGS  := -G
-
-ifneq "$(ARCH)" "i486"
-    CFLAGS += $(CFLAGS_$(VERSION))
-    LDFLAGS += $(CFLAGS_$(VERSION))
-endif
-
-# We use IOBuf.hpp, IOBuf.cpp, Buffer.hpp, and Buffer.cpp from the win32 dir.
-vpath %.cpp .:$(WIN32_DIR)
-vpath %.hpp .:$(WIN32_DIR)
-
-OBJS = $(VERSION)/svc_agent_dbx.o $(VERSION)/IOBuf.o $(VERSION)/Buffer.o
-
-
-
-# The default is to make both 32 bit and 64 bit versions.
-all:: 32bit 64bit
-
-32bit 64bit:: 
-	$(MKDIRS) $@
-	$(MAKE) $@/libsvc_agent_dbx.so  helloWorld VERSION=$@
-
-$(VERSION)/IOBuf.o: IOBuf.hpp
-$(VERSION)/Buffer.o: Buffer.hpp
-$(VERSION)/svc_agent_dbx.o: svc_agent_dbx.hpp
-
-$(VERSION)/%.o: %.cpp
-	$(C++) $(CFLAGS) -c $< -o $@
-
-$(VERSION)/libsvc_agent_dbx.so:: $(OBJS)
-	$(C++) $(LDFLAGS) -o $(VERSION)/libsvc_agent_dbx.so $(OBJS) $(LIBS)
-
-# Would be nice to move this into a shared directory
-helloWorld:: helloWorld.cpp
-	$(C++) -g $< -o $@
-
-clean::
-	$(RM) -rf 32bit 64bit *.o helloWorld
--- a/agent/src/os/solaris/dbx/README	Wed Sep 14 13:23:54 2011 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,9 +0,0 @@
-shell_impl.h
-proc_service_2.h
-
-The above files are captured from the dbx build environment.
-Rather then use a -I that points to stuff in .eng domain that
-may not be accessible in other domains these files are just
-copied here so local builds in other domains will work.
-These files rarely change so the fact that we might have to
-strobe in new ones on rare occasions is no big deal.
--- a/agent/src/os/solaris/dbx/README-commands.txt	Wed Sep 14 13:23:54 2011 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,82 +0,0 @@
-This import module uses a largely text-based protocol, except for
-certain bulk data transfer operations. All text is in single-byte
-US-ASCII.
-
-Commands understood:
-
-address_size                  ::= <int result>
-
-    Returns 32 if attached to 32-bit process, 64 if 64-bit.
-
-peek_fail_fast <bool arg>     ::=
-
-    Indicates whether "peek" requests should "fail fast"; that is, if
-    any of the addresses in the requested range are unmapped, report
-    the entire range as unmapped. This is substantially faster than
-    the alternative, which is to read the entire range byte-by-byte.
-    However, it should only be used when it is guaranteed by the
-    client application that peeks come from at most one page. The
-    default is that peek_fast_fail is not enabled.
-
-peek <address addr> <unsigned int numBytes> ::=
-    B<binary char success>
-       [<binary unsigned int len> <binary char isMapped> [<binary char data>]...]...
-
-    NOTE that the binary portion of this message is prefixed by the
-    uppercase US-ASCII letter 'B', allowing easier synchronization by
-    clients. There is no data between the 'B' and the rest of the
-    message.
-
-    May only be called once attached. Reads the address space of the
-    target process starting at the given address (see below for format
-    specifications) and extending the given number of bytes. Whether
-    the read succeeded is indicated by a single byte containing a 1 or
-    0 (success or failure). If successful, the return result is given
-    in a sequence of ranges. _len_, the length of each range, is
-    indicated by a 32-bit unsigned integer transmitted with big-endian
-    byte ordering (i.e., most significant byte first).  _isMapped_
-    indicates whether the range is mapped or unmapped in the target
-    process's address space, and will contain the value 1 or 0 for
-    mapped or unmapped, respectively. If the range is mapped,
-    _isMapped_ is followed by _data_, containing the raw binary data
-    for the range. The sum of all ranges' lengths is guaranteed to be
-    equivalent to the number of bytes requested.
-
-poke <address addr> <int numBytes> B[<binary char data>]... ::= <bool result>
-
-    NOTE that the binary portion of this message is prefixed by the
-    uppercase US-ASCII letter 'B', allowing easier synchronization by
-    clients. There is no data between the 'B' and the rest of the
-    message.
-
-    Writes the given data to the target process starting at the given
-    address. Returns 1 on success, 0 on failure (i.e., one or more of
-    target addresses were unmapped).
-
-mapped <address addr> <int numBytes> ::= <bool result>
-
-    Returns 1 if entire address range [address...address + int arg) is
-    mapped in target process's address space, 0 if not
-
-lookup <symbol objName> <symbol sym> ::= <address addr>
-
-    First symbol is object name; second is symbol to be looked up.
-    Looks up symbol in target process's symbol table and returns
-    address. Returns NULL (0x0) if symbol is not found.
-
-thr_gregs <int tid>                  ::= <int numAddresses> <address...>
-
-    Fetch the "general" (integer) register set for the given thread.
-    Returned as a series of hexidecimal values. NOTE: the meaning of
-    the return value is architecture-dependent. In general it is the
-    contents of the prgregset_t.
-
-exit                                 ::=
-
-    Exits the serviceability agent dbx module, returning control to
-    the dbx prompt.
-
-// Data formats and example values:
-<address>      ::=   0x12345678[9ABCDEF0] /* up to 64-bit hex value */
-<unsigned int> ::=   5                    /* up to 32-bit integer number; no leading sign */
-<bool>         ::=   1                    /* ASCII '0' or '1' */
--- a/agent/src/os/solaris/dbx/helloWorld.cpp	Wed Sep 14 13:23:54 2011 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,59 +0,0 @@
-/*
- * Copyright (c) 2000, Oracle and/or its affiliates. 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.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- *
- */
-
-#include <stdio.h>
-#include <inttypes.h>
-
-extern "C" {
-  const char* helloWorldString = "Hello, world!";
-  // Do not change these values without changing TestDebugger.java as well
-  // FIXME: should make these jbyte, jshort, etc...
-  volatile int8_t  testByte     = 132;
-  volatile int16_t testShort    = 27890;
-  volatile int32_t testInt      = 1020304050;
-  volatile int64_t testLong     = 102030405060708090LL;
-  volatile float   testFloat    = 35.4F;
-  volatile double  testDouble   = 1.23456789;
-
-  volatile int helloWorldTrigger = 0;
-}
-
-int
-main(int, char**) {
-  while (1) {
-    while (helloWorldTrigger == 0) {
-    }
-
-    fprintf(stderr, "%s\n", helloWorldString);
-    fprintf(stderr, "testByte=%d\n", testByte);
-    fprintf(stderr, "testShort=%d\n", testShort);
-    fprintf(stderr, "testInt=%d\n", testInt);
-    fprintf(stderr, "testLong=%d\n", testLong);
-    fprintf(stderr, "testFloat=%d\n", testFloat);
-    fprintf(stderr, "testDouble=%d\n", testDouble);
-
-    while (helloWorldTrigger != 0) {
-    }
-  }
-}
--- a/agent/src/os/solaris/dbx/proc_service_2.h	Wed Sep 14 13:23:54 2011 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,172 +0,0 @@
-/*
- * Copyright (c) 2002, Oracle and/or its affiliates. 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.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- *
- */
-
-#ifndef _PROC_SERVICE_2_H
-#define _PROC_SERVICE_2_H
-
-/*
- * Types, function definitions for the provider of services beyond
- * proc_service.  This interface will be used by import modules like
- * BAT/prex, NEO debugger etc.
- */
-
-/*
- CCR info
-
- Version history:
-
-        1.0       - Initial CCR release
-
-        1.1       - Changes for GLUE/neo.
-                    New entry points ps_svnt_generic() and ps_svc_generic()
-                  - New entry point ps_getpid()
-
- Release information for automatic CCR updates:
- BEGIN RELEASE NOTES: (signifies what gets put into CCR release notes)
-        1.2       - Changes to support Solaris 2.7
-
- END RELEASE NOTES: (signifies what gets put into CCR release notes)
-
- Following is used for CCR version number:
-
-#define CCR_PROC_SERVICE_2_VERSION 1.2
-
-*/
-
-
-#include <proc_service.h>
-#include <sys/types.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-struct ps_loadobj {
-        int     objfd;          /* fd of the load object or executable
-                                 * -1 implies its not available.
-                                 * This file decriptor is live only during the
-                                 * particular call to ps_iter_f().  If you
-                                 * need it beyond that you need to dup() it.
-                                 */
-        psaddr_t
-                text_base;      /* address where text of loadobj was mapped */
-        psaddr_t
-                data_base;      /* address where data of loadobj was mapped */
-        const char *objname;    /* loadobj name */
-};
-
-typedef int ps_iter_f(const struct ps_prochandle *, const struct ps_loadobj *,
-                        void *cd);
-
-/*
- * Returns the ps_prochandle for the current process under focus.  Returns
- * NULL if there is none.
- */
-
-const struct ps_prochandle *
-ps_get_prochandle(void);
-
-/*
- * Returns the ps_prochandle for the current process(allows core files to
- * be specified) under focus.  Returns NULL if there is none.
- */
-const struct ps_prochandle *
-ps_get_prochandle2(int cores_too);
-
-/*
- * Returns the pid of the process referred to by the ps_prochandle.
- *
- * 0 is returned in case the ps_prochandle is not valid or refers to dead
- * process.
- *
- */
-pid_t
-ps_getpid(const struct ps_prochandle *);
-
-/*
- * Iteration function that iterates over all load objects *and the
- *      executable*
- *
- *      If the callback routine returns:
- *      0 - continue processing link objects
- *      non zero - stop calling the callback function
- *
- */
-
-ps_err_e
-ps_loadobj_iter(const struct ps_prochandle *, ps_iter_f *, void *clnt_data);
-
-/*
- * Address => function name mapping
- *
- * Given an address, returns a pointer to the function's
- * linker name (null terminated).
- */
-
-ps_err_e
-ps_find_fun_name(const struct ps_prochandle *, psaddr_t addr,
-                        const char **name);
-
-/*
- * Interface to LD_PRELOAD.  LD_PRELOAD given library across the
- * program 'exec'.
- *
- */
-
-/*
- * Append/Prepend the 'lib' (has to be library name as understood by LD_PRELOAD)
- * to the LD_PRELOAD variable setting to be used by the debugee
- * Returns a cookie (in id).
- */
-ps_err_e
-ps_ld_preload_append(const char *lib, int *id);
-ps_err_e
-ps_ld_preload_prepend(const char *lib, int *id);
-
-/*
- * Remove the library associated with 'id' from the LD_PRELOAD setting.
- *
- */
-ps_err_e
-ps_ld_preload_remove(int id);
-
-#ifdef __cplusplus
-}
-#endif
-
-/*
- * The following are C++ only interfaces
- */
-#ifdef __cplusplus
-
-/*
- * classes ServiceDbx and ServantDbx and defined in "gp_dbx_svc.h" which is
- * accessed via CCR
- */
-extern class ServantDbx *ps_svnt_generic();
-extern class ServiceDbx *ps_svc_generic();
-
-#endif
-
-#endif /* _PROC_SERVICE_2_H */
--- a/agent/src/os/solaris/dbx/shell_imp.h	Wed Sep 14 13:23:54 2011 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,164 +0,0 @@
-/*
- * Copyright (c) 2001, Oracle and/or its affiliates. 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.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- *
- */
-
-#ifndef SHELL_IMP_H
-#define SHELL_IMP_H
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include <stdio.h>
-
-/*
- CCR info
-
- Vesrion history:
-
-        1.0       - Initial CCR release
-
- Release information for automatic CCR updates:
-
- BEGIN RELEASE NOTES: (signifies what gets put into CCR release notes)
-        1.1
-                  - Entry points for va_list style msgs; new shell_imp_vmsg()
-                    and shell_imp_verrmsg()
-                  - shell_imp_env_checker() is now shell_imp_var_checker().
-                    Also the var_checker callback gets passed interp.
-        1.2       - interposition framework (used by jdbx)
-                  - access to input FILE pointer.
-
- END RELEASE NOTES: (signifies what gets put into CCR release notes)
-
-Following is used as a CCR version number:
-#define CCR_SHELL_IMP_VERSION 1.1
-*/
-
-#include <stdarg.h>
-
-#define SHELL_IMP_MAJOR 1
-#define SHELL_IMP_MINOR 2
-#define SHELL_IMP_FLAG_GLOB 0x1
-#define SHELL_IMP_FLAG_ARGQ 0x2
-
-typedef void *shell_imp_interp_t;
-typedef void *shell_imp_command_t;
-typedef int shell_imp_fun_t(shell_imp_interp_t, int, char **, void *);
-
-int
-shell_imp_init(
-    int,                /* major version number */
-    int,                /* minor version number */
-    shell_imp_interp_t, /* interpreter */
-    int,                /* argc */
-    char *[]            /* argv */
-);
-
-int
-shell_imp_fini(shell_imp_interp_t);
-
-shell_imp_command_t
-shell_imp_define_command(char *,        /* command name e.g. "tnf" */
-                    shell_imp_fun_t *,  /* callback function */
-                    int,                /* SHELL_IMP_FLAG_* bit vector */
-                    void *,             /* client_data Passed as last arg to
-                                        /* callback function */
-                    char *              /* help message, e.g. */
-                                        /* "enable the specified tnf probes" */
-            );
-
-int
-shell_imp_undefine_command(shell_imp_command_t);
-
-int
-shell_imp_var_checker(shell_imp_interp_t,
-                      const char *,         /* var name */
-                      int (*)(shell_imp_interp_t, const char*) /* env checker */
-                     );
-
-int
-shell_imp_execute(shell_imp_interp_t, const char *);
-
-const char *
-shell_imp_get_var(shell_imp_interp_t, const char *);
-
-void
-shell_imp_msg(shell_imp_interp_t, const char *, ...);
-
-void
-shell_imp_errmsg(shell_imp_interp_t, const char *, ...);
-
-void
-shell_imp_vmsg(shell_imp_interp_t, const char *, va_list);
-
-void
-shell_imp_verrmsg(shell_imp_interp_t, const char *, va_list);
-
-
-
-/*
- * Stuff added for 1.2
- */
-
-struct shell_imp_interposition_info_t {
-    shell_imp_fun_t *
-                new_func;
-    void *      new_client_data;
-    shell_imp_fun_t *
-                original_func;
-    void *      original_client_data;
-    int         original_flags;
-};
-
-typedef int shell_imp_dispatcher_t(shell_imp_interp_t, int, char **,
-                                   shell_imp_interposition_info_t *);
-
-shell_imp_command_t
-shell_imp_interpose(char *name,
-                    shell_imp_fun_t *new_func,
-                    int    flags,
-                    void *client_data,
-                    char * description,
-                    shell_imp_dispatcher_t *);
-
-int shell_imp_uninterpose(shell_imp_command_t);
-
-int
-shell_imp_dispatch_interposition(shell_imp_interp_t,
-                                 shell_imp_interposition_info_t *,
-                                 int argc, char *argv[]);
-
-int
-shell_imp_dispatch_original(shell_imp_interp_t,
-                                 shell_imp_interposition_info_t *,
-                                 int argc, char *argv[]);
-
-FILE *
-shell_imp_cur_input(shell_imp_interp_t);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
--- a/agent/src/os/solaris/dbx/svc_agent_dbx.cpp	Wed Sep 14 13:23:54 2011 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1068 +0,0 @@
-/*
- * Copyright (c) 2000, 2002, Oracle and/or its affiliates. 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.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- *
- */
-
-// This is the implementation of a very simple dbx import module which
-// handles requests from the VM which come in over a socket. The
-// higher-level Java wrapper for dbx starts the debugger, attaches to
-// the process, imports this command, and runs it. After that, the SA
-// writes commands to this agent via its own private communications
-// channel. The intent is to move away from the text-based front-end
-// completely in the near future (no more calling "debug" by printing
-// text to dbx's stdin).
-
-#include <stdio.h>
-#include <errno.h>
-#include <ctype.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <unistd.h>
-#include <string.h>
-#include <stropts.h>
-#include <netinet/in.h>
-#include <netinet/tcp.h>
-
-#include <proc_service.h>
-#include <sys/procfs_isa.h>
-#include <rtld_db.h>
-#include "proc_service_2.h"
-#include "svc_agent_dbx.hpp"
-
-static ServiceabilityAgentDbxModule* module = NULL;
-#define NEEDS_CLEANUP
-
-// Useful for debugging
-#define VERBOSE_DEBUGGING
-
-#ifdef VERBOSE_DEBUGGING
-# define debug_only(x) x
-#else
-# define debug_only(x)
-#endif
-
-// For profiling
-//#define PROFILING
-
-#ifdef PROFILING
-#define PROFILE_COUNT 200
-static Timer scanTimer;
-static Timer workTimer;
-static Timer writeTimer;
-static int numRequests = 0;
-#endif /* PROFILING */
-
-const char* ServiceabilityAgentDbxModule::CMD_ADDRESS_SIZE   = "address_size";
-const char* ServiceabilityAgentDbxModule::CMD_PEEK_FAIL_FAST = "peek_fail_fast";
-const char* ServiceabilityAgentDbxModule::CMD_PEEK           = "peek";
-const char* ServiceabilityAgentDbxModule::CMD_POKE           = "poke";
-const char* ServiceabilityAgentDbxModule::CMD_MAPPED         = "mapped";
-const char* ServiceabilityAgentDbxModule::CMD_LOOKUP         = "lookup";
-const char* ServiceabilityAgentDbxModule::CMD_THR_GREGS      = "thr_gregs";
-const char* ServiceabilityAgentDbxModule::CMD_EXIT           = "exit";
-
-// The initialization routines must not have C++ name mangling
-extern "C" {
-
-/** This is the initialization routine called by dbx upon importing of
-    this module. Returns 0 upon successful initialization, -1 upon
-    failure. */
-int shell_imp_init(int major, int minor,
-                   shell_imp_interp_t interp, int argc, char *argv[])
-{
-  // Ensure shell interpreter data structure is laid out the way we
-  // expect
-  if (major != SHELL_IMP_MAJOR) {
-    debug_only(fprintf(stderr, "Serviceability agent: unexpected value for SHELL_IMP_MAJOR (got %d, expected %d)\n", major, SHELL_IMP_MAJOR);)
-    return -1;
-  }
-  if (minor < SHELL_IMP_MINOR) {
-    debug_only(fprintf(stderr, "Serviceability agent: unexpected value for SHELL_IMP_MINOR (got %d, expected >= %d)\n", minor, SHELL_IMP_MINOR);)
-    return -1;
-  }
-
-  if (module != NULL) {
-    debug_only(fprintf(stderr, "Serviceability agent: module appears to already be initialized (should not happen)\n");)
-    // Already initialized. Should not happen.
-    return -1;
-  }
-
-  module = new ServiceabilityAgentDbxModule(major, minor, interp, argc, argv);
-  if (!module->install()) {
-    debug_only(fprintf(stderr, "Serviceability agent: error installing import module\n");)
-    delete module;
-    module = NULL;
-    return -1;
-  }
-
-  // Installation was successful. Next step will be for the user to
-  // enter the appropriate command on the command line, which will
-  // make the SA's dbx module wait for commands to come in over the
-  // socket.
-  return 0;
-}
-
-/** This is the routine called by dbx upon unloading of this module.
-    Returns 0 upon success, -1 upon failure. */
-int
-shell_imp_fini(shell_imp_interp_t)
-{
-  if (module == NULL) {
-    return -1;
-  }
-
-  bool res = module->uninstall();
-  delete module;
-  module = NULL;
-  if (!res) {
-    return -1;
-  }
-  return 0;
-}
-
-} // extern "C"
-
-/** This is the routine which is called by the dbx shell when the user
-    requests the serviceability agent module to run. This delegates to
-    ServiceabilityAgentDbxModule::run. This routine's signature must
-    match that of shell_imp_fun_t. */
-extern "C" {
-static int
-svc_agent_run(shell_imp_interp_t, int, char **, void *) {
-  if (module == NULL) {
-    return -1;
-  }
-
-  module->run();
-  return 0;
-}
-}
-
-/*
- * Implementation of ServiceabilityAgentDbxModule class
- */
-
-// NOTE: we need to forward declare the special "ps_get_prochandle2"
-// function which allows examination of core files as well. It isn't
-// currently in proc_service_2.h. Note also that it has name mangling
-// because it isn't declared extern "C".
-//const struct ps_prochandle *ps_get_prochandle2(int cores_too);
-
-ServiceabilityAgentDbxModule::ServiceabilityAgentDbxModule(int, int, shell_imp_interp_t interp,
-                                                           int argc, char *argv[])
-  :myComm(32768, 131072)
-{
-  _interp = interp;
-  _argc = argc;
-  _argv = argv;
-  _tdb_agent = NULL;
-  peek_fail_fast = false;
-  libThreadName = NULL;
-}
-
-ServiceabilityAgentDbxModule::~ServiceabilityAgentDbxModule() {
-  if (_command != NULL) {
-    uninstall();
-  }
-}
-
-char*
-readCStringFromProcess(psaddr_t addr) {
-  char c;
-  int num = 0;
-  ps_prochandle* cur_proc = (ps_prochandle*) ps_get_prochandle2(1);
-
-  // Search for null terminator
-  do {
-    if (ps_pread(cur_proc, addr + num, &c, 1) != PS_OK) {
-      return NULL;
-    }
-    ++num;
-  } while (c != 0);
-
-  // Allocate string
-  char* res = new char[num];
-  if (ps_pread(cur_proc, addr, res, num) != PS_OK) {
-    delete[] res;
-    return NULL;
-  }
-  return res;
-}
-
-int
-findLibThreadCB(const rd_loadobj_t* lo, void* data) {
-  ServiceabilityAgentDbxModule* module = (ServiceabilityAgentDbxModule*) data;
-  char* name = readCStringFromProcess(lo->rl_nameaddr);
-  if (strstr(name, "libthread.so") != NULL) {
-    module->libThreadName = name;
-    return 0;
-  } else {
-    delete[] name;
-    return 1;
-  }
-}
-
-bool
-ServiceabilityAgentDbxModule::install() {
-  // NOTE interdependency between here and Java side wrapper
-  // FIXME: casts of string literal to char * to match prototype
-  _command = shell_imp_define_command((char *) "svc_agent_run",
-                                      &svc_agent_run,
-                                      0,
-                                      NULL,
-                                      (char *) "Run the serviceability agent's dbx module.\n"
-                                      "This routine causes the module to listen on a socket for requests.\n"
-                                      "It does not return until the Java-side code tells it to exit, at\n"
-                                      "which point control is returned to the dbx shell.");
-  if (_command == NULL) {
-    debug_only(fprintf(stderr, "Serviceability agent: Failed to install svc_agent_run command\n"));
-    return false;
-  }
-
-  // This is fairly painful. Since dbx doesn't currently load
-  // libthread_db with RTLD_GLOBAL, we can't just use RTLD_DEFAULT for
-  // the argument to dlsym. Instead, we have to use rtld_db to search
-  // through the loaded objects in the target process for libthread.so and
-
-  // Try rtld_db
-  if (rd_init(RD_VERSION) != RD_OK) {
-    debug_only(fprintf(stderr, "Serviceability agent: Unable to init rtld_db\n"));
-    return false;
-  }
-
-  rd_agent_t* rda = rd_new((struct ps_prochandle*) ps_get_prochandle2(1));
-  if (rda == NULL) {
-    debug_only(fprintf(stderr, "Serviceability agent: Unable to allocate rtld_db agent\n"));
-    return false;
-  }
-
-  if (rd_loadobj_iter(rda, (rl_iter_f*) findLibThreadCB, this) != RD_OK) {
-    debug_only(fprintf(stderr, "Serviceability agent: Loadobject iteration failed\n"));
-    return false;
-  }
-
-  if (libThreadName == NULL) {
-    debug_only(fprintf(stderr, "Serviceability agent: Failed to find pathname to libthread.so in target process\n"));
-    return false;
-  }
-
-  // Find and open libthread_db.so
-  char* slash = strrchr(libThreadName, '/');
-  if (slash == NULL) {
-    debug_only(fprintf(stderr, "Serviceability agent: can't parse path to libthread.so \"%s\"\n"));
-    return false;
-  }
-
-  int slashPos = slash - libThreadName;
-  char* buf = new char[slashPos + strlen("libthread_db.so") + 20]; // slop
-  if (buf == NULL) {
-    debug_only(fprintf(stderr, "Serviceability agent: error allocating libthread_db.so pathname\n"));
-    return false;
-  }
-  strncpy(buf, libThreadName, slashPos + 1);
-
-  // Check dbx's data model; use sparcv9/ subdirectory if 64-bit and
-  // if target process is 32-bit
-  if ((sizeof(void*) == 8) &&
-      (strstr(libThreadName, "sparcv9") == NULL)) {
-    strcpy(buf + slashPos + 1, "sparcv9/");
-    slashPos += strlen("sparcv9/");
-  }
-
-  strcpy(buf + slashPos + 1, "libthread_db.so");
-
-  libThreadDB = dlopen(buf, RTLD_LAZY);
-  void* tmpDB = libThreadDB;
-  if (libThreadDB == NULL) {
-    debug_only(fprintf(stderr, "Serviceability agent: Warning: unable to find libthread_db.so at \"%s\"\n", buf));
-    // Would like to handle this case as well. Maybe dbx has a better
-    // idea of where libthread_db.so lies. If the problem with dbx
-    // loading libthread_db without RTLD_GLOBAL specified ever gets
-    // fixed, we could run this code all the time.
-    tmpDB = RTLD_DEFAULT;
-  }
-
-  delete[] buf;
-
-  // Initialize access to libthread_db
-  td_init_fn          = (td_init_fn_t*)          dlsym(tmpDB, "td_init");
-  td_ta_new_fn        = (td_ta_new_fn_t*)        dlsym(tmpDB, "td_ta_new");
-  td_ta_delete_fn     = (td_ta_delete_fn_t*)     dlsym(tmpDB, "td_ta_delete");
-  td_ta_map_id2thr_fn = (td_ta_map_id2thr_fn_t*) dlsym(tmpDB, "td_ta_map_id2thr");
-  td_thr_getgregs_fn  = (td_thr_getgregs_fn_t*)  dlsym(tmpDB, "td_thr_getgregs");
-
-  if (td_init_fn == NULL ||
-      td_ta_new_fn == NULL ||
-      td_ta_delete_fn == NULL ||
-      td_ta_map_id2thr_fn == NULL ||
-      td_thr_getgregs_fn == NULL) {
-    debug_only(fprintf(stderr, "Serviceability agent: Failed to find one or more libthread_db symbols:\n"));
-    debug_only(if (td_init_fn == NULL)          fprintf(stderr, "  td_init\n"));
-    debug_only(if (td_ta_new_fn == NULL)        fprintf(stderr, "  td_ta_new\n"));
-    debug_only(if (td_ta_delete_fn == NULL)     fprintf(stderr, "  td_ta_delete\n"));
-    debug_only(if (td_ta_map_id2thr_fn == NULL) fprintf(stderr, "  td_ta_map_id2thr\n"));
-    debug_only(if (td_thr_getgregs_fn == NULL)  fprintf(stderr, "  td_thr_getgregs\n"));
-    return false;
-  }
-
-  if ((*td_init_fn)() != TD_OK) {
-    debug_only(fprintf(stderr, "Serviceability agent: Failed to initialize libthread_db\n"));
-    return false;
-  }
-
-  return true;
-}
-
-bool
-ServiceabilityAgentDbxModule::uninstall() {
-  if (_command == NULL) {
-    return false;
-  }
-
-  if (libThreadDB != NULL) {
-    dlclose(libThreadDB);
-    libThreadDB = NULL;
-  }
-
-  int res = shell_imp_undefine_command(_command);
-
-  if (res != 0) {
-    return false;
-  }
-
-  return true;
-}
-
-bool
-ServiceabilityAgentDbxModule::run() {
-  // This is where most of the work gets done.
-  // The command processor loop looks like the following:
-  //  - create listening socket
-  //  - accept a connection (only one for now)
-  //  - while that connection is open and the "exit" command has not
-  //    been received:
-  //    - read command
-  //    - if it's the exit command, cleanup and return
-  //    - otherwise, process command and write result
-
-  int listening_socket = socket(AF_INET, SOCK_STREAM, 0);
-  if (listening_socket < 0) {
-    return false;
-  }
-
-  // Set the SO_REUSEADDR property on the listening socket. This
-  // prevents problems with calls to bind() to the same port failing
-  // after this process exits. This seems to work on all platforms.
-  int reuse_address = 1;
-  if (setsockopt(listening_socket, SOL_SOCKET, SO_REUSEADDR,
-                 (char *)&reuse_address, sizeof(reuse_address)) < 0) {
-    close(listening_socket);
-    return false;
-  }
-
-  sockaddr_in server_address;
-  // Build the server address. We can bind the listening socket to the
-  // INADDR_ANY internet address.
-  memset((char*)&server_address, 0, sizeof(server_address));
-  server_address.sin_family = AF_INET;
-  server_address.sin_addr.s_addr = (unsigned long)htonl(INADDR_ANY);
-  server_address.sin_port = htons((short)PORT);
-
-  // Bind socket to port
-  if (bind(listening_socket, (sockaddr*) &server_address,
-           sizeof(server_address)) < 0) {
-    close(listening_socket);
-    return false;
-  }
-
-  // Arbitrarily chosen backlog of 5 (shouldn't matter since we expect
-  // at most one connection)
-  if (listen(listening_socket, 5) < 0) {
-    close(listening_socket);
-    return false;
-  }
-
-  // OK, now ready to wait for a data connection. This call to
-  // accept() will block.
-  struct sockaddr_in client_address;
-  int address_len   = sizeof(client_address);
-  int client_socket = accept(listening_socket, (sockaddr*) &client_address,
-                         &address_len);
-  // Close listening socket regardless of whether accept() succeeded.
-  // (FIXME: this may be annoying, especially during debugging, but I
-  // really feel that robustness and multiple connections should be
-  // handled higher up, e.g., at the Java level -- multiple clients
-  // could conceivably connect to the SA via RMI, and that would be a
-  // more robust solution than implementing multiple connections at
-  // this level)
-  NEEDS_CLEANUP;
-
-  // NOTE: the call to shutdown() usually fails, so don't panic if this happens
-  shutdown(listening_socket, 2);
-
-  if (close(listening_socket) < 0) {
-    debug_only(fprintf(stderr, "Serviceability agent: Error closing listening socket\n"));
-    return false;
-  }
-
-  if (client_socket < 0) {
-    debug_only(fprintf(stderr, "Serviceability agent: Failed to open client socket\n"));
-    // No more cleanup necessary
-    return false;
-  }
-
-  // Attempt to disable TCP buffering on this socket. We send small
-  // amounts of data back and forth and don't want buffering.
-  int buffer_val = 1;
-  if (setsockopt(client_socket, IPPROTO_IP, TCP_NODELAY, (char *) &buffer_val, sizeof(buffer_val)) < 0) {
-    debug_only(fprintf(stderr, "Serviceability agent: Failed to set TCP_NODELAY option on client socket\n"));
-    cleanup(client_socket);
-    return false;
-  }
-
-  // OK, we have the data socket through which we will communicate
-  // with the Java side. Wait for commands or until reading or writing
-  // caused an error.
-
-  bool should_continue = true;
-
-  myComm.setSocket(client_socket);
-
-#ifdef PROFILING
-  scanTimer.reset();
-  workTimer.reset();
-  writeTimer.reset();
-#endif
-
-  // Allocate a new thread agent for libthread_db
-  if ((*td_ta_new_fn)((ps_prochandle*) ps_get_prochandle2(1), &_tdb_agent) !=
-      TD_OK) {
-    debug_only(fprintf(stderr, "Serviceability agent: Failed to allocate thread agent\n"));
-    cleanup(client_socket);
-    return false;
-  }
-
-  do {
-    // Decided to use text to communicate between these processes.
-    // Probably will make debugging easier -- could telnet in if
-    // necessary. Will make scanning harder, but probably doesn't
-    // matter.
-
-    // Why not just do what workshop does and parse dbx's console?
-    // Probably could do that, but at least this way we are in control
-    // of the text format on both ends.
-
-    // FIXME: should have some way of synchronizing these commands
-    // between the C and Java sources.
-
-    NEEDS_CLEANUP;
-
-    // Do a blocking read of a line from the socket.
-    char *input_buffer = myComm.readLine();
-    if (input_buffer == NULL) {
-      debug_only(fprintf(stderr, "Serviceability agent: error during read: errno = %d\n", errno));
-      debug_only(perror("Serviceability agent"));
-      // Error occurred during read.
-      // FIXME: should guard against SIGPIPE
-      cleanup(client_socket);
-      return false;
-    }
-
-    // OK, now ready to scan. See README-commands.txt for syntax
-    // descriptions.
-
-    bool res = false;
-    if (!strncmp(input_buffer, CMD_ADDRESS_SIZE, strlen(CMD_ADDRESS_SIZE))) {
-      res = handleAddressSize(input_buffer + strlen(CMD_ADDRESS_SIZE));
-    } else if (!strncmp(input_buffer, CMD_PEEK_FAIL_FAST, strlen(CMD_PEEK_FAIL_FAST))) {
-      res = handlePeekFailFast(input_buffer + strlen(CMD_PEEK_FAIL_FAST));
-    } else if (!strncmp(input_buffer, CMD_PEEK, strlen(CMD_PEEK))) {
-      res = handlePeek(input_buffer + strlen(CMD_PEEK));
-    } else if (!strncmp(input_buffer, CMD_POKE, strlen(CMD_POKE))) {
-      res = handlePoke(input_buffer + strlen(CMD_POKE));
-    } else if (!strncmp(input_buffer, CMD_MAPPED, strlen(CMD_MAPPED))) {
-      res = handleMapped(input_buffer + strlen(CMD_MAPPED));
-    } else if (!strncmp(input_buffer, CMD_LOOKUP, strlen(CMD_LOOKUP))) {
-      res = handleLookup(input_buffer + strlen(CMD_LOOKUP));
-    } else if (!strncmp(input_buffer, CMD_THR_GREGS, strlen(CMD_THR_GREGS))) {
-      res = handleThrGRegs(input_buffer + strlen(CMD_THR_GREGS));
-    } else if (!strncmp(input_buffer, CMD_EXIT, strlen(CMD_EXIT))) {
-      should_continue = false;
-    }
-
-    if (should_continue) {
-      if (!res) {
-        cleanup(client_socket);
-        return false;
-      }
-    }
-
-#ifdef PROFILING
-    if (++numRequests == PROFILE_COUNT) {
-      fprintf(stderr, "%d requests: %d ms scanning, %d ms work, %d ms writing\n",
-              PROFILE_COUNT, scanTimer.total(), workTimer.total(), writeTimer.total());
-      fflush(stderr);
-      scanTimer.reset();
-      workTimer.reset();
-      writeTimer.reset();
-      numRequests = 0;
-    }
-#endif
-
-  } while (should_continue);
-
-  // Successful exit
-  cleanup(client_socket);
-  return true;
-}
-
-void
-ServiceabilityAgentDbxModule::cleanup(int client_socket) {
-  shutdown(client_socket, 2);
-  close(client_socket);
-  if (_tdb_agent != NULL) {
-    (*td_ta_delete_fn)(_tdb_agent);
-  }
-}
-
-bool
-ServiceabilityAgentDbxModule::handleAddressSize(char* data) {
-  int data_model;
-  ps_err_e result = ps_pdmodel((ps_prochandle*) ps_get_prochandle2(1),
-                               &data_model);
-  if (result != PS_OK) {
-    myComm.writeString("0");
-    myComm.flush();
-    return false;
-  }
-
-  int val;
-  switch (data_model) {
-  case PR_MODEL_ILP32:
-    val = 32;
-    break;
-  case PR_MODEL_LP64:
-    val = 64;
-    break;
-  default:
-    val = 0;
-    break;
-  }
-
-  if (!myComm.writeInt(val)) {
-    return false;
-  }
-  if (!myComm.writeEOL()) {
-    return false;
-  }
-  return myComm.flush();
-}
-
-bool
-ServiceabilityAgentDbxModule::handlePeekFailFast(char* data) {
-  unsigned int val;
-  if (!scanUnsignedInt(&data, &val)) {
-    return false;
-  }
-  peek_fail_fast = (val ? true : false);
-  return true;
-}
-
-bool
-ServiceabilityAgentDbxModule::handlePeek(char* data) {
-  // Scan hex address, return false if failed
-  psaddr_t addr;
-#ifdef PROFILING
-  scanTimer.start();
-#endif /* PROFILING */
-  if (!scanAddress(&data, &addr)) {
-    return false;
-  }
-  unsigned int num;
-  if (!scanUnsignedInt(&data, &num)) {
-    return false;
-  }
-  if (num == 0) {
-#ifdef PROFILING
-    writeTimer.start();
-#endif /* PROFILING */
-    myComm.writeBinChar('B');
-    myComm.writeBinChar(1);
-    myComm.writeBinUnsignedInt(0);
-    myComm.writeBinChar(0);
-#ifdef PROFILING
-    writeTimer.stop();
-#endif /* PROFILING */
-    return true;
-  }
-#ifdef PROFILING
-  scanTimer.stop();
-  workTimer.start();
-#endif /* PROFILING */
-  char* buf = new char[num];
-  ps_prochandle* cur_proc = (ps_prochandle*) ps_get_prochandle2(1);
-  ps_err_e result = ps_pread(cur_proc, addr, buf, num);
-  if (result == PS_OK) {
-    // Fast case; entire read succeeded.
-#ifdef PROFILING
-    workTimer.stop();
-    writeTimer.start();
-#endif /* PROFILING */
-    myComm.writeBinChar('B');
-    myComm.writeBinChar(1);
-    myComm.writeBinUnsignedInt(num);
-    myComm.writeBinChar(1);
-    myComm.writeBinBuf(buf, num);
-#ifdef PROFILING
-    writeTimer.stop();
-#endif /* PROFILING */
-  } else {
-#ifdef PROFILING
-    workTimer.stop();
-#endif /* PROFILING */
-
-    if (peek_fail_fast) {
-#ifdef PROFILING
-    writeTimer.start();
-#endif /* PROFILING */
-      // Fail fast
-      myComm.writeBinChar('B');
-      myComm.writeBinChar(1);
-      myComm.writeBinUnsignedInt(num);
-      myComm.writeBinChar(0);
-#ifdef PROFILING
-    writeTimer.stop();
-#endif /* PROFILING */
-    } else {
-      // Slow case: try to read one byte at a time
-      // FIXME: need better way of handling this, a la VirtualQuery
-
-      unsigned int  strideLen      = 0;
-      int           bufIdx         = 0;
-      bool          lastByteMapped = (ps_pread(cur_proc, addr, buf, 1) == PS_OK ? true : false);
-
-#ifdef PROFILING
-      writeTimer.start();
-#endif /* PROFILING */
-      myComm.writeBinChar('B');
-      myComm.writeBinChar(1);
-#ifdef PROFILING
-      writeTimer.stop();
-#endif /* PROFILING */
-
-      for (int i = 0; i < num; ++i, ++addr) {
-#ifdef PROFILING
-        workTimer.start();
-#endif /* PROFILING */
-        result = ps_pread(cur_proc, addr, &buf[bufIdx], 1);
-#ifdef PROFILING
-        workTimer.stop();
-#endif /* PROFILING */
-        bool tmpMapped = (result == PS_OK ? true : false);
-#ifdef PROFILING
-        writeTimer.start();
-#endif /* PROFILING */
-        if (tmpMapped != lastByteMapped) {
-          // State change. Write the length of the last stride.
-          myComm.writeBinUnsignedInt(strideLen);
-          if (lastByteMapped) {
-            // Stop gathering data. Write the data of the last stride.
-            myComm.writeBinChar(1);
-            myComm.writeBinBuf(buf, strideLen);
-            bufIdx = 0;
-          } else {
-            // Start gathering data to write.
-            myComm.writeBinChar(0);
-          }
-          strideLen = 0;
-          lastByteMapped = tmpMapped;
-        }
-#ifdef PROFILING
-        writeTimer.stop();
-#endif /* PROFILING */
-        if (lastByteMapped) {
-          ++bufIdx;
-        }
-        ++strideLen;
-      }
-
-      // Write last stride (must be at least one byte long by definition)
-#ifdef PROFILING
-      writeTimer.start();
-#endif /* PROFILING */
-      myComm.writeBinUnsignedInt(strideLen);
-      if (lastByteMapped) {
-        myComm.writeBinChar(1);
-        myComm.writeBinBuf(buf, strideLen);
-      } else {
-        myComm.writeBinChar(0);
-      }
-#ifdef PROFILING
-      writeTimer.stop();
-#endif /* PROFILING */
-    }
-  }
-  delete[] buf;
-  myComm.flush();
-  return true;
-}
-
-bool
-ServiceabilityAgentDbxModule::handlePoke(char* data) {
-  // FIXME: not yet implemented
-  NEEDS_CLEANUP;
-  bool res = myComm.writeBoolAsInt(false);
-  myComm.flush();
-  return res;
-}
-
-bool
-ServiceabilityAgentDbxModule::handleMapped(char* data) {
-  // Scan address
-  psaddr_t addr;
-  if (!scanAddress(&data, &addr)) {
-    return false;
-  }
-  unsigned int num;
-  if (!scanUnsignedInt(&data, &num)) {
-    return false;
-  }
-  unsigned char val;
-  ps_prochandle* cur_proc = (ps_prochandle*) ps_get_prochandle2(1);
-  char* buf = new char[num];
-  if (ps_pread(cur_proc, addr, buf, num) == PS_OK) {
-    myComm.writeBoolAsInt(true);
-  } else {
-    myComm.writeBoolAsInt(false);
-  }
-  delete[] buf;
-  myComm.writeEOL();
-  myComm.flush();
-  return true;
-}
-
-extern "C"
-int loadobj_iterator(const rd_loadobj_t* loadobj, void *) {
-  if (loadobj != NULL) {
-    fprintf(stderr, "loadobj_iterator: visited loadobj \"%p\"\n", (void*) loadobj->rl_nameaddr);
-    return 1;
-  }
-
-  fprintf(stderr, "loadobj_iterator: NULL loadobj\n");
-  return 0;
-}
-
-bool
-ServiceabilityAgentDbxModule::handleLookup(char* data) {
-  // Debugging: iterate over loadobjs
-  /*
-  rd_agent_t* rld_agent = rd_new((ps_prochandle*) ps_get_prochandle2(1));
-  rd_loadobj_iter(rld_agent, &loadobj_iterator, NULL);
-  rd_delete(rld_agent);
-  */
-
-#ifdef PROFILING
-  scanTimer.start();
-#endif /* PROFILING */
-
-  char* object_name = scanSymbol(&data);
-  if (object_name == NULL) {
-    return false;
-  }
-  char* symbol_name = scanSymbol(&data);
-  if (symbol_name == NULL) {
-    delete[] object_name;
-    return false;
-  }
-
-#ifdef PROFILING
-  scanTimer.stop();
-  workTimer.start();
-#endif /* PROFILING */
-
-  ps_sym_t sym;
-  // FIXME: check return values from write routines
-  ps_prochandle* process = (ps_prochandle*) ps_get_prochandle2(1);
-  ps_err_e lookup_res = ps_pglobal_sym(process,
-                                       object_name, symbol_name, &sym);
-#ifdef PROFILING
-  workTimer.stop();
-  writeTimer.start();
-#endif /* PROFILING */
-
-  delete[] object_name;
-  delete[] symbol_name;
-  if (lookup_res != PS_OK) {
-    // This is too noisy
-    //    debug_only(fprintf(stderr, "ServiceabilityAgentDbxModule::handleLookup: error %d\n", lookup_res));
-    myComm.writeString("0x0");
-  } else {
-    myComm.writeAddress((void *)sym.st_value);
-  }
-  myComm.writeEOL();
-  myComm.flush();
-
-#ifdef PROFILING
-  writeTimer.stop();
-#endif /* PROFILING */
-
-  return true;
-}
-
-bool
-ServiceabilityAgentDbxModule::handleThrGRegs(char* data) {
-#ifdef PROFILING
-  scanTimer.start();
-#endif /* PROFILING */
-
-  unsigned int num;
-  // Get the thread ID
-  if (!scanUnsignedInt(&data, &num)) {
-    return false;
-  }
-
-#ifdef PROFILING
-  scanTimer.stop();
-  workTimer.start();
-#endif /* PROFILING */
-
-  // Map tid to thread handle
-  td_thrhandle_t thread_handle;
-  if ((*td_ta_map_id2thr_fn)(_tdb_agent, num, &thread_handle) != TD_OK) {
-    //    fprintf(stderr, "Error mapping thread ID %d to thread handle\n", num);
-    return false;
-  }
-
-  // Fetch register set
-  prgregset_t reg_set;
-  memset(reg_set, 0, sizeof(reg_set));
-  td_err_e result = (*td_thr_getgregs_fn)(&thread_handle, reg_set);
-  if ((result != TD_OK) && (result != TD_PARTIALREG)) {
-    //    fprintf(stderr, "Error fetching registers for thread handle %d: error = %d\n", num, result);
-    return false;
-  }
-
-#ifdef PROFILING
-  workTimer.stop();
-  writeTimer.start();
-#endif /* PROFILING */
-
-#if (defined(__sparc) || defined(__i386))
-  myComm.writeInt(NPRGREG);
-  myComm.writeSpace();
-  for (int i = 0; i < NPRGREG; i++) {
-    myComm.writeAddress((void *)reg_set[i]);
-    if (i == NPRGREG - 1) {
-      myComm.writeEOL();
-    } else {
-      myComm.writeSpace();
-    }
-  }
-#else
-#error  Please port ServiceabilityAgentDbxModule::handleThrGRegs to your current platform
-#endif
-
-  myComm.flush();
-
-#ifdef PROFILING
-  writeTimer.stop();
-#endif /* PROFILING */
-
-  return true;
-}
-
-//
-// Input routines
-//
-
-bool
-ServiceabilityAgentDbxModule::scanAddress(char** data, psaddr_t* addr) {
-  *addr = 0;
-
-  // Skip whitespace
-  while ((**data != 0) && (isspace(**data))) {
-    ++*data;
-  }
-
-  if (**data == 0) {
-    return false;
-  }
-
-  if (strncmp(*data, "0x", 2) != 0) {
-    return false;
-  }
-
-  *data += 2;
-
-  while ((**data != 0) && (!isspace(**data))) {
-    int val;
-    bool res = charToNibble(**data, &val);
-    if (!res) {
-      return false;
-    }
-    *addr <<= 4;
-    *addr |= val;
-    ++*data;
-  }
-
-  return true;
-}
-
-bool
-ServiceabilityAgentDbxModule::scanUnsignedInt(char** data, unsigned int* num) {
-  *num = 0;
-
-  // Skip whitespace
-  while ((**data != 0) && (isspace(**data))) {
-    ++*data;
-  }
-
-  if (**data == 0) {
-    return false;
-  }
-
-  while ((**data != 0) && (!isspace(**data))) {
-    char cur = **data;
-    if ((cur < '0') || (cur > '9')) {
-      return false;
-    }
-    *num *= 10;
-    *num += cur - '0';
-    ++*data;
-  }
-
-  return true;
-}
-
-char*
-ServiceabilityAgentDbxModule::scanSymbol(char** data) {
-  // Skip whitespace
-  while ((**data != 0) && (isspace(**data))) {
-    ++*data;
-  }
-
-  if (**data == 0) {
-    return NULL;
-  }
-
-  // First count length
-  int len = 1; // Null terminator
-  char* tmpData = *data;
-  while ((*tmpData != 0) && (!isspace(*tmpData))) {
-    ++tmpData;
-    ++len;
-  }
-  char* buf = new char[len];
-  strncpy(buf, *data, len - 1);
-  buf[len - 1] = 0;
-  *data += len - 1;
-  return buf;
-}
-
-bool
-ServiceabilityAgentDbxModule::charToNibble(char ascii, int* value) {
-  if (ascii >= '0' && ascii <= '9') {
-    *value = ascii - '0';
-    return true;
-  } else if (ascii >= 'A' && ascii <= 'F') {
-    *value = 10 + ascii - 'A';
-    return true;
-  } else if (ascii >= 'a' && ascii <= 'f') {
-    *value = 10 + ascii - 'a';
-    return true;
-  }
-
-  return false;
-}
-
-
-char*
-ServiceabilityAgentDbxModule::readCStringFromProcess(psaddr_t addr) {
-  char c;
-  int num = 0;
-  ps_prochandle* cur_proc = (ps_prochandle*) ps_get_prochandle2(1);
-
-  // Search for null terminator
-  do {
-    if (ps_pread(cur_proc, addr + num, &c, 1) != PS_OK) {
-      return NULL;
-    }
-    ++num;
-  } while (c != 0);
-
-  // Allocate string
-  char* res = new char[num];
-  if (ps_pread(cur_proc, addr, res, num) != PS_OK) {
-    delete[] res;
-    return NULL;
-  }
-  return res;
-}
-
-
-//--------------------------------------------------------------------------------
-// Class Timer
-//
-
-Timer::Timer() {
-  reset();
-}
-
-Timer::~Timer() {
-}
-
-void
-Timer::start() {
-  gettimeofday(&startTime, NULL);
-}
-
-void
-Timer::stop() {
-  struct timeval endTime;
-  gettimeofday(&endTime, NULL);
-  totalMicroseconds += timevalDiff(&startTime, &endTime);
-  ++counter;
-}
-
-long
-Timer::total() {
-  return (totalMicroseconds / 1000);
-}
-
-long
-Timer::average() {
-  return (long) ((double) total() / (double) counter);
-}
-
-void
-Timer::reset() {
-  totalMicroseconds = 0;
-  counter = 0;
-}
-
-long long
-Timer::timevalDiff(struct timeval* start, struct timeval* end) {
-  long long secs = end->tv_sec - start->tv_sec;
-  secs *= 1000000;
-  long long usecs = end->tv_usec - start->tv_usec;
-  return (secs + usecs);
-}
--- a/agent/src/os/solaris/dbx/svc_agent_dbx.hpp	Wed Sep 14 13:23:54 2011 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,188 +0,0 @@
-/*
- * Copyright (c) 2000, 2001, Oracle and/or its affiliates. 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.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- *
- */
-
-#include "shell_imp.h"
-#include "IOBuf.hpp"
-#include <sys/time.h>
-#include <thread_db.h>
-
-typedef td_err_e td_init_fn_t();
-typedef td_err_e td_ta_new_fn_t(struct ps_prochandle *, td_thragent_t **);
-typedef td_err_e td_ta_delete_fn_t(td_thragent_t *);
-typedef td_err_e td_ta_map_id2thr_fn_t(const td_thragent_t *, thread_t,  td_thrhandle_t *);
-typedef td_err_e td_thr_getgregs_fn_t(const td_thrhandle_t *, prgregset_t);
-
-class ServiceabilityAgentDbxModule {
-public:
-  ServiceabilityAgentDbxModule(int major, int minor,
-                               shell_imp_interp_t interp, int argc, char *argv[]);
-  ~ServiceabilityAgentDbxModule();
-
-  bool install();
-  bool uninstall();
-
-  /* This is invoked through the dbx command interpreter. It listens
-     on a socket for commands and does not return until it receives an
-     "exit" command. At that point control is returned to dbx's main
-     loop, at which point if the user sends an exit command to dbx's
-     shell the dbx process will exit. Returns true if completed
-     successfully, false if an error occurred while running (for
-     example, unable to bind listening socket). */
-  bool run();
-
-private:
-
-  // This must be shared between the Java and C layers
-  static const int PORT = 21928;
-
-  // Command handlers
-  bool handleAddressSize(char* data);
-  bool handlePeekFailFast(char* data);
-  bool handlePeek(char* data);
-  bool handlePoke(char* data);
-  bool handleMapped(char* data);
-  bool handleLookup(char* data);
-  bool handleThrGRegs(char* data);
-
-  // Input routines
-
-  // May mutate addr argument even if result is false
-  bool scanAddress(char** data, psaddr_t* addr);
-  // May mutate num argument even if result is false
-  bool scanUnsignedInt(char** data, unsigned int* num);
-  // Returns NULL if error occurred while scanning. Otherwise, returns
-  // newly-allocated character array which must be freed with delete[].
-  char* scanSymbol(char** data);
-  // Helper routine: converts ASCII to 4-bit integer. Returns true if
-  // character is in range, false otherwise.
-  bool charToNibble(char ascii, int* value);
-
-  // Output routines
-
-  // Writes an int with no leading or trailing spaces
-  bool writeInt(int val, int fd);
-  // Writes an address in hex format with no leading or trailing
-  // spaces
-  bool writeAddress(psaddr_t addr, int fd);
-  // Writes a register in hex format with no leading or trailing
-  // spaces (addresses and registers might be of different size)
-  bool writeRegister(prgreg_t reg, int fd);
-  // Writes a space to given file descriptor
-  bool writeSpace(int fd);
-  // Writes carriage return to given file descriptor
-  bool writeCR(int fd);
-  // Writes a bool as [0|1]
-  bool writeBoolAsInt(bool val, int fd);
-  // Helper routine: converts low 4 bits to ASCII [0..9][A..F]
-  char nibbleToChar(unsigned char nibble);
-
-  // Base routine called by most of the above
-  bool writeString(const char* str, int fd);
-
-  // Writes a binary character
-  bool writeBinChar(char val, int fd);
-  // Writes a binary unsigned int in network (big-endian) byte order
-  bool writeBinUnsignedInt(unsigned int val, int fd);
-  // Writes a binary buffer
-  bool writeBinBuf(char* buf, int size, int fd);
-
-  // Routine to flush the socket
-  bool flush(int client_socket);
-
-  void cleanup(int client_socket);
-
-  // The shell interpreter on which we can invoke commands (?)
-  shell_imp_interp_t _interp;
-
-  // The "command line" arguments passed to us by dbx (?)
-  int _argc;
-  char **_argv;
-
-  // The installed command in the dbx shell
-  shell_imp_command_t _command;
-
-  // Access to libthread_db (dlsym'ed to be able to pick up the
-  // version loaded by dbx)
-  td_init_fn_t*          td_init_fn;
-  td_ta_new_fn_t*        td_ta_new_fn;
-  td_ta_delete_fn_t*     td_ta_delete_fn;
-  td_ta_map_id2thr_fn_t* td_ta_map_id2thr_fn;
-  td_thr_getgregs_fn_t*  td_thr_getgregs_fn;
-
-  // Our "thread agent" -- access to libthread_db
-  td_thragent_t* _tdb_agent;
-
-  // Path to libthread.so in target process; free with delete[]
-  char* libThreadName;
-
-  // Handle to dlopen'ed libthread_db.so
-  void* libThreadDB;
-
-  // Helper callback for finding libthread_db.so
-  friend int findLibThreadCB(const rd_loadobj_t* lo, void* data);
-
-  // Support for reading C strings out of the target process (so we
-  // can find the correct libthread_db). Returns newly-allocated char*
-  // which must be freed with delete[], or null if the read failed.
-  char* readCStringFromProcess(psaddr_t addr);
-
-  IOBuf myComm;
-
-  // Output buffer support (used by writeString, writeChar, flush)
-  char* output_buffer;
-  int output_buffer_size;
-  int output_buffer_pos;
-
-  // "Fail fast" flag
-  bool peek_fail_fast;
-
-  // Commands
-  static const char* CMD_ADDRESS_SIZE;
-  static const char* CMD_PEEK_FAIL_FAST;
-  static const char* CMD_PEEK;
-  static const char* CMD_POKE;
-  static const char* CMD_MAPPED;
-  static const char* CMD_LOOKUP;
-  static const char* CMD_THR_GREGS;
-  static const char* CMD_EXIT;
-};
-
-// For profiling. Times reported are in milliseconds.
-class Timer {
-public:
-  Timer();
-  ~Timer();
-
-  void start();
-  void stop();
-  long total();
-  long average();
-  void reset();
-
-private:
-  struct timeval startTime;
-  long long totalMicroseconds; // stored internally in microseconds
-  int counter;
-  long long timevalDiff(struct timeval* startTime, struct timeval* endTime);
-};
--- a/agent/src/os/win32/BasicList.hpp	Wed Sep 14 13:23:54 2011 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,66 +0,0 @@
-/*
- * Copyright (c) 2000, Oracle and/or its affiliates. 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.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- *
- */
-
-#ifndef _BASIC_LIST_
-#define _BASIC_LIST_
-
-#include <vector>
-
-template<class T>
-class BasicList {
-protected:
-  typedef std::vector<T> InternalListType;
-  InternalListType internalList;
-
-public:
-  BasicList() {
-  }
-  virtual ~BasicList() {
-  }
-
-  void add(T arg) {
-    internalList.push_back(arg);
-  }
-
-  bool remove(T arg) {
-    for (InternalListType::iterator iter = internalList.begin();
-         iter != internalList.end(); iter++) {
-      if (*iter == arg) {
-        internalList.erase(iter);
-        return true;
-      }
-    }
-    return false;
-  }
-
-  int size() {
-    return internalList.size();
-  }
-
-  T get(int index) {
-    return internalList[index];
-  }
-};
-
-#endif  // #defined _BASIC_LIST_
--- a/agent/src/os/win32/Buffer.cpp	Wed Sep 14 13:23:54 2011 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,110 +0,0 @@
-/*
- * Copyright (c) 2001, Oracle and/or its affiliates. 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.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- *
- */
-
-#include "Buffer.hpp"
-
-#include <string.h>
-
-Buffer::Buffer(int bufSize) {
-  buf = new char[bufSize];
-  sz = bufSize;
-  fill = 0;
-  drain = 0;
-}
-
-Buffer::~Buffer() {
-  delete[] buf;
-}
-
-char*
-Buffer::fillPos() {
-  return buf + fill;
-}
-
-int
-Buffer::remaining() {
-  return sz - fill;
-}
-
-int
-Buffer::size() {
-  return sz;
-}
-
-bool
-Buffer::incrFillPos(int amt) {
-  if (fill + amt >= sz) {
-    return false;
-  }
-  fill += amt;
-  return true;
-}
-
-int
-Buffer::readByte() {
-  if (drain < fill) {
-    return buf[drain++] & 0xFF;
-  } else {
-    return -1;
-  }
-}
-
-int
-Buffer::readBytes(char* data, int len) {
-  int numRead = 0;
-  while (numRead < len) {
-    int c = readByte();
-    if (c < 0) break;
-    data[numRead++] = (char) c;
-  }
-  return numRead;
-}
-
-char*
-Buffer::drainPos() {
-  return buf + drain;
-}
-
-int
-Buffer::drainRemaining() {
-  return fill - drain;
-}
-
-bool
-Buffer::incrDrainPos(int amt) {
-  if (drainRemaining() < amt) {
-    return false;
-  }
-  drain += amt;
-  return true;
-}
-
-void
-Buffer::compact() {
-  // Copy down data
-  memmove(buf, buf + drain, fill - drain);
-  // Adjust positions
-  fill -= drain;
-  drain = 0;
-}
--- a/agent/src/os/win32/Buffer.hpp	Wed Sep 14 13:23:54 2011 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,68 +0,0 @@
-/*
- * Copyright (c) 2001, Oracle and/or its affiliates. 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.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- *
- */
-
-#ifndef _BUFFER_
-#define _BUFFER_
-
-// A Buffer is the backing store for the IOBuf abstraction and
-// supports producer-consumer filling and draining.
-
-class Buffer {
-public:
-  Buffer(int bufSize);
-  ~Buffer();
-
-  char* fillPos();   // Position of the place where buffer should be filled
-  int   remaining(); // Number of bytes that can be placed starting at fillPos
-  int   size();      // Size of the buffer
-  // Move up fill position by amount (decreases remaining()); returns
-  // false if not enough space
-  bool  incrFillPos(int amt);
-
-  // Read single byte (0..255); returns -1 if no data available.
-  int   readByte();
-  // Read multiple bytes, non-blocking (this buffer does not define a
-  // fill mechanism), into provided buffer. Returns number of bytes read.
-  int   readBytes(char* buf, int len);
-
-  // Access to drain position. Be very careful using this.
-  char* drainPos();
-  int   drainRemaining();
-  bool  incrDrainPos(int amt);
-
-  // Compact buffer, removing already-consumed input. This must be
-  // called periodically to yield the illusion of an infinite buffer.
-  void  compact();
-
-private:
-  Buffer(const Buffer&);
-  Buffer& operator=(const Buffer&);
-
-  char* buf;
-  int   sz;
-  int   fill;
-  int   drain;
-};
-
-#endif // #defined _BUFFER_
--- a/agent/src/os/win32/Dispatcher.cpp	Wed Sep 14 13:23:54 2011 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,115 +0,0 @@
-/*
- * Copyright (c) 2000, 2001, Oracle and/or its affiliates. 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.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- *
- */
-
-#include <stdio.h>
-#include <string.h>
-#include "dispatcher.hpp"
-
-const char* CMD_ASCII         = "ascii";
-const char* CMD_UNICODE       = "unicode";
-const char* CMD_PROCLIST      = "proclist";
-const char* CMD_ATTACH        = "attach";
-const char* CMD_DETACH        = "detach";
-const char* CMD_LIBINFO       = "libinfo";
-const char* CMD_PEEK          = "peek";
-const char* CMD_POKE          = "poke";
-const char* CMD_THREADLIST    = "threadlist";
-const char* CMD_DUPHANDLE     = "duphandle";
-const char* CMD_CLOSEHANDLE   = "closehandle";
-const char* CMD_GETCONTEXT    = "getcontext";
-const char* CMD_SETCONTEXT    = "setcontext";
-const char* CMD_SELECTORENTRY = "selectorentry";
-const char* CMD_SUSPEND       = "suspend";
-const char* CMD_RESUME        = "resume";
-const char* CMD_POLLEVENT     = "pollevent";
-const char* CMD_CONTINUEEVENT = "continueevent";
-const char* CMD_EXIT          = "exit";
-
-// Uncomment the #define below to get messages on stderr
-// #define DEBUGGING
-
-void
-Dispatcher::dispatch(char* cmd, Handler* handler) {
-  if (!strncmp(cmd, CMD_ASCII, strlen(CMD_ASCII))) {
-    handler->ascii(cmd + strlen(CMD_ASCII));
-
-  } else if (!strncmp(cmd, CMD_UNICODE, strlen(CMD_UNICODE))) {
-    handler->unicode(cmd + strlen(CMD_UNICODE));
-
-  } else if (!strncmp(cmd, CMD_PROCLIST, strlen(CMD_PROCLIST))) {
-    handler->procList(cmd + strlen(CMD_PROCLIST));
-
-  } else if (!strncmp(cmd, CMD_ATTACH, strlen(CMD_ATTACH))) {
-    handler->attach(cmd + strlen(CMD_ATTACH));
-
-  } else if (!strncmp(cmd, CMD_DETACH, strlen(CMD_DETACH))) {
-    handler->detach(cmd + strlen(CMD_DETACH));
-
-  } else if (!strncmp(cmd, CMD_LIBINFO, strlen(CMD_LIBINFO))) {
-    handler->libInfo(cmd + strlen(CMD_LIBINFO));
-
-  } else if (!strncmp(cmd, CMD_PEEK, strlen(CMD_PEEK))) {
-    handler->peek(cmd + strlen(CMD_PEEK));
-
-  } else if (!strncmp(cmd, CMD_POKE, strlen(CMD_POKE))) {
-    handler->poke(cmd + strlen(CMD_POKE));
-
-  } else if (!strncmp(cmd, CMD_THREADLIST, strlen(CMD_THREADLIST))) {
-    handler->threadList(cmd + strlen(CMD_THREADLIST));
-
-  } else if (!strncmp(cmd, CMD_DUPHANDLE, strlen(CMD_DUPHANDLE))) {
-    handler->dupHandle(cmd + strlen(CMD_DUPHANDLE));
-
-  } else if (!strncmp(cmd, CMD_CLOSEHANDLE, strlen(CMD_CLOSEHANDLE))) {
-    handler->closeHandle(cmd + strlen(CMD_CLOSEHANDLE));
-
-  } else if (!strncmp(cmd, CMD_GETCONTEXT, strlen(CMD_GETCONTEXT))) {
-    handler->getContext(cmd + strlen(CMD_GETCONTEXT));
-
-  } else if (!strncmp(cmd, CMD_SETCONTEXT, strlen(CMD_SETCONTEXT))) {
-    handler->setContext(cmd + strlen(CMD_SETCONTEXT));
-
-  } else if (!strncmp(cmd, CMD_SELECTORENTRY, strlen(CMD_SELECTORENTRY))) {
-    handler->selectorEntry(cmd + strlen(CMD_SELECTORENTRY));
-
-  } else if (!strncmp(cmd, CMD_SUSPEND, strlen(CMD_SUSPEND))) {
-    handler->suspend(cmd + strlen(CMD_SUSPEND));
-
-  } else if (!strncmp(cmd, CMD_RESUME, strlen(CMD_RESUME))) {
-    handler->resume(cmd + strlen(CMD_RESUME));
-
-  } else if (!strncmp(cmd, CMD_POLLEVENT, strlen(CMD_POLLEVENT))) {
-    handler->pollEvent(cmd + strlen(CMD_POLLEVENT));
-
-  } else if (!strncmp(cmd, CMD_CONTINUEEVENT, strlen(CMD_CONTINUEEVENT))) {
-    handler->continueEvent(cmd + strlen(CMD_CONTINUEEVENT));
-
-  } else if (!strcmp(cmd, CMD_EXIT)) {
-    handler->exit(cmd + strlen(CMD_EXIT));
-  }
-
-#ifdef DEBUGGING
-  else fprintf(stderr, "Ignoring illegal command \"%s\"\n", cmd);
-#endif
-}
--- a/agent/src/os/win32/Dispatcher.hpp	Wed Sep 14 13:23:54 2011 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,38 +0,0 @@
-/*
- * Copyright (c) 2000, Oracle and/or its affiliates. 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.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- *
- */
-
-#ifndef _DISPATCHER_
-#define _DISPATCHER_
-
-#include "Handler.hpp"
-
-/** This class understands the commands supported by the system and
-    calls the appropriate handler routines. */
-
-class Dispatcher {
-public:
-  static void dispatch(char* cmd, Handler* handler);
-};
-
-#endif  // #defined _DISPATCHER_
--- a/agent/src/os/win32/Handler.hpp	Wed Sep 14 13:23:54 2011 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,53 +0,0 @@
-/*
- * Copyright (c) 2000, 2001, Oracle and/or its affiliates. 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.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- *
- */
-
-#ifndef _HANDLER_
-#define _HANDLER_
-
-/** An abstract base class encapsulating the handlers for all commands
-    understood by the system. */
-class Handler {
-public:
-  virtual void ascii(char* arg)         = 0;
-  virtual void unicode(char* arg)       = 0;
-  virtual void procList(char* arg)      = 0;
-  virtual void attach(char* arg)        = 0;
-  virtual void detach(char* arg)        = 0;
-  virtual void libInfo(char* arg)       = 0;
-  virtual void peek(char* arg)          = 0;
-  virtual void poke(char* arg)          = 0;
-  virtual void threadList(char* arg)    = 0;
-  virtual void dupHandle(char* arg)     = 0;
-  virtual void closeHandle(char* arg)   = 0;
-  virtual void getContext(char* arg)    = 0;
-  virtual void setContext(char* arg)    = 0;
-  virtual void selectorEntry(char* arg) = 0;
-  virtual void suspend(char* arg)       = 0;
-  virtual void resume(char* arg)        = 0;
-  virtual void pollEvent(char* arg)     = 0;
-  virtual void continueEvent(char* arg) = 0;
-  virtual void exit(char* arg)          = 0;
-};
-
-#endif  // #defined _HANDLER_
--- a/agent/src/os/win32/IOBuf.cpp	Wed Sep 14 13:23:54 2011 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,490 +0,0 @@
-/*
- * Copyright (c) 2000, 2003, Oracle and/or its affiliates. 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.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- *
- */
-
-#include <stdio.h>
-
-// This file is currently used for os/solaris/agent too.  At some point in time
-// the source will be reorganized to avoid these ifdefs.
-
-#ifdef __sun
-  #include <string.h>
-  #include <inttypes.h>
-  #include <sys/byteorder.h>
-#endif
-
-#include "IOBuf.hpp"
-
-// Formats for printing pointers
-#ifdef _LP64
-#  define INTPTR_FORMAT "0x%016lx"
-#else /* ! _LP64 */
-#  define INTPTR_FORMAT "0x%08lx"
-#endif /* _LP64 */
-
-// Uncomment the #define below to get messages on stderr
-// #define DEBUGGING
-
-IOBuf::IOBuf(int inLen, int outLen) {
-  inBuf = new Buffer(inLen);
-  outBuf = new Buffer(outLen);
-  fd = INVALID_SOCKET;
-  outHandle = NULL;
-  usingSocket = true;
-  reset();
-}
-
-IOBuf::~IOBuf() {
-  delete inBuf;
-  delete outBuf;
-}
-
-void
-IOBuf::setSocket(SOCKET sock) {
-  fd = sock;
-  usingSocket = true;
-}
-
-// Reading/writing files is only needed and used on windows.
-#ifdef WIN32
-void
-IOBuf::setOutputFileHandle(HANDLE handle) {
-  outHandle = handle;
-  usingSocket = false;
-}
-#endif
-
-void
-IOBuf::reset() {
-  gotDataLastTime = false;
-  state          = TEXT_STATE;
-  binPos         = 0;
-  binLength      = 0;
-}
-
-IOBuf::ReadLineResult
-IOBuf::tryReadLine() {
-  return doReadLine(false);
-}
-
-char*
-IOBuf::readLine() {
-  ReadLineResult rr = doReadLine(true);
-  if (rr != RL_GOT_DATA) {
-    return NULL;
-  }
-  return getLine();
-}
-
-IOBuf::ReadLineResult
-IOBuf::doReadLine(bool shouldWait) {
-
-  if (!usingSocket) {
-    return IOBuf::RL_ERROR;
-  }
-
-  if (gotDataLastTime) {
-    curLine.clear();
-  }
-
-  int c;
-  do {
-    c = readChar(shouldWait);
-    if (c >= 0) {
-      Action act = processChar((char) c);
-      if (act == GOT_LINE) {
-        curLine.push_back('\0');
-        gotDataLastTime = true;
-        return IOBuf::RL_GOT_DATA;
-      } else if (act == SKIP_EOL_CHAR) {
-        // Do nothing
-      } else {
-        curLine.push_back((char) c);
-      }
-    }
-  } while (shouldWait || c >= 0);
-
-  gotDataLastTime = false;
-  return IOBuf::RL_NO_DATA;
-}
-
-bool
-IOBuf::flushImpl(bool moreDataToCome) {
-  int numWritten = 0;
-
-#ifdef WIN32
-  // When running on Windows and using IOBufs for inter-process
-  // communication, we need to write metadata into the stream
-  // indicating how many bytes are coming down. Five bytes are written
-  // per flush() call, four containing the integer number of bytes
-  // coming (not including the five-byte header) and one (a 0 or 1)
-  // indicating whether there is more data coming.
-  if (!usingSocket) {
-    int numToWrite = outBuf->drainRemaining();
-    char moreToCome = (moreDataToCome ? 1 : 0);
-    DWORD numBytesWritten;
-    if (!WriteFile(outHandle, &numToWrite, sizeof(int), &numBytesWritten, NULL)) {
-      return false;
-    }
-    if (numBytesWritten != sizeof(int)) {
-      return false;
-    }
-    if (!WriteFile(outHandle, &moreToCome, 1, &numBytesWritten, NULL)) {
-      return false;
-    }
-    if (numBytesWritten != 1) {
-      return false;
-    }
-  }
-#endif
-
-  while (outBuf->drainRemaining() != 0) {
-#ifdef DEBUGGING
-      fprintf(stderr, "Flushing %d bytes\n", outBuf->drainRemaining());
-#endif
-    if (usingSocket) {
-      numWritten = send(fd, outBuf->drainPos(), outBuf->drainRemaining(), 0);
-    } else {
-#ifdef WIN32
-      DWORD numBytesWritten;
-      if (!WriteFile(outHandle, outBuf->drainPos(), outBuf->drainRemaining(), &numBytesWritten, NULL)) {
-        numWritten = -1;
-      } else {
-        numWritten = numBytesWritten;
-      }
-#endif
-    }
-    if (numWritten != -1) {
-#ifdef DEBUGGING
-      fprintf(stderr, "Flushed %d bytes\n", numWritten);
-#endif
-      outBuf->incrDrainPos(numWritten);
-    } else {
-      return false;
-    }
-  }
-
-  outBuf->compact();
-
-  return true;
-}
-
-int
-IOBuf::readChar(bool block) {
-  do {
-    int c = inBuf->readByte();
-    if (c >= 0) {
-      return c;
-    }
-    // See whether we need to compact the input buffer
-    if (inBuf->remaining() < inBuf->size() / 2) {
-      inBuf->compact();
-    }
-    // See whether socket is ready
-    fd_set fds;
-    FD_ZERO(&fds);
-    FD_SET(fd, &fds);
-    struct timeval timeout;
-    timeout.tv_sec = 0;
-    timeout.tv_usec = 0;
-    if (block || select(1 + fd, &fds, NULL, NULL, &timeout) > 0) {
-      if (block || FD_ISSET(fd, &fds)) {
-#ifdef DEBUGGING
-        int b = (block ? 1 : 0);
-        fprintf(stderr, "calling recv: block = %d\n", b);
-#endif
-        // Read data from socket
-        int numRead = recv(fd, inBuf->fillPos(), inBuf->remaining(), 0);
-        if (numRead < 0) {
-#ifdef DEBUGGING
-          fprintf(stderr, "recv failed\n");
-#endif
-          return -1;
-        }
-        inBuf->incrFillPos(numRead);
-      }
-    }
-  } while (block);
-
-  return inBuf->readByte();
-}
-
-char*
-IOBuf::getLine() {
-#ifdef DEBUGGING
-  fprintf(stderr, "Returning (first 10 chars) \"%.10s\"\n", curLine.begin());
-#endif
-  return curLine.begin();
-}
-
-bool
-IOBuf::flush() {
-  return flushImpl(false);
-}
-
-bool
-IOBuf::writeString(const char* str) {
-  int len = strlen(str);
-
-  if (len > outBuf->size()) {
-    return false;
-  }
-
-  if (len > outBuf->remaining()) {
-    if (!flushImpl(true)) {
-      return false;
-    }
-  }
-
-  // NOTE we do not copy the null terminator of the string.
-
-  strncpy(outBuf->fillPos(), str, len);
-  outBuf->incrFillPos(len);
-  return true;
-}
-
-bool
-IOBuf::writeInt(int val) {
-  char buf[128];
-  sprintf(buf, "%d", val);
-  return writeString(buf);
-}
-
-bool
-IOBuf::writeUnsignedInt(unsigned int val) {
-  char buf[128];
-  sprintf(buf, "%u", val);
-  return writeString(buf);
-}
-
-bool
-IOBuf::writeBoolAsInt(bool val) {
-  if (val) {
-    return writeString("1");
-  } else {
-    return writeString("0");
-  }
-}
-
-bool
-IOBuf::writeAddress(void* val) {
-  char buf[128];
-  sprintf(buf, INTPTR_FORMAT, val);
-  return writeString(buf);
-}
-
-bool
-IOBuf::writeSpace() {
-  return writeString(" ");
-}
-
-bool
-IOBuf::writeEOL() {
-  return writeString("\n\r");
-}
-
-bool
-IOBuf::writeBinChar(char c) {
-  return writeBinBuf((char*) &c, sizeof(c));
-}
-
-bool
-IOBuf::writeBinUnsignedShort(unsigned short i) {
-  i = htons(i);
-  return writeBinBuf((char*) &i, sizeof(i));
-}
-
-bool
-IOBuf::writeBinUnsignedInt(unsigned int i) {
-  i = htonl(i);
-  return writeBinBuf((char*) &i, sizeof(i));
-}
-
-bool
-IOBuf::writeBinBuf(char* buf, int size) {
-  while (size > 0) {
-    int spaceRemaining = outBuf->remaining();
-    if (spaceRemaining == 0) {
-      if (!flushImpl(true)) {
-        return false;
-      }
-      spaceRemaining = outBuf->remaining();
-    }
-    int toCopy = (size > spaceRemaining) ? spaceRemaining : size;
-    memcpy(outBuf->fillPos(), buf, toCopy);
-    outBuf->incrFillPos(toCopy);
-    buf += toCopy;
-    size -= toCopy;
-    if (size > 0) {
-      if (!flushImpl(true)) {
-        return false;
-      }
-    }
-  }
-  return true;
-}
-
-#ifdef WIN32
-IOBuf::FillState
-IOBuf::fillFromFileHandle(HANDLE fh, DWORD* numBytesRead) {
-  int totalToRead;
-  char moreToCome;
-
-  outBuf->compact();
-
-  DWORD numRead;
-  if (!ReadFile(fh, &totalToRead, sizeof(int), &numRead, NULL)) {
-    return FAILED;
-  }
-  if (numRead != sizeof(int)) {
-    return FAILED;
-  }
-  if (!ReadFile(fh, &moreToCome, 1, &numRead, NULL)) {
-    return FAILED;
-  }
-  if (numRead != 1) {
-    return FAILED;
-  }
-  if (outBuf->remaining() < totalToRead) {
-    return FAILED;
-  }
-
-  int tmp = totalToRead;
-
-  while (totalToRead > 0) {
-    if (!ReadFile(fh, outBuf->fillPos(), totalToRead, &numRead, NULL)) {
-      return FAILED;
-    }
-    outBuf->incrFillPos((int) numRead);
-    totalToRead -= numRead;
-  }
-
-  *numBytesRead = tmp;
-  return ((moreToCome == 0) ? DONE : MORE_DATA_PENDING);
-}
-#endif
-
-bool
-IOBuf::isBinEscapeChar(char c) {
-  return (c == '|');
-}
-
-IOBuf::Action
-IOBuf::processChar(char c) {
-  Action action = NO_ACTION;
-  switch (state) {
-  case TEXT_STATE: {
-    // Looking for text char, bin escape char, or EOL
-    if (isBinEscapeChar(c)) {
-#ifdef DEBUGGING
-      fprintf(stderr, "[a: '%c'] ", inBuf[0]);
-#endif
-      binPos = 0;
-#ifdef DEBUGGING
-      fprintf(stderr, "[b: '%c'] ", inBuf[0]);
-#endif
-      binLength = 0;
-#ifdef DEBUGGING
-      fprintf(stderr, "[c: '%c'] ", inBuf[0]);
-#endif
-      state = BIN_STATE;
-#ifdef DEBUGGING
-      fprintf(stderr, "[d: '%c'] ", inBuf[0]);
-#endif
-#ifdef DEBUGGING
-      fprintf(stderr, "\nSwitching to BIN_STATE\n");
-#endif
-    } else if (isEOL(c)) {
-      state = EOL_STATE;
-      action = GOT_LINE;
-#ifdef DEBUGGING
-      fprintf(stderr, "\nSwitching to EOL_STATE (GOT_LINE)\n");
-#endif
-    }
-#ifdef DEBUGGING
-    else {
-      fprintf(stderr, "'%c' ", c);
-      fflush(stderr);
-    }
-#endif
-    break;
-  }
-
-  case BIN_STATE: {
-    // Seeking to finish read of input
-    if (binPos < 4) {
-      int cur = c & 0xFF;
-      binLength <<= 8;
-      binLength |= cur;
-      ++binPos;
-    } else {
-#ifdef DEBUGGING
-      fprintf(stderr, "Reading binary byte %d of %d\n",
-              binPos - 4, binLength);
-#endif
-      ++binPos;
-      if (binPos == 4 + binLength) {
-        state = TEXT_STATE;
-#ifdef DEBUGGING
-        fprintf(stderr, "Switching to TEXT_STATE\n");
-#endif
-      }
-    }
-    break;
-  }
-
-  case EOL_STATE: {
-    // More EOL characters just cause us to re-enter this state
-    if (isEOL(c)) {
-      action = SKIP_EOL_CHAR;
-    } else if (isBinEscapeChar(c)) {
-      binPos = 0;
-      binLength = 0;
-      state = BIN_STATE;
-    } else {
-      state = TEXT_STATE;
-#ifdef DEBUGGING
-      fprintf(stderr, "'%c' ", c);
-      fflush(stderr);
-#endif
-    }
-    break;
-  }
-
-  } // switch
-
-  return action;
-}
-
-
-bool
-IOBuf::isEOL(char c) {
-#ifdef WIN32
-  return ((c == '\n') || (c == '\r'));
-#elif defined(__sun)
-  return c == '\n';
-#else
-  #error Please port isEOL() to your platform
-  return false;
-#endif
-}
--- a/agent/src/os/win32/IOBuf.hpp	Wed Sep 14 13:23:54 2011 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,222 +0,0 @@
-/*
- * Copyright (c) 2000, 2003, Oracle and/or its affiliates. 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.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- *
- */
-
-#ifndef _IO_BUF_
-#define _IO_BUF_
-
-// This file is currently used for os/solaris/agent/ too.  At some point in time
-// the source will be reorganized to avoid these ifdefs.
-// Note that this class can read/write from a file as well as a socket.  This
-// file capability is only implemented on win32.
-
-#ifdef WIN32
-  #include <winsock2.h>
-#else
-  #include <sys/types.h>
-  #include <sys/socket.h>
-  // These are from win32 winsock2.h
-  typedef unsigned int SOCKET;
-  typedef void * HANDLE;
-  typedef unsigned long DWORD;
-  #define INVALID_SOCKET (SOCKET)(~0)
-#endif
-
-#include <vector>
-#include "Buffer.hpp"
-
-/** Manages an input/output buffer pair for a socket or file handle. */
-class IOBuf {
-public:
-  IOBuf(int inBufLen, int outBufLen);
-  ~IOBuf();
-
-  enum ReadLineResult {
-    RL_GOT_DATA,
-    RL_NO_DATA,
-    RL_ERROR
-  };
-
-  /** Change the socket with which this buffer is associated */
-  void setSocket(SOCKET sock);
-
-  // Reading/writing files is only supported on windows.
-#ifdef WIN32
-  /** Change the output file handle with which this buffer is
-      associated. Currently IOBufs can not be used to read from a file
-      handle. */
-  void setOutputFileHandle(HANDLE handle);
-#endif
-
-  /** Reset the input and output buffers, without flushing the output
-      data to the socket */
-  void reset();
-
-  /** Try to read a line of data from the given socket without
-      blocking. If was able to read a complete line of data, returns a
-      character pointer to the beginning of the (null-terminated)
-      string. If not, returns NULL, but maintains enough state that
-      subsequent calls to tryReadLine() will not ignore the data
-      already read. NOTE: this skips end-of-line characters (typically
-      CR/LF) as defined by "isEOL()". When switching back and forth
-      between binary and text modes, to be sure no data is lost, pad
-      the beginning and end of the binary transmission with bytes
-      which can not be confused with these characters. */
-  ReadLineResult tryReadLine();
-
-  /** Read a line of data from the given socket, blocking until a
-      line, including EOL, appears.  Return the line, or NULL if
-      something goes wrong. */
-  char *readLine();
-
-  /** Get the pointer to the beginning of the (null-terminated) line.
-      This should only be called if tryReadLine() has returned
-      RL_GOT_DATA. This sets the "parsing cursor" to the beginning of
-      the line. */
-  char* getLine();
-
-  // NOTE: any further data-acquisition routines must ALWAYS call
-  // fixupData() at the beginning!
-
-  //----------------------------------------------------------------------
-  // Output routines
-  //
-
-  /** Flush the output buffer to the socket. Returns true if
-      succeeded, false if write error occurred. */
-  bool flush();
-
-  /** Write the given string to the output buffer. May flush if output
-      buffer becomes too full to store the data. Not guaranteed to
-      work if string is longer than the size of the output buffer.
-      Does not include the null terminator of the string. Returns true
-      if succeeded, false if write error occurred. */
-  bool writeString(const char* str);
-
-  /** Write the given int to the output buffer. May flush if output
-      buffer becomes too full to store the data. Returns true if
-      succeeded, false if write error occurred. */
-  bool writeInt(int val);
-
-  /** Write the given unsigned int to the output buffer. May flush if
-      output buffer becomes too full to store the data. Returns true
-      if succeeded, false if write error occurred. */
-  bool writeUnsignedInt(unsigned int val);
-
-  /** Write the given boolean to the output buffer. May flush if
-      output buffer becomes too full to store the data. Returns true
-      if succeeded, false if write error occurred. */
-  bool writeBoolAsInt(bool val);
-
-  /** Write the given address to the output buffer. May flush if
-      output buffer becomes too full to store the data. Returns true
-      if succeeded, false if write error occurred. */
-  bool writeAddress(void* val);
-
-  /** Writes a space to the output buffer. May flush if output buffer
-      becomes too full to store the data. Returns true if succeeded,
-      false if write error occurred. */
-  bool writeSpace();
-
-  /** Writes an end-of-line sequence to the output buffer. May flush
-      if output buffer becomes too full to store the data. Returns
-      true if succeeded, false if write error occurred. */
-  bool writeEOL();
-
-  /** Writes a binary character to the output buffer. */
-  bool writeBinChar(char c);
-
-  /** Writes a binary unsigned short in network (big-endian) byte
-      order to the output buffer. */
-  bool writeBinUnsignedShort(unsigned short i);
-
-  /** Writes a binary unsigned int in network (big-endian) byte order
-      to the output buffer. */
-  bool writeBinUnsignedInt(unsigned int i);
-
-  /** Writes a binary buffer to the output buffer. */
-  bool writeBinBuf(char* buf, int size);
-
-#ifdef WIN32
-  enum FillState {
-    DONE = 1,
-    MORE_DATA_PENDING = 2,
-    FAILED = 3
-  };
-
-  /** Very specialized routine; fill the output buffer from the given
-      file handle. Caller is responsible for ensuring that there is
-      data to be read on the file handle. */
-  FillState fillFromFileHandle(HANDLE fh, DWORD* numRead);
-#endif
-
-  /** Binary utility routine (for poke) */
-  static bool isBinEscapeChar(char c);
-
-private:
-  IOBuf(const IOBuf&);
-  IOBuf& operator=(const IOBuf&);
-
-  // Returns -1 if non-blocking and no data available
-  int readChar(bool block);
-  // Line-oriented reading
-  std::vector<char> curLine;
-  bool gotDataLastTime;
-
-  ReadLineResult doReadLine(bool);
-
-  bool flushImpl(bool moreDataToCome);
-
-  SOCKET fd;
-  HANDLE outHandle;
-  bool usingSocket;
-
-  // Buffers
-  Buffer* inBuf;
-  Buffer* outBuf;
-
-  // Simple finite-state machine to handle binary data
-  enum State {
-    TEXT_STATE,
-    BIN_STATE,
-    EOL_STATE
-  };
-  enum Action {
-    NO_ACTION,
-    GOT_LINE,     // TEXT_STATE -> EOL_STATE transition
-    SKIP_EOL_CHAR // EOL_STATE -> EOL_STATE transition
-  };
-
-  State state;
-  Action processChar(char c);
-
-  // Handling incoming binary buffers (poke command)
-  int   binPos;    // Number of binary characters read so far;
-                   // total number to read is binLength + 4
-  int   binLength; // Number of binary characters in message;
-                   // not valid until binPos >= 4
-
-  bool isEOL(char c);
-};
-
-#endif  // #defined _IO_BUF_
--- a/agent/src/os/win32/LockableList.hpp	Wed Sep 14 13:23:54 2011 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,54 +0,0 @@
-/*
- * Copyright (c) 2000, Oracle and/or its affiliates. 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.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- *
- */
-
-#ifndef _LOCKABLE_LIST_
-#define _LOCKABLE_LIST_
-
-#include <windows.h>
-#include "BasicList.hpp"
-
-template<class T>
-class LockableList : public BasicList<T> {
-private:
-  CRITICAL_SECTION crit;
-
-public:
-  LockableList() {
-    InitializeCriticalSection(&crit);
-  }
-
-  ~LockableList() {
-    DeleteCriticalSection(&crit);
-  }
-
-  void lock() {
-    EnterCriticalSection(&crit);
-  }
-
-  void unlock() {
-    LeaveCriticalSection(&crit);
-  }
-};
-
-#endif  // #defined _LOCKABLE_LIST_
--- a/agent/src/os/win32/Makefile	Wed Sep 14 13:23:54 2011 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,80 +0,0 @@
-#
-# Copyright (c) 2000, 2001, Oracle and/or its affiliates. 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.
-#
-# This code is distributed in the hope that it will be useful, but WITHOUT
-# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
-# version 2 for more details (a copy is included in the LICENSE file that
-# accompanied this code).
-#
-# You should have received a copy of the GNU General Public License version
-# 2 along with this work; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-#
-# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
-# or visit www.oracle.com if you need additional information or have any
-# questions.
-#  
-#
-
-SERVER=SwDbgSrv.exe
-SUBPROCESS=SwDbgSub.exe
-
-SERVER_SOURCES =   \
-  Buffer.cpp       \
-  Dispatcher.cpp   \
-  initWinsock.cpp  \
-  IOBuf.cpp        \
-  ioUtils.cpp      \
-  isNT4.cpp        \
-  nt4internals.cpp \
-  procList.cpp     \
-  Reaper.cpp       \
-  SwDbgSrv.cpp     \
-  serverLists.cpp  \
-  toolHelp.cpp
-
-SUBPROCESS_SOURCES = \
-  SwDbgSub.cpp       \
-  Buffer.cpp         \
-  IOBuf.cpp          \
-  isNT4.cpp          \
-  libInfo.cpp        \
-  Monitor.cpp        \
-  nt4internals.cpp   \
-  toolHelp.cpp
-
-SERVER_OBJS     = $(SERVER_SOURCES:.cpp=.obj)
-SUBPROCESS_OBJS = $(SUBPROCESS_SOURCES:.cpp=.obj)
-
-CPP=cl.exe
-LINK32=link.exe
-
-# These do not need to be optimized (don't run a lot of code) and it
-# will be useful to have the assertion checks in place
-
-CFLAGS=/nologo /MD /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
-
-LIBS=kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib          \
-     ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib     \
-     winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib \
-     odbccp32.lib ws2_32.lib  /nologo /subsystem:console /debug /machine:I386
-
-default: $(SERVER) $(SUBPROCESS)
-
-$(SERVER): $(SERVER_OBJS)
-	$(LINK32) /out:$@ $(SERVER_OBJS) $(LIBS)
-
-$(SUBPROCESS): $(SUBPROCESS_OBJS)
-	$(LINK32) /out:$@ $(SUBPROCESS_OBJS) $(LIBS)
-
-clean:
-	rm -f *.obj *.idb *.pch *.pdb *.ncb *.opt *.plg *.exe *.ilk
-
-.cpp.obj:
-	@ $(CPP) $(CFLAGS) /o $@ $<
--- a/agent/src/os/win32/Message.hpp	Wed Sep 14 13:23:54 2011 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,123 +0,0 @@
-/*
- * Copyright (c) 2000, 2001, Oracle and/or its affiliates. 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.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- *
- */
-
-#ifndef _MESSAGE_
-#define _MESSAGE_
-
-// These are the commands sent from the server to the child processes
-// over the child processes' stdin pipes. A subset of the commands
-// understood by the overall system, these require responses from the
-// child process. Having a data structure rather than sending text
-// simplifies parsing on the child side. The child replies by sending
-// back fully-formatted replies which are copied by the server process
-// to the clients' sockets.
-
-struct PeekArg {
-  DWORD address;
-  DWORD numBytes;
-};
-
-// NOTE: when sending a PokeArg to the child process, we handle the
-// buffer specially
-struct PokeArg {
-  DWORD address;
-  DWORD numBytes;
-  void* data;
-};
-
-// Used for continueevent
-struct BoolArg {
-  bool val;
-};
-
-// Used for duphandle, closehandle, and getcontext
-struct HandleArg {
-  HANDLE handle;
-};
-
-// Used for setcontext
-const int NUM_REGS_IN_CONTEXT = 22;
-struct SetContextArg {
-  HANDLE handle;
-  DWORD  Eax;
-  DWORD  Ebx;
-  DWORD  Ecx;
-  DWORD  Edx;
-  DWORD  Esi;
-  DWORD  Edi;
-  DWORD  Ebp;
-  DWORD  Esp;
-  DWORD  Eip;
-  DWORD  Ds;
-  DWORD  Es;
-  DWORD  Fs;
-  DWORD  Gs;
-  DWORD  Cs;
-  DWORD  Ss;
-  DWORD  EFlags;
-  DWORD  Dr0;
-  DWORD  Dr1;
-  DWORD  Dr2;
-  DWORD  Dr3;
-  DWORD  Dr6;
-  DWORD  Dr7;
-};
-
-// Used for selectorentry
-struct SelectorEntryArg {
-  HANDLE handle;
-  DWORD  selector;
-};
-
-struct Message {
-  typedef enum {
-    ATTACH,
-    DETACH,
-    LIBINFO,
-    PEEK,
-    POKE,
-    THREADLIST,
-    DUPHANDLE,
-    CLOSEHANDLE,
-    GETCONTEXT,
-    SETCONTEXT,
-    SELECTORENTRY,
-    SUSPEND,
-    RESUME,
-    POLLEVENT,
-    CONTINUEEVENT
-  } Type;
-
-  Type type;
-  union {
-    PeekArg          peekArg;
-    PokeArg          pokeArg;
-    BoolArg          boolArg;
-    HandleArg        handleArg;
-    SetContextArg    setContextArg;
-    SelectorEntryArg selectorArg;
-  };
-};
-
-#endif  // #defined _MESSAGE_
--- a/agent/src/os/win32/Monitor.cpp	Wed Sep 14 13:23:54 2011 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,176 +0,0 @@
-/*
- * Copyright (c) 2001, Oracle and/or its affiliates. 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.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- *
- */
-
-#include <stdio.h>
-#include <assert.h>
-#include "Monitor.hpp"
-
-Monitor::Monitor() {
-  _lock_count = -1;       // No threads have entered the critical section
-  _owner = NULL;
-  _lock_event = CreateEvent(NULL, false, false, NULL);
-  _wait_event = CreateEvent(NULL, true, false, NULL);
-  _counter = 0;
-  _tickets = 0;
-  _waiters = 0;
-}
-
-Monitor::~Monitor() {
-  assert(_owner == NULL);    // Otherwise, owned monitor being deleted
-  assert(_lock_count == -1); // Otherwise, monitor being deleted with non -1 lock count
-  CloseHandle(_lock_event);
-  CloseHandle(_wait_event);
-}
-
-void
-Monitor::lock() {
-  if (InterlockedIncrement(&_lock_count) == 0) {
-    // Success, we now own the lock
-  } else {
-    DWORD dwRet = WaitForSingleObject((HANDLE)_lock_event,  INFINITE);
-    assert(dwRet == WAIT_OBJECT_0); // Unexpected return value from WaitForSingleObject
-  }
-  assert(owner() == NULL); // Otherwise, lock count and owner are inconsistent
-  setOwner(GetCurrentThread());
-}
-
-void
-Monitor::unlock() {
-  setOwner(NULL);
-  if (InterlockedDecrement(&_lock_count) >= 0) {
-    // Wake a waiting thread up
-    DWORD dwRet = SetEvent(_lock_event);
-    assert(dwRet != 0); // Unexpected return value from SetEvent
-  }
-}
-
-bool
-Monitor::wait(long timeout) {
-  assert(owner() != NULL);
-  assert(owner() == GetCurrentThread());
-
-  // 0 means forever. Convert to Windows specific code.
-  DWORD timeout_value = (timeout == 0) ? INFINITE : timeout;
-  DWORD which;
-
-  long c = _counter;
-  bool retry = false;
-
-  _waiters++;
-  // Loop until condition variable is signaled.  The event object is
-  // set whenever the condition variable is signaled, and tickets will
-  // reflect the number of threads which have been notified. The counter
-  // field is used to make sure we don't respond to notifications that
-  // have occurred *before* we started waiting, and is incremented each
-  // time the condition variable is signaled.
-
-  while (true) {
-
-    // Leave critical region
-    unlock();
-
-    // If this is a retry, let other low-priority threads have a chance
-    // to run.  Make sure that we sleep outside of the critical section.
-    if (retry) {
-      Sleep(1);
-    } else {
-      retry = true;
-    }
-
-    which = WaitForSingleObject(_wait_event, timeout_value);
-    // Enter critical section
-    lock();
-
-    if (_tickets != 0 && _counter != c) break;
-
-    if (which == WAIT_TIMEOUT) {
-      --_waiters;
-      return true;
-    }
-  }
-  _waiters--;
-
-  // If this was the last thread to be notified, then we need to reset
-  // the event object.
-  if (--_tickets == 0) {
-    ResetEvent(_wait_event);
-  }
-
-  return false;
-}
-
-// Notify a single thread waiting on this monitor
-bool
-Monitor::notify() {
-  assert(ownedBySelf()); // Otherwise, notify on unknown thread
-
-  if (_waiters > _tickets) {
-    if (!SetEvent(_wait_event)) {
-      return false;
-    }
-    _tickets++;
-    _counter++;
-  }
-
-  return true;
-}
-
-// Notify all threads waiting on this monitor
-bool
-Monitor::notifyAll() {
-  assert(ownedBySelf()); // Otherwise, notifyAll on unknown thread
-
-  if (_waiters > 0) {
-    if (!SetEvent(_wait_event)) {
-      return false;
-    }
-    _tickets = _waiters;
-    _counter++;
-  }
-
-  return true;
-}
-
-HANDLE
-Monitor::owner() {
-  return _owner;
-}
-
-void
-Monitor::setOwner(HANDLE owner) {
-  if (owner != NULL) {
-    assert(_owner == NULL);                 // Setting owner thread of already owned monitor
-    assert(owner == GetCurrentThread());    // Else should not be doing this
-  } else {
-    HANDLE oldOwner = _owner;
-    assert(oldOwner != NULL);               // Removing the owner thread of an unowned mutex
-    assert(oldOwner == GetCurrentThread());
-  }
-  _owner = owner;
-}
-
-bool
-Monitor::ownedBySelf() {
-  return (_owner == GetCurrentThread());
-}
--- a/agent/src/os/win32/Monitor.hpp	Wed Sep 14 13:23:54 2011 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,58 +0,0 @@
-/*
- * Copyright (c) 2001, Oracle and/or its affiliates. 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.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- *
- */
-
-#ifndef _MONITOR_
-#define _MONITOR_
-
-#include <windows.h>
-
-class Monitor {
-public:
-  Monitor();
-  ~Monitor();
-
-  void lock();
-  void unlock();
-  // Default time is forever (i.e, zero). Returns true if it times-out, otherwise
-  // false.
-  bool wait(long timeout = 0);
-  bool notify();
-  bool notifyAll();
-
-private:
-  HANDLE owner();
-  void setOwner(HANDLE owner);
-  bool ownedBySelf();
-
-  HANDLE _owner;
-  long   _lock_count;
-  HANDLE _lock_event;   // Auto-reset event for blocking in lock()
-  HANDLE _wait_event;   // Manual-reset event for notifications
-  long _counter;        // Current number of notifications
-  long _waiters;        // Number of threads waiting for notification
-  long _tickets;        // Number of waiters to be notified
-};
-
-
-#endif  // #defined _MONITOR_
--- a/agent/src/os/win32/README-commands.txt	Wed Sep 14 13:23:54 2011 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,246 +0,0 @@
-This debug server uses a largely text-based protocol, except for
-certain bulk data transfer operations. All text is in single-byte
-US-ASCII except for the strings returned in "proclist".
-
-NOTE that the character '|' (vertical bar) is used as an escape
-character to switch the incoming data stream to the debug server into
-binary mode, so no text command may contain that character.
-
-Commands understood:
-
-ascii <EOL>                 ::=
-
-    Changes to ASCII mode. This affects all outgoing strings. At
-    startup the system is in unicode mode.
-
-unicode <EOL>               ::=
-
-    Changes to UNICODE mode. This affects all outgoing strings. This
-    is the default mode upon startup.
-
-proclist <EOL>              ::=
-      <int num> [<unsigned int pid> <int charSize> <int numChars> [<binary char_t name>]...]... <EOL>
-
-    Returns integer indicating number of processes to follow, followed
-    by (pid, name) pairs. Names are given by (charSize, numChars,
-    [char_t]...) tuples; charSize indicates the size of each character
-    in bytes, numChars the number of characters in the string, and
-    name the raw data for the string. Each individual character of the
-    string, if multi-byte, is transmitted in network byte order.
-    numChars and name are guaranteed to be separated by precisely one
-    US-ASCII space. If process list is not available because of
-    limitations of the underlying operating system, number of
-    processes returned is 0.
-
-attach <int pid> <EOL>      ::= <bool result> <EOL>
-
-    Attempts to attach to the specified process. Returns 1 if
-    successful, 0 if not. Will fail if already attached or if the
-    process ID does not exist. Attaching to a process causes the
-    process to be suspended.
-
-detach <EOL>                ::= <bool result> <EOL>
-
-    Detaches from the given process. Attaching and detaching multiple
-    times during a debugging session is allowed. Detaching causes the
-    process to resume execution.
-
-libinfo <EOL>               ::=
-      <int numLibs> [<int charSize> <int numChars> [<binary char_t name>]... <address baseAddr>]... <EOL>
-
-    May only be called once attached and the target process must be
-    suspended; otherwise, returns 0. Returns list of the full path
-    names of all of the loaded modules (including the executable
-    image) in the target process, as well as the base address at which
-    each module was relocated. See proclist for format of strings, but
-    NOTE that charSize is ALWAYS 1 for this particular routine,
-    regardless of the setting of ASCII/UNICODE.
-
-peek <address addr> <unsigned int numBytes> <EOL> ::=
-     B<binary char success>
-      [<binary unsigned int len> <binary char isMapped> [<binary char data>]...]...
-
-    NOTE that the binary portion of this message is prefixed by the
-    uppercase US-ASCII letter 'B', allowing easier synchronization by
-    clients. There is no data between the 'B' and the rest of the
-    message.
-
-    May only be called once attached. Reads the address space of the
-    target process starting at the given address (see below for format
-    specifications) and extending the given number of bytes. Whether
-    the read succeeded is indicated by a single byte containing a 1 or
-    0 (success or failure). If successful, the return result is given
-    in a sequence of ranges. _len_, the length of each range, is
-    indicated by a 32-bit unsigned integer transmitted with big-endian
-    byte ordering (i.e., most significant byte first).  _isMapped_
-    indicates whether the range is mapped or unmapped in the target
-    process's address space, and will contain the value 1 or 0 for
-    mapped or unmapped, respectively. If the range is mapped,
-    _isMapped_ is followed by _data_, containing the raw binary data
-    for the range. The sum of all ranges' lengths is guaranteed to be
-    equivalent to the number of bytes requested.
-
-poke <address addr> |[<binary unsigned int len> [<binary char data>]] <EOL> ::=
-     <bool result> <EOL>
-
-    NOTE that the binary portion of this message is prefixed by the
-    uppercase US-ASCII character '|' (vertical bar), allowing easier
-    synchronization by the server. There is no data between the '|'
-    and the rest of the message. ('B' is not used here because
-    addresses can contain that letter; no alphanumeric characters are
-    used because some of the parsing routines are used by the Solaris
-    SA port, and in that port any alphanumeric character can show up
-    as a part of a symbol being looked up.)
-
-    May only be called once attached. Writes the address space of the
-    target process starting at the given address (see below for format
-    specifications), extending the given number of bytes, and
-    containing the given data. The number of bytes is a 32-bit
-    unsigned integer transmitted with big-endian byte ordering (i.e.,
-    most significant byte first). This is followed by the raw binary
-    data to be placed at that address. The number of bytes of data
-    must match the number of bytes specified in the message.
-
-    Returns true if the write succeeded; false if it failed, for
-    example because a portion of the region was not mapped in the
-    target address space.
-
-threadlist <EOL>            ::= <int numThreads> [<address threadHandle>...] <EOL>
-
-    May only be called once attached and the target process must be
-    suspended; otherwise, returns 0. If available, returns handles for
-    all of the threads in the target process. These handles may be
-    used as arguments to the getcontext and selectorentry
-    commands. They do not need to be (and should not be) duplicated
-    via the duphandle command and must not be closed via the
-    closehandle command.
-
-duphandle <address handle> <EOL> ::=
-    <bool success> [<address duplicate>] <EOL>
-
-    Duplicates a HANDLE read from the target process's address space.
-    HANDLE is a Windows construct (typically typedef'd to void *).
-    The returned handle should ultimately be closed via the
-    closehandle command; failing to do so can cause resource leaks.
-
-    The purpose of this command is to allow the debugger to read the
-    value of a thread handle from the target process and query its
-    register set and thread selector entries via the getcontext and
-    selectorentry commands, below; such use implies that the target
-    program has its own notion of the thread list, and further, that
-    the debugger has a way of locating that thread list.
-
-closehandle <address handle> <EOL> ::=
-
-    Closes a handle retrieved via the duphandle command, above.
-
-getcontext <address threadHandle> <EOL> ::= <bool success> [<context>] <EOL>
-    
-    Returns the context for the given thread. The handle must either
-    be one of the handles returned from the threadlist command or the
-    result of duplicating a thread handle out of the target process
-    via the duphandle command. The target process must be suspended.
-
-    The context is returned as a series of hex values which represent
-    the following x86 registers in the following order:
-      EAX, EBX, ECX, EDX, ESI, EDI, EBP, ESP, EIP, DS, ES, FS, GS,
-      CS, SS, EFLAGS, DR0, DR1, DR2, DR3, DR6, DR7
-
-    FIXME: needs to be generalized and/or specified for other
-    architectures.
-
-setcontext <address threadHandle> <context> ::= <bool success> <EOL>
-
-    Sets the context of the given thread. The target process must be
-    suspended. See the getcontext command for the ordering of the
-    registers in the context.
-
-    Even if the setcontext command succeeds, some of the bits in some
-    of the registers (like the global enable bits in the debug
-    registers) may be overridden by the operating system. To ensure
-    the debugger's notion of the register set is up to date, it is
-    recommended to follow up a setcontext with a getcontext.
-
-selectorentry <address threadHandle> <int selector> <EOL> ::=
-    <bool success>
-    [<address limitLow> <address baseLow>
-     <address baseMid>  <address flags1>
-     <address flags2>   <address baseHi>] <EOL>
-
-    Retrieves a descriptor table entry for the given thread and
-    selector. This data structure allows conversion of a
-    segment-relative address to a linear virtual address. It is most
-    useful for locating the Thread Information Block for a given
-    thread handle to be able to find that thread's ID, to be able to
-    understand whether two different thread handles in fact refer to
-    the same underlying thread.
-
-    This command will only work on the X86 architecture and will
-    return false for the success flag (with no additional information
-    sent) on other architectures.
-
-suspend                     ::=
-
-    Suspends the target process. Must be attached to a target process.
-    A process is suspended when attached to via the attach command. If
-    the target process is already suspended then this command has no
-    effect.
-
-resume                      ::=
-
-    Resumes the target process without detaching from it. Must be
-    attached to a target process. After resuming a target process, the
-    debugger client must be prepared to poll for events from the
-    target process fairly frequently in order for execution in the
-    target process to proceed normally. If the target process is
-    already resumed then this command has no effect.
-
-pollevent                   ::=
-    <bool eventPresent> [<address threadHandle> <unsigned int eventCode>]
-
-  Additional entries in result for given eventCode:
-
-    LOAD/UNLOAD_DLL_DEBUG_EVENT: <address baseOfDLL>
-    EXCEPTION_DEBUG_EVENT:       <unsigned int exceptionCode> <address faultingPC>
-
-      Additional entries for given exceptionCode:
-
-         EXCEPTION_ACCESS_VIOLATION: <bool wasWrite> <address faultingAddress>
-
-    <EOL>
-
-    Polls once to see whether a debug event has been generated by the
-    target process. If none is present, returns 0 immediately.
-    Otherwise, returns 1 along with a series of textual information
-    about the event. The event is not cleared, and the thread resumed,
-    until the continueevent command is sent, or the debugger client
-    detaches from the target process.
-
-    Typically a debugger client will suspend the target process upon
-    reception of a debug event. Otherwise, it is not guaranteed that
-    all threads will be suspended upon reception of a debug event, and
-    any operations requiring that threads be suspended (including
-    fetching the context for the thread which generated the event)
-    will fail.
-
-continueevent <bool passEventToClient> ::= <bool success> <EOL>
-
-    Indicates that the current debug event has been used by the
-    debugger client and that the target process should be resumed. The
-    passEventToClient flag indicates whether the event should be
-    propagated to the target process. Breakpoint and single-step
-    events should not be propagated to the target. Returns false if
-    there was no pending event, true otherwise.
-
-exit <EOL>
-
-    Exits this debugger session.
-
-Format specifications:
-
-// Data formats and example values:
-<EOL>          ::=   end of line (typically \n on Unix platforms, or \n\r on Windows)
-<address>      ::=   0x12345678[9ABCDEF0] /* up to 64-bit hex value */
-<unsigned int> ::=   5                    /* up to 32-bit integer number; no leading sign */
-<bool>         ::=   1                    /* ASCII '0' or '1' */
-<context>      ::=   <address> ...
--- a/agent/src/os/win32/README.txt	Wed Sep 14 13:23:54 2011 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,64 +0,0 @@
-This is a "Simple Windows Debug Server" written for the purpose of
-enabling the Serviceability Agent on Win32. It has backends both for
-Windows NT 4.0 (using internal Windows APIs for a few routines) as
-well as for 95/98/ME/2000 via the Tool Help APIs.
-
-The reason this debug server is necessary is that the Win32 debug APIs
-by design tear down the target process when the debugger exits (see
-knowledge base article Q164205 on msdn.microsoft.com). On Solaris, one
-can attach to and detach from a process with no effect; this is key to
-allowing dbx and gcore to work.
-
-The Simple Windows Debug Server effectively implements attach/detach
-functionality for arbitrary debug clients. This allows the SA to
-attach non-destructively to a process, and will enable gcore for Win32
-to be written shortly. While the debugger (the "client" in all of the
-source code) is attached, the target process is suspended. (Note that
-the debug server could be extended to support resumption of the target
-process and transmission of debug events over to the debugger, but
-this has been left for the future.)
-
-The makefile (type "nmake") builds two executables: SwDbgSrv.exe,
-which is the server process, and SwDbgSub.exe, which is forked by the
-server and should not be directly invoked by the user.
-
-The intent is that these two executables can be installed into
-C:\WINNT\SYSTEM32 and SwDbgSrv installed to run as a service (on NT),
-for example using ServiceInstaller (http://www.kcmultimedia.com/smaster/). 
-However, SwDbgSrv can also be run from the command line. It generates
-no text output unless the source code is changed to enable debugging
-printouts. As long as any processes which have been attached to by the
-SA are alive, the SwDbgSrv and any forked SwDbgSub processes must be
-left running. Terminating them will cause termination of the target
-processes.
-
-The debug server opens port 27000 and accepts incoming connections
-from localhost only. The security model assumes that if one can run a
-process on the given machine then one basically has access to most or
-all of the machine's facilities; this seems to be in line with the
-standard Windows security model. The protocol used is text-based, so
-one can debug the debug server using telnet. See README-commands.txt
-for documentation on the supported commands.
-
-Testing indicates that the performance impact of attaching to a
-process (and therefore permanently attaching a debugger) is minimal.
-Some serious performance problems had been seen which ultimately
-appeared to be a lack of physical memory on the machine running the
-system.
-
-Bugs:
-
-This debug server is fundamentally incompatible with the Visual C++
-debugger. Once the debug server is used to attach to a process, the
-Visual C++ IDE will not be able to attach to the same process (even if
-the debug server is "detached" from that process). Note that this
-system is designed to work with the same primitives that C and C++
-debuggers use (like "symbol lookup" and "read from process memory")
-and exposes these primitives to Java, so in the long term we could
-solve this problem by implementing platform-specific debug symbol
-parsing and a platform-independent C++ debugger in Java.
-
-Note:
-
-The files IOBuf.cpp and IOBuf.hpp are also used in 
-building src/os/solaris/agent.
--- a/agent/src/os/win32/Reaper.cpp	Wed Sep 14 13:23:54 2011 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,159 +0,0 @@
-/*
- * Copyright (c) 2000, Oracle and/or its affiliates. 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.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- *
- */
-
-#include <iostream>
-#include "Reaper.hpp"
-
-using namespace std;
-
-Reaper::Reaper(ReaperCB* cb) {
-  InitializeCriticalSection(&crit);
-  event = CreateEvent(NULL, TRUE, FALSE, NULL);
-  this->cb = cb;
-
-  active = false;
-  shouldShutDown = false;
-}
-
-bool
-Reaper::start() {
-  bool result = false;
-
-  EnterCriticalSection(&crit);
-
-  if (!active) {
-    DWORD id;
-    HANDLE reaper = CreateThread(NULL, 0, &Reaper::reaperThreadEntry,
-                                 this, 0, &id);
-    if (reaper != NULL) {
-      result = true;
-    }
-  }
-
-  LeaveCriticalSection(&crit);
-
-  return result;
-}
-
-bool
-Reaper::stop() {
-  bool result = false;
-
-  EnterCriticalSection(&crit);
-
-  if (active) {
-    shouldShutDown = true;
-    SetEvent(event);
-    while (active) {
-      Sleep(1);
-    }
-    shouldShutDown = false;
-    result = true;
-  }
-
-  LeaveCriticalSection(&crit);
-
-  return result;
-}
-
-void
-Reaper::registerProcess(HANDLE processHandle, void* userData) {
-  ProcessInfo info;
-
-  info.handle = processHandle;
-  info.userData = userData;
-
-  EnterCriticalSection(&crit);
-
-  procInfo.push_back(info);
-  SetEvent(event);
-
-  LeaveCriticalSection(&crit);
-}
-
-void
-Reaper::reaperThread() {
-  while (!shouldShutDown) {
-    // Take atomic snapshot of the current process list and user data
-    EnterCriticalSection(&crit);
-
-    int num = procInfo.size();
-    HANDLE* handleList = new HANDLE[1 + num];
-    void**  dataList   = new void*[num];
-    for (int i = 0; i < num; i++) {
-      handleList[i] = procInfo[i].handle;
-      dataList[i]   = procInfo[i].userData;
-    }
-
-    LeaveCriticalSection(&crit);
-
-    // Topmost handle becomes the event object, so other threads can
-    // signal this one to notice differences in the above list (or
-    // shut down)
-    handleList[num] = event;
-
-    // Wait for these objects
-    DWORD idx = WaitForMultipleObjects(1 + num, handleList,
-                                       FALSE, INFINITE);
-    if ((idx >= WAIT_OBJECT_0) && (idx <= WAIT_OBJECT_0 + num)) {
-      idx -= WAIT_OBJECT_0;
-      if (idx < num) {
-        // A process exited (i.e., it wasn't that we were woken up
-        // just because the event went off)
-        (*cb)(dataList[idx]);
-        // Remove this process from the list (NOTE: requires that
-        // ordering does not change, i.e., that all additions are to
-        // the back of the process list)
-        EnterCriticalSection(&crit);
-
-        std::vector<ProcessInfo>::iterator iter = procInfo.begin();
-        iter += idx;
-        procInfo.erase(iter);
-
-        LeaveCriticalSection(&crit);
-      } else {
-        // Notification from other thread
-        ResetEvent(event);
-      }
-    } else {
-      // Unexpected return value. For now, warn.
-      cerr << "Reaper::reaperThread(): unexpected return value "
-           << idx << " from WaitForMultipleObjects" << endl;
-    }
-
-    // Clean up these lists
-    delete[] handleList;
-    delete[] dataList;
-  }
-
-  // Time to shut down
-  active = false;
-}
-
-DWORD WINAPI
-Reaper::reaperThreadEntry(LPVOID data) {
-  Reaper* reaper = (Reaper*) data;
-  reaper->reaperThread();
-  return 0;
-}
--- a/agent/src/os/win32/Reaper.hpp	Wed Sep 14 13:23:54 2011 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,90 +0,0 @@
-/*
- * Copyright (c) 2000, Oracle and/or its affiliates. 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.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- *
- */
-
-#ifndef _REAPER_
-#define _REAPER_
-
-#include <vector>
-#include <windows.h>
-
-typedef void ReaperCB(void* userData);
-
-/** A Reaper maintains a thread which waits for child processes to
-    terminate; upon termination it calls a user-specified ReaperCB to
-    clean up resources associated with those child processes. */
-
-class Reaper {
-private:
-  Reaper& operator=(const Reaper&);
-  Reaper(const Reaper&);
-
-public:
-  Reaper(ReaperCB*);
-  ~Reaper();
-
-  // Start the reaper thread.
-  bool start();
-
-  // Stop the reaper thread. This is called automatically in the
-  // reaper's destructor. It is not thread safe and should be called
-  // by at most one thread at a time.
-  bool stop();
-
-  // Register a given child process with the reaper. This should be
-  // called by the application's main thread. When that process
-  // terminates, the cleanup callback will be called with the
-  // specified userData in the context of the reaper thread. Callbacks
-  // are guaranteed to be called serially, so they can safely refer to
-  // static data as well as the given user data.
-  void registerProcess(HANDLE processHandle, void* userData);
-
-private:
-  // For thread safety of register()
-  CRITICAL_SECTION crit;
-
-  ReaperCB* cb;
-
-  // State variables
-  volatile bool active;
-  volatile bool shouldShutDown;
-
-  struct ProcessInfo {
-    HANDLE handle;
-    void* userData;
-  };
-
-  // Bookkeeping
-  std::vector<ProcessInfo> procInfo;
-
-  // Synchronization between application thread and reaper thread
-  HANDLE event;
-
-  // Entry point for reaper thread
-  void reaperThread();
-
-  // Static function which is actual thread entry point
-  static DWORD WINAPI reaperThreadEntry(LPVOID data);
-};
-
-#endif  // #defined _REAPER_
--- a/agent/src/os/win32/SwDbgSrv.cpp	Wed Sep 14 13:23:54 2011 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1266 +0,0 @@
-/*
- * Copyright (c) 2000, 2003, Oracle and/or its affiliates. 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.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- *
- */
-
-// A Simple Windows Debug Server.
-//
-// This software provides a socket-based debug server which uses
-// mostly ASCII protocols to communicate with its clients. Since the
-// Windows security model is largely based around being able to run
-// programs on the machine, this server only accepts connections
-// coming from localhost.
-//
-// When run as a service (under Windows NT), this software provides
-// clients the ability to attach to and detach from processes without
-// killing those processes. Ordinarily this is forbidden by the
-// Windows debugging APIs (although more recent debugging environments
-// from Microsoft seem to have circumvented this restriction, perhaps
-// in a different way). This is achieved by forking a persistent
-// subprocess for each debugging session which remains alive as long
-// as the target process is.
-//
-// At this point the client can read information out of the target
-// process's address space. Future work includes exposing more
-// functionality like writing to the remote address space and
-// suspending and resuming threads.
-
-#include <iostream>
-#include <vector>
-#include <stdlib.h>
-// Must come before everything else
-#include <winsock2.h>
-#include <assert.h>
-#include "Dispatcher.hpp"
-#include "Handler.hpp"
-#include "initWinsock.hpp"
-#include "ioUtils.hpp"
-#include "isNT4.hpp"
-#include "Message.hpp"
-#include "nt4internals.hpp"
-#include "ports.h"
-#include "procList.hpp"
-#include "serverLists.hpp"
-#include "Reaper.hpp"
-
-// Uncomment the #define below to get messages on stderr
-// #define DEBUGGING
-
-using namespace std;
-
-static ChildList childList;
-static ClientList clientList;
-static Reaper* reaper = NULL;
-
-// Needed prototypes
-void shutdownChild(ChildInfo* childInfo);
-void detachClient(ClientInfo* clientInfo);
-void shutdownClient(ClientInfo* clientInfo);
-
-char *
-longToDotFormat(long addr)
-{
-  char *temp_s = new char[20];
-
-  sprintf(temp_s, "%d.%d.%d.%d", ((addr & 0xff000000) >> 24),
-          ((addr & 0x00ff0000) >> 16), ((addr & 0x0000ff00) >> 8),
-          (addr & 0x000000ff));
-
-  return temp_s;
-}
-
-// NOTE that we do this query every time. It is a bad idea to cache IP
-// addresses. For example, we might be hosted on a machine using DHCP
-// and the connection addresses might change over time. (Yes, this
-// actually happened.)
-bool
-isConnectionOkay(ULONG connAddr) {
-  if (connAddr == INADDR_LOOPBACK) {
-    return true;
-  }
-
-  const int MAXNAME = 1024;
-  char myname[MAXNAME];
-  gethostname(myname, MAXNAME);
-  struct hostent* myInfo = gethostbyname(myname);
-  if (myInfo == NULL) {
-#ifdef DEBUGGING
-    cerr << "My host information was null" << endl;
-#endif
-  } else {
-    // Run down the list of IP addresses for myself
-    assert(myInfo->h_length == sizeof(ULONG));
-#ifdef DEBUGGING
-    cerr << "My known IP addresses: " << endl;
-#endif
-    for (char** pp = myInfo->h_addr_list; *pp != NULL; pp++) {
-      char* p = *pp;
-      ULONG altAddr = ntohl(*((ULONG*) p));
-#ifdef DEBUGGING
-      char* name = longToDotFormat(altAddr);
-      cerr << name << endl;
-      delete[] name;
-#endif
-      if (altAddr == connAddr) {
-#ifdef DEBUGGING
-        cerr << "FOUND" << endl;
-#endif
-        return true;
-      }
-    }
-#ifdef DEBUGGING
-    cerr << "Done." << endl;
-#endif
-  }
-
-  return false;
-}
-
-SOCKET
-setupListeningSocket(short port) {
-  SOCKET listening = socket(AF_INET, SOCK_STREAM, 0);
-  if (listening == INVALID_SOCKET) {
-    cerr << "Error creating listening socket" << endl;
-    exit(1);
-  }
-
-  int reuseAddress = 1;
-  if (setsockopt(listening, SOL_SOCKET, SO_REUSEADDR,
-                 (char *)&reuseAddress, sizeof(reuseAddress)) == -1) {
-    cerr << "Error reusing address" << endl;
-    exit(1);
-  }
-
-  struct sockaddr_in serverInfo;
-
-  memset((char *)&serverInfo, 0, sizeof(serverInfo));
-  serverInfo.sin_addr.s_addr = INADDR_ANY;
-  serverInfo.sin_family = AF_INET;
-  serverInfo.sin_port = htons(port);
-
-  if (bind(listening, (struct sockaddr *) &serverInfo, sizeof(serverInfo)) < 0) {
-    cerr << "Error binding socket" << endl;
-    exit(1);
-  }
-
-  if (listen(listening, 5) < 0) {
-    cerr << "Error listening" << endl;
-    exit(1);
-  }
-
-  return listening;
-}
-
-/** Accepts a connection from the given listening socket, but only if
-    the connection came from localhost. Returns INVALID_SOCKET if the
-    connection came from any other IP address or if an error occurred
-    during the call to accept(). */
-SOCKET
-acceptFromLocalhost(SOCKET listening) {
-  struct sockaddr_in peerAddr;
-  int peerAddrLen = sizeof(peerAddr);
-  SOCKET fd = accept(listening, (sockaddr*) &peerAddr, &peerAddrLen);
-  if (fd == INVALID_SOCKET) {
-    return fd;
-  }
-
-  if (!isConnectionOkay(ntohl(peerAddr.sin_addr.s_addr))) {
-    // Reject connections from other machines for security purposes.
-    // The Windows security model seems to assume one user per
-    // machine, and that security is compromised if another user is
-    // able to run executables on the given host. (If these
-    // assumptions are not strict enough, we will have to change
-    // this.)
-    shutdown(fd, SD_BOTH);
-    closesocket(fd);
-    return INVALID_SOCKET;
-  }
-
-  // Disable TCP buffering on all sockets. We send small amounts of
-  // data back and forth and don't want buffering.
-  int buffer_val = 1;
-  if (setsockopt(fd, IPPROTO_IP, TCP_NODELAY,
-                 (char *) &buffer_val, sizeof(buffer_val)) < 0) {
-    shutdown(fd, SD_BOTH);
-    closesocket(fd);
-  }
-
-  return fd;
-}
-
-void
-reapCB(void* arg) {
-  ChildInfo* info = (ChildInfo*) arg;
-  ListsLocker ll;
-  DWORD pid = info->getPid();
-  shutdownChild(info);
-#ifdef DEBUGGING
-  cerr << "Reaped child for process " << pid << endl;
-#endif
-}
-
-/** Starts a child process with stdin and stdout redirected to pipes,
-    handles to which are returned. auxHandle1 and auxHandle2 should be
-    closed as well when the child process exits. Returns false if
-    process creation failed. */
-bool
-startChildProcess(DWORD pidToDebug,
-                  DWORD childStdinBufSize,
-                  DWORD childStdoutBufSize,
-                  LPHANDLE childProcessHandle,
-                  LPHANDLE writeToStdinHandle,
-                  LPHANDLE readFromStdoutHandle,
-                  LPHANDLE auxHandle1,
-                  LPHANDLE auxHandle2) {
-  // Code adapted from Microsoft example
-  // "Creating a Child Process with Redirected Input and Output"
-
-  SECURITY_ATTRIBUTES saAttr;
-  BOOL fSuccess;
-
-  HANDLE hChildStdinRd, hChildStdinWr, hChildStdinWrDup,
-    hChildStdoutRd, hChildStdoutWr, hChildStdoutRdDup,
-    hSaveStdin, hSaveStdout;
-
-  // Set the bInheritHandle flag so pipe handles are inherited.
-  saAttr.nLength = sizeof(SECURITY_ATTRIBUTES);
-  saAttr.bInheritHandle = TRUE;
-  saAttr.lpSecurityDescriptor = NULL;
-
-  // The steps for redirecting child process's STDOUT:
-  //   1. Save current STDOUT, to be restored later.
-  //   2. Create anonymous pipe to be STDOUT for child process.
-  //   3. Set STDOUT of the parent process to be write handle to
-  //      the pipe, so it is inherited by the child process.
-  //   4. Create a noninheritable duplicate of the read handle and
-  //      close the inheritable read handle.
-
-  // Save the handle to the current STDOUT.
-  hSaveStdout = GetStdHandle(STD_OUTPUT_HANDLE);
-  // Create a pipe for the child process's STDOUT.
-  if (! CreatePipe(&hChildStdoutRd, &hChildStdoutWr, &saAttr, childStdoutBufSize)) {
-    return false;
-  }
-  // Set a write handle to the pipe to be STDOUT.
-  if (! SetStdHandle(STD_OUTPUT_HANDLE, hChildStdoutWr)) {
-    return false;
-  }
-  // Create noninheritable read handle and close the inheritable read
-  // handle.
-  fSuccess = DuplicateHandle(GetCurrentProcess(), hChildStdoutRd,
-                             GetCurrentProcess(), &hChildStdoutRdDup,
-                             0, FALSE,
-                             DUPLICATE_SAME_ACCESS);
-  if( !fSuccess ) {
-    return false;
-  }
-  CloseHandle(hChildStdoutRd);
-
-  // The steps for redirecting child process's STDIN:
-  //   1.  Save current STDIN, to be restored later.
-  //   2.  Create anonymous pipe to be STDIN for child process.
-  //   3.  Set STDIN of the parent to be the read handle to the
-  //       pipe, so it is inherited by the child process.
-  //   4.  Create a noninheritable duplicate of the write handle,
-  //       and close the inheritable write handle.
-  // Save the handle to the current STDIN.
-  hSaveStdin = GetStdHandle(STD_INPUT_HANDLE);
-  // Create a pipe for the child process's STDIN.
-  if (! CreatePipe(&hChildStdinRd, &hChildStdinWr, &saAttr, childStdinBufSize)) {
-    return false;
-  }
-  // Set a read handle to the pipe to be STDIN.
-  if (! SetStdHandle(STD_INPUT_HANDLE, hChildStdinRd)) {
-    return false;
-  }
-  // Duplicate the write handle to the pipe so it is not inherited.
-  fSuccess = DuplicateHandle(GetCurrentProcess(), hChildStdinWr,
-                             GetCurrentProcess(), &hChildStdinWrDup, 0,
-                             FALSE,                  // not inherited
-                             DUPLICATE_SAME_ACCESS);
-  if (! fSuccess) {
-    return false;
-  }
-  CloseHandle(hChildStdinWr);
-
-  // Create the child process
-  char cmdLine[256];
-  sprintf(cmdLine, "SwDbgSub.exe %u", pidToDebug);
-  PROCESS_INFORMATION procInfo;
-  STARTUPINFO startInfo;
-  memset((char*) &startInfo, 0, sizeof(startInfo));
-  startInfo.cb = sizeof(startInfo);
-  BOOL res = CreateProcess(NULL,
-                           cmdLine,
-                           NULL,
-                           NULL,
-                           TRUE, // inherit handles: important
-                           0,
-                           NULL,
-                           NULL,
-                           &startInfo,
-                           &procInfo);
-  if (!res) {
-    return false;
-  }
-  // After process creation, restore the saved STDIN and STDOUT.
-  if (! SetStdHandle(STD_INPUT_HANDLE, hSaveStdin)) {
-    return false;
-  }
-  if (! SetStdHandle(STD_OUTPUT_HANDLE, hSaveStdout)) {
-    return false;
-  }
-
-  // hChildStdinWrDup can be used to write to the child's stdin
-  // hChildStdoutRdDup can be used to read from the child's stdout
-
-  // NOTE: example code closes hChildStdoutWr before reading from
-  // hChildStdoutRdDup. "Close the write end of the pipe before
-  // reading from the read end of the pipe"??? Looks like this is
-  // example-specific.
-
-  // Set up return arguments
-  // hChildStdoutRd and hChildStdinWr are already closed at this point
-  *childProcessHandle = procInfo.hProcess;
-  *writeToStdinHandle = hChildStdinWrDup;
-  *readFromStdoutHandle = hChildStdoutRdDup;
-  *auxHandle1 = hChildStdinRd;
-  *auxHandle2 = hChildStdoutWr;
-  return true;
-}
-
-/** Clears the event and writes the message to the child process */
-bool
-sendMessage(ChildInfo* child, Message* message) {
-  DWORD numBytesWritten;
-  if (!WriteFile(child->getWriteToStdinHandle(),
-                 message, sizeof(Message), &numBytesWritten, NULL)) {
-    return false;
-  }
-  if (numBytesWritten != sizeof(Message)) {
-    return false;
-  }
-  // Follow up "poke" messages with the raw data
-  if (message->type == Message::POKE) {
-    if (!WriteFile(child->getWriteToStdinHandle(),
-                   message->pokeArg.data, message->pokeArg.numBytes, &numBytesWritten, NULL)) {
-      return false;
-    }
-    if (numBytesWritten != message->pokeArg.numBytes) {
-      return false;
-    }
-  }
-  return true;
-}
-
-/** Copies data from child's stdout to the client's IOBuf and sends it
-    along */
-bool
-forwardReplyToClient(ChildInfo* child, ClientInfo* client) {
-  DWORD total = 0;
-  IOBuf::FillState ret;
-
-  do {
-    DWORD temp;
-    ret = client->getIOBuf()->fillFromFileHandle(child->getReadFromStdoutHandle(),
-                                                 &temp);
-    if (ret == IOBuf::DONE || ret == IOBuf::MORE_DATA_PENDING) {
-      if (!client->getIOBuf()->flush()) {
-#ifdef DEBUGGING
-        cerr << "Forward failed because flush failed" << endl;
-#endif
-        return false;
-      }
-      total += temp;
-    }
-  } while (ret == IOBuf::MORE_DATA_PENDING);
-
-  return (ret == IOBuf::FAILED) ? false : true;
-}
-
-//----------------------------------------------------------------------
-// Server Handler
-//
-
-class ServerHandler : public Handler {
-public:
-  ServerHandler();
-
-  // Starts up in Unicode mode by default
-  bool getASCII();
-
-  void setIOBuf(IOBuf* ioBuf);
-
-  void procList(char* arg);
-
-  // Must be called before calling one of the routines below
-  void setClientInfo(ClientInfo* info);
-
-  // Indicates to outer loop that exit was called or that an error
-  // occurred and that the client exited.
-  bool exited();
-  // Clears this state
-  void clearExited();
-
-  void ascii(char* arg);
-  void unicode(char* arg);
-  void attach(char* arg);
-  void detach(char* arg);
-  void libInfo(char* arg);
-  void peek(char* arg);
-  void poke(char* arg);
-  void threadList(char* arg);
-  void dupHandle(char* arg);
-  void closeHandle(char* arg);
-  void getContext(char* arg);
-  void setContext(char* arg);
-  void selectorEntry(char* arg);
-  void suspend(char* arg);
-  void resume(char* arg);
-  void pollEvent(char* arg);
-  void continueEvent(char* arg);
-  void exit(char* arg);
-
-  // This is pretty gross. Needed to make the target process know
-  // about clients that have disconnected unexpectedly while attached.
-  friend void shutdownClient(ClientInfo*);
-private:
-  // Writes: charSize <space> numChars <space> <binary string>
-  // Handles both ASCII and UNICODE modes
-  void writeString(USHORT len, WCHAR* str);
-
-  // Handles only ASCII mode
-  void writeString(USHORT len, char* str);
-
-  ClientInfo* clientInfo;
-  IOBuf* ioBuf;
-  bool _exited;
-  bool _ascii;
-};
-
-static ServerHandler* handler;
-
-ServerHandler::ServerHandler() {
-  _exited = false;
-  _ascii = false;
-  ioBuf = NULL;
-}
-
-bool
-ServerHandler::getASCII() {
-  return _ascii;
-}
-
-void
-ServerHandler::setIOBuf(IOBuf* buf) {
-  ioBuf = buf;
-}
-
-void
-ServerHandler::setClientInfo(ClientInfo* info) {
-  clientInfo = info;
-}
-
-bool
-ServerHandler::exited() {
-  return _exited;
-}
-
-void
-ServerHandler::clearExited() {
-  _exited = false;
-}
-
-void
-ServerHandler::ascii(char* arg) {
-  _ascii = true;
-}
-
-void
-ServerHandler::unicode(char* arg) {
-  _ascii = false;
-}
-
-void
-ServerHandler::procList(char* arg) {
-#ifdef DEBUGGING
-  cerr << "proclist" << endl;
-#endif
-
-  ProcEntryList processes;
-  ::procList(processes);
-
-  ioBuf->writeInt(processes.size());
-
-  for (ProcEntryList::iterator iter = processes.begin();
-       iter != processes.end(); iter++) {
-    ProcEntry& entry = *iter;
-    ioBuf->writeSpace();
-    ioBuf->writeUnsignedInt(entry.getPid());
-    ioBuf->writeSpace();
-    writeString(entry.getNameLength(), entry.getName());
-  }
-
-  ioBuf->writeEOL();
-  ioBuf->flush();
-}
-
-void
-ServerHandler::attach(char* arg) {
-  // If the client is already attached to a process, fail.
-  if (clientInfo->getTarget() != NULL) {
-    ioBuf->writeBoolAsInt(false);
-    ioBuf->writeEOL();
-    ioBuf->flush();
-    return;
-  }
-
-  // Try to get pid
-  DWORD pid;
-  if (!scanUnsignedLong(&arg, &pid)) {
-    ioBuf->writeBoolAsInt(false);
-    ioBuf->writeEOL();
-    ioBuf->flush();
-    return;
-  }
-
-  // See whether this pid is already forked
-  ListsLocker ll;
-  ChildInfo* childInfo = childList.getChildByPid(pid);
-  if (childInfo != NULL) {
-    // If this child already has a client, return false
-    if (childInfo->getClient() != NULL) {
-      ioBuf->writeBoolAsInt(false);
-      ioBuf->writeEOL();
-      ioBuf->flush();
-      return;
-    }
-
-    // Otherwise, can associate this client with this child process
-    childInfo->setClient(clientInfo);
-    clientInfo->setTarget(childInfo);
-
-    // Tell the child we are attaching so it can suspend the target
-    // process
-    Message msg;
-    msg.type = Message::ATTACH;
-    sendMessage(childInfo, &msg);
-
-    ioBuf->writeBoolAsInt(true);
-    ioBuf->writeEOL();
-    ioBuf->flush();
-    return;
-  } else {
-    // Have to fork a new child subprocess
-    HANDLE childProcessHandle;
-    HANDLE writeToStdinHandle;
-    HANDLE readFromStdoutHandle;
-    HANDLE auxHandle1;
-    HANDLE auxHandle2;
-    if (!startChildProcess(pid,
-                           32768,
-                           131072,
-                           &childProcessHandle,
-                           &writeToStdinHandle,
-                           &readFromStdoutHandle,
-                           &auxHandle1,
-                           &auxHandle2)) {
-      ioBuf->writeBoolAsInt(false);
-      ioBuf->writeEOL();
-      ioBuf->flush();
-      return;
-    }
-
-    // See whether the child succeeded in attaching to the process
-    char res;
-    DWORD numRead;
-    if (!ReadFile(readFromStdoutHandle,
-                  &res,
-                  sizeof(char),
-                  &numRead,
-                  NULL)) {
-      ioBuf->writeBoolAsInt(false);
-      ioBuf->writeEOL();
-      ioBuf->flush();
-      return;
-    }
-
-    if (!res) {
-      ioBuf->writeBoolAsInt(false);
-      ioBuf->writeEOL();
-      ioBuf->flush();
-      return;
-    }
-
-    // OK, success.
-    childInfo = new ChildInfo(pid, childProcessHandle,
-                              writeToStdinHandle, readFromStdoutHandle,
-                              auxHandle1, auxHandle2);
-    childList.addChild(childInfo);
-    reaper->registerProcess(childProcessHandle, childInfo);
-    // Associate this client with this child process
-    childInfo->setClient(clientInfo);
-    clientInfo->setTarget(childInfo);
-
-    // Tell the child process to actually suspend the target process
-    Message msg;
-    msg.type = Message::ATTACH;
-    sendMessage(childInfo, &msg);
-
-    // Write result to client
-    ioBuf->writeBoolAsInt(true);
-    ioBuf->writeEOL();
-    ioBuf->flush();
-    return;
-  }
-}
-
-void
-ServerHandler::detach(char* arg) {
-  // If the client is not attached, fail.
-  if (clientInfo->getTarget() == NULL) {
-    ioBuf->writeBoolAsInt(false);
-    ioBuf->writeEOL();
-    ioBuf->flush();
-    return;
-  }
-
-  detachClient(clientInfo);
-
-  ioBuf->writeBoolAsInt(true);
-  ioBuf->writeEOL();
-  ioBuf->flush();
-}
-
-void
-ServerHandler::libInfo(char* arg) {
-  ListsLocker ll;
-  ChildInfo* child = clientInfo->getTarget();
-  if (child == NULL) {
-    ioBuf->writeInt(0);
-    ioBuf->writeEOL();
-    ioBuf->flush();
-    return;
-  }
-
-  // Send message to child
-  Message msg;
-  msg.type = Message::LIBINFO;
-  sendMessage(child, &msg);
-
-  // Forward reply to client
-  forwardReplyToClient(child, clientInfo);
-}
-
-void
-ServerHandler::peek(char* arg) {
-  ListsLocker ll;
-  ChildInfo* child = clientInfo->getTarget();
-  if (child == NULL) {
-    ioBuf->writeString("B");
-    ioBuf->writeBinChar(0);
-    ioBuf->flush();
-    return;
-  }
-
-  // Try to get address
-  DWORD address;
-  if (!scanAddress(&arg, &address)) {
-    ioBuf->writeString("B");
-    ioBuf->writeBinChar(0);
-    ioBuf->flush();
-    return;
-  }
-
-  // Try to get number of bytes
-  DWORD numBytes;
-  if (!scanUnsignedLong(&arg, &numBytes)) {
-    ioBuf->writeString("B");
-    ioBuf->writeBinChar(0);
-    ioBuf->flush();
-    return;
-  }
-
-  // Send message to child
-  Message msg;
-  msg.type = Message::PEEK;
-  msg.peekArg.address = address;
-  msg.peekArg.numBytes = numBytes;
-  sendMessage(child, &msg);
-
-  // Forward reply to client
-  forwardReplyToClient(child, clientInfo);
-}
-
-void
-ServerHandler::poke(char* arg) {
-#ifdef DEBUGGING
-  cerr << "ServerHandler::poke" << endl;
-#endif
-  ListsLocker ll;
-  ChildInfo* child = clientInfo->getTarget();
-  if (child == NULL) {
-    ioBuf->writeBoolAsInt(false);
-    ioBuf->flush();
-    return;
-  }
-
-  // Try to get address
-  DWORD address;
-  if (!scanAddress(&arg, &address)) {
-    ioBuf->writeBoolAsInt(false);
-    ioBuf->flush();
-    return;
-  }
-
-  // Try to get number of bytes
-  if (!scanAndSkipBinEscapeChar(&arg)) {
-    ioBuf->writeBoolAsInt(false);
-    ioBuf->flush();
-    return;
-  }
-  DWORD numBytes;
-  if (!scanBinUnsignedLong(&arg, &numBytes)) {
-    ioBuf->writeBoolAsInt(false);
-    ioBuf->flush();
-    return;
-  }
-
-  // Raw data is now in "arg"
-  // Send message to child
-  Message msg;
-  msg.type = Message::POKE;
-  msg.pokeArg.address = address;
-  msg.pokeArg.numBytes = numBytes;
-  msg.pokeArg.data = arg;
-  sendMessage(child, &msg);
-
-  // Forward reply to client
-  forwardReplyToClient(child, clientInfo);
-}
-
-void
-ServerHandler::threadList(char* arg) {
-  ListsLocker ll;
-  ChildInfo* child = clientInfo->getTarget();
-  if (child == NULL) {
-    ioBuf->writeBoolAsInt(false);
-    ioBuf->flush();
-    return;
-  }
-
-  // Send message to child
-  Message msg;
-  msg.type = Message::THREADLIST;
-  sendMessage(child, &msg);
-
-  // Forward reply to client
-  forwardReplyToClient(child, clientInfo);
-}
-
-void
-ServerHandler::dupHandle(char* arg) {
-  ListsLocker ll;
-  ChildInfo* child = clientInfo->getTarget();
-  if (child == NULL) {
-    ioBuf->writeBoolAsInt(false);
-    ioBuf->flush();
-    return;
-  }
-
-  // Try to get handle
-  DWORD address;
-  if (!scanAddress(&arg, &address)) {
-    ioBuf->writeBoolAsInt(false);
-    ioBuf->flush();
-  }
-
-  // Send message to child
-  Message msg;
-  msg.type = Message::DUPHANDLE;
-  msg.handleArg.handle = (HANDLE) address;
-  sendMessage(child, &msg);
-
-  // Forward reply to client
-  forwardReplyToClient(child, clientInfo);
-}
-
-void
-ServerHandler::closeHandle(char* arg) {
-  ListsLocker ll;
-  ChildInfo* child = clientInfo->getTarget();
-  if (child == NULL) {
-    return;
-  }
-
-  // Try to get handle
-  DWORD address;
-  if (!scanAddress(&arg, &address)) {
-    return;
-  }
-
-  // Send message to child
-  Message msg;
-  msg.type = Message::CLOSEHANDLE;
-  msg.handleArg.handle = (HANDLE) address;
-  sendMessage(child, &msg);
-
-  // No reply
-}
-
-void
-ServerHandler::getContext(char* arg) {
-  ListsLocker ll;
-  ChildInfo* child = clientInfo->getTarget();
-  if (child == NULL) {
-    ioBuf->writeBoolAsInt(false);
-    ioBuf->flush();
-    return;
-  }
-
-  // Try to get handle
-  DWORD address;
-  if (!scanAddress(&arg, &address)) {
-    ioBuf->writeBoolAsInt(false);
-    ioBuf->flush();
-    return;
-  }
-
-  // Send message to child
-  Message msg;
-  msg.type = Message::GETCONTEXT;
-  msg.handleArg.handle = (HANDLE) address;
-  sendMessage(child, &msg);
-
-  // Forward reply to client
-  forwardReplyToClient(child, clientInfo);
-}
-
-void
-ServerHandler::setContext(char* arg) {
-  ListsLocker ll;
-  ChildInfo* child = clientInfo->getTarget();
-  if (child == NULL) {
-    ioBuf->writeBoolAsInt(false);
-    ioBuf->flush();
-    return;
-  }
-
-  // Try to get handle
-  DWORD address;
-  if (!scanAddress(&arg, &address)) {
-    ioBuf->writeBoolAsInt(false);
-    ioBuf->flush();
-    return;
-  }
-
-  // Try to get context
-  DWORD regs[NUM_REGS_IN_CONTEXT];
-  for (int i = 0; i < NUM_REGS_IN_CONTEXT; i++) {
-    if (!scanAddress(&arg, &regs[i])) {
-      ioBuf->writeBoolAsInt(false);
-      ioBuf->flush();
-      return;
-    }
-  }
-
-  // Send message to child
-  Message msg;
-  msg.type = Message::SETCONTEXT;
-  msg.setContextArg.handle = (HANDLE) address;
-  msg.setContextArg.Eax    = regs[0];
-  msg.setContextArg.Ebx    = regs[1];
-  msg.setContextArg.Ecx    = regs[2];
-  msg.setContextArg.Edx    = regs[3];
-  msg.setContextArg.Esi    = regs[4];
-  msg.setContextArg.Edi    = regs[5];
-  msg.setContextArg.Ebp    = regs[6];
-  msg.setContextArg.Esp    = regs[7];
-  msg.setContextArg.Eip    = regs[8];
-  msg.setContextArg.Ds     = regs[9];
-  msg.setContextArg.Es     = regs[10];
-  msg.setContextArg.Fs     = regs[11];
-  msg.setContextArg.Gs     = regs[12];
-  msg.setContextArg.Cs     = regs[13];
-  msg.setContextArg.Ss     = regs[14];
-  msg.setContextArg.EFlags = regs[15];
-  msg.setContextArg.Dr0    = regs[16];
-  msg.setContextArg.Dr1    = regs[17];
-  msg.setContextArg.Dr2    = regs[18];
-  msg.setContextArg.Dr3    = regs[19];
-  msg.setContextArg.Dr6    = regs[20];
-  msg.setContextArg.Dr7    = regs[21];
-  sendMessage(child, &msg);
-
-  // Forward reply to client
-  forwardReplyToClient(child, clientInfo);
-}
-
-void
-ServerHandler::selectorEntry(char* arg) {
-  ListsLocker ll;
-  ChildInfo* child = clientInfo->getTarget();
-  if (child == NULL) {
-    ioBuf->writeBoolAsInt(false);
-    ioBuf->flush();
-    return;
-  }
-
-  // Try to get thread handle
-  DWORD address;
-  if (!scanAddress(&arg, &address)) {
-    ioBuf->writeBoolAsInt(false);
-    ioBuf->flush();
-    return;
-  }
-
-  // Try to get selector
-  DWORD selector;
-  if (!scanUnsignedLong(&arg, &selector)) {
-    ioBuf->writeBoolAsInt(false);
-    ioBuf->flush();
-    return;
-  }
-
-  // Send message to child
-  Message msg;
-  msg.type = Message::SELECTORENTRY;
-  msg.selectorArg.handle   = (HANDLE) address;
-  msg.selectorArg.selector = selector;
-  sendMessage(child, &msg);
-
-  // Forward reply to client
-  forwardReplyToClient(child, clientInfo);
-}
-
-void
-ServerHandler::suspend(char* arg) {
-  ListsLocker ll;
-  ChildInfo* child = clientInfo->getTarget();
-  if (child == NULL) {
-    return;
-  }
-
-  // Send message to child
-  Message msg;
-  msg.type = Message::SUSPEND;
-  sendMessage(child, &msg);
-
-  // No reply
-}
-
-void
-ServerHandler::resume(char* arg) {
-  ListsLocker ll;
-  ChildInfo* child = clientInfo->getTarget();
-  if (child == NULL) {
-    return;
-  }
-
-  // Send message to child
-  Message msg;
-  msg.type = Message::RESUME;
-  sendMessage(child, &msg);
-
-  // No reply
-}
-
-void
-ServerHandler::pollEvent(char* arg) {
-  ListsLocker ll;
-  ChildInfo* child = clientInfo->getTarget();
-  if (child == NULL) {
-    ioBuf->writeBoolAsInt(false);
-    ioBuf->flush();
-    return;
-  }
-
-  // Send message to child
-  Message msg;
-  msg.type = Message::POLLEVENT;
-  sendMessage(child, &msg);
-
-  // Forward reply to client
-  forwardReplyToClient(child, clientInfo);
-}
-
-void
-ServerHandler::continueEvent(char* arg) {
-  ListsLocker ll;
-  ChildInfo* child = clientInfo->getTarget();
-  if (child == NULL) {
-    ioBuf->writeBoolAsInt(false);
-    ioBuf->flush();
-    return;
-  }
-
-  // Try to get bool arg
-  int passEventToClient;
-  if (!scanInt(&arg, &passEventToClient)) {
-    ioBuf->writeBoolAsInt(false);
-    ioBuf->flush();
-    return;
-  }
-
-  // Send message to child
-  Message msg;
-  msg.type = Message::CONTINUEEVENT;
-  msg.boolArg.val = ((passEventToClient != 0) ? true : false);
-  sendMessage(child, &msg);
-
-  // Forward reply to client
-  forwardReplyToClient(child, clientInfo);
-}
-
-void
-ServerHandler::exit(char* arg) {
-  shutdownClient(clientInfo);
-  _exited = true;
-}
-
-void
-ServerHandler::writeString(USHORT len, WCHAR* str) {
-  if (_ascii) {
-    char* cStr = new char[len + 1];
-    sprintf(cStr, "%.*ls", len, str);
-    writeString(len, cStr);
-    delete[] cStr;
-  } else {
-    ioBuf->writeInt(sizeof(unsigned short));
-    ioBuf->writeSpace();
-    ioBuf->writeInt(len);
-    ioBuf->writeSpace();
-    for (int i = 0; i < len; i++) {
-      ioBuf->writeBinUnsignedShort(str[i]);
-    }
-  }
-}
-
-void
-ServerHandler::writeString(USHORT len, char* str) {
-  ioBuf->writeInt(1);
-  ioBuf->writeSpace();
-  ioBuf->writeInt(len);
-  ioBuf->writeSpace();
-  ioBuf->writeString(str);
-}
-
-//
-//----------------------------------------------------------------------
-
-//----------------------------------------------------------------------
-// Shutdown routines
-//
-
-void
-shutdownChild(ChildInfo* childInfo) {
-  childList.removeChild(childInfo);
-  childInfo->closeAll();
-  if (childInfo->getClient() != NULL) {
-    shutdownClient(childInfo->getClient());
-  }
-  delete childInfo;
-}
-
-void
-detachClient(ClientInfo* info) {
-  ListsLocker ll;
-  // May have been dissociated while not under cover of lock
-  if (info->getTarget() == NULL) {
-    return;
-  }
-
-  // Tell the child that we have detached to let the target process
-  // continue running
-  Message msg;
-  msg.type = Message::DETACH;
-  sendMessage(info->getTarget(), &msg);
-
-  // Dissociate the client and the target
-  info->getTarget()->setClient(NULL);
-  info->setTarget(NULL);
-}
-
-void
-shutdownClient(ClientInfo* clientInfo) {
-#ifdef DEBUGGING
-  cerr << "Shutting down client" << endl;
-#endif
-
-  // If we're connected, inform the target process that we're
-  // disconnecting
-  detachClient(clientInfo);
-
-  // Remove this client from the list and delete it
-  clientList.removeClient(clientInfo);
-  if (clientInfo->getTarget() != NULL) {
-    clientInfo->getTarget()->setClient(NULL);
-  }
-  clientInfo->closeAll();
-  delete clientInfo;
-}
-
-//
-//----------------------------------------------------------------------
-
-
-/** Main dispatcher for client commands. NOTE: do not refer to this
-    clientInfo data structure after calling this routine, as it may be
-    deleted internally. */
-void
-readAndDispatch(ClientInfo* clientInfo) {
-  IOBuf::ReadLineResult res;
-  IOBuf* ioBuf = clientInfo->getIOBuf();
-  unsigned long howMany;
-  ioctlsocket(clientInfo->getDataSocket(), FIONREAD, &howMany);
-  if (howMany == 0) {
-    // Client closed down.
-    shutdownClient(clientInfo);
-    return;
-  }
-  // Read and process as much data as possible
-  do {
-    res = ioBuf->tryReadLine();
-    if (res == IOBuf::RL_ERROR) {
-#ifdef DEBUGGING
-      cerr << "Error while reading line" << endl;
-#endif
-      shutdownClient(clientInfo);
-      return;
-    } else if (res == IOBuf::RL_GOT_DATA) {
-#ifdef DEBUGGING
-      cerr << "Got data: \"" << ioBuf->getLine() << "\"" << endl;
-#endif
-      handler->setIOBuf(ioBuf);
-      handler->setClientInfo(clientInfo);
-      handler->clearExited();
-      Dispatcher::dispatch(ioBuf->getLine(), handler);
-    }
-  } while (res == IOBuf::RL_GOT_DATA && (!handler->exited()));
-#ifdef DEBUGGING
-  cerr << "Exiting readAndDispatch" << endl;
-#endif
-}
-
-int
-main(int argc, char **argv)
-{
-  initWinsock();
-
-  if (isNT4()) {
-    loadPSAPIDLL(); // Will exit if not present
-  }
-
-  SOCKET clientListeningSock = setupListeningSocket(CLIENT_PORT);
-
-  handler = new ServerHandler();
-  Lists::init();
-
-  reaper = new Reaper(&reapCB);
-  if (!reaper->start()) {
-    exit(1);
-  }
-
-  while (true) {
-    // Select on all sockets:
-    //  - client listening socket
-    //  - sockets for all client connections
-
-    // When one of the client connections closes, close its socket
-    // handles.
-
-    fd_set set;
-    SOCKET maxSock = 0;
-
-    // Set up fd_set
-    {
-      int i;
-      FD_ZERO(&set);
-      FD_SET(clientListeningSock, &set);
-      if (clientListeningSock > maxSock) {
-        maxSock = clientListeningSock;
-      }
-      for (i = 0; i < clientList.size(); i++) {
-        ClientInfo* info = clientList.get(i);
-        if (info->getDataSocket() > maxSock) {
-          maxSock = info->getDataSocket();
-        }
-        FD_SET(info->getDataSocket(), &set);
-      }
-    }
-    struct timeval timeout;
-    timeout.tv_sec = 300; // 5 minutes
-    timeout.tv_usec = 0;
-    int res = select(maxSock, &set, NULL, NULL, &timeout);
-    if (res > 0) {
-
-      ////////////////
-      // New client //
-      ////////////////
-      if (FD_ISSET(clientListeningSock, &set)) {
-        SOCKET fd = acceptFromLocalhost(clientListeningSock);
-        if (fd != INVALID_SOCKET) {
-          // Create new client information object
-          ClientInfo* info = new ClientInfo(fd);
-          // Add to list of clients
-          clientList.addClient(info);
-#ifdef DEBUGGING
-          cerr << "New client" << endl;
-#endif
-        }
-      }
-
-      ///////////////////////////
-      // Commands from clients //
-      ///////////////////////////
-      ClientInfo* clientInfo;
-      if (clientList.isAnyDataSocketSet(&set, &clientInfo)) {
-        readAndDispatch(clientInfo);
-      }
-    } else if (res < 0) {
-      // Looks like one of the clients was killed. Try to figure out which one.
-      bool found = false;
-      fd_set set;
-      struct timeval timeout;
-      timeout.tv_sec = 0;
-      timeout.tv_usec = 0;
-      for (int i = 0; i < clientList.size(); i++) {
-        ClientInfo* info = clientList.get(i);
-        FD_ZERO(&set);
-        FD_SET(info->getDataSocket(), &set);
-        if (select(1 + info->getDataSocket(), &set, NULL, NULL, &timeout) < 0) {
-          found = true;
-          clientList.removeClient(info);
-          info->closeAll();
-          delete info;
-          break;
-        }
-      }
-      if (!found) {
-        // This indicates trouble -- one of our listening sockets died.
-        exit(1);
-      }
-    }
-  }
-
-  return 0;
-}
--- a/agent/src/os/win32/SwDbgSrv.dsp	Wed Sep 14 13:23:54 2011 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,146 +0,0 @@
-# Microsoft Developer Studio Project File - Name="SwDbgSrv" - Package Owner=<4>
-# Microsoft Developer Studio Generated Build File, Format Version 6.00
-# ** DO NOT EDIT **
-
-# TARGTYPE "Win32 (x86) Console Application" 0x0103
-
-CFG=SwDbgSrv - Win32 Debug
-!MESSAGE This is not a valid makefile. To build this project using NMAKE,
-!MESSAGE use the Export Makefile command and run
-!MESSAGE 
-!MESSAGE NMAKE /f "SwDbgSrv.mak".
-!MESSAGE 
-!MESSAGE You can specify a configuration when running NMAKE
-!MESSAGE by defining the macro CFG on the command line. For example:
-!MESSAGE 
-!MESSAGE NMAKE /f "SwDbgSrv.mak" CFG="SwDbgSrv - Win32 Debug"
-!MESSAGE 
-!MESSAGE Possible choices for configuration are:
-!MESSAGE 
-!MESSAGE "SwDbgSrv - Win32 Release" (based on "Win32 (x86) Console Application")
-!MESSAGE "SwDbgSrv - Win32 Debug" (based on "Win32 (x86) Console Application")
-!MESSAGE 
-
-# Begin Project
-# PROP AllowPerConfigDependencies 0
-# PROP Scc_ProjName ""
-# PROP Scc_LocalPath ""
-CPP=cl.exe
-RSC=rc.exe
-
-!IF  "$(CFG)" == "SwDbgSrv - Win32 Release"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 0
-# PROP BASE Output_Dir "Release"
-# PROP BASE Intermediate_Dir "Release"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 0
-# PROP Output_Dir "Release"
-# PROP Intermediate_Dir "Release"
-# PROP Ignore_Export_Lib 0
-# PROP Target_Dir ""
-# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
-# ADD CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
-# ADD BASE RSC /l 0x409 /d "NDEBUG"
-# ADD RSC /l 0x409 /d "NDEBUG"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LINK32=link.exe
-# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
-# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ws2_32.lib /nologo /subsystem:console /machine:I386
-
-!ELSEIF  "$(CFG)" == "SwDbgSrv - Win32 Debug"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 1
-# PROP BASE Output_Dir "SwDbgSrv___Win32_Debug"
-# PROP BASE Intermediate_Dir "SwDbgSrv___Win32_Debug"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 1
-# PROP Output_Dir "Debug"
-# PROP Intermediate_Dir "Debug"
-# PROP Ignore_Export_Lib 0
-# PROP Target_Dir ""
-# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
-# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
-# ADD BASE RSC /l 0x409 /d "_DEBUG"
-# ADD RSC /l 0x409 /d "_DEBUG"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LINK32=link.exe
-# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
-# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ws2_32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
-
-!ENDIF 
-
-# Begin Target
-
-# Name "SwDbgSrv - Win32 Release"
-# Name "SwDbgSrv - Win32 Debug"
-# Begin Group "Source Files"
-
-# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
-# Begin Source File
-
-SOURCE=.\Buffer.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=.\Dispatcher.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=.\initWinsock.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=.\IOBuf.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=.\ioUtils.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=.\isNT4.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=.\nt4internals.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=.\procList.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=.\Reaper.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=.\serverLists.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=.\SwDbgSrv.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=.\toolHelp.cpp
-# End Source File
-# End Group
-# Begin Group "Header Files"
-
-# PROP Default_Filter "h;hpp;hxx;hm;inl"
-# End Group
-# Begin Group "Resource Files"
-
-# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
-# End Group
-# End Target
-# End Project
--- a/agent/src/os/win32/SwDbgSrv.dsw	Wed Sep 14 13:23:54 2011 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,41 +0,0 @@
-Microsoft Developer Studio Workspace File, Format Version 6.00
-# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
-
-###############################################################################
-
-Project: "SwDbgSrv"=.\SwDbgSrv.dsp - Package Owner=<4>
-
-Package=<5>
-{{{
-}}}
-
-Package=<4>
-{{{
-}}}
-
-###############################################################################
-
-Project: "SwDbgSub"=.\SwDbgSub.dsp - Package Owner=<4>
-
-Package=<5>
-{{{
-}}}
-
-Package=<4>
-{{{
-}}}
-
-###############################################################################
-
-Global:
-
-Package=<5>
-{{{
-}}}
-
-Package=<3>
-{{{
-}}}
-
-###############################################################################
-
--- a/agent/src/os/win32/SwDbgSub.cpp	Wed Sep 14 13:23:54 2011 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,883 +0,0 @@
-/*
- * Copyright (c) 2000, 2003, Oracle and/or its affiliates. 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.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- *
- */
-
-// This is the source code for the subprocess forked by the Simple
-// Windows Debug Server. It assumes most of the responsibility for the
-// debug session, and processes all of the commands sent by clients.
-
-// Disable too-long symbol warnings
-#pragma warning ( disable : 4786 )
-
-#include <iostream>
-#include <vector>
-#include <stdlib.h>
-#include <assert.h>
-// Must come before windows.h
-#include <winsock2.h>
-#include <windows.h>
-#include "IOBuf.hpp"
-#include "libInfo.hpp"
-#include "LockableList.hpp"
-#include "Message.hpp"
-#include "Monitor.hpp"
-#include "nt4internals.hpp"
-
-// Uncomment the #define below to get messages on stderr
-// #define DEBUGGING
-
-using namespace std;
-
-DWORD pid;
-HANDLE procHandle;
-IOBuf* ioBuf;
-
-// State flags indicating whether the attach to the remote process
-// definitively succeeded or failed
-volatile bool attachFailed    = false;
-volatile bool attachSucceeded = false;
-
-// State flag indicating whether the target process is suspended.
-// Modified by suspend()/resume(), viewed by debug thread, but only
-// under cover of the threads lock.
-volatile bool suspended       = false;
-
-// State flags indicating whether we are considered to be attached to
-// the target process and are therefore queuing up events to be sent
-// back to the debug server. These flags are only accessed and
-// modified under the cover of the eventLock.
-Monitor* eventLock;
-// The following is set to true when a client is attached to this process
-volatile bool generateDebugEvents = false;
-// Pointer to current debug event; non-NULL indicates a debug event is
-// waiting to be sent to the client. Main thread sets this to NULL to
-// indicate that the event has been consumed; also sets
-// passEventToClient, below.
-volatile DEBUG_EVENT* curDebugEvent = NULL;
-// Set by main thread to indicate whether the most recently posted
-// debug event should be passed on to the target process.
-volatile bool passEventToClient = true;
-
-void conditionalPostDebugEvent(DEBUG_EVENT* ev, DWORD* continueOrNotHandledFlag) {
-  // FIXME: make it possible for the client to enable and disable
-  // certain types of events (have to do so in a platform-independent
-  // manner)
-  switch (ev->dwDebugEventCode) {
-  case EXCEPTION_DEBUG_EVENT:
-    switch (ev->u.Exception.ExceptionRecord.ExceptionCode) {
-    case EXCEPTION_BREAKPOINT:  break;
-    case EXCEPTION_SINGLE_STEP: break;
-    case EXCEPTION_ACCESS_VIOLATION: break;
-    default: return;
-    }
-  }
-  eventLock->lock();
-  if (generateDebugEvents) {
-    curDebugEvent = ev;
-    while (curDebugEvent != NULL) {
-      eventLock->wait();
-    }
-    if (passEventToClient) {
-      *continueOrNotHandledFlag = DBG_EXCEPTION_NOT_HANDLED;
-    } else {
-      *continueOrNotHandledFlag = DBG_CONTINUE;
-    }
-  }
-  eventLock->unlock();
-}
-
-
-//----------------------------------------------------------------------
-// Module list
-//
-
-vector<LibInfo> libs;
-
-//----------------------------------------------------------------------
-// Thread list
-//
-
-struct ThreadInfo {
-  DWORD tid;
-  HANDLE thread;
-
-  ThreadInfo(DWORD tid, HANDLE thread) {
-    this->tid = tid;
-    this->thread = thread;
-  }
-};
-
-class ThreadList : public LockableList<ThreadInfo> {
-public:
-  bool removeByThreadID(DWORD tid) {
-    for (InternalListType::iterator iter = internalList.begin();
-         iter != internalList.end(); iter++) {
-      if ((*iter).tid == tid) {
-        internalList.erase(iter);
-        return true;
-      }
-    }
-    return false;
-  }
-  HANDLE threadIDToHandle(DWORD tid) {
-    for (InternalListType::iterator iter = internalList.begin();
-         iter != internalList.end(); iter++) {
-      if ((*iter).tid == tid) {
-        return (*iter).thread;
-      }
-    }
-    return NULL;
-  }
-};
-
-ThreadList threads;
-
-//----------------------------------------------------------------------
-// INITIALIZATION AND TERMINATION
-//
-
-void
-printError(const char* prefix) {
-  DWORD detail = GetLastError();
-  LPTSTR message;
-  FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
-                FORMAT_MESSAGE_FROM_SYSTEM,
-                0,
-                detail,
-                0,
-                (LPTSTR) &message,
-                1,
-                NULL);
-  // FIXME: This is signaling an error: "The handle is invalid." ?
-  // Do I have to do all of my WaitForDebugEvent calls from the same thread?
-  cerr << prefix << ": " << message << endl;
-  LocalFree(message);
-}
-
-void
-endProcess(bool waitForProcess = true) {
-  NT4::unloadNTDLL();
-  if (waitForProcess) {
-    // Though we're exiting because of an error, do not tear down the
-    // target process.
-    WaitForSingleObject(procHandle, INFINITE);
-  }
-  CloseHandle(procHandle);
-  exit(0);
-}
-
-DWORD WINAPI
-debugThreadEntry(void*) {
-#ifdef DEBUGGING
-  DWORD lastMsgId = 0;
-  int count = 0;
-#endif
-
-  if (!DebugActiveProcess(pid)) {
-    attachFailed = true;
-    return 0;
-  }
-
-  // Wait for debug events. We keep the information from some of these
-  // on the side in anticipation of later queries by the client. NOTE
-  // that we leave the process running. The main thread is responsible
-  // for suspending and resuming all currently-active threads upon
-  // client attach and detach.
-
-  while (true) {
-    DEBUG_EVENT ev;
-    if (!WaitForDebugEvent(&ev, INFINITE)) {
-#ifdef DEBUGGING
-      if (++count < 10) {
-        // FIXME: This is signaling an error: "The handle is invalid." ?
-        // Do I have to do all of my WaitForDebugEvent calls from the same thread?
-        printError("WaitForDebugEvent failed");
-      }
-#endif
-    } else {
-
-#ifdef DEBUGGING
-      if (ev.dwDebugEventCode != lastMsgId) {
-        lastMsgId = ev.dwDebugEventCode;
-        count = 0;
-        cerr << "Debug thread received event " << ev.dwDebugEventCode << endl;
-      } else {
-        if (++count < 10) {
-          cerr << "Debug thread received event " << ev.dwDebugEventCode << endl;
-        }
-      }
-#endif
-
-      DWORD dbgContinueMode = DBG_CONTINUE;
-
-      switch (ev.dwDebugEventCode) {
-      case LOAD_DLL_DEBUG_EVENT:
-        conditionalPostDebugEvent(&ev, &dbgContinueMode);
-        break;
-
-      case UNLOAD_DLL_DEBUG_EVENT:
-        conditionalPostDebugEvent(&ev, &dbgContinueMode);
-        break;
-
-      case CREATE_PROCESS_DEBUG_EVENT:
-        threads.lock();
-        // FIXME: will this deal properly with child processes? If
-        // not, is it possible to make it do so?
-#ifdef DEBUGGING
-        cerr << "CREATE_PROCESS_DEBUG_EVENT " << ev.dwThreadId
-             << " " << ev.u.CreateProcessInfo.hThread << endl;
-#endif
-        if (ev.u.CreateProcessInfo.hThread != NULL) {
-          threads.add(ThreadInfo(ev.dwThreadId, ev.u.CreateProcessInfo.hThread));
-        }
-        threads.unlock();
-        break;
-
-      case CREATE_THREAD_DEBUG_EVENT:
-        threads.lock();
-#ifdef DEBUGGING
-        cerr << "CREATE_THREAD_DEBUG_EVENT " << ev.dwThreadId
-             << " " << ev.u.CreateThread.hThread << endl;
-#endif
-        if (suspended) {
-          // Suspend this thread before adding it to the thread list
-          SuspendThread(ev.u.CreateThread.hThread);
-        }
-        threads.add(ThreadInfo(ev.dwThreadId, ev.u.CreateThread.hThread));
-        threads.unlock();
-        break;
-
-      case EXIT_THREAD_DEBUG_EVENT:
-        threads.lock();
-#ifdef DEBUGGING
-        cerr << "EXIT_THREAD_DEBUG_EVENT " << ev.dwThreadId << endl;
-#endif
-        threads.removeByThreadID(ev.dwThreadId);
-        threads.unlock();
-        break;
-
-      case EXCEPTION_DEBUG_EVENT:
-        //      cerr << "EXCEPTION_DEBUG_EVENT" << endl;
-        switch (ev.u.Exception.ExceptionRecord.ExceptionCode) {
-        case EXCEPTION_BREAKPOINT:
-          //        cerr << "EXCEPTION_BREAKPOINT" << endl;
-          if (!attachSucceeded && !attachFailed) {
-            attachSucceeded = true;
-          }
-          break;
-
-        default:
-          dbgContinueMode = DBG_EXCEPTION_NOT_HANDLED;
-          break;
-        }
-        conditionalPostDebugEvent(&ev, &dbgContinueMode);
-        break;
-
-      case EXIT_PROCESS_DEBUG_EVENT:
-        endProcess(false);
-        // NOT REACHED
-        break;
-
-      default:
-#ifdef DEBUGGING
-        cerr << "Received debug event " << ev.dwDebugEventCode << endl;
-#endif
-        break;
-      }
-
-      ContinueDebugEvent(ev.dwProcessId, ev.dwThreadId, dbgContinueMode);
-    }
-  }
-}
-
-bool
-attachToProcess() {
-  // Create event lock
-  eventLock = new Monitor();
-
-  // Get a process handle for later
-  procHandle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);
-  if (procHandle == NULL) {
-    return false;
-  }
-
-  // Start up the debug thread
-  DWORD debugThreadId;
-  if (CreateThread(NULL, 0, &debugThreadEntry, NULL, 0, &debugThreadId) == NULL) {
-    // Failed to make background debug thread. Fail.
-    return false;
-  }
-
-  while ((!attachSucceeded) && (!attachFailed)) {
-    Sleep(1);
-  }
-
-  if (attachFailed) {
-    return false;
-  }
-
-  assert(attachSucceeded);
-
-  return true;
-}
-
-bool
-readMessage(Message* msg) {
-  DWORD numRead;
-  if (!ReadFile(GetStdHandle(STD_INPUT_HANDLE),
-                msg,
-                sizeof(Message),
-                &numRead,
-                NULL)) {
-    return false;
-  }
-  if (numRead != sizeof(Message)) {
-    return false;
-  }
-  // For "poke" messages, must follow up by reading raw data
-  if (msg->type == Message::POKE) {
-    char* dataBuf = new char[msg->pokeArg.numBytes];
-    if (dataBuf == NULL) {
-      return false;
-    }
-    if (!ReadFile(GetStdHandle(STD_INPUT_HANDLE),
-                  dataBuf,
-                  msg->pokeArg.numBytes,
-                  &numRead,
-                  NULL)) {
-      delete[] dataBuf;
-      return false;
-    }
-    if (numRead != msg->pokeArg.numBytes) {
-      delete[] dataBuf;
-      return false;
-    }
-    msg->pokeArg.data = (void *) dataBuf;
-  }
-  return true;
-}
-
-void
-handlePeek(Message* msg) {
-#ifdef DEBUGGING
-  cerr << "Entering handlePeek()" << endl;
-#endif
-
-  char* memBuf = new char[msg->peekArg.numBytes];
-  if (memBuf == NULL) {
-    ioBuf->writeString("B");
-    ioBuf->writeBinChar(0);
-    ioBuf->flush();
-    delete[] memBuf;
-    return;
-  }
-
-  // Try fast case first
-  DWORD numRead;
-  BOOL res = ReadProcessMemory(procHandle,
-                               (LPCVOID) msg->peekArg.address,
-                               memBuf,
-                               msg->peekArg.numBytes,
-                               &numRead);
-  if (res && (numRead == msg->peekArg.numBytes)) {
-
-    // OK, complete success. Phew.
-#ifdef DEBUGGING
-    cerr << "Peek success case" << endl;
-#endif
-    ioBuf->writeString("B");
-    ioBuf->writeBinChar(1);
-    ioBuf->writeBinUnsignedInt(numRead);
-    ioBuf->writeBinChar(1);
-    ioBuf->writeBinBuf(memBuf, numRead);
-  } else {
-#ifdef DEBUGGING
-    cerr << "*** Peek slow case ***" << endl;
-#endif
-
-    ioBuf->writeString("B");
-    ioBuf->writeBinChar(1);
-
-    // Use VirtualQuery to speed things up a bit
-    DWORD numLeft = msg->peekArg.numBytes;
-    char* curAddr = (char*) msg->peekArg.address;
-    while (numLeft > 0) {
-      MEMORY_BASIC_INFORMATION memInfo;
-      VirtualQueryEx(procHandle, curAddr, &memInfo, sizeof(memInfo));
-      DWORD numToRead = memInfo.RegionSize;
-      if (numToRead > numLeft) {
-        numToRead = numLeft;
-      }
-      DWORD numRead;
-      if (memInfo.State == MEM_COMMIT) {
-        // Read the process memory at this address for this length
-        // FIXME: should check the result of this read
-        ReadProcessMemory(procHandle, curAddr, memBuf,
-                          numToRead, &numRead);
-        // Write this out
-#ifdef DEBUGGING
-        cerr << "*** Writing " << numToRead << " bytes as mapped ***" << endl;
-#endif
-        ioBuf->writeBinUnsignedInt(numToRead);
-        ioBuf->writeBinChar(1);
-        ioBuf->writeBinBuf(memBuf, numToRead);
-      } else {
-        // Indicate region is free
-#ifdef DEBUGGING
-        cerr << "*** Writing " << numToRead << " bytes as unmapped ***" << endl;
-#endif
-        ioBuf->writeBinUnsignedInt(numToRead);
-        ioBuf->writeBinChar(0);
-      }
-      curAddr += numToRead;
-      numLeft -= numToRead;
-    }
-  }
-
-  ioBuf->flush();
-  delete[] memBuf;
-#ifdef DEBUGGING
-  cerr << "Exiting handlePeek()" << endl;
-#endif
-}
-
-void
-handlePoke(Message* msg) {
-#ifdef DEBUGGING
-  cerr << "Entering handlePoke()" << endl;
-#endif
-  DWORD numWritten;
-  BOOL res = WriteProcessMemory(procHandle,
-                                (LPVOID) msg->pokeArg.address,
-                                msg->pokeArg.data,
-                                msg->pokeArg.numBytes,
-                                &numWritten);
-  if (res && (numWritten == msg->pokeArg.numBytes)) {
-    // Success
-    ioBuf->writeBoolAsInt(true);
-#ifdef DEBUGGING
-    cerr << " (Succeeded)" << endl;
-#endif
-  } else {
-    // Failure
-    ioBuf->writeBoolAsInt(false);
-#ifdef DEBUGGING
-    cerr << " (Failed)" << endl;
-#endif
-  }
-  ioBuf->writeEOL();
-  ioBuf->flush();
-  // We clean up the data
-  char* dataBuf = (char*) msg->pokeArg.data;
-  delete[] dataBuf;
-#ifdef DEBUGGING
-  cerr << "Exiting handlePoke()" << endl;
-#endif
-}
-
-bool
-suspend() {
-  if (suspended) {
-    return false;
-  }
-  // Before we suspend, we must take a snapshot of the loaded module
-  // names and base addresses, since acquiring this snapshot requires
-  // starting and exiting a thread in the remote process (at least on
-  // NT 4).
-  libs.clear();
-#ifdef DEBUGGING
-  cerr << "Starting suspension" << endl;
-#endif
-  libInfo(pid, libs);
-#ifdef DEBUGGING
-  cerr << "  Got lib info" << endl;
-#endif
-  threads.lock();
-#ifdef DEBUGGING
-  cerr << "  Got thread lock" << endl;
-#endif
-  suspended = true;
-  int j = 0;
-  for (int i = 0; i < threads.size(); i++) {
-    j++;
-    SuspendThread(threads.get(i).thread);
-  }
-#ifdef DEBUGGING
-  cerr << "Suspended " << j << " threads" << endl;
-#endif
-  threads.unlock();
-  return true;
-}
-
-bool
-resume() {
-  if (!suspended) {
-    return false;
-  }
-  threads.lock();
-  suspended = false;
-  for (int i = 0; i < threads.size(); i++) {
-    ResumeThread(threads.get(i).thread);
-  }
-  threads.unlock();
-#ifdef DEBUGGING
-  cerr << "Resumed process" << endl;
-#endif
-  return true;
-}
-
-int
-main(int argc, char **argv)
-{
-  if (argc != 2) {
-    // Should only be used by performing CreateProcess within SwDbgSrv
-    exit(1);
-  }
-
-  if (sscanf(argv[1], "%u", &pid) != 1) {
-    exit(1);
-  }
-
-  // Try to attach to process
-  if (!attachToProcess()) {
-    // Attach failed. Notify parent by writing result to stdout file
-    // handle.
-    char res = 0;
-    DWORD numBytes;
-    WriteFile(GetStdHandle(STD_OUTPUT_HANDLE), &res, sizeof(res),
-              &numBytes, NULL);
-    exit(1);
-  }
-
-  // Server is expecting success result back.
-  char res = 1;
-  DWORD numBytes;
-  WriteFile(GetStdHandle(STD_OUTPUT_HANDLE), &res, sizeof(res),
-            &numBytes, NULL);
-
-  // Initialize our I/O buffer
-  ioBuf = new IOBuf(32768, 131072);
-  ioBuf->setOutputFileHandle(GetStdHandle(STD_OUTPUT_HANDLE));
-
-  // At this point we are attached. Enter our main loop which services
-  // requests from the server. Note that in order to handle attach/
-  // detach properly (i.e., resumption of process upon "detach") we
-  // will need another thread which handles debug events.
-  while (true) {
-    // Read a message from the server
-    Message msg;
-    if (!readMessage(&msg)) {
-      endProcess();
-    }
-
-#ifdef DEBUGGING
-    cerr << "Main thread read message: " << msg.type << endl;
-#endif
-
-    switch (msg.type) {
-    // ATTACH and DETACH messages MUST come in pairs
-    case Message::ATTACH:
-      suspend();
-      eventLock->lock();
-      generateDebugEvents = true;
-      eventLock->unlock();
-      break;
-
-    case Message::DETACH:
-      eventLock->lock();
-      generateDebugEvents = false;
-      // Flush remaining event if any
-      if (curDebugEvent != NULL) {
-        curDebugEvent = NULL;
-        eventLock->notifyAll();
-      }
-      eventLock->unlock();
-      resume();
-      break;
-
-    case Message::LIBINFO:
-      {
-        if (!suspended) {
-          ioBuf->writeInt(0);
-        } else {
-          // Send back formatted text
-          ioBuf->writeInt(libs.size());
-          for (int i = 0; i < libs.size(); i++) {
-            ioBuf->writeSpace();
-            ioBuf->writeInt(1);
-            ioBuf->writeSpace();
-            ioBuf->writeInt(libs[i].name.size());
-            ioBuf->writeSpace();
-            ioBuf->writeString(libs[i].name.c_str());
-            ioBuf->writeSpace();
-            ioBuf->writeAddress(libs[i].base);
-          }
-        }
-        ioBuf->writeEOL();
-        ioBuf->flush();
-        break;
-      }
-
-    case Message::PEEK:
-      handlePeek(&msg);
-      break;
-
-    case Message::POKE:
-      handlePoke(&msg);
-      break;
-
-    case Message::THREADLIST:
-      {
-        if (!suspended) {
-          ioBuf->writeInt(0);
-        } else {
-          threads.lock();
-          ioBuf->writeInt(threads.size());
-          for (int i = 0; i < threads.size(); i++) {
-            ioBuf->writeSpace();
-            ioBuf->writeAddress((void*) threads.get(i).thread);
-          }
-          threads.unlock();
-        }
-        ioBuf->writeEOL();
-        ioBuf->flush();
-        break;
-      }
-
-    case Message::DUPHANDLE:
-      {
-        HANDLE dup;
-        if (DuplicateHandle(procHandle,
-                            msg.handleArg.handle,
-                            GetCurrentProcess(),
-                            &dup,
-                            0,
-                            FALSE,
-                            DUPLICATE_SAME_ACCESS)) {
-          ioBuf->writeBoolAsInt(true);
-          ioBuf->writeSpace();
-          ioBuf->writeAddress((void*) dup);
-        } else {
-          ioBuf->writeBoolAsInt(false);
-        }
-        ioBuf->writeEOL();
-        ioBuf->flush();
-        break;
-      }
-
-    case Message::CLOSEHANDLE:
-      {
-        CloseHandle(msg.handleArg.handle);
-        break;
-      }
-
-    case Message::GETCONTEXT:
-      {
-        if (!suspended) {
-          ioBuf->writeBoolAsInt(false);
-        } else {
-          CONTEXT context;
-          context.ContextFlags = CONTEXT_FULL | CONTEXT_DEBUG_REGISTERS;
-          if (GetThreadContext(msg.handleArg.handle, &context)) {
-            ioBuf->writeBoolAsInt(true);
-            // EAX, EBX, ECX, EDX, ESI, EDI, EBP, ESP, EIP, DS, ES, FS, GS,
-            // CS, SS, EFLAGS, DR0, DR1, DR2, DR3, DR6, DR7
-            // See README-commands.txt
-            ioBuf->writeSpace(); ioBuf->writeAddress((void*) context.Eax);
-            ioBuf->writeSpace(); ioBuf->writeAddress((void*) context.Ebx);
-            ioBuf->writeSpace(); ioBuf->writeAddress((void*) context.Ecx);
-            ioBuf->writeSpace(); ioBuf->writeAddress((void*) context.Edx);
-            ioBuf->writeSpace(); ioBuf->writeAddress((void*) context.Esi);
-            ioBuf->writeSpace(); ioBuf->writeAddress((void*) context.Edi);
-            ioBuf->writeSpace(); ioBuf->writeAddress((void*) context.Ebp);
-            ioBuf->writeSpace(); ioBuf->writeAddress((void*) context.Esp);
-            ioBuf->writeSpace(); ioBuf->writeAddress((void*) context.Eip);
-            ioBuf->writeSpace(); ioBuf->writeAddress((void*) context.SegDs);
-            ioBuf->writeSpace(); ioBuf->writeAddress((void*) context.SegEs);
-            ioBuf->writeSpace(); ioBuf->writeAddress((void*) context.SegFs);
-            ioBuf->writeSpace(); ioBuf->writeAddress((void*) context.SegGs);
-            ioBuf->writeSpace(); ioBuf->writeAddress((void*) context.SegCs);
-            ioBuf->writeSpace(); ioBuf->writeAddress((void*) context.SegSs);
-            ioBuf->writeSpace(); ioBuf->writeAddress((void*) context.EFlags);
-            ioBuf->writeSpace(); ioBuf->writeAddress((void*) context.Dr0);
-            ioBuf->writeSpace(); ioBuf->writeAddress((void*) context.Dr1);
-            ioBuf->writeSpace(); ioBuf->writeAddress((void*) context.Dr2);
-            ioBuf->writeSpace(); ioBuf->writeAddress((void*) context.Dr3);
-            ioBuf->writeSpace(); ioBuf->writeAddress((void*) context.Dr6);
-            ioBuf->writeSpace(); ioBuf->writeAddress((void*) context.Dr7);
-          } else {
-            ioBuf->writeBoolAsInt(false);
-          }
-        }
-        ioBuf->writeEOL();
-        ioBuf->flush();
-        break;
-      }
-
-    case Message::SETCONTEXT:
-      {
-        if (!suspended) {
-          ioBuf->writeBoolAsInt(false);
-        } else {
-          CONTEXT context;
-          context.ContextFlags = CONTEXT_FULL | CONTEXT_DEBUG_REGISTERS;
-          context.Eax    = msg.setContextArg.Eax;
-          context.Ebx    = msg.setContextArg.Ebx;
-          context.Ecx    = msg.setContextArg.Ecx;
-          context.Edx    = msg.setContextArg.Edx;
-          context.Esi    = msg.setContextArg.Esi;
-          context.Edi    = msg.setContextArg.Edi;
-          context.Ebp    = msg.setContextArg.Ebp;
-          context.Esp    = msg.setContextArg.Esp;
-          context.Eip    = msg.setContextArg.Eip;
-          context.SegDs  = msg.setContextArg.Ds;
-          context.SegEs  = msg.setContextArg.Es;
-          context.SegFs  = msg.setContextArg.Fs;
-          context.SegGs  = msg.setContextArg.Gs;
-          context.SegCs  = msg.setContextArg.Cs;
-          context.SegSs  = msg.setContextArg.Ss;
-          context.EFlags = msg.setContextArg.EFlags;
-          context.Dr0    = msg.setContextArg.Dr0;
-          context.Dr1    = msg.setContextArg.Dr1;
-          context.Dr2    = msg.setContextArg.Dr2;
-          context.Dr3    = msg.setContextArg.Dr3;
-          context.Dr6    = msg.setContextArg.Dr6;
-          context.Dr7    = msg.setContextArg.Dr7;
-          if (SetThreadContext(msg.setContextArg.handle, &context)) {
-            ioBuf->writeBoolAsInt(true);
-          } else {
-            ioBuf->writeBoolAsInt(false);
-          }
-        }
-        ioBuf->writeEOL();
-        ioBuf->flush();
-        break;
-      }
-
-    case Message::SELECTORENTRY:
-      {
-        LDT_ENTRY entry;
-
-        if (GetThreadSelectorEntry(msg.selectorArg.handle,
-                                   msg.selectorArg.selector,
-                                   &entry)) {
-          ioBuf->writeBoolAsInt(true);
-          ioBuf->writeSpace(); ioBuf->writeAddress((void*) entry.LimitLow);
-          ioBuf->writeSpace(); ioBuf->writeAddress((void*) entry.BaseLow);
-          ioBuf->writeSpace(); ioBuf->writeAddress((void*) entry.HighWord.Bytes.BaseMid);
-          ioBuf->writeSpace(); ioBuf->writeAddress((void*) entry.HighWord.Bytes.Flags1);
-          ioBuf->writeSpace(); ioBuf->writeAddress((void*) entry.HighWord.Bytes.Flags2);
-          ioBuf->writeSpace(); ioBuf->writeAddress((void*) entry.HighWord.Bytes.BaseHi);
-        } else {
-          ioBuf->writeBoolAsInt(false);
-        }
-
-        ioBuf->writeEOL();
-        ioBuf->flush();
-        break;
-      }
-
-    case Message::SUSPEND:
-      suspend();
-      break;
-
-    case Message::RESUME:
-      resume();
-      break;
-
-    case Message::POLLEVENT:
-      eventLock->lock();
-      if (curDebugEvent == NULL) {
-        ioBuf->writeBoolAsInt(false);
-      } else {
-        ioBuf->writeBoolAsInt(true);
-        ioBuf->writeSpace();
-        threads.lock();
-        ioBuf->writeAddress((void*) threads.threadIDToHandle(curDebugEvent->dwThreadId));
-        threads.unlock();
-        ioBuf->writeSpace();
-        ioBuf->writeUnsignedInt(curDebugEvent->dwDebugEventCode);
-        // Figure out what else to write
-        switch (curDebugEvent->dwDebugEventCode) {
-        case LOAD_DLL_DEBUG_EVENT:
-          ioBuf->writeSpace();
-          ioBuf->writeAddress(curDebugEvent->u.LoadDll.lpBaseOfDll);
-          break;
-
-        case UNLOAD_DLL_DEBUG_EVENT:
-          ioBuf->writeSpace();
-          ioBuf->writeAddress(curDebugEvent->u.UnloadDll.lpBaseOfDll);
-          break;
-
-        case EXCEPTION_DEBUG_EVENT:
-          {
-            DWORD code = curDebugEvent->u.Exception.ExceptionRecord.ExceptionCode;
-            ioBuf->writeSpace();
-            ioBuf->writeUnsignedInt(code);
-            ioBuf->writeSpace();
-            ioBuf->writeAddress(curDebugEvent->u.Exception.ExceptionRecord.ExceptionAddress);
-            switch (curDebugEvent->u.Exception.ExceptionRecord.ExceptionCode) {
-            case EXCEPTION_ACCESS_VIOLATION:
-              ioBuf->writeSpace();
-              ioBuf->writeBoolAsInt(curDebugEvent->u.Exception.ExceptionRecord.ExceptionInformation[0] != 0);
-              ioBuf->writeSpace();
-              ioBuf->writeAddress((void*) curDebugEvent->u.Exception.ExceptionRecord.ExceptionInformation[1]);
-              break;
-
-            default:
-              break;
-            }
-            break;
-          }
-
-        default:
-          break;
-        }
-      }
-      eventLock->unlock();
-      ioBuf->writeEOL();
-      ioBuf->flush();
-      break;
-
-    case Message::CONTINUEEVENT:
-      eventLock->lock();
-      if (curDebugEvent == NULL) {
-        ioBuf->writeBoolAsInt(false);
-      } else {
-        curDebugEvent = NULL;
-        passEventToClient = msg.boolArg.val;
-        ioBuf->writeBoolAsInt(true);
-        eventLock->notify();
-      }
-      eventLock->unlock();
-      ioBuf->writeEOL();
-      ioBuf->flush();
-      break;
-    }
-  }
-
-  endProcess();
-
-  // NOT REACHED
-  return 0;
-}
--- a/agent/src/os/win32/SwDbgSub.dsp	Wed Sep 14 13:23:54 2011 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,130 +0,0 @@
-# Microsoft Developer Studio Project File - Name="SwDbgSub" - Package Owner=<4>
-# Microsoft Developer Studio Generated Build File, Format Version 6.00
-# ** DO NOT EDIT **
-
-# TARGTYPE "Win32 (x86) Console Application" 0x0103
-
-CFG=SwDbgSub - Win32 Debug
-!MESSAGE This is not a valid makefile. To build this project using NMAKE,
-!MESSAGE use the Export Makefile command and run
-!MESSAGE 
-!MESSAGE NMAKE /f "SwDbgSub.mak".
-!MESSAGE 
-!MESSAGE You can specify a configuration when running NMAKE
-!MESSAGE by defining the macro CFG on the command line. For example:
-!MESSAGE 
-!MESSAGE NMAKE /f "SwDbgSub.mak" CFG="SwDbgSub - Win32 Debug"
-!MESSAGE 
-!MESSAGE Possible choices for configuration are:
-!MESSAGE 
-!MESSAGE "SwDbgSub - Win32 Release" (based on "Win32 (x86) Console Application")
-!MESSAGE "SwDbgSub - Win32 Debug" (based on "Win32 (x86) Console Application")
-!MESSAGE 
-
-# Begin Project
-# PROP AllowPerConfigDependencies 0
-# PROP Scc_ProjName ""
-# PROP Scc_LocalPath ""
-CPP=cl.exe
-RSC=rc.exe
-
-!IF  "$(CFG)" == "SwDbgSub - Win32 Release"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 0
-# PROP BASE Output_Dir "Release"
-# PROP BASE Intermediate_Dir "Release"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 0
-# PROP Output_Dir "Release"
-# PROP Intermediate_Dir "Release"
-# PROP Ignore_Export_Lib 0
-# PROP Target_Dir ""
-# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
-# ADD CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
-# ADD BASE RSC /l 0x409 /d "NDEBUG"
-# ADD RSC /l 0x409 /d "NDEBUG"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LINK32=link.exe
-# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
-# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ws2_32.lib /nologo /subsystem:console /machine:I386
-
-!ELSEIF  "$(CFG)" == "SwDbgSub - Win32 Debug"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 1
-# PROP BASE Output_Dir "SwDbgSub___Win32_Debug"
-# PROP BASE Intermediate_Dir "SwDbgSub___Win32_Debug"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 1
-# PROP Output_Dir "Debug"
-# PROP Intermediate_Dir "Debug"
-# PROP Ignore_Export_Lib 0
-# PROP Target_Dir ""
-# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
-# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
-# ADD BASE RSC /l 0x409 /d "_DEBUG"
-# ADD RSC /l 0x409 /d "_DEBUG"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LINK32=link.exe
-# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
-# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ws2_32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
-
-!ENDIF 
-
-# Begin Target
-
-# Name "SwDbgSub - Win32 Release"
-# Name "SwDbgSub - Win32 Debug"
-# Begin Group "Source Files"
-
-# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
-# Begin Source File
-
-SOURCE=.\Buffer.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=.\IOBuf.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=.\isNT4.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=.\libInfo.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=.\Monitor.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=.\nt4internals.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=.\SwDbgSub.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=.\toolHelp.cpp
-# End Source File
-# End Group
-# Begin Group "Header Files"
-
-# PROP Default_Filter "h;hpp;hxx;hm;inl"
-# End Group
-# Begin Group "Resource Files"
-
-# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
-# End Group
-# End Target
-# End Project
--- a/agent/src/os/win32/initWinsock.cpp	Wed Sep 14 13:23:54 2011 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,71 +0,0 @@
-/*
- * Copyright (c) 2000, Oracle and/or its affiliates. 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.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- *
- */
-
-#include <iostream>
-#include <winsock2.h>
-
-using namespace std;
-
-void
-initWinsock()
-{
-  static int initted = 0;
-  WORD wVersionRequested;
-  WSADATA wsaData;
-  int err;
-
-  if (!initted) {
-    wVersionRequested = MAKEWORD( 2, 0 );
-
-    err = WSAStartup( wVersionRequested, &wsaData );
-    if ( err != 0 ) {
-      {
-        /* Tell the user that we couldn't find a usable */
-        /* WinSock DLL.                                 */
-        cerr << "SocketBase::SocketBase: unable to find usable "
-             << "WinSock DLL" << endl;
-        exit(1);
-      }
-    }
-
-    /* Confirm that the WinSock DLL supports 2.0.*/
-    /* Note that if the DLL supports versions greater    */
-    /* than 2.0 in addition to 2.0, it will still return */
-    /* 2.0 in wVersion since that is the version we      */
-    /* requested.                                        */
-
-    if ( LOBYTE( wsaData.wVersion ) != 2 ||
-         HIBYTE( wsaData.wVersion ) != 0 ) {
-      /* Tell the user that we couldn't find a usable */
-      /* WinSock DLL.                                  */
-      {
-        cerr << "Unable to find suitable version of WinSock DLL" << endl;
-        WSACleanup( );
-        exit(1);
-      }
-    }
-
-    initted = 1;
-  }
-}
--- a/agent/src/os/win32/initWinsock.hpp	Wed Sep 14 13:23:54 2011 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,30 +0,0 @@
-/*
- * Copyright (c) 2000, Oracle and/or its affiliates. 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.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- *
- */
-
-#ifndef _INIT_WINSOCK_
-#define _INIT_WINSOCK_
-
-void initWinsock();
-
-#endif // #defined _INIT_WINSOCK_
--- a/agent/src/os/win32/ioUtils.cpp	Wed Sep 14 13:23:54 2011 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,156 +0,0 @@
-/*
- * Copyright (c) 2000, 2001, Oracle and/or its affiliates. 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.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- *
- */
-
-#include <ctype.h>
-#include <string.h>
-#include "ioUtils.hpp"
-#include "IOBuf.hpp"
-
-bool
-scanInt(char** data, int* num) {
-  *num = 0;
-
-  // Skip whitespace
-  while ((**data != 0) && (isspace(**data))) {
-    ++*data;
-  }
-
-  if (**data == 0) {
-    return false;
-  }
-
-  while ((**data != 0) && (!isspace(**data))) {
-    char cur = **data;
-    if ((cur < '0') || (cur > '9')) {
-      return false;
-    }
-    *num *= 10;
-    *num += cur - '0';
-    ++*data;
-  }
-
-  return true;
-}
-
-bool
-scanUnsignedLong(char** data, unsigned long* num) {
-  *num = 0;
-
-  // Skip whitespace
-  while ((**data != 0) && (isspace(**data))) {
-    ++*data;
-  }
-
-  if (**data == 0) {
-    return false;
-  }
-
-  while ((**data != 0) && (!isspace(**data))) {
-    char cur = **data;
-    if ((cur < '0') || (cur > '9')) {
-      return false;
-    }
-    *num *= 10;
-    *num += cur - '0';
-    ++*data;
-  }
-
-  return true;
-}
-
-bool
-charToNibble(char ascii, int* value) {
-  if (ascii >= '0' && ascii <= '9') {
-    *value = ascii - '0';
-    return true;
-  } else if (ascii >= 'A' && ascii <= 'F') {
-    *value = 10 + ascii - 'A';
-    return true;
-  } else if (ascii >= 'a' && ascii <= 'f') {
-    *value = 10 + ascii - 'a';
-    return true;
-  }
-
-  return false;
-}
-
-bool
-scanAddress(char** data, unsigned long* addr) {
-  *addr = 0;
-
-  // Skip whitespace
-  while ((**data != 0) && (isspace(**data))) {
-    ++*data;
-  }
-
-  if (**data == 0) {
-    return false;
-  }
-
-  if (strncmp(*data, "0x", 2) != 0) {
-    return false;
-  }
-
-  *data += 2;
-
-  while ((**data != 0) && (!isspace(**data))) {
-    int val;
-    bool res = charToNibble(**data, &val);
-    if (!res) {
-      return false;
-    }
-    *addr <<= 4;
-    *addr |= val;
-    ++*data;
-  }
-
-  return true;
-}
-
-bool
-scanAndSkipBinEscapeChar(char** data) {
-  // Skip whitespace
-  while ((**data != 0) && (isspace(**data))) {
-    ++*data;
-  }
-
-  if (!IOBuf::isBinEscapeChar(**data)) {
-    return false;
-  }
-
-  ++*data;
-
-  return true;
-}
-
-bool
-scanBinUnsignedLong(char** data, unsigned long* num) {
-  *num = 0;
-  for (int i = 0; i < 4; i++) {
-    unsigned char val = (unsigned char) **data;
-    *num = (*num << 8) | val;
-    ++*data;
-  }
-  return true;
-}
--- a/agent/src/os/win32/ioUtils.hpp	Wed Sep 14 13:23:54 2011 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,36 +0,0 @@
-/*
- * Copyright (c) 2000, 2001, Oracle and/or its affiliates. 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.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- *
- */
-
-#ifndef _IO_UTILS_
-#define _IO_UTILS_
-
-bool scanInt(char** data, int* num);
-bool scanUnsignedLong(char** data, unsigned long* num);
-bool scanAddress(char** data, unsigned long* addr);
-
-// Binary utils (for poke)
-bool scanAndSkipBinEscapeChar(char** data);
-bool scanBinUnsignedLong(char** data, unsigned long* num);
-
-#endif  // #defined _IO_UTILS_
--- a/agent/src/os/win32/isNT4.cpp	Wed Sep 14 13:23:54 2011 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,39 +0,0 @@
-/*
- * Copyright (c) 2000, Oracle and/or its affiliates. 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.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- *
- */
-
-#include "isNT4.hpp"
-#include <windows.h>
-
-bool
-isNT4() {
-  OSVERSIONINFO info;
-  info.dwOSVersionInfoSize = sizeof(info);
-
-  if (!GetVersionEx(&info)) {
-    return false;
-  }
-
-  return ((info.dwPlatformId == VER_PLATFORM_WIN32_NT) &&
-          (info.dwMajorVersion == 4));
-}
--- a/agent/src/os/win32/isNT4.hpp	Wed Sep 14 13:23:54 2011 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,34 +0,0 @@
-/*
- * Copyright (c) 2000, Oracle and/or its affiliates. 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.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- *
- */
-
-#ifndef _ISNT4_H_
-#define _ISNT4_H_
-
-// We need to special-case the Windows NT 4.0 implementations of some
-// of the debugging routines because the Tool Help API is not
-// available on this platform.
-
-bool isNT4();
-
-#endif  // #defined _ISNT4_H_
--- a/agent/src/os/win32/libInfo.cpp	Wed Sep 14 13:23:54 2011 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,186 +0,0 @@
-/*
- * Copyright (c) 2001, Oracle and/or its affiliates. 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.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- *
- */
-
-// Disable too-long symbol warnings
-#pragma warning ( disable : 4786 )
-
-#include "libInfo.hpp"
-#include "nt4internals.hpp"
-#include "isNT4.hpp"
-#include "toolHelp.hpp"
-#include <assert.h>
-
-using namespace std;
-
-typedef void LibInfoImplFunc(DWORD pid, vector<LibInfo>& info);
-
-static void libInfoImplNT4(DWORD pid, vector<LibInfo>& info);
-static void libInfoImplToolHelp(DWORD pid, vector<LibInfo>& info);
-
-void
-libInfo(DWORD pid, vector<LibInfo>& info) {
-  static LibInfoImplFunc* impl = NULL;
-
-  if (impl == NULL) {
-    // See which operating system we're on
-    impl = (isNT4() ? &libInfoImplNT4 : &libInfoImplToolHelp);
-  }
-
-  assert(impl != NULL);
-
-  (*impl)(pid, info);
-}
-
-static ULONG
-ModuleCount(NT4::PDEBUG_BUFFER db) {
-  return db->ModuleInformation ? *PULONG(db->ModuleInformation) : 0;
-}
-
-#define MAX2(a, b) (((a) < (b)) ? (b) : (a))
-
-static void
-libInfoImplNT4(DWORD pid, vector<LibInfo>& info) {
-  static EnumProcessModulesFunc*   enumFunc = NULL;
-  static GetModuleFileNameExFunc*  fnFunc   = NULL;
-  static GetModuleInformationFunc* infoFunc = NULL;
-
-  if (enumFunc == NULL) {
-    HMODULE dll = loadPSAPIDLL();
-
-    enumFunc = (EnumProcessModulesFunc*)   GetProcAddress(dll, "EnumProcessModules");
-    fnFunc   = (GetModuleFileNameExFunc*)  GetProcAddress(dll, "GetModuleFileNameExA");
-    infoFunc = (GetModuleInformationFunc*) GetProcAddress(dll, "GetModuleInformation");
-
-    assert(enumFunc != NULL);
-    assert(fnFunc   != NULL);
-    assert(infoFunc != NULL);
-  }
-
-  static HMODULE* mods = new HMODULE[256];
-  static int      numMods = 256;
-
-  if (mods == NULL) {
-    mods = new HMODULE[numMods];
-    if (mods == NULL) {
-      return;
-    }
-  }
-
-  bool done = false;
-
-  HANDLE proc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);
-  if (proc == NULL) {
-    return;
-  }
-
-  do {
-    DWORD bufSize = numMods * sizeof(HMODULE);
-    DWORD neededSize;
-
-    if (!(*enumFunc)(proc, mods, bufSize, &neededSize)) {
-      // Enum failed
-      CloseHandle(proc);
-      return;
-    }
-
-    int numFetched = neededSize / sizeof(HMODULE);
-
-    if (numMods < numFetched) {
-      // Grow buffer
-      numMods = MAX2(numFetched, 2 * numMods);
-      delete[] mods;
-      mods = new HMODULE[numMods];
-      if (mods == NULL) {
-        CloseHandle(proc);
-        return;
-      }
-    } else {
-      char filename[MAX_PATH];
-      MODULEINFO modInfo;
-
-      // Iterate through and fetch each one's info
-      for (int i = 0; i < numFetched; i++) {
-        if (!(*fnFunc)(proc, mods[i], filename, MAX_PATH)) {
-          CloseHandle(proc);
-          return;
-        }
-
-        if (!(*infoFunc)(proc, mods[i], &modInfo, sizeof(MODULEINFO))) {
-          CloseHandle(proc);
-          return;
-        }
-
-        info.push_back(LibInfo(string(filename), (void*) modInfo.lpBaseOfDll));
-      }
-
-      done = true;
-    }
-  } while (!done);
-
-  CloseHandle(proc);
-  return;
-}
-
-void
-libInfoImplToolHelp(DWORD pid, vector<LibInfo>& info) {
-  using namespace ToolHelp;
-
-  static CreateToolhelp32SnapshotFunc* snapshotFunc = NULL;
-  static Module32FirstFunc*            firstFunc    = NULL;
-  static Module32NextFunc*             nextFunc     = NULL;
-
-  if (snapshotFunc == NULL) {
-    HMODULE dll = loadDLL();
-
-    snapshotFunc =
-      (CreateToolhelp32SnapshotFunc*) GetProcAddress(dll,
-                                                     "CreateToolhelp32Snapshot");
-
-    firstFunc = (Module32FirstFunc*) GetProcAddress(dll,
-                                                    "Module32First");
-
-    nextFunc = (Module32NextFunc*) GetProcAddress(dll,
-                                                  "Module32Next");
-
-    assert(snapshotFunc != NULL);
-    assert(firstFunc    != NULL);
-    assert(nextFunc     != NULL);
-  }
-
-  HANDLE snapshot = (*snapshotFunc)(TH32CS_SNAPMODULE, pid);
-  if (snapshot == (HANDLE) -1) {
-    // Error occurred during snapshot
-    return;
-  }
-
-  // Iterate
-  MODULEENTRY32 module;
-  if ((*firstFunc)(snapshot, &module)) {
-    do {
-      info.push_back(LibInfo(string(module.szExePath), (void*) module.modBaseAddr));
-    } while ((*nextFunc)(snapshot, &module));
-  }
-
-  CloseHandle(snapshot);
-}
--- a/agent/src/os/win32/libInfo.hpp	Wed Sep 14 13:23:54 2011 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,44 +0,0 @@
-/*
- * Copyright (c) 2001, Oracle and/or its affiliates. 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.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- *
- */
-
-#ifndef _LIBINFO_
-#define _LIBINFO_
-
-#include <vector>
-#include <string>
-#include <windows.h>
-
-struct LibInfo {
-  std::string name;
-  void*  base;
-
-  LibInfo(const std::string& name, void* base) {
-    this->name = name;
-    this->base = base;
-  }
-};
-
-void libInfo(DWORD pid, std::vector<LibInfo>& info);
-
-#endif  // #defined _LIBINFO_
--- a/agent/src/os/win32/nt4internals.cpp	Wed Sep 14 13:23:54 2011 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,75 +0,0 @@
-/*
- * Copyright (c) 2000, 2001, Oracle and/or its affiliates. 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.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- *
- */
-
-#include "nt4internals.hpp"
-#include <stdio.h>
-#include <stdlib.h>
-#include <assert.h>
-
-namespace NT4 {
-
-static HMODULE ntDLL = NULL;
-
-HMODULE loadNTDLL() {
-  if (ntDLL == NULL) {
-    ntDLL = LoadLibrary("NTDLL.DLL");
-  }
-
-  assert(ntDLL != NULL);
-  return ntDLL;
-}
-
-void unloadNTDLL() {
-  if (ntDLL != NULL) {
-    FreeLibrary(ntDLL);
-    ntDLL = NULL;
-  }
-}
-
-} // namespace NT4
-
-static HMODULE psapiDLL = NULL;
-
-HMODULE
-loadPSAPIDLL() {
-  if (psapiDLL == NULL) {
-    psapiDLL = LoadLibrary("PSAPI.DLL");
-  }
-
-  if (psapiDLL == NULL) {
-    fprintf(stderr, "Simple Windows Debug Server requires PSAPI.DLL on Windows NT 4.0.\n");
-    fprintf(stderr, "Please install this DLL from the SDK and restart the server.\n");
-    exit(1);
-  }
-
-  return psapiDLL;
-}
-
-void
-unloadPSAPIDLL() {
-  if (psapiDLL != NULL) {
-    FreeLibrary(psapiDLL);
-    psapiDLL = NULL;
-  }
-}
--- a/agent/src/os/win32/nt4internals.hpp	Wed Sep 14 13:23:54 2011 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,273 +0,0 @@
-/*
- * Copyright (c) 2000, 2001, Oracle and/or its affiliates. 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.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- *
- */
-
-#ifndef _NT4INTERNALS_H_
-#define _NT4INTERNALS_H_
-
-#include <windows.h>
-
-namespace NT4 {
-extern "C" {
-
-// Data structures and constants required to be able to get necessary
-// debugging-related information on Windows NT 4.0 through internal
-// (i.e., non-public) APIs. These are adapted from those in the
-// _Windows NT/2000 Native API Reference_ by Gary Nebbett, Macmillan
-// Technical Publishing, 201 West 103rd Street, Indianapolis, IN
-// 46290, 2000.
-
-typedef LONG NTSTATUS;
-typedef LONG KPRIORITY;
-
-#if (_MSC_VER >= 800) || defined(_STDCALL_SUPPORTED)
-#define NTAPI __stdcall
-#else
-#define _cdecl
-#define NTAPI
-#endif
-
-#define STATUS_INFO_LENGTH_MISMATCH ((NTSTATUS)0xC0000004L)
-
-typedef enum _SYSTEM_INFORMATION_CLASS {
-  SystemProcessesAndThreadsInformation = 5
-} SYSTEM_INFORMATION_CLASS;
-
-typedef struct _UNICODE_STRING {
-  USHORT Length;
-  USHORT MaximumLength;
-  PWSTR  Buffer;
-} UNICODE_STRING;
-
-typedef struct _VM_COUNTERS {
-  ULONG PeakVirtualSize;
-  ULONG VirtualSize;
-  ULONG PageFaultCount;
-  ULONG PeakWorkingSetSize;
-  ULONG WorkingSetSize;
-  ULONG QuotaPeakPagedPoolUsage;
-  ULONG QuotaPagedPoolUsage;
-  ULONG QuotaPeakNonPagedPoolUsage;
-  ULONG QuotaNonPagedPoolUsage;
-  ULONG PagefileUsage;
-  ULONG PeakPagefileUsage;
-} VM_COUNTERS, *PVM_COUNTERS;
-
-typedef struct _IO_COUNTERS {
-  LARGE_INTEGER ReadOperationCount;
-  LARGE_INTEGER WriteOperationCount;
-  LARGE_INTEGER OtherOperationCount;
-  LARGE_INTEGER ReadTransferCount;
-  LARGE_INTEGER WriteTransferCount;
-  LARGE_INTEGER OtherTransferCount;
-} IO_COUNTERS, *PIO_COUNTERS;
-
-typedef struct _CLIENT_ID {
-  HANDLE UniqueProcess;
-  HANDLE UniqueThread;
-} CLIENT_ID, *PCLIENT_ID;
-
-typedef enum {
-  StateInitialized,
-  StateReady,
-  StateRunning,
-  StateStandby,
-  StateTerminated,
-  StateWait,
-  StateTransition,
-  StateUnknown
-} THREAD_STATE;
-
-typedef enum {
-  Executive,
-  FreePage,
-  PageIn,
-  PoolAllocation,
-  DelayExecution,
-  Suspended,
-  UserRequest,
-  WrExecutive,
-  WrFreePage,
-  WrPageIn,
-  WrPoolAllocation,
-  WrDelayExecution,
-  WrSuspended,
-  WrUserRequest,
-  WrEventPair,
-  WrQueue,
-  WrLpcReceive,
-  WrLpcReply,
-  WrVirtualMemory,
-  WrPageOut,
-  WrRendezvous,
-  Spare2,
-  Spare3,
-  Spare4,
-  Spare5,
-  Spare6,
-  WrKernel
-} KWAIT_REASON;
-
-typedef struct _SYSTEM_THREADS {
-  LARGE_INTEGER KernelTime;
-  LARGE_INTEGER UserTime;
-  LARGE_INTEGER CreateTime;
-  ULONG WaitTime;
-  PVOID StartAddress;
-  CLIENT_ID ClientId;
-  KPRIORITY Priority;
-  KPRIORITY BasePriority;
-  ULONG ContextSwitchCount;
-  THREAD_STATE State;
-  KWAIT_REASON WaitReason;
-} SYSTEM_THREADS, *PSYSTEM_THREADS;
-
-typedef struct _SYSTEM_PROCESSES { // Information class 5
-  ULONG NextEntryDelta;
-  ULONG ThreadCount;
-  ULONG Reserved1[6];
-  LARGE_INTEGER CreateTime;
-  LARGE_INTEGER UserTime;
-  LARGE_INTEGER KernelTime;
-  UNICODE_STRING ProcessName;
-  KPRIORITY BasePriority;
-  ULONG ProcessId;
-  ULONG InheritedFromProcessId;
-  ULONG HandleCount;
-  ULONG Reserved2[2];
-  ULONG PrivatePageCount;
-  VM_COUNTERS VmCounters;
-  IO_COUNTERS IoCounters; // Windows 2000 only
-  SYSTEM_THREADS Threads[1];
-} SYSTEM_PROCESSES, *PSYSTEM_PROCESSES;
-
-typedef NTSTATUS NTAPI
-ZwQuerySystemInformationFunc(IN SYSTEM_INFORMATION_CLASS SystemInformationClass,
-                             IN OUT PVOID SystemInformation,
-                             IN ULONG SystemInformationLength,
-                             OUT PULONG ReturnLength OPTIONAL
-                             );
-
-typedef struct _DEBUG_BUFFER {
-  HANDLE SectionHandle;
-  PVOID  SectionBase;
-  PVOID  RemoteSectionBase;
-  ULONG  SectionBaseDelta;
-  HANDLE EventPairHandle;
-  ULONG  Unknown[2];
-  HANDLE RemoteThreadHandle;
-  ULONG  InfoClassMask;
-  ULONG  SizeOfInfo;
-  ULONG  AllocatedSize;
-  ULONG  SectionSize;
-  PVOID  ModuleInformation;
-  PVOID  BackTraceInformation;
-  PVOID  HeapInformation;
-  PVOID  LockInformation;
-  PVOID  Reserved[8];
-} DEBUG_BUFFER, *PDEBUG_BUFFER;
-
-typedef PDEBUG_BUFFER NTAPI
-RtlCreateQueryDebugBufferFunc(IN ULONG Size,
-                              IN BOOLEAN EventPair);
-
-#define PDI_MODULES     0x01 // The loaded modules of the process
-#define PDI_BACKTRACE   0x02 // The heap stack back traces
-#define PDI_HEAPS       0x04 // The heaps of the process
-#define PDI_HEAP_TAGS   0x08 // The heap tags
-#define PDI_HEAP_BLOCKS 0x10 // The heap blocks
-#define PDI_LOCKS       0x20 // The locks created by the process
-
-typedef struct _DEBUG_MODULE_INFORMATION { // c.f. SYSTEM_MODULE_INFORMATION
-  ULONG  Reserved[2];
-  ULONG  Base;
-  ULONG  Size;
-  ULONG  Flags;
-  USHORT Index;
-  USHORT Unknown;
-  USHORT LoadCount;
-  USHORT ModuleNameOffset;
-  CHAR   ImageName[256];
-} DEBUG_MODULE_INFORMATION, *PDEBUG_MODULE_INFORMATION;
-
-// Flags
-#define LDRP_STATIC_LINK             0x00000002
-#define LDRP_IMAGE_DLL               0x00000004
-#define LDRP_LOAD_IN_PROGRESS        0x00001000
-#define LDRP_UNLOAD_IN_PROGRESS      0x00002000
-#define LDRP_ENTRY_PROCESSED         0x00004000
-#define LDRP_ENTRY_INSERTED          0x00008000
-#define LDRP_CURRENT_LOAD            0x00010000
-#define LDRP_FAILED_BUILTIN_LOAD     0x00020000
-#define LDRP_DONT_CALL_FOR_THREADS   0x00040000
-#define LDRP_PROCESS_ATTACH_CALLED   0x00080000
-#define LDRP_DEBUG_SYMBOLS_LOADED    0x00100000
-#define LDRP_IMAGE_NOT_AT_BASE       0x00200000
-#define LDRP_WX86_IGNORE_MACHINETYPE 0x00400000
-
-// NOTE that this will require creating a thread in the target
-// process, implying that we can not call this while the process is
-// suspended. May have to run this command in the child processes
-// rather than the server.
-
-typedef NTSTATUS NTAPI
-RtlQueryProcessDebugInformationFunc(IN ULONG ProcessId,
-                                    IN ULONG DebugInfoClassMask,
-                                    IN OUT PDEBUG_BUFFER DebugBuffer);
-
-typedef NTSTATUS NTAPI
-RtlDestroyQueryDebugBufferFunc(IN PDEBUG_BUFFER DebugBuffer);
-
-// Routines to load and unload NTDLL.DLL.
-HMODULE loadNTDLL();
-// Safe to call even if has not been loaded
-void    unloadNTDLL();
-
-} // extern "C"
-} // namespace NT4
-
-//----------------------------------------------------------------------
-
-// On NT 4 only, we now use PSAPI to enumerate the loaded modules in
-// the target processes. RtlQueryProcessDebugInformation creates a
-// thread in the target process, which causes problems when we are
-// handling events like breakpoints in the debugger. The dependence on
-// an external DLL which might not be present is unfortunate, but we
-// can either redistribute this DLL (if allowed) or refuse to start on
-// NT 4 if it is not present.
-
-typedef struct _MODULEINFO {
-    LPVOID lpBaseOfDll;
-    DWORD SizeOfImage;
-    LPVOID EntryPoint;
-} MODULEINFO, *LPMODULEINFO;
-
-typedef BOOL (WINAPI EnumProcessModulesFunc)(HANDLE, HMODULE *, DWORD, LPDWORD);
-typedef DWORD (WINAPI GetModuleFileNameExFunc)(HANDLE, HMODULE, LPTSTR, DWORD);
-typedef BOOL (WINAPI GetModuleInformationFunc)(HANDLE, HMODULE, LPMODULEINFO, DWORD);
-// Routines to load and unload PSAPI.DLL.
-HMODULE loadPSAPIDLL();
-// Safe to call even if has not been loaded
-void    unloadPSAPIDLL();
-
-#endif // #defined _NT4INTERNALS_H_
--- a/agent/src/os/win32/ports.h	Wed Sep 14 13:23:54 2011 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,32 +0,0 @@
-/*
- * Copyright (c) 2000, Oracle and/or its affiliates. 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.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- *
- */
-
-#ifndef _PORTS_H_
-#define _PORTS_H_
-
-// This is the "public" port which end-user clients can connect to
-// with an arbitrary application, including telnet.
-const short CLIENT_PORT = 27000;
-
-#endif  // #defined _PORTS_H_
--- a/agent/src/os/win32/procList.cpp	Wed Sep 14 13:23:54 2011 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,190 +0,0 @@
-/*
- * Copyright (c) 2000, 2001, Oracle and/or its affiliates. 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.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- *
- */
-
-#include "procList.hpp"
-#include "nt4internals.hpp"
-#include "isNT4.hpp"
-#include "toolHelp.hpp"
-#include <assert.h>
-
-using namespace std;
-using namespace NT4;
-
-typedef void ProcListImplFunc(ProcEntryList& processes);
-
-void procListImplNT4(ProcEntryList& processes);
-void procListImplToolHelp(ProcEntryList& processes);
-
-ProcEntry::ProcEntry(ULONG pid, USHORT nameLength, WCHAR* name) {
-  this->pid = pid;
-  this->nameLength = nameLength;
-  this->name = new WCHAR[nameLength];
-  memcpy(this->name, name, nameLength * sizeof(WCHAR));
-}
-
-ProcEntry::ProcEntry(ULONG pid, USHORT nameLength, char* name) {
-  this->pid = pid;
-  this->nameLength = nameLength;
-  this->name = new WCHAR[nameLength];
-  int j = 0;
-  for (int i = 0; i < nameLength; i++) {
-    // FIXME: what is the proper promotion from ASCII to UNICODE?
-    this->name[i] = name[i] & 0xFF;
-  }
-}
-
-ProcEntry::ProcEntry(const ProcEntry& arg) {
-  name = NULL;
-  copyFrom(arg);
-}
-
-ProcEntry&
-ProcEntry::operator=(const ProcEntry& arg) {
-  copyFrom(arg);
-  return *this;
-}
-
-ProcEntry::~ProcEntry() {
-  delete[] name;
-}
-
-void
-ProcEntry::copyFrom(const ProcEntry& arg) {
-  if (name != NULL) {
-    delete[] name;
-  }
-  pid = arg.pid;
-  nameLength = arg.nameLength;
-  name = new WCHAR[nameLength];
-  memcpy(name, arg.name, nameLength * sizeof(WCHAR));
-}
-
-ULONG
-ProcEntry::getPid() {
-  return pid;
-}
-
-USHORT
-ProcEntry::getNameLength() {
-  return nameLength;
-}
-
-WCHAR*
-ProcEntry::getName() {
-  return name;
-}
-
-void
-procList(ProcEntryList& processes) {
-  static ProcListImplFunc* impl = NULL;
-
-  if (impl == NULL) {
-    // See which operating system we're on
-    impl = (isNT4() ? &procListImplNT4 : &procListImplToolHelp);
-  }
-
-  assert(impl != NULL);
-
-  (*impl)(processes);
-}
-
-void
-procListImplNT4(ProcEntryList& processes) {
-  using namespace NT4;
-
-  static ZwQuerySystemInformationFunc* query = NULL;
-
-  if (query == NULL) {
-    HMODULE ntDLL = loadNTDLL();
-    query =
-      (ZwQuerySystemInformationFunc*) GetProcAddress(ntDLL,
-                                                     "ZwQuerySystemInformation");
-    assert(query != NULL);
-  }
-
-  ULONG n = 0x100;
-  PSYSTEM_PROCESSES sp = new SYSTEM_PROCESSES[n];
-  while ((*query)(SystemProcessesAndThreadsInformation,
-                  sp, n * sizeof(SYSTEM_PROCESSES), 0) == STATUS_INFO_LENGTH_MISMATCH) {
-    delete[] sp;
-    n *= 2;
-    sp = new SYSTEM_PROCESSES[n];
-  }
-
-  bool done = false;
-  for (PSYSTEM_PROCESSES p = sp; !done;
-       p = PSYSTEM_PROCESSES(PCHAR(p) + p->NextEntryDelta)) {
-    processes.push_back(ProcEntry(p->ProcessId,
-                                  p->ProcessName.Length / 2,
-                                  p->ProcessName.Buffer));
-    done = p->NextEntryDelta == 0;
-  }
-}
-
-void
-procListImplToolHelp(ProcEntryList& processes) {
-  using namespace ToolHelp;
-
-  static CreateToolhelp32SnapshotFunc* snapshotFunc = NULL;
-  static Process32FirstFunc*           firstFunc    = NULL;
-  static Process32NextFunc*            nextFunc     = NULL;
-
-  if (snapshotFunc == NULL) {
-    HMODULE dll = loadDLL();
-
-    snapshotFunc =
-      (CreateToolhelp32SnapshotFunc*) GetProcAddress(dll,
-                                                     "CreateToolhelp32Snapshot");
-
-    firstFunc = (Process32FirstFunc*) GetProcAddress(dll,
-                                                     "Process32First");
-
-    nextFunc = (Process32NextFunc*) GetProcAddress(dll,
-                                                   "Process32Next");
-
-    assert(snapshotFunc != NULL);
-    assert(firstFunc    != NULL);
-    assert(nextFunc     != NULL);
-  }
-
-  HANDLE snapshot = (*snapshotFunc)(TH32CS_SNAPPROCESS, 0 /* ignored */);
-  if (snapshot == (HANDLE) -1) {
-    // Error occurred during snapshot
-    return;
-  }
-
-  // Iterate
-  PROCESSENTRY32 proc;
-  if ((*firstFunc)(snapshot, &proc)) {
-    do {
-      // FIXME: could make this uniform to the NT version by cutting
-      // off the path name just before the executable name
-      processes.push_back(ProcEntry(proc.th32ProcessID,
-                                    strlen(proc.szExeFile),
-                                    proc.szExeFile));
-    } while ((*nextFunc)(snapshot, &proc));
-  }
-
-  CloseHandle(snapshot);
-}
--- a/agent/src/os/win32/procList.hpp	Wed Sep 14 13:23:54 2011 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,55 +0,0 @@
-/*
- * Copyright (c) 2000, 2001, Oracle and/or its affiliates. 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.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- *
- */
-
-#ifndef _PROCLIST_
-#define _PROCLIST_
-
-#include <windows.h>
-#include <vector>
-
-class ProcEntry {
-public:
-  /** name may not be NULL */
-  ProcEntry(ULONG pid, USHORT nameLength, wchar_t* name);
-  ProcEntry(ULONG pid, USHORT nameLength, char* name);
-  ~ProcEntry();
-  ProcEntry(const ProcEntry& arg);
-  ProcEntry& operator=(const ProcEntry& arg);
-
-  ULONG getPid();
-  /** Returns number of WCHAR characters in getName() */
-  USHORT getNameLength();
-  WCHAR* getName();
-
-private:
-  ULONG pid;
-  USHORT nameLength;
-  WCHAR* name;
-  void copyFrom(const ProcEntry& arg);
-};
-
-typedef std::vector<ProcEntry> ProcEntryList;
-void procList(ProcEntryList& processes);
-
-#endif  // #defined _PROCLIST_
--- a/agent/src/os/win32/serverLists.cpp	Wed Sep 14 13:23:54 2011 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,270 +0,0 @@
-/*
- * Copyright (c) 2000, 2003, Oracle and/or its affiliates. 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.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- *
- */
-
-#include <assert.h>
-#include "serverLists.hpp"
-
-//----------------------------------------------------------------------
-// Lists
-//
-
-CRITICAL_SECTION Lists::crit;
-
-void
-Lists::init() {
-  InitializeCriticalSection(&crit);
-}
-
-void
-Lists::lock() {
-  EnterCriticalSection(&crit);
-}
-
-void
-Lists::unlock() {
-  LeaveCriticalSection(&crit);
-}
-
-//----------------------------------------------------------------------
-// ListsLocker
-//
-
-ListsLocker::ListsLocker() {
-  Lists::lock();
-}
-
-ListsLocker::~ListsLocker() {
-  Lists::unlock();
-}
-
-//----------------------------------------------------------------------
-// ChildInfo
-//
-
-ChildInfo::ChildInfo(DWORD pid, HANDLE childProcessHandle,
-                     HANDLE writeToStdinHandle, HANDLE readFromStdoutHandle,
-                     HANDLE auxHandle1, HANDLE auxHandle2) {
-  this->pid = pid;
-  this->childProcessHandle = childProcessHandle;
-  this->writeToStdinHandle = writeToStdinHandle;
-  this->readFromStdoutHandle = readFromStdoutHandle;
-  this->auxHandle1 = auxHandle1;
-  this->auxHandle2 = auxHandle2;
-  client = NULL;
-}
-
-DWORD
-ChildInfo::getPid() {
-  return pid;
-}
-
-HANDLE
-ChildInfo::getChildProcessHandle() {
-  return childProcessHandle;
-}
-
-HANDLE
-ChildInfo::getWriteToStdinHandle() {
-  return writeToStdinHandle;
-}
-
-HANDLE
-ChildInfo::getReadFromStdoutHandle() {
-  return readFromStdoutHandle;
-}
-
-void
-ChildInfo::setClient(ClientInfo* clientInfo) {
-  client = clientInfo;
-}
-
-ClientInfo*
-ChildInfo::getClient() {
-  return client;
-}
-
-void
-ChildInfo::closeAll() {
-  CloseHandle(childProcessHandle);
-  CloseHandle(writeToStdinHandle);
-  CloseHandle(readFromStdoutHandle);
-  CloseHandle(auxHandle1);
-  CloseHandle(auxHandle2);
-}
-
-//----------------------------------------------------------------------
-// ChildList
-//
-
-ChildList::ChildList() {
-}
-
-ChildList::~ChildList() {
-}
-
-void
-ChildList::addChild(ChildInfo* info) {
-  // Could store these in binary sorted order by pid for efficiency
-  childList.push_back(info);
-}
-
-ChildInfo*
-ChildList::removeChild(HANDLE childProcessHandle) {
-  for (ChildInfoList::iterator iter = childList.begin(); iter != childList.end();
-       iter++) {
-    ChildInfo* info = *iter;
-    if (info->getChildProcessHandle() == childProcessHandle) {
-      childList.erase(iter);
-      return info;
-    }
-  }
-  assert(false);
-  return NULL;
-}
-
-void
-ChildList::removeChild(ChildInfo* info) {
-  for (ChildInfoList::iterator iter = childList.begin(); iter != childList.end();
-       iter++) {
-    if (*iter == info) {
-      childList.erase(iter);
-      return;
-    }
-  }
-  assert(false);
-}
-
-ChildInfo*
-ChildList::getChildByPid(DWORD pid) {
-  for (ChildInfoList::iterator iter = childList.begin(); iter != childList.end();
-       iter++) {
-    ChildInfo* info = *iter;
-    if (info->getPid() == pid) {
-      return info;
-    }
-  }
-  return NULL;
-}
-
-int
-ChildList::size() {
-  return childList.size();
-}
-
-ChildInfo*
-ChildList::getChildByIndex(int index) {
-  return childList[index];
-}
-
-//----------------------------------------------------------------------
-// ClientInfo
-//
-
-ClientInfo::ClientInfo(SOCKET dataSocket) {
-  this->dataSocket = dataSocket;
-  buf = new IOBuf(32768, 131072);
-  buf->setSocket(dataSocket);
-  target = NULL;
-}
-
-ClientInfo::~ClientInfo() {
-  delete buf;
-}
-
-SOCKET
-ClientInfo::getDataSocket() {
-  return dataSocket;
-}
-
-IOBuf*
-ClientInfo::getIOBuf() {
-  return buf;
-}
-
-void
-ClientInfo::setTarget(ChildInfo* childInfo) {
-  target = childInfo;
-}
-
-ChildInfo*
-ClientInfo::getTarget() {
-  return target;
-}
-
-void
-ClientInfo::closeAll() {
-  shutdown(dataSocket, SD_BOTH);
-  closesocket(dataSocket);
-  dataSocket = INVALID_SOCKET;
-}
-
-//----------------------------------------------------------------------
-// ClientList
-//
-
-ClientList::ClientList() {
-}
-
-ClientList::~ClientList() {
-}
-
-void
-ClientList::addClient(ClientInfo* info) {
-  clientList.push_back(info);
-}
-
-bool
-ClientList::isAnyDataSocketSet(fd_set* fds, ClientInfo** out) {
-  for (ClientInfoList::iterator iter = clientList.begin(); iter != clientList.end();
-       iter++) {
-    ClientInfo* info = *iter;
-    if (FD_ISSET(info->getDataSocket(), fds)) {
-      *out = info;
-      return true;
-    }
-  }
-  return false;
-}
-
-void
-ClientList::removeClient(ClientInfo* client) {
-  for (ClientInfoList::iterator iter = clientList.begin(); iter != clientList.end();
-       iter++) {
-    if (*iter == client) {
-      clientList.erase(iter);
-      return;
-    }
-  }
-  assert(false);
-}
-
-int
-ClientList::size() {
-  return clientList.size();
-}
-
-ClientInfo*
-ClientList::get(int num) {
-  return clientList[num];
-}
--- a/agent/src/os/win32/serverLists.hpp	Wed Sep 14 13:23:54 2011 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,204 +0,0 @@
-/*
- * Copyright (c) 2000, 2003, Oracle and/or its affiliates. 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.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- *
- */
-
-#ifndef _SERVER_LISTS_
-#define _SERVER_LISTS_
-
-#include <vector>
-#include <winsock2.h>
-#include "IOBuf.hpp"
-
-//
-// NOTE:
-//
-// All of these lists are guarded by the global lock managed by the
-// Lists class. Lists::init() must be called at the start of the
-// program.
-//
-
-class Lists {
-  friend class ListsLocker;
-public:
-  static void init();
-private:
-  static void lock();
-  static void unlock();
-  static CRITICAL_SECTION crit;
-};
-
-// Should be allocated on stack. Ensures proper locking/unlocking
-// pairing.
-class ListsLocker {
-public:
-  ListsLocker();
-  ~ListsLocker();
-};
-
-// We must keep track of all of the child processes we have forked to
-// handle attaching to a target process. This is necessary because we
-// allow clients to detach from processes, but the child processes we
-// fork must necessarily stay alive for the duration of the target
-// application. A subsequent attach operation to the target process
-// results in the same child process being reused. For this reason,
-// child processes are known to be in one of two states: attached and
-// detached.
-
-class ClientInfo;
-
-class ChildInfo {
-public:
-  /** The pid of the ChildInfo indicates the process ID of the target
-      process which the subprocess was created to debug, not the pid
-      of the subprocess itself. */
-  ChildInfo(DWORD pid, HANDLE childProcessHandle,
-            HANDLE writeToStdinHandle, HANDLE readFromStdoutHandle,
-            HANDLE auxHandle1, HANDLE auxHandle2);
-
-  DWORD getPid();
-  HANDLE getChildProcessHandle();
-  HANDLE getWriteToStdinHandle();
-  HANDLE getReadFromStdoutHandle();
-
-  /** Set the client which is currently attached to the target process
-      via this child process. Set this to NULL to indicate that the
-      child process is ready to accept another attachment. */
-  void setClient(ClientInfo* clientInfo);
-
-  ClientInfo* getClient();
-
-  /** This is NOT automatically called in the destructor */
-  void closeAll();
-
-private:
-  DWORD pid;
-  HANDLE childProcessHandle;
-  HANDLE writeToStdinHandle;
-  HANDLE readFromStdoutHandle;
-  HANDLE auxHandle1;
-  HANDLE auxHandle2;
-  ClientInfo* client;
-};
-
-// We keep track of a list of child debugger processes, each of which
-// is responsible for debugging a certain target process. These
-// debugger processes can serve multiple clients during their
-// lifetime. When a client detaches from a given process or tells the
-// debugger to "exit", the debug server is notified that the child
-// process is once again available to accept connections from clients.
-
-class ChildList {
-private:
-  typedef std::vector<ChildInfo*> ChildInfoList;
-
-public:
-  ChildList();
-  ~ChildList();
-
-  void addChild(ChildInfo*);
-
-  /** Removes and returns the ChildInfo* associated with the given
-      child process handle. */
-  ChildInfo* removeChild(HANDLE childProcessHandle);
-
-  /** Removes the given ChildInfo. */
-  void removeChild(ChildInfo* info);
-
-  /** Return the ChildInfo* associated with a given process ID without
-      removing it from the list. */
-  ChildInfo* getChildByPid(DWORD pid);
-
-  /** Iteration support */
-  int size();
-
-  /** Iteration support */
-  ChildInfo* getChildByIndex(int index);
-
-private:
-  ChildInfoList childList;
-};
-
-// We also keep a list of clients whose requests we are responsible
-// for serving. Clients can attach and detach from child processes.
-
-class ClientInfo {
-public:
-  ClientInfo(SOCKET dataSocket);
-  ~ClientInfo();
-
-  SOCKET getDataSocket();
-  /** Gets an IOBuf configured for the data socket, which should be
-      used for all communication with the client. */
-  IOBuf* getIOBuf();
-
-  /** Set the information for the process to which this client is
-      attached. Set this to NULL to indicate that the client is not
-      currently attached to any target process. */
-  void setTarget(ChildInfo* childInfo);
-
-  /** Get the information for the process to which this client is
-      currently attached, or NULL if none. */
-  ChildInfo* getTarget();
-
-  /** Close down the socket connection to this client. This is NOT
-      automatically called by the destructor. */
-  void closeAll();
-
-private:
-  SOCKET dataSocket;
-  IOBuf* buf;
-  ChildInfo* target;
-};
-
-class ClientList {
-private:
-  typedef std::vector<ClientInfo*> ClientInfoList;
-
-public:
-  ClientList();
-  ~ClientList();
-
-  /** Adds a client to the list. */
-  void addClient(ClientInfo* info);
-
-  /** Check to see whether the parent socket of any of the ClientInfo
-      objects is readable in the given fd_set. If so, returns TRUE and
-      sets the given ClientInfo* (a non-NULL pointer to which must be
-      given) appropriately. */
-  bool isAnyDataSocketSet(fd_set* fds, ClientInfo** info);
-
-  /** Removes a client from the list. User is responsible for deleting
-      the ClientInfo* using operator delete. */
-  void removeClient(ClientInfo* client);
-
-  /** Iteration support. */
-  int size();
-
-  /** Iteration support. */
-  ClientInfo* get(int num);
-
-private:
-  ClientInfoList clientList;
-};
-
-#endif  // #defined _SERVER_LISTS_
--- a/agent/src/os/win32/toolHelp.cpp	Wed Sep 14 13:23:54 2011 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,48 +0,0 @@
-/*
- * Copyright (c) 2001, Oracle and/or its affiliates. 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.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- *
- */
-
-#include "toolHelp.hpp"
-#include <assert.h>
-
-namespace ToolHelp {
-
-static HMODULE kernelDLL = NULL;
-
-HMODULE loadDLL() {
-  if (kernelDLL == NULL) {
-    kernelDLL = LoadLibrary("KERNEL32.DLL");
-  }
-
-  assert(kernelDLL != NULL);
-  return kernelDLL;
-}
-
-void unloadDLL() {
-  if (kernelDLL != NULL) {
-    FreeLibrary(kernelDLL);
-    kernelDLL = NULL;
-  }
-}
-
-} // namespace ToolHelp
--- a/agent/src/os/win32/toolHelp.hpp	Wed Sep 14 13:23:54 2011 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,75 +0,0 @@
-/*
- * Copyright (c) 2001, Oracle and/or its affiliates. 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.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- *
- */
-
-#ifndef _TOOLHELP_H_
-#define _TOOLHELP_H_
-
-#include <windows.h>
-#include <tlhelp32.h>
-
-namespace ToolHelp {
-extern "C" {
-
-  ///////////////
-  // Snapshots //
-  ///////////////
-  typedef HANDLE WINAPI
-  CreateToolhelp32SnapshotFunc(DWORD dwFlags, DWORD th32ProcessID);
-
-  //////////////////
-  // Process List //
-  //////////////////
-  typedef BOOL WINAPI Process32FirstFunc(HANDLE hSnapshot,
-                                         LPPROCESSENTRY32 lppe);
-
-  typedef BOOL WINAPI Process32NextFunc(HANDLE hSnapshot,
-                                        LPPROCESSENTRY32 lppe);
-
-  // NOTE: although these routines are defined in TLHELP32.H, they
-  // seem to always return false (maybe only under US locales)
-  typedef BOOL WINAPI Process32FirstWFunc(HANDLE hSnapshot,
-                                          LPPROCESSENTRY32W lppe);
-
-  typedef BOOL WINAPI Process32NextWFunc(HANDLE hSnapshot,
-                                         LPPROCESSENTRY32W lppe);
-
-  /////////////////
-  // Module List //
-  /////////////////
-  typedef BOOL WINAPI
-  Module32FirstFunc(HANDLE hSnapshot, LPMODULEENTRY32 lpme);
-
-  typedef BOOL WINAPI
-  Module32NextFunc (HANDLE hSnapshot, LPMODULEENTRY32 lpme);
-
-
-  // Routines to load and unload KERNEL32.DLL.
-  HMODULE loadDLL();
-  // Safe to call even if has not been loaded
-  void    unloadDLL();
-
-} // extern "C"
-} // namespace "ToolHelp"
-
-#endif // #defined _TOOLHELP_H_
--- a/agent/src/share/classes/sun/jvm/hotspot/CLHSDB.java	Wed Sep 14 13:23:54 2011 -0700
+++ b/agent/src/share/classes/sun/jvm/hotspot/CLHSDB.java	Mon Sep 19 13:17:12 2011 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2011, Oracle and/or its affiliates. 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
@@ -170,6 +170,7 @@
             final String errMsg = formatMessage(e.getMessage(), 80);
             System.err.println("Unable to connect to process ID " + pid + ":\n\n" + errMsg);
             agent.detach();
+            e.printStackTrace();
             return;
         }
     }
@@ -191,6 +192,7 @@
             final String errMsg = formatMessage(e.getMessage(), 80);
             System.err.println("Unable to open core file\n" + corePath + ":\n\n" + errMsg);
             agent.detach();
+            e.printStackTrace();
             return;
         }
     }
@@ -209,6 +211,7 @@
             final String errMsg = formatMessage(e.getMessage(), 80);
             System.err.println("Unable to connect to machine \"" + remoteMachineName + "\":\n\n" + errMsg);
             agent.detach();
+            e.printStackTrace();
             return;
         }
     }
--- a/agent/src/share/classes/sun/jvm/hotspot/CommandProcessor.java	Wed Sep 14 13:23:54 2011 -0700
+++ b/agent/src/share/classes/sun/jvm/hotspot/CommandProcessor.java	Mon Sep 19 13:17:12 2011 -0700
@@ -40,6 +40,8 @@
 import sun.jvm.hotspot.interpreter.*;
 import sun.jvm.hotspot.memory.*;
 import sun.jvm.hotspot.oops.*;
+import sun.jvm.hotspot.opto.*;
+import sun.jvm.hotspot.ci.*;
 import sun.jvm.hotspot.runtime.*;
 import sun.jvm.hotspot.utilities.*;
 import sun.jvm.hotspot.utilities.soql.*;
@@ -48,6 +50,8 @@
 import sun.jvm.hotspot.tools.*;
 import sun.jvm.hotspot.tools.ObjectHistogram;
 import sun.jvm.hotspot.tools.StackTrace;
+import sun.jvm.hotspot.tools.jcore.ClassDump;
+import sun.jvm.hotspot.tools.jcore.ClassFilter;
 
 public class CommandProcessor {
     public abstract static class DebuggerInterface {
@@ -59,6 +63,27 @@
         public abstract void reattach();
     }
 
+    public static class BootFilter implements ClassFilter {
+        public boolean canInclude(InstanceKlass kls) {
+            return kls.getClassLoader() == null;
+        }
+    }
+
+    public static class NonBootFilter implements ClassFilter {
+        private HashMap emitted = new HashMap();
+        public boolean canInclude(InstanceKlass kls) {
+            if (kls.getClassLoader() == null) return false;
+            if (emitted.get(kls.getName()) != null) {
+                // Since multiple class loaders are being shoved
+                // together duplicate classes are a possibilty.  For
+                // now just ignore them.
+                return false;
+            }
+            emitted.put(kls.getName(), kls);
+            return true;
+        }
+    }
+
     static class Tokens {
         final String input;
         int i;
@@ -258,9 +283,14 @@
     }
 
     void dumpFields(Type type) {
+        dumpFields(type, true);
+    }
+
+    void dumpFields(Type type, boolean allowStatic) {
         Iterator i = type.getFields();
         while (i.hasNext()) {
             Field f = (Field) i.next();
+            if (!allowStatic && f.isStatic()) continue;
             out.print("field ");
             quote(type.getName());
             out.print(" ");
@@ -458,13 +488,18 @@
                     });
             }
         },
-        new Command("flags", "flags [ flag ]", false) {
+        new Command("flags", "flags [ flag | -nd ]", false) {
             public void doit(Tokens t) {
                 int tokens = t.countTokens();
                 if (tokens != 0 && tokens != 1) {
                     usage();
                 } else {
                     String name = tokens > 0 ? t.nextToken() : null;
+                    boolean nonDefault = false;
+                    if (name != null && name.equals("-nd")) {
+                        name = null;
+                        nonDefault = true;
+                    }
 
                     VM.Flag[] flags = VM.getVM().getCommandLineFlags();
                     if (flags == null) {
@@ -474,7 +509,12 @@
                         for (int f = 0; f < flags.length; f++) {
                             VM.Flag flag = flags[f];
                             if (name == null || flag.getName().equals(name)) {
-                                out.println(flag.getName() + " = " + flag.getValue());
+
+                                if (nonDefault && flag.getOrigin() == 0) {
+                                    // only print flags which aren't their defaults
+                                    continue;
+                                }
+                                out.println(flag.getName() + " = " + flag.getValue() + " " + flag.getOrigin());
                                 printed = true;
                             }
                         }
@@ -586,6 +626,158 @@
                 }
             }
         },
+        new Command("printmdo", "printmdo [ -a | expression ]", false) {
+            // Print every MDO in the heap or the one referenced by expression.
+            public void doit(Tokens t) {
+                if (t.countTokens() != 1) {
+                    usage();
+                } else {
+                    String s = t.nextToken();
+                    if (s.equals("-a")) {
+                        HeapVisitor iterator = new DefaultHeapVisitor() {
+                                public boolean doObj(Oop obj) {
+                                    if (obj instanceof MethodData) {
+                                        Method m = ((MethodData)obj).getMethod();
+                                        out.println("MethodData " + obj.getHandle() + " for " +
+                                                    "method " + m.getMethodHolder().getName().asString() + "." +
+                                                    m.getName().asString() +
+                                                    m.getSignature().asString() + "@" + m.getHandle());
+                                        ((MethodData)obj).printDataOn(out);
+                                    }
+                                    return false;
+                                }
+                            };
+                        VM.getVM().getObjectHeap().iteratePerm(iterator);
+                    } else {
+                        Address a = VM.getVM().getDebugger().parseAddress(s);
+                        OopHandle handle = a.addOffsetToAsOopHandle(0);
+                        MethodData mdo = (MethodData)VM.getVM().getObjectHeap().newOop(handle);
+                        mdo.printDataOn(out);
+                    }
+                }
+            }
+        },
+        new Command("dumpideal", "dumpideal { -a | id }", false) {
+            // Do a full dump of the nodes reachabile from root in each compiler thread.
+            public void doit(Tokens t) {
+                if (t.countTokens() != 1) {
+                    usage();
+                } else {
+                    String name = t.nextToken();
+                    boolean all = name.equals("-a");
+                    Threads threads = VM.getVM().getThreads();
+                    for (JavaThread thread = threads.first(); thread != null; thread = thread.next()) {
+                        ByteArrayOutputStream bos = new ByteArrayOutputStream();
+                        thread.printThreadIDOn(new PrintStream(bos));
+                        if (all || bos.toString().equals(name)) {
+                          if (thread instanceof CompilerThread) {
+                            CompilerThread ct = (CompilerThread)thread;
+                            out.println(ct);
+                            ciEnv env = ct.env();
+                            if (env != null) {
+                              Compile c = env.compilerData();
+                              c.root().dump(9999, out);
+                            } else {
+                              out.println("  not compiling");
+                            }
+                          }
+                        }
+                    }
+                }
+            }
+        },
+        new Command("dumpcfg", "dumpcfg { -a | id }", false) {
+            // Dump the PhaseCFG for every compiler thread that has one live.
+            public void doit(Tokens t) {
+                if (t.countTokens() != 1) {
+                    usage();
+                } else {
+                    String name = t.nextToken();
+                    boolean all = name.equals("-a");
+                    Threads threads = VM.getVM().getThreads();
+                    for (JavaThread thread = threads.first(); thread != null; thread = thread.next()) {
+                        ByteArrayOutputStream bos = new ByteArrayOutputStream();
+                        thread.printThreadIDOn(new PrintStream(bos));
+                        if (all || bos.toString().equals(name)) {
+                          if (thread instanceof CompilerThread) {
+                            CompilerThread ct = (CompilerThread)thread;
+                            out.println(ct);
+                            ciEnv env = ct.env();
+                            if (env != null) {
+                              Compile c = env.compilerData();
+                              c.cfg().dump(out);
+                            }
+                          }
+                        }
+                    }
+                }
+            }
+        },
+        new Command("dumpilt", "dumpilt { -a | id }", false) {
+            // dumps the InlineTree of a C2 compile
+            public void doit(Tokens t) {
+                if (t.countTokens() != 1) {
+                    usage();
+                } else {
+                    String name = t.nextToken();
+                    boolean all = name.equals("-a");
+                    Threads threads = VM.getVM().getThreads();
+                    for (JavaThread thread = threads.first(); thread != null; thread = thread.next()) {
+                        ByteArrayOutputStream bos = new ByteArrayOutputStream();
+                        thread.printThreadIDOn(new PrintStream(bos));
+                        if (all || bos.toString().equals(name)) {
+                            if (thread instanceof CompilerThread) {
+                                CompilerThread ct = (CompilerThread)thread;
+                                ciEnv env = ct.env();
+                                if (env != null) {
+                                    Compile c = env.compilerData();
+                                    InlineTree ilt = c.ilt();
+                                    if (ilt != null) {
+                                        ilt.print(out);
+                                    }
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        },
+        new Command("vmstructsdump", "vmstructsdump", false) {
+            public void doit(Tokens t) {
+                if (t.countTokens() != 0) {
+                    usage();
+                    return;
+                }
+
+                // Dump a copy of the type database in a form that can
+                // be read back.
+                Iterator i = agent.getTypeDataBase().getTypes();
+                // Make sure the types are emitted in an order than can be read back in
+                HashSet emitted = new HashSet();
+                Stack pending = new Stack();
+                while (i.hasNext()) {
+                    Type n = (Type)i.next();
+                    if (emitted.contains(n.getName())) {
+                        continue;
+                    }
+
+                    while (n != null && !emitted.contains(n.getName())) {
+                        pending.push(n);
+                        n = n.getSuperclass();
+                    }
+                    while (!pending.empty()) {
+                        n = (Type)pending.pop();
+                        dumpType(n);
+                        emitted.add(n.getName());
+                    }
+                }
+                i = agent.getTypeDataBase().getTypes();
+                while (i.hasNext()) {
+                    dumpFields((Type)i.next(), false);
+                }
+            }
+        },
+
         new Command("inspect", "inspect expression", false) {
             public void doit(Tokens t) {
                 if (t.countTokens() != 1) {
@@ -760,6 +952,50 @@
                 }
             }
         },
+        new Command("intConstant", "intConstant [ name [ value ] ]", true) {
+            public void doit(Tokens t) {
+                if (t.countTokens() != 1 && t.countTokens() != 0 && t.countTokens() != 2) {
+                    usage();
+                    return;
+                }
+                HotSpotTypeDataBase db = (HotSpotTypeDataBase)agent.getTypeDataBase();
+                if (t.countTokens() == 1) {
+                    out.println("intConstant " + name + " " + db.lookupIntConstant(name));
+                } else if (t.countTokens() == 0) {
+                    Iterator i = db.getIntConstants();
+                    while (i.hasNext()) {
+                        String name = (String)i.next();
+                        out.println("intConstant " + name + " " + db.lookupIntConstant(name));
+                    }
+                } else if (t.countTokens() == 2) {
+                    String name = t.nextToken();
+                    Integer value = Integer.valueOf(t.nextToken());
+                    db.addIntConstant(name, value);
+                }
+            }
+        },
+        new Command("longConstant", "longConstant [ name [ value ] ]", true) {
+            public void doit(Tokens t) {
+                if (t.countTokens() != 1 && t.countTokens() != 0 && t.countTokens() != 2) {
+                    usage();
+                    return;
+                }
+                HotSpotTypeDataBase db = (HotSpotTypeDataBase)agent.getTypeDataBase();
+                if (t.countTokens() == 1) {
+                    out.println("longConstant " + name + " " + db.lookupLongConstant(name));
+                } else if (t.countTokens() == 0) {
+                    Iterator i = db.getLongConstants();
+                    while (i.hasNext()) {
+                        String name = (String)i.next();
+                        out.println("longConstant " + name + " " + db.lookupLongConstant(name));
+                    }
+                } else if (t.countTokens() == 2) {
+                    String name = t.nextToken();
+                    Long value = Long.valueOf(t.nextToken());
+                    db.addLongConstant(name, value);
+                }
+            }
+        },
         new Command("field", "field [ type [ name fieldtype isStatic offset address ] ]", true) {
             public void doit(Tokens t) {
                 if (t.countTokens() != 1 && t.countTokens() != 0 && t.countTokens() != 6) {
@@ -1311,13 +1547,13 @@
                 return;
             }
 
-            executeCommand(ln);
+            executeCommand(ln, prompt);
         }
     }
 
     static Pattern historyPattern = Pattern.compile("((!\\*)|(!\\$)|(!!-?)|(!-?[0-9][0-9]*)|(![a-zA-Z][^ ]*))");
 
-    public void executeCommand(String ln) {
+    public void executeCommand(String ln, boolean putInHistory) {
         if (ln.indexOf('!') != -1) {
             int size = history.size();
             if (size == 0) {
@@ -1406,7 +1642,7 @@
         Tokens t = new Tokens(ln);
         if (t.hasMoreTokens()) {
             boolean error = false;
-            history.add(ln);
+            if (putInHistory) history.add(ln);
             int len = t.countTokens();
             if (len > 2) {
                 String r = t.at(len - 2);
--- a/agent/src/share/classes/sun/jvm/hotspot/DebugServer.java	Wed Sep 14 13:23:54 2011 -0700
+++ b/agent/src/share/classes/sun/jvm/hotspot/DebugServer.java	Mon Sep 19 13:17:12 2011 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000, 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2011, Oracle and/or its affiliates. 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
@@ -25,7 +25,6 @@
 package sun.jvm.hotspot;
 
 import sun.jvm.hotspot.debugger.*;
-import sun.jvm.hotspot.debugger.dbx.*;
 import sun.jvm.hotspot.runtime.*;
 import sun.jvm.hotspot.oops.*;
 
--- a/agent/src/share/classes/sun/jvm/hotspot/HSDB.java	Wed Sep 14 13:23:54 2011 -0700
+++ b/agent/src/share/classes/sun/jvm/hotspot/HSDB.java	Mon Sep 19 13:17:12 2011 -0700
@@ -1740,7 +1740,7 @@
       else if (f.isCompiledFrame())    { tty.print("compiled"); }
       else if (f.isEntryFrame())       { tty.print("entry"); }
       else if (f.isNativeFrame())      { tty.print("native"); }
-      else if (f.isGlueFrame())        { tty.print("glue"); }
+      else if (f.isRuntimeFrame())     { tty.print("runtime"); }
       else { tty.print("external"); }
       tty.print(" frame with PC = " + f.getPC() + ", SP = " + f.getSP() + ", FP = " + f.getFP());
       if (f.isSignalHandlerFrameDbg()) {
--- a/agent/src/share/classes/sun/jvm/hotspot/HotSpotAgent.java	Wed Sep 14 13:23:54 2011 -0700
+++ b/agent/src/share/classes/sun/jvm/hotspot/HotSpotAgent.java	Mon Sep 19 13:17:12 2011 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000, 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2011, Oracle and/or its affiliates. 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
@@ -28,10 +28,8 @@
 import java.net.*;
 import java.rmi.*;
 import sun.jvm.hotspot.debugger.*;
-import sun.jvm.hotspot.debugger.dbx.*;
 import sun.jvm.hotspot.debugger.proc.*;
 import sun.jvm.hotspot.debugger.remote.*;
-import sun.jvm.hotspot.debugger.win32.*;
 import sun.jvm.hotspot.debugger.windbg.*;
 import sun.jvm.hotspot.debugger.linux.*;
 import sun.jvm.hotspot.memory.*;
@@ -436,113 +434,35 @@
 
     private void setupDebuggerSolaris() {
         setupJVMLibNamesSolaris();
-        if(System.getProperty("sun.jvm.hotspot.debugger.useProcDebugger") != null) {
-            ProcDebuggerLocal dbg = new ProcDebuggerLocal(null, true);
-            debugger = dbg;
-            attachDebugger();
+        ProcDebuggerLocal dbg = new ProcDebuggerLocal(null, true);
+        debugger = dbg;
+        attachDebugger();
 
-            // Set up CPU-dependent stuff
-            if (cpu.equals("x86")) {
-                machDesc = new MachineDescriptionIntelX86();
-            } else if (cpu.equals("sparc")) {
-                int addressSize = dbg.getRemoteProcessAddressSize();
-                if (addressSize == -1) {
-                    throw new DebuggerException("Error occurred while trying to determine the remote process's " +
-                    "address size");
-                }
-
-                if (addressSize == 32) {
-                    machDesc = new MachineDescriptionSPARC32Bit();
-                } else if (addressSize == 64) {
-                    machDesc = new MachineDescriptionSPARC64Bit();
-                } else {
-                    throw new DebuggerException("Address size " + addressSize + " is not supported on SPARC");
-                }
-            } else if (cpu.equals("amd64")) {
-                machDesc = new MachineDescriptionAMD64();
-            } else {
-                throw new DebuggerException("Solaris only supported on sparc/sparcv9/x86/amd64");
+        // Set up CPU-dependent stuff
+        if (cpu.equals("x86")) {
+            machDesc = new MachineDescriptionIntelX86();
+        } else if (cpu.equals("sparc")) {
+            int addressSize = dbg.getRemoteProcessAddressSize();
+            if (addressSize == -1) {
+                throw new DebuggerException("Error occurred while trying to determine the remote process's " +
+                                            "address size");
             }
 
-            dbg.setMachineDescription(machDesc);
-            return;
+            if (addressSize == 32) {
+                machDesc = new MachineDescriptionSPARC32Bit();
+            } else if (addressSize == 64) {
+                machDesc = new MachineDescriptionSPARC64Bit();
+            } else {