[kaffe] Apache Jakarta Commons Net does not work on Linux

Ito Kazumitsu kaz at maczuka.gcd.org
Wed Aug 3 07:46:54 PDT 2005


From: Ito Kazumitsu <kaz at maczuka.gcd.org>
Subject: [kaffe] Apache Jakarta Commons Net does not work on Linux 
Date: Tue, 02 Aug 2005 00:10:49 +0900 (JST)

> I have found that apache Jakarta Commons Net does not work
> with current Kaffe on Linux.

I slightly changed the test program to find the following.

(1) Telnet client including FTP client of Apache Commons Net
    performs its socket input operation in a different thread
    called reader thread.

(2) When run on Kaffe on Linux, there seems to occur a deadlock
    between the reader thread and the current thread.  The writing
    operation of the current thread cannot be finished until some
    state of the reader thread changes.  But the reading thread is
    waiting for a response from the server, which will never come
    until the writing operation of the current thread is finished.

(3) Such deadlock does not occur when run on Sun's JDK
    or on Kaffe on FreeBSD.

(4) By setting some socket timeout value, the deadlock of (2)
    can be releasd.  But such timeout means the death of the reading
    thread and this cannot be a solusion of the problem.

    And on Linux 2.6.7-co-0.6.2, setting a timeout causes another
    error like

$ java TestCommonsNet somehost foo bar 5000 true
220
kaffe-bin: pthread_mutex_lock.c:78: __pthread_mutex_lock: Assertion `mutex->__data.__owner == 0' failed.
Aborted

(5) Telnet client including FTP client of Apache Commons Net has
    an option of disabling the use of reader thread.  This helps
    to avoid the deadlock of (2).

Application system users can be satisfied with (5),  but the problem
(2) seen only on Kaffe on Linux indicates some bugs in Kaffe.

My test program follows.

import org.apache.commons.net.ftp.*;

public class TestCommonsNet {
  public static void main(String[] args) throws Exception {
    String hostName = args[0];
    int port = 21;
    String userName = args[1];
    String password = args[2];
    int timeout = Integer.parseInt(args[3]);
    boolean readerThread = (args[4].equals("true"));

    FTPClient _ftpClient = new FTPClient();
    _ftpClient.setDefaultTimeout(timeout);
    _ftpClient.setReaderThread(readerThread);
    _ftpClient.connect(hostName, port);
    System.err.println(_ftpClient.getReplyCode());
    _ftpClient.login(userName, password);
    System.err.flush();
    System.err.println(_ftpClient.getReplyCode());
    _ftpClient.logout();
    System.err.println(_ftpClient.getReplyCode());

  }
}



More information about the kaffe mailing list