public inbox for frysk-cvs@sourceware.org help / color / mirror / Atom feed
From: cagney@sourceware.org To: frysk-cvs@sourceware.org Subject: [SCM] master: Don't copy FileBytes. Date: Tue, 20 May 2008 18:01:00 -0000 [thread overview] Message-ID: <20080520180123.25285.qmail@sourceware.org> (raw) The branch, master has been updated via e3e3774f9865d9c6e7a94fc53b60ab5c0a5a96aa (commit) from 73d257dda14d543954b156e4b5ecbb20312cc0b0 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email. - Log ----------------------------------------------------------------- commit e3e3774f9865d9c6e7a94fc53b60ab5c0a5a96aa Author: Andrew Cagney <cagney@redhat.com> Date: Tue May 20 13:59:50 2008 -0400 Don't copy FileBytes. frysk-sys/frysk/sys/proc/ChangeLog 2008-05-20 Andrew Cagney <cagney@redhat.com> * jni/Stat.cxx: Delete stray print statements. frysk-sys/jnixx/ChangeLog 2008-05-20 Andrew Cagney <cagney@redhat.com> * elements.hxx (class FileBytes): Add pid/tid method. * elements.cxx (FileBytes::FileBytes): Implement. (slurp): Refactor out of FileBytes constructor; include NUL in length. ----------------------------------------------------------------------- Summary of changes: frysk-sys/frysk/sys/proc/ChangeLog | 2 + frysk-sys/frysk/sys/proc/jni/Stat.cxx | 2 - frysk-sys/jnixx/ChangeLog | 5 ++ frysk-sys/jnixx/elements.cxx | 68 ++++++++++++++++++++++----------- frysk-sys/jnixx/elements.hxx | 1 + 5 files changed, 53 insertions(+), 25 deletions(-) First 500 lines of diff: diff --git a/frysk-sys/frysk/sys/proc/ChangeLog b/frysk-sys/frysk/sys/proc/ChangeLog index dc6accf..a2a3c3a 100644 --- a/frysk-sys/frysk/sys/proc/ChangeLog +++ b/frysk-sys/frysk/sys/proc/ChangeLog @@ -1,5 +1,7 @@ 2008-05-20 Andrew Cagney <cagney@redhat.com> + * jni/Stat.cxx: Delete stray print statements. + * jni/Stat.cxx: Implement. * jni/MapsBuilder.cxx: Implement. diff --git a/frysk-sys/frysk/sys/proc/jni/Stat.cxx b/frysk-sys/frysk/sys/proc/jni/Stat.cxx index d4135bb..df0e85a 100644 --- a/frysk-sys/frysk/sys/proc/jni/Stat.cxx +++ b/frysk-sys/frysk/sys/proc/jni/Stat.cxx @@ -130,9 +130,7 @@ frysk::sys::proc::Stat::scan(jnixx::env env, jint procPid, jint threadTid) { frysk::sys::proc::Stat frysk::sys::proc::Stat::scan(jnixx::env env, jint procPid) { - fprintf(stderr, "opening %d\n", procPid); FileBytes bytes = FileBytes(env, procPid, "stat"); - fprintf(stderr, "elements %s\n", bytes.elements); if (bytes.elements == NULL) return Stat(env, NULL); ::scan(env, (const char*) bytes.elements, *this, GetFine(env)); diff --git a/frysk-sys/jnixx/ChangeLog b/frysk-sys/jnixx/ChangeLog index ed3049d..fb7e090 100644 --- a/frysk-sys/jnixx/ChangeLog +++ b/frysk-sys/jnixx/ChangeLog @@ -1,5 +1,10 @@ 2008-05-20 Andrew Cagney <cagney@redhat.com> + * elements.hxx (class FileBytes): Add pid/tid method. + * elements.cxx (FileBytes::FileBytes): Implement. + (slurp): Refactor out of FileBytes constructor; include NUL in + length. + * scan.hxx: New. * scan.cxx: New. diff --git a/frysk-sys/jnixx/elements.cxx b/frysk-sys/jnixx/elements.cxx index 937609c..65b3315 100644 --- a/frysk-sys/jnixx/elements.cxx +++ b/frysk-sys/jnixx/elements.cxx @@ -101,16 +101,8 @@ chars2strings(::jnixx::env env, char** argv) { return strings; } -FileBytes::FileBytes(jnixx::env env, const char* fmt, ...) { - // Convert the string into a file. - char file[FILENAME_MAX]; - va_list ap; - va_start(ap, fmt); - if (::vsnprintf(file, sizeof file, fmt, ap) >= FILENAME_MAX) { - errnoException(env, errno, "snprintf"); - } - va_end(ap); - +void +slurp(jnixx::env env, FileBytes& bytes, const char* file) { // Attempt to open the file. int fd = ::open(file, O_RDONLY); if (fd < 0) { @@ -124,49 +116,79 @@ FileBytes::FileBytes(jnixx::env env, const char* fmt, ...) { // reads are needed to confirm EOF. Allocating 2&BUFSIZE ensures // that there's always space for at least two reads. Ref SW #3370 jsize allocated = BUFSIZ * 2 + 1; - elements = (jbyte*) ::malloc(allocated); - if (elements == NULL) { + bytes.elements = (jbyte*) ::malloc(allocated); + if (bytes.elements == NULL) { errnoException(env, errno, "malloc"); } - length = 0; + bytes.length = 0; while (true) { // Attempt to fill the remaining buffer; less space for a // terminating NUL character. - int size = ::read(fd, elements + length, allocated - length - 1); + int size = ::read(fd, bytes.elements + bytes.length, + allocated - bytes.length - 1); if (size < 0) { ::close(fd); - release(); + bytes.release(); + // Abandon the read with elements == NULL. return; } else if (size == 0) { break; } - length += size; + bytes.length += size; - if (length + BUFSIZ >= allocated) { + if (bytes.length + BUFSIZ >= allocated) { // Not enough space for the next ~BUFSIZ'd read; expand the // buffer. Don't trust realloc with the pointer; will need to // free the old buffer if something goes wrong. allocated += BUFSIZ; - jbyte *tmp = (jbyte*)::realloc(elements, allocated); + jbyte *tmp = (jbyte*)::realloc(bytes.elements, allocated); if (tmp == NULL) { int err = errno; ::close(fd); - release(); + bytes.release(); errnoException(env, err, "realloc"); } - elements = tmp; + bytes.elements = tmp; } } ::close(fd); // Null terminate the buffer. - elements[length] = '\0'; + bytes.elements[bytes.length] = '\0'; + bytes.length++; // count the trailing NUL } -FileBytes::FileBytes(jnixx::env env, jint pid, const char* name) { - FileBytes(env, "/proc/%d/%s", (int) pid, name); +FileBytes::FileBytes(jnixx::env env, const char* fmt, ...) { + // Convert the string into a file. + char file[FILENAME_MAX]; + va_list ap; + va_start(ap, fmt); + if (::vsnprintf(file, sizeof file, fmt, ap) >= FILENAME_MAX) { + errnoException(env, errno, "vsnprintf"); + } + va_end(ap); + slurp(env, *this, file); +} + +FileBytes::FileBytes(jnixx::env env, int pid, const char* name) { + // Convert the string into a file. + char file[FILENAME_MAX]; + if (::snprintf(file, sizeof file, "/proc/%d/%s", pid, name) >= FILENAME_MAX) { + errnoException(env, errno, "snprintf"); + } + slurp(env, *this, file); +} + +FileBytes::FileBytes(jnixx::env env, int pid, int tid, const char* name) { + // Convert the string into a file. + char file[FILENAME_MAX]; + if (::snprintf(file, sizeof file, "/proc/%d/task/%d/%s", pid, tid, name) + >= FILENAME_MAX) { + errnoException(env, errno, "snprintf"); + } + slurp(env, *this, file); } void diff --git a/frysk-sys/jnixx/elements.hxx b/frysk-sys/jnixx/elements.hxx index ebaad34..28b41f8 100644 --- a/frysk-sys/jnixx/elements.hxx +++ b/frysk-sys/jnixx/elements.hxx @@ -100,6 +100,7 @@ public: FileBytes(jnixx::env, const char* fmt, ...) __attribute__((format(printf, 3, 4))); FileBytes(jnixx::env, int pid, const char* name); + FileBytes(jnixx::env, int pid, int tid, const char* name); void release(); ~FileBytes() { release(); hooks/post-receive -- frysk system monitor/debugger
reply other threads:[~2008-05-20 18:01 UTC|newest] Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20080520180123.25285.qmail@sourceware.org \ --to=cagney@sourceware.org \ --cc=frysk-cvs@sourceware.org \ --cc=frysk@sourceware.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).