We have modified GNU Classpath so that ORP with Classpath can run Volano. Here is 
the first of the patches needed for that.
    We found that Classpath's implementation of PlainSocketImpl(in 
java/net/PlainsocketImpl.java) overused synchronized keyword before almost all the 
native methods such as read, write, etc.. Generally speaking native socket 
implementation(e.g., Winsock) takes the responsibility for thread-safety, and if we 
raise the responsibility up to Java language level, there'll be problems here in 
multi-threaded senarios.
    The following is a simple senario in Volano benchmark which will lead to deadlock 
using current implementation of classpath:

       Server:           |    Client:
                         |    Thread A:               Thread B:
 ... ...                 |    sock1.read(.....).
                         |    //waiting for item B    
                         |                            sock1.write(.....).
 sock.read(.....).       |                            //sending item A
 //waiting for item A    |
 sock.write(.....).      \/
 //sending item B       time
 
    Obviously in thread A, "sock1" blocks on read, and write of thread B will block on 
the same "sock1", and Server will block in turn.
    In a word, if different threads read/write the same socket, current implementation 
will potentially cause dead-lock.
    So our suggestion is to remove synchronized keyword from read/write native methods.

    The context compare result below is based on gnu classpath cvs snapshot of June 
22.Note that revision number is different

Index: java/net/PlainSocketImpl.java
===================================================================
RCS file: /cvsroot/classpath/java/net/PlainSocketImpl.java,v
retrieving revision 1.1.1.1
diff -c -r1.1.1.1 PlainSocketImpl.java
*** java/net/PlainSocketImpl.java       2001/06/25 01:13:33     1.1.1.1
--- java/net/PlainSocketImpl.java       2001/06/25 01:24:32
***************
*** 204,210 ****
    *
    * @exception IOException If an error occurs
    */
! protected native synchronized int read(byte[] buf, int offset, int len) throws 
IOException;

  /*************************************************************************/

--- 204,210 ----
    *
    * @exception IOException If an error occurs
    */
! protected native int read(byte[] buf, int offset, int len) throws IOException;

  /*************************************************************************/

***************
*** 215,221 ****
    *
    * @exception IOException If an error occurs
    */
! protected native synchronized void write(byte[] buf, int offset, int len) throws 
IOException;

  /*************************************************************************/

--- 215,221 ----
    *
    * @exception IOException If an error occurs
    */
! protected native void write(byte[] buf, int offset, int len) throws IOException;

  /*************************************************************************/


_______________________________________________
Classpath mailing list
[EMAIL PROTECTED]
http://mail.gnu.org/mailman/listinfo/classpath

Reply via email to