public inbox for frysk-cvs@sourceware.org
help / color / mirror / Atom feed
From: cagney@sourceware.org
To: frysk-cvs@sourceware.org
Subject: [SCM]  master: (Re-)implement frysk.sys.poll, fixing JNI failures.
Date: Fri, 20 Jun 2008 21:15:00 -0000	[thread overview]
Message-ID: <20080620211553.2496.qmail@sourceware.org> (raw)

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


                 reply	other threads:[~2008-06-20 21:15 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=20080620211553.2496.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: link
Be 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).