public inbox for frysk-cvs@sourceware.org
help / color / mirror / Atom feed
* [SCM]  master: (Re-)implement frysk.sys.poll, fixing JNI failures.
@ 2008-06-20 21:15 cagney
  0 siblings, 0 replies; only message in thread
From: cagney @ 2008-06-20 21:15 UTC (permalink / raw)
  To: frysk-cvs

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


^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2008-06-20 21:15 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2008-06-20 21:15 [SCM] master: (Re-)implement frysk.sys.poll, fixing JNI failures cagney

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).