You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by od...@apache.org on 2009/07/16 17:57:41 UTC
svn commit: r794726 [8/15] - in
/harmony/enhanced/jdktools/branches/java6/modules/jpda: ./
src/main/native/include/ src/main/native/jdwp/common/agent/commands/
src/main/native/jdwp/common/agent/core/
src/main/native/jdwp/common/generic/ src/main/native...
Modified: harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/agent/core/EventDispatcher.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/agent/core/EventDispatcher.cpp?rev=794726&r1=794725&r2=794726&view=diff
==============================================================================
--- harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/agent/core/EventDispatcher.cpp (original)
+++ harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/agent/core/EventDispatcher.cpp Thu Jul 16 15:57:37 2009
@@ -15,22 +15,16 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-
-/**
- * @author Pavel N. Vyssotski
- * @version $Revision: 1.24 $
- */
-// EventDispatcher.cpp
-
#include "EventDispatcher.h"
#include "ThreadManager.h"
#include "OptionParser.h"
#include "PacketDispatcher.h"
+#include "ExceptionManager.h"
#include "Log.h"
using namespace jdwp;
-EventDispatcher::EventDispatcher(size_t limit) throw() {
+EventDispatcher::EventDispatcher(size_t limit) {
JDWP_ASSERT(limit > 0);
m_idCount = 0;
m_queueMonitor = 0;
@@ -45,67 +39,65 @@
}
void EventDispatcher::Run(JNIEnv* jni) {
- JDWP_TRACE_ENTRY("Run(" << jni << ')');
+ JDWP_TRACE_ENTRY(LOG_RELEASE, (LOG_FUNC_FL, "Run(%p)", jni));
- try {
- MonitorAutoLock malCM(m_completeMonitor JDWP_FILE_LINE);
-
- try {
- while (!m_stopFlag) {
- EventComposer *ec;
-
- // get next event from queue
- {
- MonitorAutoLock lock(m_queueMonitor JDWP_FILE_LINE);
-
- while (m_holdFlag || m_eventQueue.empty()) {
- m_queueMonitor->Wait();
- if (m_stopFlag) break; // break event waiting loop
- }
-
- if (m_stopFlag) break; // break events handling loop
-
- ec = m_eventQueue.front();
- m_eventQueue.pop();
- m_queueMonitor->NotifyAll();
- }
-
- // send event and suspend thread according to suspend policy
- SuspendOnEvent(jni, ec);
+ MonitorAutoLock malCM(m_completeMonitor JDWP_FILE_LINE);
+ /*if (GetExceptionManager().GetLastException() != NULL) {
+ AgentException aex = GetExceptionManager().GetLastException();
+ JDWP_TRACE(LOG_RELEASE, (LOG_ERROR_FL, "Exception in EventDispatcher synchronization: %s", aex.GetExceptionMessage(jni)));
+ return;
+ }*/
+
+ while (!m_stopFlag) {
+ EventComposer *ec;
+
+ // get next event from queue
+ {
+ MonitorAutoLock lock(m_queueMonitor JDWP_FILE_LINE);
+
+ while (m_holdFlag || m_eventQueue.empty()) {
+ m_queueMonitor->Wait();
+ if (m_stopFlag) break; // break event waiting loop
}
+ if (m_stopFlag) break; // break events handling loop
+
+ ec = m_eventQueue.front();
+ m_eventQueue.pop();
+ m_queueMonitor->NotifyAll();
}
- catch (const AgentException& e)
- {
- JDWP_ERROR("Exception in EventDispatcher thread: "
- << e.what() << " [" << e.ErrCode() << "]");
-
+
+ // send event and suspend thread according to suspend policy
+ int ret = SuspendOnEvent(jni, ec);
+ if (ret != JDWP_ERROR_NONE) {
+ AgentException aex = GetExceptionManager().GetLastException();
+ JDWP_TRACE(LOG_RELEASE, (LOG_ERROR_FL, "Exception in EventDispatcher thread: %s", aex.GetExceptionMessage(jni)));
+
// reset current session
- JDWP_TRACE_PROG("Run: reset session after exception");
- GetPacketDispatcher().ResetAll(jni);
+ JDWP_TRACE(LOG_RELEASE, (LOG_PROG_FL, "Run: reset session after exception"));
+ int ret = GetPacketDispatcher().ResetAll(jni);
+ if (ret != JDWP_ERROR_NONE) {
+ AgentException aex = GetExceptionManager().GetLastException();
+ JDWP_TRACE(LOG_RELEASE, (LOG_ERROR_FL, "Exception in PacketDispatcher::ResetAll(): %s", aex.GetExceptionMessage(jni)));
+ }
+ break;
}
+ }
// release completion monitor and wait forever until VM kills this thread
// TODO: remove this workaround to prevent from resource leak
// This is the old completion mechanism fixed in HARMONY-5019
// m_completeMonitor->Wait(0);
- }
- catch (const AgentException& e)
- {
- // just report an error, cannot do anything else
- JDWP_ERROR("Exception in EventDispatcher synchronization: "
- << e.what() << " [" << e.ErrCode() << "]");
- }
}
void JNICALL
EventDispatcher::StartFunction(jvmtiEnv* jvmti, JNIEnv* jni, void* arg) {
- JDWP_TRACE_ENTRY("StartFunction(" << jvmti << ',' << jni << ',' << arg << ')');
+ JDWP_TRACE_ENTRY(LOG_RELEASE, (LOG_FUNC_FL, "StartFunction(%p,%p,%p)", jvmti, jni, arg));
(reinterpret_cast<EventDispatcher*>(arg))->Run(jni);
}
-void EventDispatcher::Init(JNIEnv *jni) throw(AgentException) {
- JDWP_TRACE_ENTRY("Init(" << jni << ')');
+void EventDispatcher::Init(JNIEnv *jni) {
+ JDWP_TRACE_ENTRY(LOG_RELEASE, (LOG_FUNC_FL, "Init(%p)", jni));
m_queueMonitor = new AgentMonitor("_jdwp_EventDispatcher_queueMonitor");
m_waitMonitor = new AgentMonitor("_jdwp_EventDispatcher_waitMonitor");
@@ -115,15 +107,20 @@
m_holdFlag = true;
}
-void EventDispatcher::Start(JNIEnv *jni) throw(AgentException) {
- JDWP_TRACE_ENTRY("Start(" << jni << ')');
+int EventDispatcher::Start(JNIEnv *jni) {
+ JDWP_TRACE_ENTRY(LOG_RELEASE, (LOG_FUNC_FL, "Start(%p)", jni));
- m_threadObject = jni->NewGlobalRef(GetThreadManager().RunAgentThread(jni, StartFunction, this,
- JVMTI_THREAD_MAX_PRIORITY, "_jdwp_EventDispatcher"));
+ jthread thread = GetThreadManager().RunAgentThread(jni, StartFunction, this,
+ JVMTI_THREAD_MAX_PRIORITY, "_jdwp_EventDispatcher");
+ if (thread == 0) {
+ return JDWP_ERROR_INTERNAL;
+ }
+ m_threadObject = jni->NewGlobalRef(thread);
+ return JDWP_ERROR_NONE;
}
-void EventDispatcher::Reset(JNIEnv *jni) throw(AgentException) {
- JDWP_TRACE_ENTRY("Reset(" << jni << ')');
+void EventDispatcher::Reset(JNIEnv *jni) {
+ JDWP_TRACE_ENTRY(LOG_RELEASE, (LOG_FUNC_FL, "Reset(%p)", jni));
m_resetFlag = true;
@@ -134,7 +131,7 @@
while(!m_eventQueue.empty()) {
EventComposer *ec = m_eventQueue.front();
m_eventQueue.pop();
- JDWP_TRACE_EVENT("Reset -- delete event set: packet=" << ec);
+ JDWP_TRACE(LOG_RELEASE, (LOG_EVENT_FL, "Reset -- delete event set: packet=%p", ec));
ec->Reset(jni);
delete ec;
}
@@ -155,8 +152,8 @@
}
}
-void EventDispatcher::Stop(JNIEnv *jni) throw(AgentException) {
- JDWP_TRACE_ENTRY("Stop(" << jni << ')');
+void EventDispatcher::Stop(JNIEnv *jni) {
+ JDWP_TRACE_ENTRY(LOG_RELEASE, (LOG_FUNC_FL, "Stop(%p)", jni));
// let thread loop to finish
{
@@ -177,8 +174,8 @@
m_threadObject = NULL;
}
-void EventDispatcher::Clean(JNIEnv *jni) throw(AgentException) {
- JDWP_TRACE_ENTRY("Clean(" << jni << ')');
+void EventDispatcher::Clean(JNIEnv *jni) {
+ JDWP_TRACE_ENTRY(LOG_RELEASE, (LOG_FUNC_FL, "Clean(%p)", jni));
// The following code is just a workaround for known problem
// in reset and clean-up procedure to release threads which
@@ -199,8 +196,9 @@
}
// delete monitors
-
- if (m_queueMonitor != 0) {
+
+ /* Commented out as a workaround for shutdown crash - TODO apply correct behaviour to free these locks */
+ /*if (m_queueMonitor != 0) {
delete m_queueMonitor;
m_queueMonitor = 0;
}
@@ -211,7 +209,7 @@
if (m_invokeMonitor != 0){
delete m_invokeMonitor;
m_invokeMonitor = 0;
- }
+ }*/
// do not delete m_completeMonitor because thread is waiting on it
// TODO: remove this workaround to prevent from resource leak
@@ -226,84 +224,86 @@
m_idCount = 0;
}
-void EventDispatcher::HoldEvents() throw(AgentException) {
- JDWP_TRACE_ENTRY("HoldEvents()");
+void EventDispatcher::HoldEvents() {
+ JDWP_TRACE_ENTRY(LOG_RELEASE, (LOG_FUNC_FL, "HoldEvents()"));
MonitorAutoLock lock(m_queueMonitor JDWP_FILE_LINE);
m_holdFlag = true;
}
-void EventDispatcher::ReleaseEvents() throw(AgentException) {
- JDWP_TRACE_ENTRY("ReleaseEvents()");
+void EventDispatcher::ReleaseEvents() {
+ JDWP_TRACE_ENTRY(LOG_RELEASE, (LOG_FUNC_FL, "ReleaseEvents()"));
MonitorAutoLock lock(m_queueMonitor JDWP_FILE_LINE);
m_holdFlag = false;
m_queueMonitor->NotifyAll();
}
-void EventDispatcher::NewSession() throw(AgentException) {
- JDWP_TRACE_ENTRY("NewSession()");
+void EventDispatcher::NewSession() {
+ JDWP_TRACE_ENTRY(LOG_RELEASE, (LOG_FUNC_FL, "NewSession()"));
m_resetFlag = false;
m_holdFlag = true;
}
-void EventDispatcher::PostInvokeSuspend(JNIEnv *jni, SpecialAsyncCommandHandler* handler)
- throw(AgentException)
+int EventDispatcher::PostInvokeSuspend(JNIEnv *jni, SpecialAsyncCommandHandler* handler)
+
{
- JDWP_TRACE_ENTRY("PostInvokeSuspend(" << jni << ',' << handler << ')');
+ JDWP_TRACE_ENTRY(LOG_RELEASE, (LOG_FUNC_FL, "PostInvokeSuspend(%p,%p)", jni, handler));
MonitorAutoLock lock(m_invokeMonitor JDWP_FILE_LINE);
jthread thread = handler->GetThread();
+ int ret;
char* threadName = 0;
#ifndef NDEBUG
if (JDWP_TRACE_ENABLED(LOG_KIND_EVENT)) {
jvmtiError err;
jvmtiThreadInfo threadInfo;
- JVMTI_TRACE(err, GetJvmtiEnv()->GetThreadInfo(thread, &threadInfo));
+ JVMTI_TRACE(LOG_DEBUG, err, GetJvmtiEnv()->GetThreadInfo(thread, &threadInfo));
threadName = threadInfo.name;
}
#endif // NDEBUG
JvmtiAutoFree af(threadName);
// wait for thread to complete method invocation and ready for suspension
- JDWP_TRACE_EVENT("PostInvokeSuspend -- wait for method invoked: thread=" << thread
- << ", name=" << JDWP_CHECK_NULL(threadName));
+ JDWP_TRACE(LOG_RELEASE, (LOG_EVENT_FL, "PostInvokeSuspend -- wait for method invoked: thread=%p, name=%s", thread, JDWP_CHECK_NULL(threadName)));
while (!handler->IsInvoked()) {
m_invokeMonitor->Wait();
if (m_resetFlag) {
- return;
+ return JDWP_ERROR_NONE;
}
}
// suspend single thread or all threads accodring to invocation options
if ((handler->GetOptions() & JDWP_INVOKE_SINGLE_THREADED) == 0) {
- JDWP_TRACE_EVENT("PostInvokeSuspend -- suspend all after method invoke: thread=" << thread
- << ", name=" << JDWP_CHECK_NULL(threadName));
- GetThreadManager().SuspendAll(jni, handler->GetThread());
+ JDWP_TRACE(LOG_RELEASE, (LOG_EVENT_FL, "PostInvokeSuspend -- suspend all after method invoke: thread=%p, name=%s", thread, JDWP_CHECK_NULL(threadName)));
+ ret = GetThreadManager().SuspendAll(jni, handler->GetThread());
+ JDWP_CHECK_RETURN(ret);
} else {
- JDWP_TRACE_EVENT("PostInvokeSuspend -- suspend after method invoke: thread=" << thread
- << ", name=" << JDWP_CHECK_NULL(threadName));
- GetThreadManager().Suspend(jni, handler->GetThread(), true);
+ JDWP_TRACE(LOG_RELEASE, (LOG_EVENT_FL, "PostInvokeSuspend -- suspend after method invoke: thread=%p, name=%s", thread, JDWP_CHECK_NULL(threadName)));
+ ret = GetThreadManager().Suspend(jni, handler->GetThread(), true);
+ JDWP_CHECK_RETURN(ret);
}
// release thread after suspension
- JDWP_TRACE_EVENT("SuspendOnEvent -- release after method invoke: thread=" << thread
- << ", name=" << JDWP_CHECK_NULL(threadName));
+ JDWP_TRACE(LOG_RELEASE, (LOG_EVENT_FL, "SuspendOnEvent -- release after method invoke: thread=%p, name=%s", thread, JDWP_CHECK_NULL(threadName)));
handler->SetReleased(true);
m_invokeMonitor->NotifyAll();
+
+ return JDWP_ERROR_NONE;
}
-void EventDispatcher::SuspendOnEvent(JNIEnv* jni, EventComposer *ec)
- throw(AgentException)
+int EventDispatcher::SuspendOnEvent(JNIEnv* jni, EventComposer *ec)
+
{
- JDWP_TRACE_EVENT("SuspendOnEvent -- send event set: id=" << ec->event.GetId()
- << ", policy=" << ec->GetSuspendPolicy());
+ JDWP_TRACE(LOG_RELEASE, (LOG_EVENT_FL, "SuspendOnEvent -- send event set: id=%d, policy=%d", ec->event.GetId(), ec->GetSuspendPolicy()));
+ int ret = 0;
if (ec->GetSuspendPolicy() == JDWP_SUSPEND_NONE && !ec->IsAutoDeathEvent()) {
// thread is not waiting for suspension
- ec->WriteEvent(jni);
- JDWP_TRACE_EVENT("SuspendOnEvent -- delete event set: packet=" << ec);
+ ret = ec->WriteEvent(jni);
+ JDWP_CHECK_RETURN(ret);
+ JDWP_TRACE(LOG_RELEASE, (LOG_EVENT_FL, "SuspendOnEvent -- delete event set: packet=%p", ec));
ec->Reset(jni);
delete ec;
} else {
@@ -315,49 +315,51 @@
if (JDWP_TRACE_ENABLED(LOG_KIND_EVENT)) {
jvmtiError err;
jvmtiThreadInfo threadInfo;
- JVMTI_TRACE(err, GetJvmtiEnv()->GetThreadInfo(thread, &threadInfo));
+ JVMTI_TRACE(LOG_DEBUG, err, GetJvmtiEnv()->GetThreadInfo(thread, &threadInfo));
threadName = threadInfo.name;
}
#endif // NDEBUG
JvmtiAutoFree af(threadName);
// wait for thread to reach suspension point
- JDWP_TRACE_EVENT("SuspendOnEvent -- wait for thread on event: thread=" << thread
- << ", name=" << JDWP_CHECK_NULL(threadName));
+ JDWP_TRACE(LOG_RELEASE, (LOG_EVENT_FL, "SuspendOnEvent -- wait for thread on event: thread=%p, name=%s", thread, JDWP_CHECK_NULL(threadName)));
+
while (!ec->IsWaiting()) {
m_waitMonitor->Wait();
if (m_resetFlag) {
- return;
+ return JDWP_ERROR_NONE;
}
}
// suspend corresponding threads if necessary
if (ec->GetSuspendPolicy() == JDWP_SUSPEND_ALL) {
- JDWP_TRACE_EVENT("SuspendOnEvent -- suspend all threads on event: thread=" << thread
- << ", name=" << JDWP_CHECK_NULL(threadName));
- GetThreadManager().SuspendAll(jni, thread);
+ JDWP_TRACE(LOG_RELEASE, (LOG_EVENT_FL, "SuspendOnEvent -- suspend all threads on event: thread=%p, name=%s", thread, JDWP_CHECK_NULL(threadName)));
+ ret = GetThreadManager().SuspendAll(jni, thread);
+ JDWP_CHECK_RETURN(ret);
} else if (ec->GetSuspendPolicy() == JDWP_SUSPEND_EVENT_THREAD) {
- JDWP_TRACE_EVENT("SuspendOnEvent -- suspend thread on event: thread=" << thread
- << ", name=" << JDWP_CHECK_NULL(threadName));
+ JDWP_TRACE(LOG_RELEASE, (LOG_EVENT_FL, "SuspendOnEvent -- suspend thread on event: thread=%p, name=%s", thread, JDWP_CHECK_NULL(threadName)));
JDWP_ASSERT(thread != 0);
- GetThreadManager().Suspend(jni, thread, true);
+ ret = GetThreadManager().Suspend(jni, thread, true);
+ JDWP_CHECK_RETURN(ret);
}
// send event packet
- ec->WriteEvent(jni);
+ ret = ec->WriteEvent(jni);
+ JDWP_CHECK_RETURN(ret);
// release thread on suspension point
- JDWP_TRACE_EVENT("SuspendOnEvent -- release thread on event: thread=" << thread
- << ", name=" << JDWP_CHECK_NULL(threadName));
+ JDWP_TRACE(LOG_RELEASE, (LOG_EVENT_FL, "SuspendOnEvent -- release thread on event: thread=%p, name=%s", thread, JDWP_CHECK_NULL(threadName)));
ec->SetReleased(true);
m_waitMonitor->NotifyAll();
}
+
+ return JDWP_ERROR_NONE;
}
void EventDispatcher::PostEventSet(JNIEnv *jni, EventComposer *ec, jdwpEventKind eventKind)
- throw(AgentException)
+
{
- JDWP_TRACE_ENTRY("PostEventSet(" << jni << ',' << ec << ',' << eventKind << ')');
+ JDWP_TRACE_ENTRY(LOG_RELEASE, (LOG_FUNC_FL, "PostEventSet(%p,%p,%d)", jni, ec, eventKind));
if (m_stopFlag) {
return;
@@ -369,11 +371,10 @@
// put event packet into queue
{
MonitorAutoLock lock(m_queueMonitor JDWP_FILE_LINE);
- while (m_eventQueue.size() > m_queueLimit) {
+ while (m_eventQueue.size() > (jint)m_queueLimit) {
m_queueMonitor->Wait();
if (m_resetFlag) {
- JDWP_TRACE_EVENT("PostEventSet -- delete event set: packet=" << ec
- << ", eventKind=" << eventKind);
+ JDWP_TRACE(LOG_RELEASE, (LOG_EVENT_FL, "PostEventSet -- delete event set: packet=%p, evenKind=%d", ec, eventKind));
ec->Reset(jni);
delete ec;
return;
@@ -393,7 +394,7 @@
if (JDWP_TRACE_ENABLED(LOG_KIND_EVENT)) {
jvmtiError err;
jvmtiThreadInfo threadInfo;
- JVMTI_TRACE(err, GetJvmtiEnv()->GetThreadInfo(thread, &threadInfo));
+ JVMTI_TRACE(LOG_DEBUG, err, GetJvmtiEnv()->GetThreadInfo(thread, &threadInfo));
threadName = threadInfo.name;
}
#endif // NDEBUG
@@ -402,8 +403,7 @@
// wait on suspension point
{
MonitorAutoLock lock(m_waitMonitor JDWP_FILE_LINE);
- JDWP_TRACE_EVENT("PostEventSet -- wait for release on event: thread=" << thread
- << ", name=" << JDWP_CHECK_NULL(threadName) << ", eventKind=" << eventKind);
+ JDWP_TRACE(LOG_RELEASE, (LOG_EVENT_FL, "PostEventSet -- wait for release on event: thread=%p, name=%s, eventKind=%d", thread, JDWP_CHECK_NULL(threadName), eventKind));
// notify that thread is waiting on suspension point
ec->SetWaiting(true);
@@ -412,28 +412,36 @@
// wait for thread to be released after suspension
while (!ec->IsReleased()) {
m_waitMonitor->Wait();
- if (m_resetFlag) {
+ if (m_resetFlag || m_stopFlag) {
return;
}
}
- JDWP_TRACE_EVENT("PostEventSet -- released on event: thread=" << thread
- << ", name=" << JDWP_CHECK_NULL(threadName) << ", eventKind=" << eventKind);
+ JDWP_TRACE(LOG_RELEASE, (LOG_EVENT_FL, "PostEventSet -- released on event: thread=%p, name=%s, eventKind=%d", thread, JDWP_CHECK_NULL(threadName), eventKind));
}
-
+
+ if (GetThreadManager().IsSuspended(thread)) {
+ jvmtiError error;
+ JVMTI_TRACE(LOG_DEBUG, error, GetJvmtiEnv()->ResumeThread(thread));
+ if (error == JVMTI_ERROR_NONE) {
+ JVMTI_TRACE(LOG_DEBUG, error, GetJvmtiEnv()->SuspendThread(thread));
+ }
+ JDWP_TRACE(LOG_RELEASE, (LOG_EVENT_FL, "PostEventSet -- Running suspended thread: thread=%p, name=%s, eventKind=%d", thread, threadName, eventKind));
+ }
+
// execute all registered InvokeMethod handlers sequentially
if (thread != 0 && suspendPolicy != JDWP_SUSPEND_NONE) {
ExecuteInvokeMethodHandlers(jni, thread);
}
// delete event packet
- JDWP_TRACE_EVENT("PostEventSet -- delete event set: packet=" << ec);
+ JDWP_TRACE(LOG_RELEASE, (LOG_EVENT_FL, "PostEventSet -- delete event set: packet=%p", ec));
ec->Reset(jni);
delete ec;
}
}
-void EventDispatcher::ExecuteInvokeMethodHandlers(JNIEnv *jni, jthread thread) throw(AgentException)
+void EventDispatcher::ExecuteInvokeMethodHandlers(JNIEnv *jni, jthread thread)
{
// if reset process, don't invoke handlers
if (m_resetFlag) {
@@ -445,7 +453,7 @@
jvmtiError err;
if (JDWP_TRACE_ENABLED(LOG_KIND_EVENT)) {
jvmtiThreadInfo threadInfo;
- JVMTI_TRACE(err, GetJvmtiEnv()->GetThreadInfo(thread, &threadInfo));
+ JVMTI_TRACE(LOG_DEBUG, err, GetJvmtiEnv()->GetThreadInfo(thread, &threadInfo));
threadName = threadInfo.name;
}
#endif // NDEBUG
@@ -458,8 +466,7 @@
while ((handler =
GetThreadManager().FindInvokeHandler(jni, thread)) != 0)
{
- JDWP_TRACE_EVENT("ExecuteInvokeMethodHandlers -- invoke method: thread=" << thread
- << ", name=" << JDWP_CHECK_NULL(threadName) << ", handler=" << handler);
+ JDWP_TRACE(LOG_RELEASE, (LOG_EVENT_FL, "ExecuteInvokeMethodHandlers -- invoke method: thread=%p, threadName=%s, handler=%p", thread, JDWP_CHECK_NULL(threadName), handler));
handler->ExecuteDeferredInvoke(jni);
MonitorAutoLock invokeMonitorLock(m_invokeMonitor JDWP_FILE_LINE);
@@ -469,16 +476,24 @@
m_invokeMonitor->NotifyAll();
// wait on suspension point after method invocation
- JDWP_TRACE_EVENT("ExecuteInvokeMethodHandlers -- wait for released on event: thread=" << thread
- << ", name=" << JDWP_CHECK_NULL(threadName) << ", handler=" << handler);
+ JDWP_TRACE(LOG_RELEASE, (LOG_EVENT_FL, "ExecuteInvokeMethodHandlers -- wait for released on event: thread=%p, threadName=%s, handler=%p", thread, JDWP_CHECK_NULL(threadName), handler));
while (!handler->IsReleased()) {
m_invokeMonitor->Wait();
if (m_resetFlag) {
return;
}
}
- JDWP_TRACE_EVENT("ExecuteInvokeMethodHandlers -- released on event: thread=" << thread
- << ", name=" << JDWP_CHECK_NULL(threadName) << ", handler=" << handler);
+
+ if (GetThreadManager().IsSuspended(thread)) {
+ jvmtiError error;
+ JVMTI_TRACE(LOG_DEBUG, error, GetJvmtiEnv()->ResumeThread(thread));
+ if (error == JVMTI_ERROR_NONE) {
+ JVMTI_TRACE(LOG_DEBUG, error, GetJvmtiEnv()->SuspendThread(thread));
+ }
+ JDWP_TRACE(LOG_RELEASE, (LOG_EVENT_FL, "ExecuteInvokeMethodHandlers -- Running suspended thread: thread=%p, name=%s", thread, threadName));
+ }
+
+ JDWP_TRACE(LOG_RELEASE, (LOG_EVENT_FL, "ExecuteInvokeMethodHandlers -- released on event: thread=%p, threadName=%s, handler=%p", thread, JDWP_CHECK_NULL(threadName), handler));
}
}
}
Modified: harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/agent/core/EventDispatcher.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/agent/core/EventDispatcher.h?rev=794726&r1=794725&r2=794726&view=diff
==============================================================================
--- harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/agent/core/EventDispatcher.h (original)
+++ harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/agent/core/EventDispatcher.h Thu Jul 16 15:57:37 2009
@@ -15,12 +15,6 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-
-/**
- * @author Pavel N. Vyssotski
- * @version $Revision: 1.11.2.1 $
- */
-
/**
* @file
* EventDispatcher.h
@@ -32,21 +26,18 @@
#ifndef _EVENT_DISPATCHER_H_
#define _EVENT_DISPATCHER_H_
-#include <queue>
-
+#include "Util.h"
#include "jni.h"
#include "jvmti.h"
#include "jdwp.h"
#include "AgentBase.h"
#include "AgentMonitor.h"
-#include "AgentAllocator.h"
#include "PacketParser.h"
#include "CommandHandler.h"
namespace jdwp {
-
/**
* The given class provides a separate thread that dispatches all event packets,
* suspends threads on events and performs deferred method invocation.
@@ -61,13 +52,13 @@
*
* @param limit - maximum even queue length
*/
- EventDispatcher(size_t limit = 1024) throw();
+ EventDispatcher(size_t limit = 1024);
/**
* A destructor.
* Destroys the given instance.
*/
- ~EventDispatcher() throw() {}
+ ~EventDispatcher() {}
/**
* Initializes this events before starting the thread.
@@ -76,7 +67,7 @@
*
* @exception If any error occurs, <code>AgentException</code> is thrown.
*/
- void Init(JNIEnv *jni) throw(AgentException);
+ void Init(JNIEnv *jni);
/**
* Starts the given thread.
@@ -85,7 +76,7 @@
*
* @exception If any error occurs, <code>AgentException</code> is thrown.
*/
- void Start(JNIEnv *jni) throw(AgentException);
+ int Start(JNIEnv *jni);
/**
* Resets all data.
@@ -94,7 +85,7 @@
*
* @exception If any error occurs, <code>AgentException</code> is thrown.
*/
- void Reset(JNIEnv *jni) throw(AgentException);
+ void Reset(JNIEnv *jni);
/**
* Stops the given thread.
@@ -103,7 +94,7 @@
*
* @exception If any error occurs, <code>AgentException</code> is thrown.
*/
- void Stop(JNIEnv *jni) throw(AgentException);
+ void Stop(JNIEnv *jni);
/**
* Cleans all data after thread completion.
@@ -112,33 +103,33 @@
*
* @exception If any error occurs, <code>AgentException</code> is thrown.
*/
- void Clean(JNIEnv *jni) throw(AgentException);
+ void Clean(JNIEnv *jni);
/**
* Turns on the flag to hold all events.
*
* @exception If any error occurs, <code>AgentException</code> is thrown.
*/
- void HoldEvents() throw(AgentException);
+ void HoldEvents();
/**
* Turns off the flag to hold all events.
*
* @exception If any error occurs, <code>AgentException</code> is thrown.
*/
- void ReleaseEvents() throw(AgentException);
+ void ReleaseEvents();
/**
* Informs that new session started.
*
* @exception If any error occurs, <code>AgentException</code> is thrown.
*/
- void NewSession() throw(AgentException);
+ void NewSession();
/**
* Generates new ID for the event packet.
*/
- jint NewId() throw() { return m_idCount++; }
+ jint NewId() { return m_idCount++; }
/**
* Sends the event packet and suspends thread(s) according to suspend
@@ -150,8 +141,7 @@
*
* @exception If any error occurs, <code>AgentException</code> is thrown.
*/
- void PostEventSet(JNIEnv *jni, EventComposer *ec, jdwpEventKind eventKind)
- throw(AgentException);
+ void PostEventSet(JNIEnv *jni, EventComposer *ec, jdwpEventKind eventKind);
/**
* Suspends thread(s) after method invocation according to invocation
@@ -162,8 +152,7 @@
*
* @exception If any error occurs, <code>AgentException</code> is thrown.
*/
- void PostInvokeSuspend(JNIEnv *jni, SpecialAsyncCommandHandler* handler)
- throw(AgentException);
+ int PostInvokeSuspend(JNIEnv *jni, SpecialAsyncCommandHandler* handler);
/**
* Executes all handlers of methods that should be invoked on the
@@ -174,8 +163,7 @@
*
* @exception If any error occurs, <code>AgentException</code> is thrown.
*/
- void ExecuteInvokeMethodHandlers(JNIEnv *jni, jthread thread)
- throw(AgentException);
+ void ExecuteInvokeMethodHandlers(JNIEnv *jni, jthread thread);
protected:
@@ -205,13 +193,14 @@
*
* @exception If any error occurs, <code>AgentException</code> is thrown.
*/
- void SuspendOnEvent(JNIEnv* jni, EventComposer *ec) throw(AgentException);
+ int SuspendOnEvent(JNIEnv* jni, EventComposer *ec);
/**
* Event queue type.
*/
- typedef queue<EventComposer*,
- deque<EventComposer*, AgentAllocator<EventComposer*> > > EventQueue;
+ //typedef queue<EventComposer*,
+ // deque<EventComposer*, AgentAllocator<EventComposer*> > > EventQueue;
+ typedef JDWPQueue EventQueue;
/**
* Event queue with event packets to be sent.
Added: harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/agent/core/ExceptionManager.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/agent/core/ExceptionManager.cpp?rev=794726&view=auto
==============================================================================
--- harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/agent/core/ExceptionManager.cpp (added)
+++ harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/agent/core/ExceptionManager.cpp Thu Jul 16 15:57:37 2009
@@ -0,0 +1,139 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef USING_VMI
+#define USING_VMI
+#endif
+
+#include "ExceptionManager.h"
+
+using namespace jdwp;
+
+static inline ThreadId_t _GetCurrentThreadId(JavaVM *jvm)
+{
+ ThreadId_t tid;
+#ifdef HY_NO_THR
+ THREAD_ACCESS_FROM_JAVAVM(jvm);
+#endif /* HY_NO_THR */
+ hythread_attach(&tid);
+ return tid;
+} // GetCurrentThreadId()
+
+
+static inline bool ThreadId_equal(ThreadId_t treadId1, ThreadId_t treadId2)
+{
+ return (treadId1 == treadId2);
+} // ThreadId_equal()
+
+void ExceptionManager::Init(JNIEnv *jni) {
+ jni->GetJavaVM(&m_jvm);
+ m_monitor = new AgentMonitor("_jdwp_exception_monitor");
+}
+
+ExceptionManager::ExceptionManager() {
+ m_context = 0;
+}
+
+void ExceptionManager::Clean() {
+ exception_context* context = m_context;
+ while (context != 0) {
+ m_context = context->next_context;
+ free(context);
+ context = m_context;
+ }
+}
+
+exception_context* ExceptionManager::GetCurrentContext(ThreadId_t tid) {
+
+ exception_context* context = m_context;
+ exception_context* pre_context = 0;
+
+ while (context != 0) {
+ // remove context contains no exception
+ while (context->lastException == NULL) {
+ if (pre_context == 0) {
+ m_context = context->next_context;
+ free(context);
+
+ context = m_context;
+ } else {
+ pre_context->next_context = context->next_context;
+ free(context);
+ context = pre_context->next_context;
+ }
+
+ if (context == 0) {
+ return 0;
+ }
+ }
+
+ if (ThreadId_equal(tid, context->id)) {
+ return context;
+ }
+
+ pre_context = context;
+ context = context->next_context;
+ }
+
+ return 0;
+}
+
+exception_context* ExceptionManager::AddNewContext(ThreadId_t tid) {
+ exception_context* context = (exception_context*) malloc(sizeof(exception_context));
+ context->id = tid;
+ context->next_context = m_context;
+ context->lastException = NULL;
+ m_context = context;
+ return m_context;
+}
+
+AgentException* ExceptionManager::Clone(AgentException* ex) {
+ AgentException* e = new AgentException(*ex);
+ return e;
+}
+
+
+void ExceptionManager::SetException(AgentException& ex) {
+ ThreadId_t tid = _GetCurrentThreadId(m_jvm);
+ MonitorAutoLock lock(m_monitor JDWP_FILE_LINE);
+
+ exception_context* context = GetCurrentContext(tid);
+ if (context == 0) {
+ context = AddNewContext(tid);
+ }
+
+ if (!context->lastException) {
+ context->lastException = Clone(&ex);
+ }
+}
+
+AgentException ExceptionManager::GetLastException() {
+ ThreadId_t tid = _GetCurrentThreadId(m_jvm);
+ MonitorAutoLock lock(m_monitor JDWP_FILE_LINE);
+
+ exception_context* context = GetCurrentContext(tid);
+ AgentException* aex;
+ if (context == 0 || context->lastException == 0) {
+ aex = new AgentException(JDWP_ERROR_NONE);
+ } else {
+ aex = context->lastException;
+ context->lastException = NULL;
+ }
+ return *aex;
+}
+
Propchange: harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/agent/core/ExceptionManager.cpp
------------------------------------------------------------------------------
svn:eol-style = native
Added: harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/agent/core/ExceptionManager.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/agent/core/ExceptionManager.h?rev=794726&view=auto
==============================================================================
--- harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/agent/core/ExceptionManager.h (added)
+++ harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/agent/core/ExceptionManager.h Thu Jul 16 15:57:37 2009
@@ -0,0 +1,88 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _EXCEPTION_MANAGER_H
+#define _EXCEPTION_MANAGER_H
+
+#include <setjmp.h>
+#include <stdlib.h>
+#include <stdio.h>
+
+#include "AgentBase.h"
+#include "AgentException.h"
+#include "AgentMonitor.h"
+#include "vmi.h"
+#include "hythread.h"
+#include "hyport.h"
+#include "jni.h"
+#include "jvmti.h"
+
+#define JDWP_SET_EXCEPTION(ex) AgentBase::GetExceptionManager().SetException(ex)
+
+#define JDWP_CHECK_RETURN(value) if (value != JDWP_ERROR_NONE) { \
+ return value; \
+ }
+
+namespace jdwp {
+
+ typedef hythread_t ThreadId_t;
+
+ struct exception_context {
+ ThreadId_t id;
+ AgentException* lastException;
+ struct exception_context* next_context;
+ };
+
+ typedef struct exception_context exception_context;
+
+
+ class ExceptionManager
+ {
+ public:
+ ExceptionManager();
+
+ /**
+ * A destructor.
+ */
+ ~ExceptionManager();
+
+ void Init(JNIEnv *jni);
+ void Clean();
+
+ void SetException(AgentException& ex);
+ AgentException GetLastException();
+
+ inline void* operator new(size_t size) {
+ return malloc(size);
+ }
+
+ inline void operator delete(void* ptr) {
+ free(ptr);
+ }
+
+ private:
+ exception_context* GetCurrentContext(ThreadId_t tid);
+ exception_context* AddNewContext(ThreadId_t tid);
+ AgentException* Clone(AgentException* ex);
+ exception_context* m_context;
+
+ JavaVM *m_jvm;
+ AgentMonitor* m_monitor;
+ };
+};
+#endif // _EXCEPTION_MANAGER_H
Propchange: harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/agent/core/ExceptionManager.h
------------------------------------------------------------------------------
svn:eol-style = native
Modified: harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/agent/core/Log.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/agent/core/Log.h?rev=794726&r1=794725&r2=794726&view=diff
==============================================================================
--- harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/agent/core/Log.h (original)
+++ harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/agent/core/Log.h Thu Jul 16 15:57:37 2009
@@ -17,138 +17,101 @@
*/
/**
- * @author Pavel N. Vyssotski
- * @version $Revision: 1.9.2.1 $
- */
-#ifndef _LOG_H_
-#define _LOG_H_
-
-#include <sstream>
-#include "LogManager.h"
-
-/**
* @file
* Log.h
*
* Macros in the given file provide functionality for tracing
- * program execution in a debug mode except INFO and ERROR,
- * which work in a release mode as well as in a debug one.
+ * program execution in a debug mode except INFO, SIMPLE and
+ * ERROR, which work in a release mode as well as in a debug
+ * one.
*/
+#ifndef _LOG_H_
+#define _LOG_H_
+
+#include <stdarg.h>
+#include "LogManager.h"
+
/**
* Safe null-checking method for passing a string as a parameter.
*/
#define JDWP_CHECK_NULL(str) ( (str)==0 ? "(null)" : (str) )
/**
- * Traces messages using the corresponding method of a log manager.
+ * Macro definition for assertion checking in JDWP agent code.
*/
-#define JDWP_MESSAGE(method, message) { \
- std::ostringstream _oss; \
- _oss << message; \
- AgentBase::GetLogManager().method(_oss.str(), __FILE__, __LINE__); \
-}
+#ifdef NDEBUG
+ #define JDWP_ASSERT(assert)
+#else // !NDEBUG
+ #define JDWP_ASSERT(assert) { \
+ if (!(assert)) { \
+ JDWP_TRACE(LOG_DEBUG, (LOG_ERROR_FL, "assert \"%s\" failed", #assert)); \
+ ::exit(1); \
+ } \
+ }
+#endif // !NDEBUG
-/**
- * Traces INFO kind of the messages.
- */
-#define JDWP_INFO(message) JDWP_MESSAGE(Info, message)
/**
- * Traces ERROR kind of the messages.
+ * Defines to indicate the current levels of tracing available.
+ * LOG_RELEASE indicates tracepoints that will be executed when
+ * building in both release and debug configuration.
+ * LOG_DEBUG indicates tracepoints that will be executed when
+ * building in debug configuration only.
*/
-#define JDWP_ERROR(message) JDWP_MESSAGE(Error, message)
+#define LOG_RELEASE JDWP_TRACE_RELEASE
+#define LOG_DEBUG JDWP_TRACE_DEBUG
/**
- * Traces messages of a specific kind. The macro is empty in a release mode.
+ * Macros to check if the specified kind of tracing is enabled.
+ *
+ * 2 versions - one takes just the kind of tracing, the other
+ * can take a variable argument list as specified to the
+ * JDWP_TRACE macro.
*/
-#define JDWP_TRACE(kind, message) JDWP_TRACE_EX(kind, __FILE__, __LINE__, message)
-
-#define JDWP_TRACE_CMD(message) JDWP_TRACE(LOG_KIND_CMD, message)
-#define JDWP_TRACE_EVENT(message) JDWP_TRACE(LOG_KIND_EVENT, message)
-#define JDWP_TRACE_PACKET(message) JDWP_TRACE(LOG_KIND_PACKET, message)
-#define JDWP_TRACE_THREAD(message) JDWP_TRACE(LOG_KIND_THREAD, message)
-#define JDWP_TRACE_DATA(message) JDWP_TRACE(LOG_KIND_DATA, message)
-#define JDWP_TRACE_MEMORY(message) JDWP_TRACE(LOG_KIND_MEMORY, message)
-#define JDWP_TRACE_MAP(message) JDWP_TRACE(LOG_KIND_MAP, message)
-#define JDWP_TRACE_JVMTI(message) JDWP_TRACE(LOG_KIND_JVMTI, message)
-#define JDWP_TRACE_FUNC(message) JDWP_TRACE(LOG_KIND_FUNC, message)
-#define JDWP_TRACE_MON(message) JDWP_TRACE(LOG_KIND_MON, message)
-#define JDWP_TRACE_UTIL(message) JDWP_TRACE(LOG_KIND_UTIL, message)
-#define JDWP_TRACE_PROG(message) JDWP_TRACE(LOG_KIND_PROG, message)
+ #define JDWP_TRACE_ENABLED(kind) AgentBase::GetLogManager().TraceEnabled(kind, __FILE__, __LINE__, "")
+ #define JDWP_TRACE_ENABLED_VAARGS(args) AgentBase::GetLogManager().TraceEnabled args
/**
- * Traces the JVMTI kind of the messages.
+ * Trace JVMTI calls - has format
+ * JVMTI_TRACE(level, err, function_call)
+ * where
+ * level - the tracing level, either LOG_RELEASE or LOG_DEBUG
+ * err - the variable to store the return code in
+ * function_call - the function call to execute
*/
-#define JVMTI_TRACE(err, function_call) { \
- JDWP_TRACE_JVMTI(">> " #function_call); \
+#define JVMTI_TRACE(level, err, function_call) { \
+ JDWP_TRACE(level, (LOG_JVMTI_FL, ">> %s", #function_call)); \
err = function_call; \
- JDWP_TRACE_JVMTI("<< " #function_call "=" << err); \
+ JDWP_TRACE(level, (LOG_JVMTI_FL, "<< %s=%d", #function_call, err)); \
}
/**
- * Prints the message and terminates the program execution.
- */
-#define JDWP_DIE(message) { \
- JDWP_ERROR(message); \
- exit(1); \
-}
+* Macros providing trace for JDWP agent code
+*
+* Tracepoints are of the format:
+* JDWP_TRACE(level, (kind, file, line, format, tokens));
+* where
+* level - either LOG_RELEASE or LOG_DEBUG
+* kind - the type of trace, e.g. LOG_KIND_EVENT
+* file - the file name
+* line - the line number
+* format - the format string, e.g. "Hello %s"
+* tokens - the tokens to be parsed into the format string,
+* e.g."World"
+*/
+#define _JDWP_TRACE(args) if (JDWP_TRACE_ENABLED_VAARGS(args)) AgentBase::GetLogManager().Trace args
+#define _JDWP_TRACE_ENTRY(args) JdwpTraceEntry _tre args
#ifdef NDEBUG
+#define JDWP_TRACE_DEBUG(func, args)
+#else
+#define JDWP_TRACE_DEBUG(func, args) func(args)
+#endif
+#define JDWP_TRACE_RELEASE(func, args) func(args)
-/**
- * The given macros are empty in a release mode.
- */
-#define JDWP_LOG(message)
-#define JDWP_TRACE_EX(kind, file, line, message)
-#define JDWP_TRACE_ENTRY(message)
-#define JDWP_ASSERT(assert)
-#define JDWP_TRACE_ENABLED(kind) false
-
-#define JDWP_FILE_LINE
-#define JDWP_FILE_LINE_PAR
-#define JDWP_FILE_LINE_INI
-#define JDWP_FILE_LINE_MPAR
-#define JDWP_FILE_LINE_DECL
-
-#else // !NDEBUG
-
-/**
- * Traces LOG kind of the messages.
- */
-#define JDWP_LOG(message) JDWP_MESSAGE(Log, message)
-
-/**
- * Traces messages of a specific kind.
- */
-#define JDWP_TRACE_EX(kind, file, line, message){ \
- std::ostringstream _oss; \
- _oss << message; \
- AgentBase::GetLogManager().Trace(_oss.str(), file, line, kind); \
-}
-
-/**
- * Traces the function kind of the messages.
- */
-#define JDWP_TRACE_ENTRY(message) \
- std::ostringstream _ose; \
- _ose << message; \
- JdwpTraceEntry _tre(_ose, __FILE__, __LINE__, LOG_KIND_FUNC);
-
-/**
- * Verifies the expression and terminates the program execution, if it
- * is <code>FALSE</code>.
- */
-#define JDWP_ASSERT(assert) { \
- if (!(assert)) { \
- JDWP_DIE("assert \"" #assert "\" failed"); \
- } \
-}
-
-/**
- * Checks whether a specific kind of messages is enabled for logging.
- */
-#define JDWP_TRACE_ENABLED(kind) AgentBase::GetLogManager().TraceEnabled(__FILE__, __LINE__, kind)
+#define JDWP_TRACE(level, args) level(_JDWP_TRACE, args)
+#define JDWP_TRACE_ENTRY(level, args) level(_JDWP_TRACE_ENTRY, args)
/**
* The following macros provide placement for file and line parameters in a debug mode1.
@@ -159,6 +122,27 @@
#define JDWP_FILE_LINE_MPAR , m_file, m_line
#define JDWP_FILE_LINE_DECL const char* m_file; int m_line;
-#endif // NDEBUG
+/**
+ * Utility defines for kind, file, line in the JDWP_TRACE macros
+ * above.
+ */
+#define LOG_CMD_FL LOG_KIND_CMD, __FILE__, __LINE__
+#define LOG_EVENT_FL LOG_KIND_EVENT, __FILE__, __LINE__
+#define LOG_PACKET_FL LOG_KIND_PACKET, __FILE__, __LINE__
+#define LOG_THREAD_FL LOG_KIND_THREAD, __FILE__, __LINE__
+#define LOG_DATA_FL LOG_KIND_DATA, __FILE__, __LINE__
+#define LOG_MEMORY_FL LOG_KIND_MEMORY, __FILE__, __LINE__
+#define LOG_MAP_FL LOG_KIND_MAP, __FILE__, __LINE__
+#define LOG_JVMTI_FL LOG_KIND_JVMTI, __FILE__, __LINE__
+#define LOG_FUNC_FL LOG_KIND_FUNC, __FILE__, __LINE__
+#define LOG_MON_FL LOG_KIND_MON, __FILE__, __LINE__
+#define LOG_UTIL_FL LOG_KIND_UTIL, __FILE__, __LINE__
+#define LOG_PROG_FL LOG_KIND_PROG, __FILE__, __LINE__
+#define LOG_LOG_FL LOG_KIND_LOG, __FILE__, __LINE__
+#define LOG_INFO_FL LOG_KIND_INFO, __FILE__, __LINE__
+#define LOG_ERROR_FL LOG_KIND_ERROR, __FILE__, __LINE__
+#define LOG_SIMPLE_FL LOG_KIND_SIMPLE, __FILE__, __LINE__
+#define LOG_NUM_FL LOG_KIND_NUM, __FILE__, __LINE__
+
#endif // _LOG_H_
Modified: harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/agent/core/LogManager.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/agent/core/LogManager.cpp?rev=794726&r1=794725&r2=794726&view=diff
==============================================================================
--- harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/agent/core/LogManager.cpp (original)
+++ harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/agent/core/LogManager.cpp Thu Jul 16 15:57:37 2009
@@ -15,23 +15,19 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-
-/**
- * @author Pavel N. Vyssotski
- * @version $Revision: 1.15 $
- */
-// LogManager.cpp
-
-#include <iostream>
-#include <fstream>
-#include <cstring>
-#include <string>
+#ifndef USING_VMI
+#define USING_VMI
+#endif
#include "LogManager.h"
#include "AgentMonitor.h"
+#include "AgentBase.h"
+#include "vmi.h"
+#include "hyport.h"
+
+#include <string.h>
using namespace jdwp;
-using namespace std;
static struct {
const char* disp;
@@ -53,11 +49,11 @@
{ " PROG", "PROG" },
{ " LOG", "LOG" },
{ " INFO", "INFO" },
- { "ERROR", "ERROR" }
+ { "ERROR", "ERROR" },
+ { "SIMPLE", "SIMPLE" }
};
-STDLogManager::STDLogManager() throw() :
- m_logStream(&clog),
+STDLogManager::STDLogManager() :
m_fileFilter(0),
m_monitor(0)
{
@@ -69,7 +65,6 @@
}
void STDLogManager::Init(const char* log, const char* kindFilter, const char* srcFilter)
- throw(AgentException)
{
if (srcFilter != 0 && strcmp("all", srcFilter) == 0) {
srcFilter = 0; // null equvivalent to "all"
@@ -101,29 +96,32 @@
m_logKinds[LOG_KIND_INFO] = TRACE_KIND_ALWAYS;
m_logKinds[LOG_KIND_ERROR] = TRACE_KIND_ALWAYS;
+ m_logKinds[LOG_KIND_SIMPLE] = TRACE_KIND_ALWAYS;
if (log == 0) {
- m_logStream = &clog;
+ m_fileHandle = -1;
} else {
- m_logStream = new ofstream(log);
- if (m_logStream == 0) {
- fprintf(stderr, "Cannot open log file: %s\n", log);
- m_logStream = &clog;
+ PORT_ACCESS_FROM_JAVAVM(AgentBase::GetJavaVM());
+ hyfile_unlink(log); // We do not care about the result of unlink here, failure may be because the file does not exist
+ m_fileHandle = hyfile_open(log, HyOpenCreate | HyOpenWrite, 0660);
+ if (m_fileHandle == -1) {
+ hytty_printf(privatePortLibrary, "Cannot open log file: %s", log);
}
}
m_monitor = new AgentMonitor("_agent_Log");
}
-void STDLogManager::Clean() throw()
+void STDLogManager::Clean()
{
if (m_monitor != 0) {
m_monitor->Enter();
}
- if (m_logStream != &clog) {
- delete m_logStream;
- m_logStream = &clog;
+ if (m_fileHandle != -1) {
+ PORT_ACCESS_FROM_JAVAVM(AgentBase::GetJavaVM());
+ hyfile_close(m_fileHandle);
+ m_fileHandle = -1;
}
// prevent logging in destruction of log's monitor
@@ -137,7 +135,7 @@
// extract basename from filename
-const char* STDLogManager::BaseName(const char* filepath) throw()
+const char* STDLogManager::BaseName(const char* filepath)
{
size_t len;
@@ -157,64 +155,76 @@
return filepath;
}
-// STDLogManager intended to use cout, cerr and clog streams.
+void STDLogManager::Tracev(int kind, const char* file, int line, const char* format, va_list args) {
+ // No need to check kind here, as this is a private function and all public functions using it should check kind before calling tracev
+ PORT_ACCESS_FROM_JAVAVM(AgentBase::GetJavaVM());
+ if (m_monitor != 0) {
+ m_monitor->Enter();
+ }
-void STDLogManager::Info(const std::string& message,
- const char *file, int line) throw()
-{
- Trace(message, file, line, LOG_KIND_INFO);
-}
+ I_64 timeMillis = hytime_current_time_millis();
+ char timestamp[9]; // Buffer for the timestamp
+ hystr_ftime(timestamp, 9, "%H:%M:%S");
+
+ int currentMillis = (int)(timeMillis%1000); // get the 1000ths of a second
+
+ char message[5000]; //Buffer of a large size, big enough to contain formatted message strings
+ hystr_vprintf(message, 5000, format, args);
+
+ file = BaseName(file);
+ if (LOG_KIND_SIMPLE == kind) {
+ hyfile_printf(privatePortLibrary, HYPORT_TTY_OUT, "%s\n", message);
+ } else {
+ hyfile_printf(privatePortLibrary, HYPORT_TTY_ERR, "%s.%03d %s: [%s:%d] %s\n", timestamp, currentMillis, s_logKinds[kind].disp, file, line, message);
+ }
-void STDLogManager::Error(const std::string& message,
- const char *file, int line) throw()
-{
- Trace(message, file, line, LOG_KIND_ERROR);
-}
+ // duplicate ERROR and INFO message in the log and in the cerr/cout output
+ if (m_fileHandle != -1) {
+ hyfile_printf(privatePortLibrary, m_fileHandle, "%s.%03d %s: [%s:%d] %s\n", timestamp, currentMillis, s_logKinds[kind].disp, file, line, message);
+ }
-void STDLogManager::Log(const std::string& message,
- const char *file, int line) throw()
-{
- Trace(message, file, line, LOG_KIND_LOG);
+ if (m_monitor != 0) {
+ m_monitor->Exit();
+ }
}
-void STDLogManager::Trace(const string& message,
- const char *file, int line, int kind) throw()
-{
- if (TraceEnabled(file, line, kind)){
- if (m_monitor != 0) {
- m_monitor->Enter();
- }
+void STDLogManager::Trace(int kind, const char* file, int line, const char* format, ...) {
+ PORT_ACCESS_FROM_JAVAVM(AgentBase::GetJavaVM());
+ va_list args;
+ va_start(args, format);
+ Tracev(kind, file, line, format, args);
+ va_end(args);
+}
- file = BaseName(file);
- std::ostream* logStream = m_logStream;
- if (LOG_KIND_ERROR == kind) {
- logStream = &cerr;
- }
- else if (LOG_KIND_INFO == kind) {
- logStream = &cout;
- }
+void STDLogManager::TraceEnter(int kind, const char* file, int line, const char* format, ...) {
+ PORT_ACCESS_FROM_JAVAVM(AgentBase::GetJavaVM());
+ char *message = (char*)hymem_allocate_memory(strlen(format) + 4);
+ va_list args;
+ va_start(args, format);
+ hystr_printf(privatePortLibrary, message, (U_32)(strlen(format) + 4), ">> %s", format);
+ Tracev(kind, file, line, message, args);
+ va_end(args);
+ hymem_free_memory(message);
+}
- *logStream
- << s_logKinds[kind].disp << ": "
- << "[" << file << ":" << line << "] "
- << message << endl;
-
- // duplicate ERROR and INFO message in the log and in the cerr/cout output
- if (logStream != m_logStream && m_logStream != &clog) {
- *m_logStream
- << s_logKinds[kind].disp << ": "
- << "[" << file << ":" << line << "] "
- << message << endl;
- }
+void STDLogManager::TraceExit(int kind, const char* file, int line, const char* format) {
+ PORT_ACCESS_FROM_JAVAVM(AgentBase::GetJavaVM());
+ const char *openBracket = strchr(format, '(');
+ char *message = (char*)hymem_allocate_memory(openBracket - format + 3);
+ hystr_printf(privatePortLibrary, message, (U_32)(openBracket - format + 2), format);
+ Trace(kind, file, line, "<< %s)", message);
+ hymem_free_memory(message);
+}
- if (m_monitor != 0) {
- m_monitor->Exit();
- }
- }
+void STDLogManager::TraceEnterv(int kind, const char* file, int line, const char* format, va_list args) {
+ PORT_ACCESS_FROM_JAVAVM(AgentBase::GetJavaVM());
+ char *message = (char*)hymem_allocate_memory(strlen(format) + 5);
+ hystr_printf(privatePortLibrary, message, (U_32)(strlen(format) + 4), ">> %s", format);
+ Tracev(kind, file, line, message, args);
+ hymem_free_memory(message);
}
-bool STDLogManager::TraceEnabled(const char *file, int line, int kind) throw()
-{
+bool STDLogManager::TraceEnabled(int kind, const char* file, int line, const char* format, ...) {
if (TRACE_KIND_FILTER_FILE == m_logKinds[kind]) {
return strstr(m_fileFilter, BaseName(file)) != 0;
}
@@ -222,3 +232,4 @@
return TRACE_KIND_ALWAYS == m_logKinds[kind];
}
}
+
Modified: harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/agent/core/LogManager.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/agent/core/LogManager.h?rev=794726&r1=794725&r2=794726&view=diff
==============================================================================
--- harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/agent/core/LogManager.h (original)
+++ harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/agent/core/LogManager.h Thu Jul 16 15:57:37 2009
@@ -15,12 +15,6 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-
-/**
- * @author Pavel N. Vyssotski
- * @version $Revision: 1.12.2.1 $
- */
-
/**
* @file
* LogManager.h
@@ -30,10 +24,10 @@
#ifndef _LOG_MANAGER_H_
#define _LOG_MANAGER_H_
-#include <iostream>
-#include <string>
-
-#include "AgentException.h"
+#include <stdarg.h>
+#include <stdlib.h>
+#include "vmi.h"
+#include "hyport.h"
namespace jdwp {
@@ -57,7 +51,7 @@
LOG_KIND_LOG,
LOG_KIND_INFO,
LOG_KIND_ERROR,
-
+ LOG_KIND_SIMPLE,
LOG_KIND_NUM
};
@@ -82,54 +76,21 @@
/**
* Initializes the log manager.
*/
- virtual void Init(const char* log, const char* kindFilter, const char* srcFilter)
- throw(AgentException) = 0;
+ virtual void Init(const char* log, const char* kindFilter, const char* srcFilter) {};
/**
* Cleanups the log manager.
*/
- virtual void Clean() throw() = 0;
+ virtual void Clean() {};
- /**
- * Prints the given message of the Info type.
- *
- * @param message - the log message
- * @param file - the name of the source file (__FILE__ macro)
- * @param line - the number of the code line (__LINE__ macro)
- */
- virtual void Info(const std::string& message,
- const char *file, int line) throw() = 0;
+ /* Trace methods */
+ virtual void Trace(int kind, const char* file, int line, const char* format, ...) {};
- /**
- * Prints the given message of the Error type.
- *
- * @param message - the log message
- * @param file - the name of the source file (__FILE__ macro)
- * @param line - the number of the code line (__LINE__ macro)
- */
- virtual void Error(const std::string& message,
- const char *file, int line) throw() = 0;
+ virtual void TraceEnter(int kind, const char* file, int line, const char* format, ...) {};
+ virtual void TraceEnterv(int kind, const char* file, int line, const char* format, va_list args) {};
+ virtual void TraceExit(int kind, const char* file, int line, const char* format) {};
- /**
- * Prints the given message of the Log type.
- *
- * @param message - the log message
- * @param file - the name of the source file (__FILE__ macro)
- * @param line - the number of the code line (__LINE__ macro)
- */
- virtual void Log(const std::string& message,
- const char *file, int line) throw() = 0;
-
- /**
- * Prints the given message of the Trace type.
- *
- * @param message - the log message
- * @param file - the name of the source file (__FILE__ macro)
- * @param line - the number of the code line (__LINE__ macro)
- * @param kind - the log kind
- */
- virtual void Trace(const std::string& message,
- const char *file, int line, int kind) throw() = 0;
+ static inline void EmptyFunction(int kind, const char* file, int line, const char* format, ...) {};
/**
* Checks whether the print to log is enabled for the Trace log type.
@@ -140,7 +101,18 @@
*
* @return Boolean.
*/
- virtual bool TraceEnabled(const char *file, int line, int kind) throw() = 0;
+ virtual bool TraceEnabled(int kind, const char* file, int line, const char* format, ...) {return false;};
+
+ inline void* operator new(size_t size) {
+ return malloc(size);
+ }
+
+ inline void operator delete(void* ptr) {
+ free(ptr);
+ }
+
+ private:
+ virtual void Tracev(int kind, const char* file, int line, const char* format, va_list args) {};
};
/**
@@ -153,59 +125,25 @@
/**
* A constructor.
*/
- STDLogManager() throw();
+ STDLogManager();
/**
* Initializes the log manager.
*/
- void Init(const char* log, const char* kindFilter, const char* srcFilter)
- throw(AgentException);
+ void Init(const char* log, const char* kindFilter, const char* srcFilter);
/**
* Cleanups the log manager.
*/
- void Clean() throw();
+ void Clean();
- /**
- * Prints the given message of the Info type.
- *
- * @param message - the log message
- * @param file - the name of the source file (__FILE__ macro)
- * @param line - the number of the code line (__LINE__ macro)
- */
- void Info(const std::string& message,
- const char *file, int line) throw();
-
- /**
- * Prints the given message of the Error type.
- *
- * @param message - the log message
- * @param file - the name of the source file (__FILE__ macro)
- * @param line - the number of the code line (__LINE__ macro)
- */
- void Error(const std::string& message,
- const char *file, int line) throw();
+ /* Trace methods */
+ void Trace(int kind, const char* file, int line, const char* format, ...);
- /**
- * Prints the given message of the Log type.
- *
- * @param message - the log message
- * @param file - the name of the source file (__FILE__ macro)
- * @param line - the number of the code line (__LINE__ macro)
- */
- void Log(const std::string& message,
- const char *file, int line) throw();
+ void TraceEnter(int kind, const char* file, int line, const char* format, ...);
+ void TraceEnterv(int kind, const char* file, int line, const char* format, va_list args);
+ void TraceExit(int kind, const char* file, int line, const char* format);
- /**
- * Prints the given message of the Trace type.
- *
- * @param message - the log message
- * @param file - the name of the source file (__FILE__ macro)
- * @param line - the number of the code line (__LINE__ macro)
- * @param kind - the log kind
- */
- void Trace(const std::string& message,
- const char *file, int line, int kind) throw();
/**
* Checks whether the print to log is enabled for the Trace log type.
@@ -216,7 +154,7 @@
*
* @return Boolean.
*/
- bool TraceEnabled(const char *file, int line, int kind) throw();
+ bool TraceEnabled(int kind, const char* file, int line, const char* format, ...);
/**
* Gets a short file name from the full path.
@@ -225,14 +163,17 @@
*
* @return Zero terminated string.
*/
- static const char* BaseName(const char* filepath) throw();
+ static const char* BaseName(const char* filepath);
private:
+ void Tracev(int kind, const char* file, int line, const char* format, va_list args);
+
const char* m_fileFilter;
- std::ostream* m_logStream;
+ IDATA m_fileHandle;
AgentMonitor* m_monitor;
int m_logKinds[LOG_KIND_NUM];
};
+
}
#endif // _LOG_MANAGER_H_
Modified: harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/agent/core/MemoryManager.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/agent/core/MemoryManager.cpp?rev=794726&r1=794725&r2=794726&view=diff
==============================================================================
--- harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/agent/core/MemoryManager.cpp (original)
+++ harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/agent/core/MemoryManager.cpp Thu Jul 16 15:57:37 2009
@@ -16,97 +16,107 @@
* limitations under the License.
*/
-/**
- * @author Pavel N. Vyssotski
- * @version $Revision: 1.5 $
- */
-// MemoryManager.cpp
-
-#include <cstdlib>
-#include <cstring>
-
-#include "AgentException.h"
#include "MemoryManager.h"
+#include "ExceptionManager.h"
#include "AgentBase.h"
-//#include "Log.h"
+#include "Log.h"
//#include "jvmti.h"
+#include <string.h>
+#include <stdlib.h>
+
using namespace jdwp;
-// STDMemoryManager intended to use std::malloc(), std::free() etc.
+// should never be invoked
+void *operator new(size_t size)
+{
+ void* p = malloc(size);
+ JDWP_TRACE(LOG_RELEASE, (LOG_KIND_MEMORY, __FILE__, __LINE__, "VM malloc: %lld, %p", static_cast<long long>(size), p));
+ return p;
+}
+
+// should never be invoked
+void operator delete(void *p)
+{
+ JDWP_TRACE(LOG_RELEASE, (LOG_KIND_MEMORY, __FILE__, __LINE__, "VM free: %p", p));
+ free(p);
+}
-void* STDMemoryManager::AllocateNoThrow(size_t size JDWP_FILE_LINE_PAR) throw() {
- void *p = std::malloc(size);
- JDWP_TRACE_EX(LOG_KIND_MEMORY, file, line, "STD malloc: " << static_cast<long long>(size) << " " << p);
+// STDMemoryManager intended to use malloc(), free() etc.
+
+void* STDMemoryManager::AllocateNoThrow(size_t size JDWP_FILE_LINE_PAR) {
+ void *p = malloc(size);
+ JDWP_TRACE(LOG_RELEASE, (LOG_KIND_MEMORY, file, line, "STD malloc: %lld %p", static_cast<long long>(size), p));
return p;
}
-void* STDMemoryManager::Allocate(size_t size JDWP_FILE_LINE_PAR) throw(AgentException) {
- void *p = std::malloc(size);
- JDWP_TRACE_EX(LOG_KIND_MEMORY, file, line, "STD malloc: " << static_cast<long long>(size) << " " << p);
+void* STDMemoryManager::Allocate(size_t size JDWP_FILE_LINE_PAR) {
+ void *p = malloc(size);
+ JDWP_TRACE(LOG_RELEASE, (LOG_KIND_MEMORY, file, line, "STD malloc: %lld %p", static_cast<long long>(size), p));
if (p == 0) {
- throw OutOfMemoryException();
+ JDWP_TRACE(LOG_RELEASE, (LOG_KIND_ERROR, file, line, "STD malloc failed: %lld %p", static_cast<long long>(size), p));
}
return p;
}
void* STDMemoryManager::Reallocate(void* ptr, size_t oldSize, size_t newSize JDWP_FILE_LINE_PAR)
- throw(AgentException) {
- void *p = std::realloc(ptr, newSize);
- JDWP_TRACE_EX(LOG_KIND_MEMORY, file, line, "STD realloc: " << ptr << " " << static_cast<long long>(oldSize)
- << "/" << static_cast<long long>(newSize) << " " << p);
+ {
+ void *p = realloc(ptr, newSize);
+ JDWP_TRACE(LOG_RELEASE, (LOG_KIND_MEMORY, file, line, "STD realloc: %p %lld/%lld %p", ptr, static_cast<long long>(oldSize),
+ static_cast<long long>(newSize), p));
if (p == 0) {
- throw OutOfMemoryException();
- }
+ JDWP_TRACE(LOG_RELEASE, (LOG_KIND_ERROR, file, line, "STD realloc failed: %p %lld/%lld %p", ptr, static_cast<long long>(oldSize),
+ static_cast<long long>(newSize), p));
+ }
return p;
}
-void STDMemoryManager::Free(void* ptr JDWP_FILE_LINE_PAR) throw() {
- JDWP_TRACE_EX(LOG_KIND_MEMORY, file, line, "STD free: " << ptr);
- std::free(ptr);
+void STDMemoryManager::Free(void* ptr JDWP_FILE_LINE_PAR) {
+ JDWP_TRACE(LOG_RELEASE, (LOG_KIND_MEMORY, file, line, "STD free: %p", ptr));
+ free(ptr);
}
// VMMemoryManager intended to use JVMTI's Allocate() and Deallocate()
-void* VMMemoryManager::AllocateNoThrow(size_t size JDWP_FILE_LINE_PAR) throw() {
+void* VMMemoryManager::AllocateNoThrow(size_t size JDWP_FILE_LINE_PAR) {
void *p;
jvmtiError err;
- JVMTI_TRACE(err, AgentBase::GetJvmtiEnv()->Allocate(size,
+ JVMTI_TRACE(LOG_DEBUG, err, AgentBase::GetJvmtiEnv()->Allocate(size,
reinterpret_cast<unsigned char**>(&p)));
- JDWP_TRACE_EX(LOG_KIND_MEMORY, file, line, "VM malloc: " << static_cast<long long>(size) << ", " << p);
+ JDWP_TRACE(LOG_RELEASE, (LOG_KIND_MEMORY, file, line, "VM malloc: %lld, %p", static_cast<long long>(size), p));
return ((err == JVMTI_ERROR_NONE) ? p : 0);
}
-void* VMMemoryManager::Allocate(size_t size JDWP_FILE_LINE_PAR) throw(AgentException) {
+void* VMMemoryManager::Allocate(size_t size JDWP_FILE_LINE_PAR) {
void *p;
jvmtiError err;
- JVMTI_TRACE(err, AgentBase::GetJvmtiEnv()->Allocate(size,
+ JVMTI_TRACE(LOG_DEBUG, err, AgentBase::GetJvmtiEnv()->Allocate(size,
reinterpret_cast<unsigned char**>(&p)));
- JDWP_TRACE_EX(LOG_KIND_MEMORY, file, line, "VM malloc: " << static_cast<long long>(size) << ", " << p);
+ JDWP_TRACE(LOG_RELEASE, (LOG_KIND_MEMORY, file, line, "VM malloc: %lld, %p", static_cast<long long>(size), p));
if (err != JVMTI_ERROR_NONE) {
- throw AgentException(err);
+ JDWP_TRACE(LOG_RELEASE, (LOG_KIND_ERROR, file, line, "VM malloc failed: %lld, %p", static_cast<long long>(size), p));
}
-
return p;
}
void* VMMemoryManager::Reallocate(void* ptr, size_t oldSize, size_t newSize JDWP_FILE_LINE_PAR)
- throw(AgentException) {
+ {
void *p;
jvmtiError err;
- JVMTI_TRACE(err, AgentBase::GetJvmtiEnv()->Allocate(newSize,
+ JVMTI_TRACE(LOG_DEBUG, err, AgentBase::GetJvmtiEnv()->Allocate(newSize,
reinterpret_cast<unsigned char**>(&p)));
- JDWP_TRACE_EX(LOG_KIND_MEMORY, file, line, "VM realloc: " << ptr << " " << static_cast<long long>(oldSize)
- << "/" << static_cast<long long>(newSize) << " " << p);
+ JDWP_TRACE(LOG_RELEASE, (LOG_KIND_MEMORY, file, line, "VM realloc: %p %lld/%lld %p", ptr, static_cast<long long>(oldSize),
+ static_cast<long long>(newSize), p));
if (err != JVMTI_ERROR_NONE) {
- throw AgentException(err);
+ JDWP_TRACE(LOG_RELEASE, (LOG_KIND_ERROR, file, line, "VM realloc failed: %p %lld/%lld %p", ptr, static_cast<long long>(oldSize),
+ static_cast<long long>(newSize), p));
} else {
- std::memcpy(p, ptr, (newSize < oldSize) ? newSize : oldSize);
- JVMTI_TRACE(err, AgentBase::GetJvmtiEnv()->Deallocate(
+ memcpy(p, ptr, (newSize < oldSize) ? newSize : oldSize);
+ JVMTI_TRACE(LOG_DEBUG, err, AgentBase::GetJvmtiEnv()->Deallocate(
reinterpret_cast<unsigned char*>(ptr)));
JDWP_ASSERT(err==JVMTI_ERROR_NONE);
}
@@ -114,10 +124,10 @@
return p;
}
-void VMMemoryManager::Free(void* ptr JDWP_FILE_LINE_PAR) throw() {
- JDWP_TRACE_EX(LOG_KIND_MEMORY, file, line, "VM free: " << ptr);
+void VMMemoryManager::Free(void* ptr JDWP_FILE_LINE_PAR) {
+ JDWP_TRACE(LOG_RELEASE, (LOG_KIND_MEMORY, file, line, "VM free: %p", ptr));
jvmtiError err;
- JVMTI_TRACE(err, AgentBase::GetJvmtiEnv()->Deallocate(
+ JVMTI_TRACE(LOG_DEBUG, err, AgentBase::GetJvmtiEnv()->Deallocate(
reinterpret_cast<unsigned char*>(ptr)));
JDWP_ASSERT(err==JVMTI_ERROR_NONE);
}
Modified: harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/agent/core/MemoryManager.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/agent/core/MemoryManager.h?rev=794726&r1=794725&r2=794726&view=diff
==============================================================================
--- harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/agent/core/MemoryManager.h (original)
+++ harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/agent/core/MemoryManager.h Thu Jul 16 15:57:37 2009
@@ -15,12 +15,6 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-
-/**
- * @author Pavel N. Vyssotski
- * @version $Revision: 1.6.2.1 $
- */
-
/**
* @file
* MemoryManager.h
@@ -30,11 +24,15 @@
#ifndef _MEMORY_MANAGER_H_
#define _MEMORY_MANAGER_H_
-#include "AgentException.h"
#include "Log.h"
+void *operator new(size_t size);
+
+void operator delete(void *p);
+
namespace jdwp {
+
/**
* Agent memory manager interface.
*/
@@ -51,7 +49,7 @@
* @return Pointer to the allocated memory block.
*/
virtual void* AllocateNoThrow(size_t size
- JDWP_FILE_LINE_PAR) throw() = 0;
+ JDWP_FILE_LINE_PAR) {return 0;};
/**
* Allocates the memory block with the given size.
@@ -64,7 +62,7 @@
* <code>OutOfMemoryException</code> is thrown.
*/
virtual void* Allocate(size_t size
- JDWP_FILE_LINE_PAR) throw(AgentException) = 0;
+ JDWP_FILE_LINE_PAR) {return 0;};
/**
* Reallocates the memory block with the given size over the previously
@@ -78,7 +76,7 @@
* <code>OutOfMemoryException</code> is thrown.
*/
virtual void* Reallocate(void* ptr, size_t oldSize, size_t newSize
- JDWP_FILE_LINE_PAR) throw(AgentException) = 0;
+ JDWP_FILE_LINE_PAR) {return 0;};
/**
* Frees the memory block with the given size.
@@ -86,7 +84,15 @@
* @param ptr - the pointer to the allocated memory block
*/
virtual void Free(void* ptr
- JDWP_FILE_LINE_PAR) throw() = 0;
+ JDWP_FILE_LINE_PAR) {};
+
+ inline void* operator new(size_t size) {
+ return malloc(size);
+ }
+
+ inline void operator delete(void* ptr) {
+ free(ptr);
+ }
};
/**
@@ -106,7 +112,7 @@
* @return Pointer to the allocated memory block.
*/
void* AllocateNoThrow(size_t size
- JDWP_FILE_LINE_PAR) throw();
+ JDWP_FILE_LINE_PAR);
/**
* Allocates the memory block with the given size.
@@ -119,7 +125,7 @@
* <code>OutOfMemoryException</code> is thrown.
*/
void* Allocate(size_t size
- JDWP_FILE_LINE_PAR) throw(AgentException);
+ JDWP_FILE_LINE_PAR) ;
/**
* Reallocates the memory block with the given size over the previously
@@ -133,7 +139,7 @@
* <code>OutOfMemoryException</code> is thrown.
*/
void* Reallocate(void* ptr, size_t oldSize, size_t newSize
- JDWP_FILE_LINE_PAR) throw(AgentException);
+ JDWP_FILE_LINE_PAR);
/**
* Frees the memory block with the given size.
@@ -141,7 +147,7 @@
* @param ptr - the pointer to the allocated memory block
*/
void Free(void* ptr
- JDWP_FILE_LINE_PAR) throw();
+ JDWP_FILE_LINE_PAR);
};
@@ -162,7 +168,7 @@
* @return Pointer to the allocated memory block.
*/
void* AllocateNoThrow(size_t size
- JDWP_FILE_LINE_PAR) throw();
+ JDWP_FILE_LINE_PAR);
/**
* Allocates the memory block with the given size.
@@ -175,7 +181,7 @@
* <code>OutOfMemoryException</code> is thrown.
*/
void* Allocate(size_t size
- JDWP_FILE_LINE_PAR) throw(AgentException);
+ JDWP_FILE_LINE_PAR);
/**
* Reallocates the memory block with the given size over the previously
@@ -189,7 +195,7 @@
* <code>OutOfMemoryException</code> is thrown.
*/
void* Reallocate(void* ptr, size_t oldSize, size_t newSize
- JDWP_FILE_LINE_PAR) throw(AgentException);
+ JDWP_FILE_LINE_PAR);
/**
* Frees the memory block with the given size.
@@ -197,7 +203,7 @@
* @param ptr - the pointer to the allocated memory block
*/
void Free(void* ptr
- JDWP_FILE_LINE_PAR) throw();
+ JDWP_FILE_LINE_PAR);
};
}