[ 
https://issues.apache.org/jira/browse/DIRMINA-708?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12711393#action_12711393
 ] 

Emmanuel Lecharny commented on DIRMINA-708:
-------------------------------------------

A quick look at the code shows that if the thread is locked, it's because the 
flush() method is not called. Let's walk the code :

We have a writeMonitor which is used in two places ; the WriteWorker and the 
SerialIoProcessor. 
- In the WriteWorker :

...
                // wait for more data
                synchronized (writeMonitor) {
                    try {
                        writeMonitor.wait();
                    } catch (InterruptedException e) {
                        log.error("InterruptedException", e);
                    }
                }
...

- in the SerialIoProcessor :
...
        public void flush(SerialSessionImpl session) {
            if (writeWorker == null) {
                writeWorker = new WriteWorker();
                writeWorker.start();
            } else {
                synchronized (writeMonitor) {
                    writeMonitor.notifyAll();
                }
            }
        }
...

This flush method is called by the SerialIoProcessor.remove() method, and the 
flush method is the only place the WriterWorker is created.

Now note the sequence :
1) we start the SerialSessionImpl
2) It creates everything, and the remove() method is called when there is an 
exception
3) The remove() method do some cleaning, and call the flush() method (this is 
the only place this method is called)
4) The flush method create a new WriteWorker, as this is the only place we 
create it in the code
5) The WriteWorker is started, calls flushWrites()
6) When this methods returns, the WriteMonitor wait for notification
7) As soon as the SerialIoProcessor.remove() method will be called, the flush(à 
method will be called and it will notify the WriteMonitor, releasing the 
thread, if it were blocked on a wait().

The remove() is invoked when the session is closed. I don't have the code of 
your application, so I can't tell if you close the session, and when. Also 
there is something strange I see in the traces : if you check the thread 30, 
you can see that the SerialSessionImpl.flushWrites() method is called, and end 
with a call to PdrProtocolEngine.messageSent() method, which does not return. 
I'm wondering if this method is not supposed to timeout at some point, and then 
close the session, if it can't write to the client.

This is a bit difficult to say what'ss really going in in your app, as I don't 
see the code, so consider those elements as semi blind guesses ...




> Unbound thread growth on discovery attempts
> -------------------------------------------
>
>                 Key: DIRMINA-708
>                 URL: https://issues.apache.org/jira/browse/DIRMINA-708
>             Project: MINA
>          Issue Type: Bug
>            Reporter: boB Gage
>         Attachments: profile-mina.txt.gz
>
>
> Using several different possible protocol handlers (handler, codecs, et al) 
> on several potential ports (serial and/or network), our code attempts to 
> discover devices on the far end and attach the proper decoders on the proper 
> ports.
> Generally, this process is working, however, every failed discovery attempt 
> has launched roughly 6 threads, but only destroyed roughly 4 of them.    The 
> 2 delta threads sit in WAIT states forever.
> More details are available in the "Unbound thread growth" thread of the 
> listserv.

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to