The branch, master has been updated via 96412cf7f66a603e6ba048433317aed31c8b1543 (commit) from 75e76209d2bde38c31b45978fcda6aa863547aeb (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email. - Log ----------------------------------------------------------------- commit 96412cf7f66a603e6ba048433317aed31c8b1543 Author: Andrew Cagney <cagney@redhat.com> Date: Fri Jun 20 17:13:03 2008 -0400 (Re-)implement frysk.sys.poll, fixing JNI failures. Number of things: - move frysk.sys.Poll to its own package - make the nexted Poll$Fds class first class - Use FileDescriptor, instead of <<int fd>> in parameters This also fixes the JNI frysk.event failures. frysk-core/frysk/event/ChangeLog 2008-06-20 Andrew Cagney <cagney@redhat.com> * PollEventLoop.java: Update; Poll et.al., moved to frysk.sys.poll. frysk-sys/frysk/sys/ChangeLog 2008-06-20 Andrew Cagney <cagney@redhat.com> * Poll.java: Move to frysk.sys.poll. * PollBuilder.java: Ditto. * jni/Poll.cxx: Ditto. * cni/Poll.cxx: Ditto. frysk-sys/frysk/sys/poll/ChangeLog 2008-06-20 Andrew Cagney <cagney@redhat.com> * Poll.java: Moved from frysk.sys. * PollBuilder.java: Ditto. * jni/Poll.cxx: Ditto. * cni/Poll.cxx: Ditto. * PollFileDescriptors.java: Extract from Poll.java. * jni/PollFileDescriptors.java: Extract from jni/Poll.cxx. * cni/PollFileDescriptors.java: Similar. ----------------------------------------------------------------------- Summary of changes: frysk-core/frysk/event/ChangeLog | 5 + frysk-core/frysk/event/PollEventLoop.java | 13 ++-- frysk-sys/frysk/sys/ChangeLog | 7 ++ frysk-sys/frysk/sys/poll/ChangeLog | 16 ++++ frysk-sys/frysk/sys/{ => poll}/Poll.java | 47 +++++------- frysk-sys/frysk/sys/{ => poll}/PollBuilder.java | 9 ++- .../PollFileDescriptors.java} | 37 ++++++++-- frysk-sys/frysk/sys/{ => poll}/cni/Poll.cxx | 80 +++++--------------- .../cni/PollFileDescriptors.cxx} | 45 +++++++++-- frysk-sys/frysk/sys/{ => poll}/jni/Poll.cxx | 72 ++++-------------- .../jni/PollFileDescriptors.cxx} | 45 +++++++++-- 11 files changed, 198 insertions(+), 178 deletions(-) create mode 100644 frysk-sys/frysk/sys/poll/ChangeLog rename frysk-sys/frysk/sys/{ => poll}/Poll.java (81%) copy frysk-sys/frysk/sys/{ => poll}/PollBuilder.java (92%) copy frysk-sys/frysk/sys/{PollBuilder.java => poll/PollFileDescriptors.java} (71%) rename frysk-sys/frysk/sys/{ => poll}/cni/Poll.cxx (77%) copy frysk-sys/frysk/sys/{PollBuilder.java => poll/cni/PollFileDescriptors.cxx} (67%) rename frysk-sys/frysk/sys/{ => poll}/jni/Poll.cxx (79%) rename frysk-sys/frysk/sys/{PollBuilder.java => poll/jni/PollFileDescriptors.cxx} (66%) First 500 lines of diff: diff --git a/frysk-core/frysk/event/ChangeLog b/frysk-core/frysk/event/ChangeLog index b457707..13ecd79 100644 --- a/frysk-core/frysk/event/ChangeLog +++ b/frysk-core/frysk/event/ChangeLog @@ -1,3 +1,8 @@ +2008-06-20 Andrew Cagney <cagney@redhat.com> + + * PollEventLoop.java: Update; Poll et.al., moved to + frysk.sys.poll. + 2008-05-23 Teresa Thomas <tthomas@redhat.com> * ActionPointEvent.java: New file. diff --git a/frysk-core/frysk/event/PollEventLoop.java b/frysk-core/frysk/event/PollEventLoop.java index 8b841f9..31a09be 100644 --- a/frysk-core/frysk/event/PollEventLoop.java +++ b/frysk-core/frysk/event/PollEventLoop.java @@ -39,8 +39,9 @@ package frysk.event; -import frysk.sys.Poll; -import frysk.sys.PollBuilder; +import frysk.sys.FileDescriptor; +import frysk.sys.poll.Poll; +import frysk.sys.poll.PollBuilder; import frysk.sys.Signal; import frysk.sys.Wait; import frysk.sys.WaitBuilder; @@ -101,10 +102,8 @@ class PollEventLoop extends EventLoop { add (new PollWaitOnSigChild (waitBuilder)); } - private PollBuilder pollObserver = new PollBuilder () - { - public String toString () - { + private PollBuilder pollObserver = new PollBuilder() { + public String toString() { return ("{" + super.toString () + "}"); } public void signal(Signal sig) { @@ -112,7 +111,7 @@ class PollEventLoop extends EventLoop { processSignal (sig); } // Not yet using file descriptors. - public void pollIn (int fd) { + public void pollIn(FileDescriptor fd) { throw new RuntimeException ("should not happen"); } }; diff --git a/frysk-sys/frysk/sys/ChangeLog b/frysk-sys/frysk/sys/ChangeLog index aec7679..30c807d 100644 --- a/frysk-sys/frysk/sys/ChangeLog +++ b/frysk-sys/frysk/sys/ChangeLog @@ -1,3 +1,10 @@ +2008-06-20 Andrew Cagney <cagney@redhat.com> + + * Poll.java: Move to frysk.sys.poll. + * PollBuilder.java: Ditto. + * jni/Poll.cxx: Ditto. + * cni/Poll.cxx: Ditto. + 2008-06-12 Andrew Cagney <cagney@redhat.com> * cni/Errno.cxx (throwUserException): New. diff --git a/frysk-sys/frysk/sys/poll/ChangeLog b/frysk-sys/frysk/sys/poll/ChangeLog new file mode 100644 index 0000000..236b189 --- /dev/null +++ b/frysk-sys/frysk/sys/poll/ChangeLog @@ -0,0 +1,16 @@ +2008-06-20 Andrew Cagney <cagney@redhat.com> + + * Poll.java: Moved from frysk.sys. + * PollBuilder.java: Ditto. + * jni/Poll.cxx: Ditto. + * cni/Poll.cxx: Ditto. + * PollFileDescriptors.java: Extract from Poll.java. + * jni/PollFileDescriptors.java: Extract from jni/Poll.cxx. + * cni/PollFileDescriptors.java: Similar. +\f +Local Variables: +mode: change-log +left-margin: 8 +fill-column: 74 +version-control: never +End: diff --git a/frysk-sys/frysk/sys/Poll.java b/frysk-sys/frysk/sys/poll/Poll.java similarity index 81% rename from frysk-sys/frysk/sys/Poll.java rename to frysk-sys/frysk/sys/poll/Poll.java index 8496fd8..bef9c0a 100644 --- a/frysk-sys/frysk/sys/Poll.java +++ b/frysk-sys/frysk/sys/poll/Poll.java @@ -37,7 +37,10 @@ // version and license this file solely under the GPL without // exception. -package frysk.sys; +package frysk.sys.poll; + +import frysk.sys.SignalSet; +import frysk.sys.Signal; /** * Poll like interface for waiting on kernel events. @@ -49,56 +52,42 @@ package frysk.sys; * methods. */ -public final class Poll -{ +public final class Poll { /** * Set of signals checked during poll. */ static protected SignalSet signalSet = new SignalSet (); - private static native void addSignalHandler (Signal sig); /** * Add Sig to the set of signals checked during poll. */ - public static void add (Signal sig) { + public static void add(Signal sig) { signalSet.add(sig); addSignalHandler(sig); } + private static native void addSignalHandler(Signal sig); /** * Empty the set of signals, and file descriptors, checked during * poll. */ - public static void empty () - { + public static void empty() { // Note that this doesn't restore any signal handlers. signalSet.empty (); } /** - * Manage the file descriptors watched by the poll call. - */ - public static final class Fds { - long fds; - public Fds() { - fds = malloc(); - } - protected void finalize() { - free(fds); - } - private static native long malloc(); - private static native void free(long fds); - public void addPollIn(int fd) { - fds = addPollIn(fds, fd); - } - private static native long addPollIn(long fds, int fd); - } - static protected Fds pollFds = new Fds (); - - /** * Poll the system for either FD, or signal events. Block for * timeout milliseconds (if timeout is +ve or zero), or until the * next event (if timeout is -ve). Return when an event might * have occured. */ - public static native void poll (PollBuilder observer, - long timeout); + public static void poll(PollBuilder observer, long timeout) { + poll(observer, timeout, pollFds.pollFds, pollFds.fds.toArray()); + } + private static native void poll(PollBuilder observer, long timeout, + long pollFds, Object[] fds); + + /** + * Set of pollfdS. + */ + static protected PollFileDescriptors pollFds = new PollFileDescriptors(); } diff --git a/frysk-sys/frysk/sys/PollBuilder.java b/frysk-sys/frysk/sys/poll/PollBuilder.java similarity index 92% copy from frysk-sys/frysk/sys/PollBuilder.java copy to frysk-sys/frysk/sys/poll/PollBuilder.java index 8c13aab..d3f6c3d 100644 --- a/frysk-sys/frysk/sys/PollBuilder.java +++ b/frysk-sys/frysk/sys/poll/PollBuilder.java @@ -1,6 +1,6 @@ // This file is part of the program FRYSK. // -// Copyright 2005, 2007, Red Hat Inc. +// Copyright 2005, 2007, 2008, Red Hat Inc. // // FRYSK is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by @@ -37,12 +37,15 @@ // version and license this file solely under the GPL without // exception. -package frysk.sys; +package frysk.sys.poll; + +import frysk.sys.Signal; +import frysk.sys.FileDescriptor; /** * Notify client of Poll events. */ public interface PollBuilder { void signal(Signal sig); - void pollIn (int fd); + void pollIn(FileDescriptor fd); } diff --git a/frysk-sys/frysk/sys/PollBuilder.java b/frysk-sys/frysk/sys/poll/PollFileDescriptors.java similarity index 71% copy from frysk-sys/frysk/sys/PollBuilder.java copy to frysk-sys/frysk/sys/poll/PollFileDescriptors.java index 8c13aab..0f1380e 100644 --- a/frysk-sys/frysk/sys/PollBuilder.java +++ b/frysk-sys/frysk/sys/poll/PollFileDescriptors.java @@ -1,6 +1,6 @@ // This file is part of the program FRYSK. // -// Copyright 2005, 2007, Red Hat Inc. +// Copyright 2005, 2007, 2008, Red Hat Inc. // // FRYSK is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by @@ -37,12 +37,37 @@ // version and license this file solely under the GPL without // exception. -package frysk.sys; +package frysk.sys.poll; + +import frysk.sys.FileDescriptor; + +import java.util.ArrayList; /** - * Notify client of Poll events. + * Manage the file descriptors watched by the poll call. */ -public interface PollBuilder { - void signal(Signal sig); - void pollIn (int fd); +public class PollFileDescriptors { + long pollFds = malloc(); + private static native long malloc(); + final ArrayList fds = new ArrayList(); + + public PollFileDescriptors() { + } + + protected void finalize() { + free(pollFds); + } + private static native void free(long pollFds); + + public void addPollIn(FileDescriptor fd) { + int i = fds.indexOf(fd); + if (i >= 0) { + setPollIn(pollFds, i); + } else { + fds.add(fd); + pollFds = addPollIn(pollFds, fds.size(), fd.getFd()); + } + } + private static native void setPollIn(long pollFds, int pos); + private static native long addPollIn(long pollFds, int pos, int fd); } diff --git a/frysk-sys/frysk/sys/cni/Poll.cxx b/frysk-sys/frysk/sys/poll/cni/Poll.cxx similarity index 77% rename from frysk-sys/frysk/sys/cni/Poll.cxx rename to frysk-sys/frysk/sys/poll/cni/Poll.cxx index 1cffb92..5d6f367 100644 --- a/frysk-sys/frysk/sys/cni/Poll.cxx +++ b/frysk-sys/frysk/sys/poll/cni/Poll.cxx @@ -52,18 +52,19 @@ _syscall2(int, tkill, pid_t, tid, int, sig); #include <gcj/cni.h> -#include <gnu/gcj/RawDataManaged.h> #include "frysk/sys/cni/Errno.hxx" #include "frysk/sys/ProcessIdentifier.h" +#include "frysk/sys/FileDescriptor.h" #include "frysk/sys/Tid.h" -#include "frysk/sys/Poll.h" #include "frysk/sys/Signal.h" #include "frysk/sys/SignalSet.h" #include "frysk/sys/cni/SignalSet.hxx" -#include "frysk/sys/Poll$Fds.h" -#include "frysk/sys/PollBuilder.h" +#include "frysk/sys/poll/Poll.h" +#include "frysk/sys/poll/PollBuilder.h" +using namespace java::lang; +using namespace frysk::sys::poll; // If there's a signal abort the wait() function using a longjmp (and // return the signal). Should the jmpbuf be per-thread? @@ -96,8 +97,7 @@ handler (int signum, siginfo_t *siginfo, void *context) } void -frysk::sys::Poll::addSignalHandler (frysk::sys::Signal* sig) -{ +Poll::addSignalHandler (frysk::sys::Signal* sig) { int signum = sig->hashCode (); // Make certain that the signal is masked (this is ment to be // process wide). @@ -121,52 +121,12 @@ frysk::sys::Poll::addSignalHandler (frysk::sys::Signal* sig) \f -jlong -frysk::sys::Poll$Fds::malloc() { - // Allocate a non-empty buffer, marked with a sentinel. - struct pollfd* fds = (struct pollfd*) JvMalloc(sizeof (struct pollfd)); - fds->fd = -1; // sentinel - return (jlong)(long) fds; -} - -void -frysk::sys::Poll$Fds::free(jlong fds) { - JvFree((struct pollfd*)(long)fds); -} - -static jlong -addPollFd(jlong pollFds, int fd, short event) { - struct pollfd* ufds = (struct pollfd*) pollFds; - // If the FD is alreay listed, just add the event; end up with a - // count of fds. - int numFds; - for (numFds = 0; ufds[numFds].fd >= 0; numFds++) { - if (ufds[numFds].fd == fd) { - ufds[numFds].events |= event; - return pollFds; - } - } - // Create space for the new fd (and retain space for the sentinel). - ufds = (struct pollfd*) JvRealloc(ufds, (numFds + 2) * sizeof (struct pollfd)); - ufds[numFds + 0].fd = fd; - ufds[numFds + 0].events = event; - ufds[numFds + 1].fd = -1; - return (jlong) (long) ufds; -} - -jlong -frysk::sys::Poll$Fds::addPollIn(jlong fds, jint fd) { - return addPollFd(fds, fd, POLLIN); -} - -\f +#define POLLFDS ((struct pollfd*)pollFds) void -frysk::sys::Poll::poll(frysk::sys::PollBuilder* pollObserver, jlong timeout) { - // Compute the current number of poll fds. - struct pollfd* fds = (struct pollfd*)pollFds->fds; - int numFds; - for (numFds = 0; fds[numFds].fd >= 0; numFds++); +Poll::poll(PollBuilder* pollObserver, jlong timeout, jlong pollFds, + jobjectArray fds) { + int nfds = fds->length; // Set up a SIGSETJMP call that jumps back to here when any watched // signal is delivered. The signals are accumulated in a sigset, @@ -201,12 +161,12 @@ frysk::sys::Poll::poll(frysk::sys::PollBuilder* pollObserver, jlong timeout) { errno = ::pthread_sigmask (SIG_UNBLOCK, &mask, 0); if (errno != 0) throwErrno (errno, "pthread_sigmask.UNBLOCK"); - int status = ::poll (fds, numFds, timeout); + int status = ::poll(POLLFDS, nfds, timeout); if (status < 0) status = -errno; // Save the errno across the next system call. - errno = ::pthread_sigmask (SIG_BLOCK, &mask, NULL); + errno = ::pthread_sigmask(SIG_BLOCK, &mask, NULL); if (errno != 0) - throwErrno (errno, "pthread_sigmask.BLOCK"); + throwErrno(errno, "pthread_sigmask.BLOCK"); // Did something go wrong? if (status < 0) { @@ -214,7 +174,7 @@ frysk::sys::Poll::poll(frysk::sys::PollBuilder* pollObserver, jlong timeout) { case EINTR: break; default: - throwErrno (-status, "poll"); + throwErrno(-status, "poll"); } } @@ -226,20 +186,18 @@ frysk::sys::Poll::poll(frysk::sys::PollBuilder* pollObserver, jlong timeout) { // Find the signal object. frysk::sys::Signal* sig = frysk::sys::Signal::valueOf (i); // Notify the client of the signal. - pollObserver->signal (sig); + pollObserver->signal(sig); } } // Did a file descriptor fire, status when +ve, contains the number // of file descriptors that fired one or more events. - struct pollfd* pollfd = (struct pollfd*) pollFds; - while (status > 0) { - if (pollfd->revents != 0) { - if (pollfd->revents & POLLIN) - pollObserver->pollIn (pollfd->fd); + for (int i = 0; i < nfds && status > 0; i++) { + if (POLLFDS[i].revents != 0) { + if (POLLFDS[i].revents & POLLIN) + pollObserver->pollIn((frysk::sys::FileDescriptor*)(elements(fds)[i])); status--; } - pollfd++; } } diff --git a/frysk-sys/frysk/sys/PollBuilder.java b/frysk-sys/frysk/sys/poll/cni/PollFileDescriptors.cxx similarity index 67% copy from frysk-sys/frysk/sys/PollBuilder.java copy to frysk-sys/frysk/sys/poll/cni/PollFileDescriptors.cxx index 8c13aab..e03424b 100644 --- a/frysk-sys/frysk/sys/PollBuilder.java +++ b/frysk-sys/frysk/sys/poll/cni/PollFileDescriptors.cxx @@ -1,6 +1,6 @@ // This file is part of the program FRYSK. // -// Copyright 2005, 2007, Red Hat Inc. +// Copyright 2005, 2006, 2007, 2008, Red Hat Inc. // // FRYSK is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by @@ -37,12 +37,41 @@ // version and license this file solely under the GPL without // exception. -package frysk.sys; +#include <poll.h> -/** - * Notify client of Poll events. - */ -public interface PollBuilder { - void signal(Signal sig); - void pollIn (int fd); +#include <gcj/cni.h> + +#include "frysk/sys/FileDescriptor.h" +#include "frysk/sys/poll/PollFileDescriptors.h" + +using namespace java::lang; +using namespace frysk::sys::poll; + +#define POLLFDS ((struct pollfd*)pollFds) + +jlong +PollFileDescriptors::malloc() { + // Allocate a non-empty buffer, marked with a sentinel. + struct pollfd* pollFds = (struct pollfd*) JvMalloc(sizeof (struct pollfd)); + return (jlong)(long)pollFds; +} + +void +PollFileDescriptors::free(jlong pollFds) { + JvFree(POLLFDS); +} + +void +PollFileDescriptors::setPollIn(jlong pollFds, jint pos) { + POLLFDS[pos].events |= POLLIN; +} + +jlong +PollFileDescriptors::addPollIn(jlong pollFds, jint pos, jint fd) { + // Create space for the new fd (and retain space for the sentinel). + struct pollfd* ufds + = (struct pollfd*) JvRealloc(POLLFDS, (pos + 1)*sizeof (struct pollfd)); + ufds[pos].fd = fd; + ufds[pos].events = POLLIN; + return (jlong) (long) ufds; } diff --git a/frysk-sys/frysk/sys/jni/Poll.cxx b/frysk-sys/frysk/sys/poll/jni/Poll.cxx similarity index 79% rename from frysk-sys/frysk/sys/jni/Poll.cxx rename to frysk-sys/frysk/sys/poll/jni/Poll.cxx index a0f0eaa..85950c0 100644 --- a/frysk-sys/frysk/sys/jni/Poll.cxx +++ b/frysk-sys/frysk/sys/poll/jni/Poll.cxx @@ -58,7 +58,7 @@ #include "frysk/sys/jni/SignalSet.hxx" using namespace java::lang; -using namespace frysk::sys; +using namespace frysk::sys::poll; // If there's a signal abort the wait() function using a longjmp (and // return the signal). Should the jmpbuf be per-thread? @@ -114,52 +114,12 @@ Poll::addSignalHandler(jnixx::env env, Signal sig) { hooks/post-receive -- frysk system monitor/debugger