The branch, master has been updated via 5d97469db26f702cc28746e00e1022a7588d1ae6 (commit) from 3e3394b67b6c1dcb5bce4216bedc5f363d287263 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email. - Log ----------------------------------------------------------------- commit 5d97469db26f702cc28746e00e1022a7588d1ae6 Author: Andrew Cagney <cagney@redhat.com> Date: Sun May 25 17:48:29 2008 -0400 Rename ArrayBytes -> jbyteArrayElements, define jlongArrayElements et.al. frysk-sys/frysk/sys/ChangeLog 2008-05-25 Andrew Cagney <cagney@redhat.com> * jni/FileDescriptor.cxx: Use jbyteArrayElements / jstringUTFChars. * jni/AuditLibs.cxx: Ditto. * jni/StatelessFile.cxx: Ditto * jni/Signal.cxx-sh: Ditto * jni/Fork.hxx: Ditto. * jni/PseudoTerminal.cxx: Ditto. frysk-sys/frysk/sys/proc/ChangeLog 2008-05-25 Andrew Cagney <cagney@redhat.com> * jni/CmdLineBuilder.cxx: Use jbyteArrayElements. * jni/Status.cxx: Ditto. * jni/Stat.cxx: Ditto. * jni/MapsBuilder.cxx: Ditto. frysk-sys/frysk/sys/ptrace/ChangeLog 2008-05-25 Andrew Cagney <cagney@redhat.com> * jni/AddressSpace.cxx: Use jbyteArrayElements. * jni/RegisterSet.cxx: Ditto. frysk-sys/jnixx/ChangeLog 2008-05-25 Andrew Cagney <cagney@redhat.com> * elements.hxx (jbyteArrayElements): Rename ArrayBytes. (jlongArrayElements): Define. (jstringUTFChars): Replace StringChars. * jni/Native.cxx: Update. ----------------------------------------------------------------------- Summary of changes: frysk-sys/frysk/sys/ChangeLog | 9 +++ frysk-sys/frysk/sys/jni/AuditLibs.cxx | 2 +- frysk-sys/frysk/sys/jni/FileDescriptor.cxx | 6 +- frysk-sys/frysk/sys/jni/Fork.cxx | 12 ++-- frysk-sys/frysk/sys/jni/Fork.hxx | 4 +- frysk-sys/frysk/sys/jni/PseudoTerminal.cxx | 4 +- frysk-sys/frysk/sys/jni/Signal.cxx-sh | 2 +- frysk-sys/frysk/sys/jni/StatelessFile.cxx | 8 +- frysk-sys/frysk/sys/proc/ChangeLog | 7 ++ frysk-sys/frysk/sys/proc/jni/AuxvBuilder.cxx | 2 +- frysk-sys/frysk/sys/proc/jni/CmdLineBuilder.cxx | 2 +- frysk-sys/frysk/sys/proc/jni/MapsBuilder.cxx | 4 +- frysk-sys/frysk/sys/proc/jni/Stat.cxx | 2 +- frysk-sys/frysk/sys/proc/jni/Status.cxx | 2 +- frysk-sys/frysk/sys/ptrace/ChangeLog | 5 ++ frysk-sys/frysk/sys/ptrace/jni/AddressSpace.cxx | 2 +- frysk-sys/frysk/sys/ptrace/jni/RegisterSet.cxx | 2 +- frysk-sys/jnixx/ChangeLog | 5 ++ frysk-sys/jnixx/elements.hxx | 83 +++++++++++------------ frysk-sys/jnixx/jni/Native.cxx | 8 +- 20 files changed, 97 insertions(+), 74 deletions(-) First 500 lines of diff: diff --git a/frysk-sys/frysk/sys/ChangeLog b/frysk-sys/frysk/sys/ChangeLog index c6c850e..d26ad79 100644 --- a/frysk-sys/frysk/sys/ChangeLog +++ b/frysk-sys/frysk/sys/ChangeLog @@ -1,3 +1,12 @@ +2008-05-25 Andrew Cagney <cagney@redhat.com> + + * jni/FileDescriptor.cxx: Use jbyteArrayElements / jstringUTFChars. + * jni/AuditLibs.cxx: Ditto. + * jni/StatelessFile.cxx: Ditto + * jni/Signal.cxx-sh: Ditto + * jni/Fork.hxx: Ditto. + * jni/PseudoTerminal.cxx: Ditto. + 2008-05-24 Andrew Cagney <cagney@redhat.com> * jni/FileDescriptor.cxx: Update; byteArray -> jbyteArray. diff --git a/frysk-sys/frysk/sys/jni/AuditLibs.cxx b/frysk-sys/frysk/sys/jni/AuditLibs.cxx index 9614942..fb0cda7 100644 --- a/frysk-sys/frysk/sys/jni/AuditLibs.cxx +++ b/frysk-sys/frysk/sys/jni/AuditLibs.cxx @@ -60,6 +60,6 @@ frysk::sys::AuditLibs::syscallToName(jnixx::env env, jint syscall, jint frysk::sys::AuditLibs::nameToSyscall(jnixx::env env, String name, jint machine) { - StringChars syscall_name = StringChars(env, name); + jstringUTFChars syscall_name = jstringUTFChars(env, name); return audit_name_to_syscall(syscall_name.elements(), machine); } diff --git a/frysk-sys/frysk/sys/jni/FileDescriptor.cxx b/frysk-sys/frysk/sys/jni/FileDescriptor.cxx index 0c33fd4..b831562 100644 --- a/frysk-sys/frysk/sys/jni/FileDescriptor.cxx +++ b/frysk-sys/frysk/sys/jni/FileDescriptor.cxx @@ -85,7 +85,7 @@ FileDescriptor::write(jnixx::env env, jint fd, { verifyBounds(env, bytes, off, len); errno = 0; - ArrayBytes b = ArrayBytes(env, bytes); + jbyteArrayElements b = jbyteArrayElements(env, bytes); int size = ::write(fd, b.elements() + off, len); int err = errno; // ::fprintf (stderr, "wrote <<%c>>\n", (char) b); @@ -152,7 +152,7 @@ FileDescriptor::read(jnixx::env env, jint fd, jnixx::jbyteArray bytes, jint off, jint len) { verifyBounds(env, bytes, off, len); - ArrayBytes b = ArrayBytes(env, bytes); + jbyteArrayElements b = jbyteArrayElements(env, bytes); jint ok = doRead(env, fd, b.elements() + off, len); b.release(); return ok; @@ -181,7 +181,7 @@ FileDescriptor::creat(jnixx::env) { jint FileDescriptor::open(jnixx::env env, String file, jint flags, jint mode) { // ::fprintf ("opening <<%s>>\n", pathname); - StringChars pathname = StringChars(env, file); + jstringUTFChars pathname = jstringUTFChars(env, file); int fd = ::open(pathname.elements(), flags, mode); if (fd < 0) { errnoException(env, errno, "open", "file %s", pathname.elements()); diff --git a/frysk-sys/frysk/sys/jni/Fork.cxx b/frysk-sys/frysk/sys/jni/Fork.cxx index 0eeefe3..561ffe6 100644 --- a/frysk-sys/frysk/sys/jni/Fork.cxx +++ b/frysk-sys/frysk/sys/jni/Fork.cxx @@ -141,17 +141,17 @@ private: ::_exit(errno); } } - StringChars in; - StringChars out; - StringChars err; + jstringUTFChars in; + jstringUTFChars out; + jstringUTFChars err; const char* inElements; const char* outElements; const char* errElements; public: redirect_stdio(jnixx::env env, String in, String out, String err) { - this->in = StringChars(env, in); - this->out = StringChars(env, out); - this->err = StringChars(env, err); + this->in = jstringUTFChars(env, in); + this->out = jstringUTFChars(env, out); + this->err = jstringUTFChars(env, err); // allocate memory for the arrays before the fork. inElements = this->in.elements(); outElements = this->out.elements(); diff --git a/frysk-sys/frysk/sys/jni/Fork.hxx b/frysk-sys/frysk/sys/jni/Fork.hxx index b64feb2..2b78775 100644 --- a/frysk-sys/frysk/sys/jni/Fork.hxx +++ b/frysk-sys/frysk/sys/jni/Fork.hxx @@ -80,7 +80,7 @@ public: * exec the specified program. */ class exec_program : public exec { - StringChars exe; + jstringUTFChars exe; const char* exeElements; StringArrayChars argv; char** argvElements; @@ -88,7 +88,7 @@ class exec_program : public exec { public: exec_program(jnixx::env env, java::lang::String exe, jnixx::array<java::lang::String> args, jlong environ) { - this->exe = StringChars(env, exe); + this->exe = jstringUTFChars(env, exe); this->argv = StringArrayChars(env, args); this->environ = (char**)(long)environ; // allocate the exec strings before the fork diff --git a/frysk-sys/frysk/sys/jni/PseudoTerminal.cxx b/frysk-sys/frysk/sys/jni/PseudoTerminal.cxx index 4118ba9..c3eee94 100644 --- a/frysk-sys/frysk/sys/jni/PseudoTerminal.cxx +++ b/frysk-sys/frysk/sys/jni/PseudoTerminal.cxx @@ -89,11 +89,11 @@ frysk::sys::PseudoTerminal::getName(jnixx::env env, jint fd) { } class redirect_tty : public redirect { - StringChars pty; + jstringUTFChars pty; const char* ptyElements; public: redirect_tty(jnixx::env env, String name) { - pty = StringChars(env, name); + pty = jstringUTFChars(env, name); ptyElements = pty.elements(); } ~redirect_tty() { diff --git a/frysk-sys/frysk/sys/jni/Signal.cxx-sh b/frysk-sys/frysk/sys/jni/Signal.cxx-sh index f9744ce..cd03ccd 100644 --- a/frysk-sys/frysk/sys/jni/Signal.cxx-sh +++ b/frysk-sys/frysk/sys/jni/Signal.cxx-sh @@ -71,7 +71,7 @@ frysk::sys::Signal::tkill(::jnixx::env env, jint tid, jint sig, ::java::lang::String name) { errno = 0; if (::syscall(__NR_tkill, tid, sig) < 0) { - StringChars sname = StringChars(env, name); + jstringUTFChars sname = jstringUTFChars(env, name); errnoException(env, errno, "tkill", "task %d, signal %s (%d)", tid, sname.elements(), sig); sname.release(); // happens during unwind diff --git a/frysk-sys/frysk/sys/jni/StatelessFile.cxx b/frysk-sys/frysk/sys/jni/StatelessFile.cxx index 489c4b4..d2dc7b0 100644 --- a/frysk-sys/frysk/sys/jni/StatelessFile.cxx +++ b/frysk-sys/frysk/sys/jni/StatelessFile.cxx @@ -58,7 +58,7 @@ frysk::sys::StatelessFile::pread(jnixx::env env, jlong fileOffset, jint start, jint length) { verifyBounds(env, bytes, start, length); - ArrayBytes unixPath = ArrayBytes(env, GetUnixPath(env)); + jbyteArrayElements unixPath = jbyteArrayElements(env, GetUnixPath(env)); int fd = ::open((const char *)unixPath.elements(), O_RDONLY); if (fd < 0) errnoException(env, errno, "open", "filename %s", @@ -66,7 +66,7 @@ frysk::sys::StatelessFile::pread(jnixx::env env, jlong fileOffset, unixPath.release(); // XXX: 64-bit? - ArrayBytes buffer = ArrayBytes(env, bytes); + jbyteArrayElements buffer = jbyteArrayElements(env, bytes); ssize_t rc = ::pread64 (fd, start + buffer.elements(), length, fileOffset); if (rc < 0) { int savedErrno = errno; @@ -86,7 +86,7 @@ frysk::sys::StatelessFile::pwrite(jnixx::env env, jlong fileOffset, jint start, jint length) { verifyBounds (env, bytes, start, length); - ArrayBytes unixPath = ArrayBytes(env, GetUnixPath(env)); + jbyteArrayElements unixPath = jbyteArrayElements(env, GetUnixPath(env)); int fd = ::open((const char *)unixPath.elements(), O_WRONLY); if (fd < 0) errnoException(env, errno, "open", "filename %s", @@ -94,7 +94,7 @@ frysk::sys::StatelessFile::pwrite(jnixx::env env, jlong fileOffset, unixPath.release(); // XXX: 64-bit? - ArrayBytes buffer = ArrayBytes(env, bytes); + jbyteArrayElements buffer = jbyteArrayElements(env, bytes); ssize_t rc = ::pwrite64 (fd, start + buffer.elements(), length, fileOffset); if (rc < 0) { int savedErrno = errno; diff --git a/frysk-sys/frysk/sys/proc/ChangeLog b/frysk-sys/frysk/sys/proc/ChangeLog index b6047f9..9873ddd 100644 --- a/frysk-sys/frysk/sys/proc/ChangeLog +++ b/frysk-sys/frysk/sys/proc/ChangeLog @@ -1,3 +1,10 @@ +2008-05-25 Andrew Cagney <cagney@redhat.com> + + * jni/CmdLineBuilder.cxx: Use jbyteArrayElements. + * jni/Status.cxx: Ditto. + * jni/Stat.cxx: Ditto. + * jni/MapsBuilder.cxx: Ditto. + 2008-05-24 Andrew Cagney <cagney@redhat.com> * jni/AuxvBuilder.cxx: Update; byteArray -> jbyteArray. diff --git a/frysk-sys/frysk/sys/proc/jni/AuxvBuilder.cxx b/frysk-sys/frysk/sys/proc/jni/AuxvBuilder.cxx index b90a1ba..ef013aa 100644 --- a/frysk-sys/frysk/sys/proc/jni/AuxvBuilder.cxx +++ b/frysk-sys/frysk/sys/proc/jni/AuxvBuilder.cxx @@ -193,7 +193,7 @@ AuxvBuilder::construct(jnixx::env env, jint pid) { bool AuxvBuilder::construct(jnixx::env env, jnixx::jbyteArray buf) { - ArrayBytes bytes = ArrayBytes(env, buf); + jbyteArrayElements bytes = jbyteArrayElements(env, buf); bool ok = ::construct(env, *this, bytes); bytes.release(); return ok; diff --git a/frysk-sys/frysk/sys/proc/jni/CmdLineBuilder.cxx b/frysk-sys/frysk/sys/proc/jni/CmdLineBuilder.cxx index 98cec61..cb0b1ec 100644 --- a/frysk-sys/frysk/sys/proc/jni/CmdLineBuilder.cxx +++ b/frysk-sys/frysk/sys/proc/jni/CmdLineBuilder.cxx @@ -85,7 +85,7 @@ frysk::sys::proc::CmdLineBuilder::construct(jnixx::env env, jint pid) { bool frysk::sys::proc::CmdLineBuilder::construct(jnixx::env env, jnixx::jbyteArray buf) { - ArrayBytes bytes = ArrayBytes(env, buf); + jbyteArrayElements bytes = jbyteArrayElements(env, buf); bool ok = ::construct(env, this, bytes); bytes.release(); return ok; diff --git a/frysk-sys/frysk/sys/proc/jni/MapsBuilder.cxx b/frysk-sys/frysk/sys/proc/jni/MapsBuilder.cxx index b8d00d3..ddea631 100644 --- a/frysk-sys/frysk/sys/proc/jni/MapsBuilder.cxx +++ b/frysk-sys/frysk/sys/proc/jni/MapsBuilder.cxx @@ -102,7 +102,7 @@ construct(jnixx::env env, frysk::sys::proc::MapsBuilder* builder, Bytes& buf) { bool frysk::sys::proc::MapsBuilder::construct(jnixx::env env, jnixx::jbyteArray buf) { - ArrayBytes bytes = ArrayBytes(env, buf); + jbyteArrayElements bytes = jbyteArrayElements(env, buf); bool ok = ::construct(env, this, bytes); bytes.release(); return ok; @@ -115,7 +115,7 @@ frysk::sys::proc::MapsBuilder::construct(jnixx::env env, jint pid) { return false; { jnixx::jbyteArray array = jnixx::jbyteArray::NewByteArray(env, bytes.length()); - ArrayBytes b = ArrayBytes(env, array); + jbyteArrayElements b = jbyteArrayElements(env, array); memcpy(b.elements(), bytes.elements(), bytes.length()); b.release(); buildBuffer(env, array); diff --git a/frysk-sys/frysk/sys/proc/jni/Stat.cxx b/frysk-sys/frysk/sys/proc/jni/Stat.cxx index f7e675f..44129b4 100644 --- a/frysk-sys/frysk/sys/proc/jni/Stat.cxx +++ b/frysk-sys/frysk/sys/proc/jni/Stat.cxx @@ -140,7 +140,7 @@ frysk::sys::proc::Stat::scan(jnixx::env env, jint procPid) { frysk::sys::proc::Stat frysk::sys::proc::Stat::scan(jnixx::env env, jnixx::jbyteArray buf) { - ArrayBytes bytes = ArrayBytes(env, buf); + jbyteArrayElements bytes = jbyteArrayElements(env, buf); ::scan(env, (const char*) bytes.elements(), *this, GetFine(env)); bytes.release(); return *this; diff --git a/frysk-sys/frysk/sys/proc/jni/Status.cxx b/frysk-sys/frysk/sys/proc/jni/Status.cxx index 4bb296f..8bcf600 100644 --- a/frysk-sys/frysk/sys/proc/jni/Status.cxx +++ b/frysk-sys/frysk/sys/proc/jni/Status.cxx @@ -124,7 +124,7 @@ Status::scan(jnixx::env env, jint pid) { Status Status::scan(jnixx::env env, jnixx::jbyteArray buf) { - ArrayBytes bytes = ArrayBytes(env, buf); + jbyteArrayElements bytes = jbyteArrayElements(env, buf); Status s = ::scan(env, (const char*)bytes.elements(), *this, GetFine(env)); bytes.release(); return s; diff --git a/frysk-sys/frysk/sys/ptrace/ChangeLog b/frysk-sys/frysk/sys/ptrace/ChangeLog index 0121fe7..9484163 100644 --- a/frysk-sys/frysk/sys/ptrace/ChangeLog +++ b/frysk-sys/frysk/sys/ptrace/ChangeLog @@ -1,3 +1,8 @@ +2008-05-25 Andrew Cagney <cagney@redhat.com> + + * jni/AddressSpace.cxx: Use jbyteArrayElements. + * jni/RegisterSet.cxx: Ditto. + 2008-05-24 Andrew Cagney <cagney@redhat.com> * jni/AddressSpace.cxx: Update; byteArray -> jbyteArray. diff --git a/frysk-sys/frysk/sys/ptrace/jni/AddressSpace.cxx b/frysk-sys/frysk/sys/ptrace/jni/AddressSpace.cxx index 0d3c666..598d8cc 100644 --- a/frysk-sys/frysk/sys/ptrace/jni/AddressSpace.cxx +++ b/frysk-sys/frysk/sys/ptrace/jni/AddressSpace.cxx @@ -147,7 +147,7 @@ frysk::sys::ptrace::AddressSpace::transfer(::jnixx::env env, } // extract or modify - ArrayBytes bytes = ArrayBytes(env, byteArray); + jbyteArrayElements bytes = jbyteArrayElements(env, byteArray); if (op == ptPeek) memcpy(offset + i + bytes.elements(), &w.b[woff], wlen); else { diff --git a/frysk-sys/frysk/sys/ptrace/jni/RegisterSet.cxx b/frysk-sys/frysk/sys/ptrace/jni/RegisterSet.cxx index e22ab3c..d8fe8ca 100644 --- a/frysk-sys/frysk/sys/ptrace/jni/RegisterSet.cxx +++ b/frysk-sys/frysk/sys/ptrace/jni/RegisterSet.cxx @@ -55,7 +55,7 @@ frysk::sys::ptrace::RegisterSet::transfer(::jnixx::env env, ::jnixx::jbyteArray data, jint length) { verifyBounds(env, data, length); - ArrayBytes bytes = ArrayBytes(env, data); + jbyteArrayElements bytes = jbyteArrayElements(env, data); ptraceOp(env, op, pid, NULL, (long) bytes.elements()); bytes.release(); } diff --git a/frysk-sys/jnixx/ChangeLog b/frysk-sys/jnixx/ChangeLog index d59e3b2..4cc0ec7 100644 --- a/frysk-sys/jnixx/ChangeLog +++ b/frysk-sys/jnixx/ChangeLog @@ -1,5 +1,10 @@ 2008-05-25 Andrew Cagney <cagney@redhat.com> + * elements.hxx (jbyteArrayElements): Rename ArrayBytes. + (jlongArrayElements): Define. + (jstringUTFChars): Replace StringChars. + * jni/Native.cxx: Update. + * JniBindings.java: Generate GetArrayElements and ReleaesArrayElements as aliases for Get<primitive>ArrayElements et.al. diff --git a/frysk-sys/jnixx/elements.hxx b/frysk-sys/jnixx/elements.hxx index bafbb51..75f137f 100644 --- a/frysk-sys/jnixx/elements.hxx +++ b/frysk-sys/jnixx/elements.hxx @@ -51,48 +51,6 @@ extern char** strings2chars(::jnixx::env, ::jnixx::array<java::lang::String>); extern ::jnixx::array<java::lang::String> chars2strings(::jnixx::env, char**); extern void slurp(::jnixx::env, const char[], jbyte* (&), jsize&); -class StringChars { -private: - ::java::lang::String string; - ::jnixx::env env; - const char* p; -public: - void operator=(const StringChars& src) { - this->env = src.env; - this->string = src.string; - // Avoid double references by not copying P. - this->p = NULL; - } - StringChars() { - this->p = NULL; - } - StringChars(const StringChars& old) { - this->operator=(old); - } - StringChars(::jnixx::env env, ::java::lang::String string) { - this->env = env; - this->string = string; - this->p = NULL; - } - const char* elements() { - if (p == NULL) { - if (string != NULL) { - this->p = string.GetStringUTFChars(env); - } - } - return p; - } - void release() { - if (p != NULL) { - string.ReleaseStringUTFChars(env, p); - p = NULL; - } - } - ~StringChars() { - release(); - } -}; - class StringArrayChars { private: ::jnixx::env env; @@ -197,6 +155,44 @@ public: typedef Elements<jbyte> Bytes; /** + * Scratch UTF Chars. + */ +class jstringUTFChars : public Elements<const char> { +private: + ::java::lang::String string; +public: + void operator=(const jstringUTFChars& src) { + this->copy(src); + this->string = src.string; + } + jstringUTFChars() { + } + jstringUTFChars(const jstringUTFChars& old) { + this->operator=(old); + } + jstringUTFChars(::jnixx::env env, ::java::lang::String string) + : Elements<const char>(env) { + this->string = string; + } + void slurp(jnixx::env& env, const char* (&buf), jsize &len) { + if (string == NULL) { + buf = NULL; + len = 0; + } else { + buf = string.GetStringUTFChars(env); + len = ::strlen(buf); + } + } + void free(jnixx::env& env, const char* buf, int mode) { + string.ReleaseStringUTFChars(env, buf); + } + ~jstringUTFChars() { + release(); + } +}; + + +/** * A scratch buffer containing the file's entire contents; the buffer * is recovered once this goes out of scope. */ @@ -292,6 +288,7 @@ protected: types.ReleaseArrayElements(env, buf, mode); } }; -typedef ArrayElements<jbyte,::jnixx::jbyteArray> ArrayBytes; +typedef ArrayElements<jbyte,::jnixx::jbyteArray> jbyteArrayElements; +typedef ArrayElements<jlong,::jnixx::jlongArray> jlongArrayElements; #endif diff --git a/frysk-sys/jnixx/jni/Native.cxx b/frysk-sys/jnixx/jni/Native.cxx index c207cce..646aee4 100644 --- a/frysk-sys/jnixx/jni/Native.cxx +++ b/frysk-sys/jnixx/jni/Native.cxx @@ -97,9 +97,9 @@ jnixx::Native::catchRuntimeException(jnixx::env env, jnixx::Native e) { } static void -throwCopy(jnixx::env env, int n, StringChars stringChars, +throwCopy(jnixx::env env, int n, jstringUTFChars stringChars, StringArrayChars stringArrayChars, - ArrayBytes arrayBytes) { + jbyteArrayElements arrayBytes) { if (n <= 0) { java::lang::RuntimeException::ThrowNew(env, "oops!"); } else { @@ -114,8 +114,8 @@ void jnixx::Native::throwElements(jnixx::env env, String string, jnixx::array<String> stringArray, jnixx::jbyteArray bytes) { - StringChars stringChars = StringChars(env, string); + jstringUTFChars stringChars = jstringUTFChars(env, string); StringArrayChars stringArrayChars = StringArrayChars(env, stringArray); - ArrayBytes arrayBytes = ArrayBytes(env, bytes); + jbyteArrayElements arrayBytes = jbyteArrayElements(env, bytes); throwCopy(env, 4, stringChars, stringArrayChars, arrayBytes); } hooks/post-receive -- frysk system monitor/debugger