activemq-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Albert Strasheim (JIRA)" <j...@apache.org>
Subject [jira] Updated: (AMQCPP-122) Crash on Windows when rapidly creating and destroying connections
Date Wed, 13 Jun 2007 00:31:33 GMT

     [ https://issues.apache.org/activemq/browse/AMQCPP-122?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]

Albert Strasheim updated AMQCPP-122:
------------------------------------

    Attachment: IOTransportConcurrentv1.patch

Here's my first attempt at a patch.

The problem is the following:

1. From the main thread, IOTransport::close() is called.

2. This closes the input stream contained in the IOTransport. Then it joins the IOTransport's
thread.

2. At the "same" time, this other thread is busy in IOTransport::read(). It tries to perform
operations on this closed input stream.

I attempted to fix this by synchronizing on a mutex in IOTransport::close() and in IOTransport::read().
In between loop iterations in IOTransport::read(), the lock is released to give another thread
that is waiting to close the IOTransport an opportunity to do so.

Does this patch look right in general? How about the style? In Java I'd probably synchronize
on this instead of adding a mutex to the class, but what I did in the patch looks like the
way to go if one doesn't want to implement Synchronizable.

> Crash on Windows when rapidly creating and destroying connections
> -----------------------------------------------------------------
>
>                 Key: AMQCPP-122
>                 URL: https://issues.apache.org/activemq/browse/AMQCPP-122
>             Project: ActiveMQ C++ Client
>          Issue Type: Bug
>    Affects Versions: 2.1
>            Reporter: Albert Strasheim
>            Assignee: Timothy Bish
>             Fix For: 2.1
>
>         Attachments: IOTransportConcurrentv1.patch
>
>
> Me again. :)
> The following program crashes within a few seconds on my Windows XP machine. This machine
has a Core 2 Duo processor (i. e. 2 cores).
> On my Pentium 4 + Hyperthreading Linux machine is only dies after about a minute with:
> terminate called after throwing an instance of 'activemq::exceptions::ActiveMQException'
>   what():  Cannot assign requested address
> Aborted
> However, this is to be expected, since the program causes thousands of sockets to be
created. This doesn't seem to be the reason it crashes on Windows though.
> The code:
> {code:none}
> #include <activemq/core/ActiveMQConnectionFactory.h> 
> #include <cms/Connection.h> 
> #include <cms/Session.h>
> #include <cms/MessageProducer.h>
> #include <cms/DeliveryMode.h>
> int main(int argc, char* argv[]) {                            
>   activemq::core::ActiveMQConnectionFactory connectionFactory("tcp://localhost:61613?wireFormat=stomp");
>   while(true)
>   {
>     cms::Connection* connection = connectionFactory.createConnection(); 
>     cms::Session* session = connection->createSession(cms::Session::AUTO_ACKNOWLEDGE);
>     cms::Topic* topic = session->createTopic("topic");
>     cms::MessageProducer* producer = session->createProducer(topic);
>     delete producer;
>     delete topic;
>     delete session; 
>     delete connection;
>   }
>   return 0;
> }
> {code}
> The stack trace when it crashes:
> >	activemq-cppd.dll!activemq::io::BufferedInputStream::read()  Line 79 + 0x12 bytes
C++
>  	activemq-cppd.dll!activemq::connector::stomp::StompCommandReader::readStompHeaderLine()
 Line 194 + 0x19 bytes	C++
>  	activemq-cppd.dll!activemq::connector::stomp::StompCommandReader::readStompCommandHeader(activemq::connector::stomp::StompFrame
& frame={...})  Line 101	C++
>  	activemq-cppd.dll!activemq::connector::stomp::StompCommandReader::readCommand()  Line
59	C++
>  	activemq-cppd.dll!activemq::transport::IOTransport::run()  Line 166 + 0x19 bytes	C++
>  	activemq-cppd.dll!activemq::concurrent::Thread::runCallback(void * param=0x003ad328)
 Line 152 + 0x13 bytes	C++
>  	msvcr80d.dll!_callthreadstartex()  Line 348 + 0xf bytes	C
>  	msvcr80d.dll!_threadstartex(void * ptd=0x003adac0)  Line 331	C
>  	kernel32.dll!7c80b683() 	
>  	[Frames below may be incorrect and/or missing, no symbols loaded for kernel32.dll]

> The line in BufferedInputStream::read is:
> char returnValue = buffer[head++];
> There is a local variable called bufferSize with a value of 1024. However, the value
of head is usually much larger than bufferSize (like more than 10000).

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


Mime
View raw message