From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 2537 invoked by alias); 20 Jun 2008 21:15:54 -0000 Received: (qmail 2511 invoked by uid 367); 20 Jun 2008 21:15:53 -0000 Date: Fri, 20 Jun 2008 21:15:00 -0000 Message-ID: <20080620211553.2496.qmail@sourceware.org> From: cagney@sourceware.org To: frysk-cvs@sourceware.org Subject: [SCM] master: (Re-)implement frysk.sys.poll, fixing JNI failures. X-Git-Refname: refs/heads/master X-Git-Reftype: branch X-Git-Oldrev: 75e76209d2bde38c31b45978fcda6aa863547aeb X-Git-Newrev: 96412cf7f66a603e6ba048433317aed31c8b1543 Mailing-List: contact frysk-cvs-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Post: List-Help: , Sender: frysk-cvs-owner@sourceware.org Reply-To: frysk@sourceware.org X-SW-Source: 2008-q2/txt/msg00395.txt.bz2 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 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 <> in parameters This also fixes the JNI frysk.event failures. frysk-core/frysk/event/ChangeLog 2008-06-20 Andrew Cagney * PollEventLoop.java: Update; Poll et.al., moved to frysk.sys.poll. frysk-sys/frysk/sys/ChangeLog 2008-06-20 Andrew Cagney * 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 * 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 + + * PollEventLoop.java: Update; Poll et.al., moved to + frysk.sys.poll. + 2008-05-23 Teresa Thomas * 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 + + * Poll.java: Move to frysk.sys.poll. + * PollBuilder.java: Ditto. + * jni/Poll.cxx: Ditto. + * cni/Poll.cxx: Ditto. + 2008-06-12 Andrew Cagney * 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 + + * 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. + +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 -#include #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) -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); -} - - +#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 -/** - * Notify client of Poll events. - */ -public interface PollBuilder { - void signal(Signal sig); - void pollIn (int fd); +#include + +#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