tcgetattr hangs

Konstantin Belousov kostikbel at gmail.com
Tue May 29 11:03:52 UTC 2012


On Tue, May 29, 2012 at 01:40:36PM +0300, Kustaa Nyholm wrote:
> Hi,
> 
> this maybe wrong list but it was suggested I try my luck here.
> 
> MY feeling is that this NOT a Java issue per se but here goes.
> 
> I'm the developer of PureJavaComm (PJC) , a pure Java serial port access
> library that runs on Mac OS X, Linux, Windows and soon I hope on
> FreeBSD. I'm co-operating with someone to port the library to
> FreeBSD but we have run into mysterious problem that has defeated
> all our debugging efforts.
> 
> PJC can be found at:
> 
> https://github.com/nyholku/purejavacomm
> 
> Some background. PJC uses JNA which is a library to access C-code
> APIs from Java by writing Java classes that JNA automatically
> turns in to standard C calls.
> 
> The C functions we are using are very simple and few, here is the complete
> list to put you into the picture (btw, this is Java):
> 
> int errno();
> int fcntl(int fd, int cmd, int arg); int cfgetispeed(Termios termios);
> int cfgetospeed(Termios termios);
> int setspeed(int fd, int speed);
> int cfsetispeed(Termios termios, int speed);
> int cfsetospeed(Termios termios, int speed)
> int tcflush(int fd, int b);
> int tcdrain(int fd);
> void cfmakeraw(Termios termios);
> int tcgetattr(int fd, Termios termios);
> int tcsetattr(int fd, int cmd, Termios termios); int tcsendbreak(int fd,
> int duration);
> int open(String s, int t); int close(int fd);
> int write(int fd, byte[] buffer, int len);
> int read(int fd, byte[] buffer, int len);
> int ioctl(int fd, int cmd, int[] data);
> int select(int n, FDSet read, FDSet write, FDSet error, TimeVal timeout);
> 
> 
> 
> So far we have been able to run PJC testsuite in FreeBSD 32 bit Intel with
> no problems.
> 
> Now however, on FreeBSD 64 bit AMD our test set hangs in a call to
> tcgetattr()
> in the third test case in our test suite.
> 
> The first test opens a port and wiggles some control lines, then closes
> the port.
> The second test sends and receives a some hundreds of messages using a
> background
> thread and select(). This is the test that is causing problem further down
> the line.
> After this test the next test (regardless what it is) hangs in a call to
> tcgetattr()
> after successfully opening the port.
> 
> So how can tcgetattr() hang???
> 
> I found one reference to a similar problem but no solution:
> 
> http://freebsd.1045724.n5.nabble.com/Re-cups-bugs-tcgetattr-causes-lockup-i
> n-USB-backend-on-FreeBSD6-STABLE-td3950285.html
> 
> Here is a piece of our debug log that shows the calls from Java to the
> native
> API showing the end of the successful Test2 and the hang at the beginning
> of Test3:
> 
> log: > select(9,[8],[],[],jtermios.TimeVal at 6f507fb2)
> .................................. OK average speed log: <
> select(9,[],[],[],jtermios.TimeVal at 6f507fb2) => 0
> log: > select(9,[8],[],[],jtermios.TimeVal at 6f507fb2)
> 18241 b/sec at baud rate 19200
> log: > fcntl(8, 3, 0)
> log: < fcntl(8, 3, 0) => 2
> log: > fcntl(8, 4, 6)
> log: < fcntl(8, 4, 6) => 0
> log: > close(8)
> log: < close(8) => 0
> Test3 - transmit all characters     log: <
> select(9,[8],[],[],jtermios.TimeVal at 6f507fb2) => -1
> log: > open('cuau0',00008006)
> log: < open('cuau0',00008006) => 8
> log: > close(8)
> log: < close(8) => 0
> log: > open('cuau0',00008006)
> log: < open('cuau0',00008006) => 8
> log: > fcntl(8, 3, 0)
> log: < fcntl(8, 3, 0) => 6
> log: > fcntl(8, 4, 2)
> log: < fcntl(8, 4, 2) => 0
> log: > tcgetattr(8,jtermios.Termios at 5a77a7f9)
> 
> 
> All comments welcome.

Verify that the thread indeed hang in ioctl, executed on the right
file descriptor and TIOCGETA ioctl command. You may use ktrace(1)
or truss(1) for this.

If ioctl(TIOCGETA) is indeed what was called, then look at the in-kernel
backtrace of the hung thread with procstat -kk <pid> command.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 196 bytes
Desc: not available
Url : http://lists.freebsd.org/pipermail/freebsd-java/attachments/20120529/026eb719/attachment.pgp


More information about the freebsd-java mailing list