PatchSet 4001 Date: 2003/08/31 17:16:47 Author: guilhem Branch: HEAD Tag: (none) Log: Various fixes.
Noticeable changes: Reimplementation of deleteOnExit (missing in classpath) Removed SoInterrupt because it is wrong. Implemented fsync for pthreads. Members: ChangeLog:1.1597->1.1598 include/Makefile.am:1.47->1.48 include/Makefile.in:1.119->1.120 kaffe/kaffevm/systems/unix-pthreads/syscalls.c:1.14->1.15 libraries/clib/io/File.c:1.20->1.21 libraries/clib/io/FileDescriptor.c:1.5->1.6 libraries/clib/net/NetworkInterface.c:1.2->1.3 libraries/clib/net/PlainDatagramSocketImpl.c:1.27->1.28 libraries/clib/net/PlainSocketImpl.c:1.31->1.32 libraries/javalib/java/io/File.java:1.35->1.36 libraries/javalib/java/lang/Runtime.java:1.25->1.26 libraries/javalib/java/lang/Thread.java:1.42->1.43 test/regression/Makefile.am:1.81->1.82 test/regression/Makefile.in:1.134->1.135 test/regression/SoInterrupt.java:1.5->1.6(DEAD) Index: kaffe/ChangeLog diff -u kaffe/ChangeLog:1.1597 kaffe/ChangeLog:1.1598 --- kaffe/ChangeLog:1.1597 Sat Aug 30 23:57:08 2003 +++ kaffe/ChangeLog Sun Aug 31 17:16:47 2003 @@ -1,3 +1,36 @@ +2003-08-31 Guilhem Lavaux <[EMAIL PROTECTED]> + + * kaffe/kaffevm/systems/unix-pthreads/syscalls.c: + (jthreadedFSync) added. + (Kaffe_SystemCallInterface) added jthreadedFSync. + + * libraries/clib/net/PlainDatagramSocketImpl.c: + (java_net_PlainDatagramSocketImpl_receive) check if pkt is NULL + and throw NullPointerException if it is the case. + Changed the way EINTR is handled (it must be ignored). + ETIMEDOUT throws a better exception with bytesTransferred set to + the right value. + + * libraries/clib/net/PlainSocketImpl.c: + (java_net_PlainSocketImpl_receive) see above for the changed behaviour. + (java_net_PlainSocketImpl_accept) EINTR is now ignored. + + * libraries/clib/io/File.c: + (java_io_File_listInternal) check whether the pointer is null. + + * libraries/clib/io/FileDescriptor.c: + (getFileSize) don't return an error if there isn't. + + * include/Makefile.am: + (NOINSTALL_DERIVED_HDRS) added java_io_InterruptedIOException.h + + * test/regression/SoInterrupt.java: removed. This test was a + non-sense from the beginning to the end. + + * test/regression/Makefile.am: removed SoInterrupt.java + + * test/regression/Makefile.in: regenerated. + 2003-08-30 Timothy S. Stack <[EMAIL PROTECTED]> * include/jni.h, include/jvmpi.h: Index: kaffe/include/Makefile.am diff -u kaffe/include/Makefile.am:1.47 kaffe/include/Makefile.am:1.48 --- kaffe/include/Makefile.am:1.47 Sat Aug 30 14:18:23 2003 +++ kaffe/include/Makefile.am Sun Aug 31 17:16:48 2003 @@ -47,6 +47,7 @@ java_io_FileInputStream.h \ java_io_FileOutputStream.h \ java_io_InputStream.h \ + java_io_InterruptedIOException.h \ java_io_ObjectInputStream.h \ java_io_PrintStream.h \ java_io_RandomAccessFile.h \ Index: kaffe/include/Makefile.in diff -u kaffe/include/Makefile.in:1.119 kaffe/include/Makefile.in:1.120 --- kaffe/include/Makefile.in:1.119 Sat Aug 30 14:18:23 2003 +++ kaffe/include/Makefile.in Sun Aug 31 17:16:48 2003 @@ -282,6 +282,7 @@ java_io_FileInputStream.h \ java_io_FileOutputStream.h \ java_io_InputStream.h \ + java_io_InterruptedIOException.h \ java_io_ObjectInputStream.h \ java_io_PrintStream.h \ java_io_RandomAccessFile.h \ Index: kaffe/kaffe/kaffevm/systems/unix-pthreads/syscalls.c diff -u kaffe/kaffe/kaffevm/systems/unix-pthreads/syscalls.c:1.14 kaffe/kaffe/kaffevm/systems/unix-pthreads/syscalls.c:1.15 --- kaffe/kaffe/kaffevm/systems/unix-pthreads/syscalls.c:1.14 Fri Aug 8 14:38:25 2003 +++ kaffe/kaffe/kaffevm/systems/unix-pthreads/syscalls.c Sun Aug 31 17:16:48 2003 @@ -249,6 +249,17 @@ } static int +jthreadedFSync(int fd) +{ + int rc = 0; + + if (fsync(fd) == -1) { + rc = errno; + } + return (rc); +} + +static int jthreadedMkdir(const char *path, int mode) { int rc = 0; @@ -880,6 +891,7 @@ jthreadedFStat, jthreadedStat, jthreadedFTruncate, + jthreadedFSync, jthreadedMkdir, jthreadedRmdir, jthreadedRename, Index: kaffe/libraries/clib/io/File.c diff -u kaffe/libraries/clib/io/File.c:1.20 kaffe/libraries/clib/io/File.c:1.21 --- kaffe/libraries/clib/io/File.c:1.20 Sat Aug 30 14:18:24 2003 +++ kaffe/libraries/clib/io/File.c Sun Aug 31 17:16:49 2003 @@ -272,7 +272,7 @@ mentry = dirlist; dirlist = mentry->next; unhand_array(array)->body[i] = - (Hjava_lang_Object*)stringC2Java(mentry->name); + (Hjava_lang_Object*)checkPtr(stringC2Java(mentry->name)); /* if allocation fails, continue freeing mentries in this loop. */ oom |= !unhand_array(array)->body[i]; Index: kaffe/libraries/clib/io/FileDescriptor.c diff -u kaffe/libraries/clib/io/FileDescriptor.c:1.5 kaffe/libraries/clib/io/FileDescriptor.c:1.6 --- kaffe/libraries/clib/io/FileDescriptor.c:1.5 Sat Aug 30 20:24:59 2003 +++ kaffe/libraries/clib/io/FileDescriptor.c Sun Aug 31 17:16:49 2003 @@ -274,7 +274,7 @@ if (rc == 0 && S_ISREG(statbuf.st_mode)) { *fileSize = statbuf.st_size; - } + } else if (rc == 0) { rc = EINVAL; Index: kaffe/libraries/clib/net/NetworkInterface.c diff -u kaffe/libraries/clib/net/NetworkInterface.c:1.2 kaffe/libraries/clib/net/NetworkInterface.c:1.3 --- kaffe/libraries/clib/net/NetworkInterface.c:1.2 Sat Aug 30 14:18:25 2003 +++ kaffe/libraries/clib/net/NetworkInterface.c Sun Aug 31 17:16:49 2003 @@ -97,7 +97,7 @@ &((struct sockaddr_in *)sa)->sin_addr, addr, NII_MAX_ADDRESS_SIZE); - address_string = stringC2Java(addr); + address_string = checkPtr(stringC2Java(addr)); break; #if defined(AF_INET6) case AF_INET6: @@ -105,7 +105,7 @@ &((struct sockaddr_in6 *)sa)->sin6_addr, addr, NII_MAX_ADDRESS_SIZE); - address_string = stringC2Java(addr); + address_string = checkPtr(stringC2Java(addr)); #endif default: /* XXX What to do? */ @@ -133,7 +133,7 @@ while (ifa != NULL) { struct Hjava_lang_String* iface_name = - stringC2Java(ifa->ifa_name); + checkPtr(stringC2Java(ifa->ifa_name)); struct Hjava_net_InetAddress* addr; addr = getInetAddress(ifa); Index: kaffe/libraries/clib/net/PlainDatagramSocketImpl.c diff -u kaffe/libraries/clib/net/PlainDatagramSocketImpl.c:1.27 kaffe/libraries/clib/net/PlainDatagramSocketImpl.c:1.28 --- kaffe/libraries/clib/net/PlainDatagramSocketImpl.c:1.27 Sat Aug 30 14:18:25 2003 +++ kaffe/libraries/clib/net/PlainDatagramSocketImpl.c Sun Aug 31 17:16:49 2003 @@ -17,6 +17,7 @@ #include <native.h> #include "java_lang_Integer.h" #include "java_io_FileDescriptor.h" +#include "java_io_InterruptedIOException.h" #include "java_net_DatagramPacket.h" #include "java_net_NetworkInterface.h" #include "java_net_SocketAddress.h" @@ -29,6 +30,7 @@ #include <jsyscall.h> #include "../../../kaffe/kaffevm/debug.h" #include "../../../kaffe/kaffevm/itypes.h" +#include "../../../kaffe/kaffevm/exception.h" /* * Supported socket options @@ -241,9 +243,12 @@ int alen = sizeof(addr); HArrayOfByte *array_address; int i; + int to_read, offset; assert(this != NULL); - assert(pkt != NULL); + if (pkt == NULL || unhand(pkt)->buffer == NULL) + SignalError("java.lang.NullPointerException", "null datagram packet"); + assert(unhand(pkt)->length <= unhand(unhand(pkt)->buffer)->length); DBG(NATIVENET, dprintf("datagram_receive(%p, %p [%d bytes])\n", @@ -254,25 +259,39 @@ addr.sin_port = htons(unhand(this)->localPort); /* XXX should assert (unhand(pkt)->length <= unhand_array(unhand(pkt)->buf)->length), no? */ - - rc = KRECVFROM(unhand(unhand(this)->fd)->nativeFd, - &(unhand_array(unhand(pkt)->buffer)->body)[unhand(pkt)->offset], - unhand(pkt)->length, 0, (struct sockaddr*)&addr, - &alen, unhand(this)->timeout, &r); - switch( rc ) - { - case 0: - break; - case ETIMEDOUT: - SignalError("java.net.SocketTimeoutException", SYS_ERROR(rc)); - break; - case EINTR: - SignalError("java.io.InterruptedIOException", SYS_ERROR(rc)); - break; - default: - SignalError("java.net.SocketException", SYS_ERROR(rc)); - break; - } + offset = unhand(pkt)->offset; + to_read = unhand(pkt)->length; + do { + rc = KRECVFROM(unhand(unhand(this)->fd)->nativeFd, + &(unhand_array(unhand(pkt)->buffer)->body)[offset], + to_read, 0, (struct sockaddr*)&addr, + &alen, unhand(this)->timeout, &r); + switch( rc ) + { + case 0: + break; + case ETIMEDOUT: { + struct Hjava_io_InterruptedIOException* except; + + except = (struct Hjava_io_InterruptedIOException *) + execute_java_constructor( + "java.net.SocketTimeoutException", 0, 0, + "([Ljava/lang/String;)V", + checkPtr(stringC2Java("Read timed out"))); + except->bytesTransferred = offset-unhand(pkt)->offset; + + throwException((struct Hjava_lang_Throwable*)except); + break; + } + case EINTR: + break; + default: + SignalError("java.net.SocketException", SYS_ERROR(rc)); + break; + } + to_read -= r; + offset += r; + } while (rc == EINTR); unhand(pkt)->length = r; unhand(pkt)->port = ntohs(addr.sin_port); Index: kaffe/libraries/clib/net/PlainSocketImpl.c diff -u kaffe/libraries/clib/net/PlainSocketImpl.c:1.31 kaffe/libraries/clib/net/PlainSocketImpl.c:1.32 --- kaffe/libraries/clib/net/PlainSocketImpl.c:1.31 Sat Aug 30 14:18:25 2003 +++ kaffe/libraries/clib/net/PlainSocketImpl.c Sun Aug 31 17:16:49 2003 @@ -20,12 +20,14 @@ #include "java_net_InetAddress.h" #include "java_net_PlainSocketImpl.h" #include "java_net_SocketOptions.h" +#include "java_io_InterruptedIOException.h" #include "nets.h" #include <jsyscall.h> #include <jthread.h> #include "../../../kaffe/kaffevm/debug.h" #include "../../../kaffe/kaffevm/object.h" #include "../../../kaffe/kaffevm/itypes.h" +#include "../../../kaffe/kaffevm/exception.h" #include "dummyin6.h" @@ -313,11 +315,10 @@ ) alen = sizeof(addr); - rc = KACCEPT(unhand(unhand(this)->fd)->nativeFd, (struct sockaddr*)&addr, &alen, unhand(this)->timeout, &r); - if (rc == EINTR) { - SignalError("java.io.InterruptedIOException", - "Accept was interrupted"); - } + do { + rc = KACCEPT(unhand(unhand(this)->fd)->nativeFd, + (struct sockaddr*)&addr, &alen, unhand(this)->timeout, &r); + } while (rc == EINTR); if (rc == ETIMEDOUT) { SignalError("java.net.SocketTimeoutException", "Accept timed out"); @@ -562,6 +563,7 @@ ssize_t r; int rc; int fd; + int total_read; DBG(NATIVENET, dprintf("socket_read(%p, %p, %d, %d)\n", @@ -573,24 +575,32 @@ SignalError("java.io.IOException", "fd invalid"); } - rc = KSOCKREAD(fd, &unhand_array(buf)->body[offset], len, unhand(this)->timeout, &r); - if (rc == EINTR || rc == ETIMEDOUT) { - SignalError("java.io.InterruptedIOException", - "Read was interrupted"); - } - if (rc == ETIMEDOUT) { - SignalError("java.net.SocketTimeoutException", - "Read timed out"); - } - if (rc) { - SignalError("java.io.IOException", SYS_ERROR(rc)); - } - else if (r == 0 && len > 0) { - return (-1); /* EOF */ - } - else { - return (r); - } + total_read = 0; + r = 0; + do { + rc = KSOCKREAD(fd, &unhand_array(buf)->body[offset], len, unhand(this)->timeout, &r); + + if (rc == ETIMEDOUT) { + struct Hjava_io_InterruptedIOException* except; + + except = (struct Hjava_io_InterruptedIOException *) + execute_java_constructor( + "java.net.SocketTimeoutException", 0, 0, + "(Ljava/lang/String;)V", + checkPtr(stringC2Java("Read was interrupted"))); + except->bytesTransferred = r; + + throwException((struct Hjava_lang_Throwable*)except); + } else if (rc != EINTR && rc != 0) { + SignalError("java.io.IOException", SYS_ERROR(rc)); + } else if (rc == 0 && r == 0 && len > 0) { + return (-1); + } + offset += r; + len -= r; + total_read += r; + } while (rc == EINTR); + return (total_read); } void Index: kaffe/libraries/javalib/java/io/File.java diff -u kaffe/libraries/javalib/java/io/File.java:1.35 kaffe/libraries/javalib/java/io/File.java:1.36 --- kaffe/libraries/javalib/java/io/File.java:1.35 Sat Aug 30 14:18:31 2003 +++ kaffe/libraries/javalib/java/io/File.java Sun Aug 31 17:16:50 2003 @@ -42,6 +42,8 @@ import java.net.URL; import gnu.classpath.Configuration; import gnu.java.io.PlatformHelper; +import java.util.LinkedList; +import java.util.Iterator; /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 @@ -1241,6 +1243,37 @@ s.checkRead (path); } + static class DeleteFileHelper extends Thread + { + LinkedList filesToDelete = new LinkedList(); + + public DeleteFileHelper() + { + Runtime.getRuntime().addShutdownHook (this); + } + + public void run() + { + Iterator fileIterator = filesToDelete.iterator(); + + while (fileIterator.hasNext()) + { + String path = (String)fileIterator.next(); + try + { + File f = new File(path); + + f.delete(); + } + catch (Throwable _) + { + } + } + } + } + + private static DeleteFileHelper deleteHelper = new DeleteFileHelper(); + /** * Calling this method requests that the file represented by this object * be deleted when the virtual machine exits. Note that this request cannot @@ -1258,11 +1291,8 @@ if (sm != null) sm.checkDelete(path); - // Sounds like we need to do some VM specific stuff here. We could delete - // the file in finalize() and set FinalizeOnExit to true, but delete on - // finalize != delete on exit and we should not be setting up system - // parameters without the user's knowledge. - // FIXME: ********IMPLEMENT ME!!!!!!*************** + deleteHelper.filesToDelete.add (getAbsolutePath()); + return; } Index: kaffe/libraries/javalib/java/lang/Runtime.java diff -u kaffe/libraries/javalib/java/lang/Runtime.java:1.25 kaffe/libraries/javalib/java/lang/Runtime.java:1.26 --- kaffe/libraries/javalib/java/lang/Runtime.java:1.25 Sat Jul 26 17:28:36 2003 +++ kaffe/libraries/javalib/java/lang/Runtime.java Sun Aug 31 17:16:50 2003 @@ -240,13 +240,21 @@ hook_enum = shutdownHooks.elements(); while (hook_enum.hasMoreElements()) { Thread hook = (Thread)hook_enum.nextElement(); + boolean join_interrupted = false; /* XXX Should this timeout? */ - try { - hook.join(); - } catch (Exception e) { - e.printStackTrace(); + do + { + join_interrupted = false; + try { + hook.join(); + } catch (InterruptedException _) { + join_interrupted = true; + } catch (Exception e) { + e.printStackTrace(); + } } + while (join_interrupted); } return true; } Index: kaffe/libraries/javalib/java/lang/Thread.java diff -u kaffe/libraries/javalib/java/lang/Thread.java:1.42 kaffe/libraries/javalib/java/lang/Thread.java:1.43 --- kaffe/libraries/javalib/java/lang/Thread.java:1.42 Wed Jul 9 10:01:57 2003 +++ kaffe/libraries/javalib/java/lang/Thread.java Sun Aug 31 17:16:50 2003 @@ -240,7 +240,7 @@ } } else { - /* Can't to it in java - so ask the system to try */ + /* Can't do it in java - so ask the system to try */ interrupt0(); } } Index: kaffe/test/regression/Makefile.am diff -u kaffe/test/regression/Makefile.am:1.81 kaffe/test/regression/Makefile.am:1.82 --- kaffe/test/regression/Makefile.am:1.81 Mon Aug 18 06:34:46 2003 +++ kaffe/test/regression/Makefile.am Sun Aug 31 17:16:50 2003 @@ -149,7 +149,8 @@ TEST_REFLECTION = \ ReflectInvoke.java \ - InvTarExcTest.java + InvTarExcTest.java \ + DeleteFile.java ## tests for ClassLoader TEST_CLASS_LOADING = \ @@ -205,7 +206,6 @@ ## Test interrupting I/O ## This is kind of tricky, and Sun doesn't support it. TEST_INTERRUPTING_IO = \ - SoInterrupt.java \ sysdepCallMethod.java ## This one is skipped unless you --enable-debug. Index: kaffe/test/regression/Makefile.in diff -u kaffe/test/regression/Makefile.in:1.134 kaffe/test/regression/Makefile.in:1.135 --- kaffe/test/regression/Makefile.in:1.134 Mon Aug 18 06:34:46 2003 +++ kaffe/test/regression/Makefile.in Sun Aug 31 17:16:50 2003 @@ -383,7 +383,8 @@ TEST_REFLECTION = \ ReflectInvoke.java \ - InvTarExcTest.java + InvTarExcTest.java \ + DeleteFile.java TEST_CLASS_LOADING = \ =================================================================== Checking out kaffe/test/regression/SoInterrupt.java RCS: /home/cvs/kaffe/kaffe/test/regression/Attic/SoInterrupt.java,v VERS: 1.5 *************** --- kaffe/test/regression/SoInterrupt.java Sun Aug 31 17:19:02 2003 +++ /dev/null Sun Aug 4 19:57:58 2002 @@ -1,136 +0,0 @@ -/** - * Test interruptable I/O. - * - * Note that this test will not run under Sun's JDK1.2 on Solaris, see - * http://developer.java.sun.com/developer/bugParade/bugs/4178050.html - * - * It's unlikely to work on Windows either, see - * http://developer.java.sun.com/developer/bugParade/bugs/4154947.html - * - * It it supported by Kaffe's jthreads, though it may not work under other - * threading systems either. XXX - * - * @author Godmar Back <[EMAIL PROTECTED]> - */ -import java.net.*; -import java.io.*; - -public class SoInterrupt { - public static void main(String av[]) throws Exception { - final boolean verbose = av.length > 0; - final String foo = "foo"; - final Thread main = Thread.currentThread(); - - int tryport = 45054; - ServerSocket server; - for(;;++tryport) { - try { - server = new ServerSocket(tryport); - break; - } catch (IOException _) {} - } - final int port = tryport; - Thread watchdog = new Thread() { - public void run() { - try { - Thread.sleep(10 * 1000); - } catch (InterruptedException _) { } - System.out.println("Watchdog Failure: Time out."); - System.exit(1); - } - }; - watchdog.start(); - - Thread t = new Thread() { - public void run() { - try { - // let main thread wait a while - try { - Thread.sleep(1000); - } catch (InterruptedException e) { - System.out.println("Failure " + e); - } - if (verbose) - System.out.println("interrupting " + main); - // interrupt it - main.interrupt(); - // give it some more time - try { - Thread.sleep(1000); - } catch (InterruptedException e) { - System.out.println("Failure " + e); - } - - // now connect - if (verbose) - System.out.println("connecting..."); - Socket s = new Socket(InetAddress.getByName(null), port); - // wait some - try { - Thread.sleep(1000); - } catch (InterruptedException e) { - System.out.println("Failure " + e); - } - - if (verbose) - System.out.println("interrupting again " + main); - // interrupt it again - main.interrupt(); - // wait some more - try { - Thread.sleep(1000); - } catch (InterruptedException e) { - System.out.println("Failure " + e); - } - - // now finish up - PrintWriter p = new PrintWriter(s.getOutputStream()); - p.println(foo); - p.close(); - } catch (Exception e) { - System.out.println("Failure " + e); - } - } - }; - t.start(); - Socket rsocket = null; - try { - if (verbose) - System.out.println("waiting for client..."); - rsocket = server.accept(); - if (verbose) - System.out.println("accepted..." + rsocket); - } catch (InterruptedIOException e) { - if (verbose) - System.out.println(e); - System.out.println("Success 1."); - } - if (verbose) - System.out.println("waiting for client again..."); - rsocket = server.accept(); - System.out.println("Success 2."); - InputStream is = rsocket.getInputStream(); - LineNumberReader r = new LineNumberReader(new InputStreamReader(is)); - byte []b = null; - try { - r.readLine(); - } catch (InterruptedIOException e) { - // System.out.println(e); - System.out.println("Success 3."); - } - String s = r.readLine(); - if (s.equals(foo)) { - System.out.println("Success 4."); - } else { - System.out.println("Failure: `" + s + "'"); - } - System.exit(0); - } -} - -/* Expected Output: -Success 1. -Success 2. -Success 3. -Success 4. -*/ _______________________________________________ kaffe mailing list [EMAIL PROTECTED] http://kaffe.org/cgi-bin/mailman/listinfo/kaffe