[ 
https://issues.apache.org/jira/browse/PROTON-1734?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16370416#comment-16370416
 ] 

Alan Conway edited comment on PROTON-1734 at 2/20/18 6:30 PM:
--------------------------------------------------------------

I think this is a proactor behavior problem.

In stop(), C++ uses pn_proactor_interrupt() to close all open 
connctions/listeners etc. and then waits for a PN_PROACTOR_INACTIVE event 
before closing down. This is the intended use of the proactor.

The problem is that the proactor currently only dispatches the 
PN_PROACTOR_INACTIVE event on the *transition* from active to inactive - i.e. 
when the last connection, listener or timeout finishes. Therefore if you call 
pn_proactor_disconnect() when the proactor is already inactive, you will never 
get a PN_PROACTOR_INACTIVE event.

I think a valid fix is to say that the proactor should *always* dispatch at 
least one PN_PROACTOR_ACTIVE event after every call to 
pn_proactor_disconnect(). If there are things to disconnect, then the INACTIVE 
is dispatched as it currently is when the last activity is finished. If not it 
is dispatched immediately. With that change to the proactor I think the C++ 
would work as intended.

 


was (Author: aconway):
I think this is a proactor behavior problem.

In stop(), C++ uses pn_proactor_interrupt() to close all open 
connctions/listeners etc. and then waits for a PN_PROACTOR_INACTIVE event 
before closing down. This is the intended use of the proactor.

The problem is that the proactor currently only dispatches the 
PN_PROACTOR_INACTIVE event on the *transition* from active to inactive - i.e. 
when the last connection, listener or timeout finishes. Therefore if you call 
pn_proactor_disconnect() when the proactor is already inactive, you will never 
get a PN_PROACTOR_INACTIVE event.

I think a valid fix is to say that the proactor should *always* dispatch at 
least one PN_PROACTOR_ACTIVE event after every call to 
pn_proactor_disconnect(). If there are things to disconnect, then the INACTIVE 
is dispatched as it currently is when the last activity is finished. If not it 
is dispatched immediately. 

 

> [cpp] container.stop() doesn't work when called from non-proactor thread.
> -------------------------------------------------------------------------
>
>                 Key: PROTON-1734
>                 URL: https://issues.apache.org/jira/browse/PROTON-1734
>             Project: Qpid Proton
>          Issue Type: Bug
>          Components: cpp-binding
>    Affects Versions: proton-c-0.19.0
>            Reporter: Alan Conway
>            Assignee: Andrew Stitcher
>            Priority: Major
>             Fix For: proton-c-0.21.0
>
>
> Using the below code
> {code}
> #include <proton/container.hpp>
> #include <iostream>
> #include <thread>
> int main( int, char** )
> {
>   try
>   {
>     proton::container c;
>     c.auto_stop( false );
>     auto containerThread = std::thread([&]() { std::cout << "CONTAINER IS 
> RUNNING" << std::endl; 
>                                                                               
>             c.run(); std::cout << "CONTAINER IS DONE" << std::endl; });
>     std::this_thread::sleep_for( std::chrono::seconds( 2 ));
>     std::cout << "STOPPING CONTAINER" << std::endl;
>     c.stop();
>     std::cout << "WAITING FOR CONTAINER" << std::endl;
>     containerThread.join();
>     return 0;
>   }
>   catch( std::exception& e )
>   {
>     std::cerr << e.what() << std::endl;
>   }
>   return 1;
> }
> {code}
> via
> {code}
> [rkieley@i7t450s build]$ g++ -g -Wall -Wextra -Wpointer-arith -Wconversion 
> -Wformat -Wformat-security -Wformat-y2k -Wsign-promo -Wcast-qual -g3 -ggdb3 
> -Wunused-variable -fno-eliminate-unused-debug-types -O3 -DNDEBUG -fPIC 
> -DPN_CPP_HAS_LAMBDAS=0  -std=gnu++11  ../attachments/test.cpp 
> -lqpid-proton-cpp -lqpid-proton-core -lqpid-proton-proactor -lrt -lpthread -o 
> test
> {code}
> With both PROACTOR epoll and libuv I see the following when run:
> {quote}
> [New Thread 0x7ffff3c95700 (LWP 20312)]
> CONTAINER IS RUNNING
> STOPPING CONTAINER
> WAITING FOR CONTAINER
> ^C
> Thread 1 "test" received signal SIGINT, Interrupt.
> {quote}
> When I use CTRL-C to stop waiting after running via gdb and waiting 2 minutes.



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@qpid.apache.org
For additional commands, e-mail: dev-h...@qpid.apache.org

Reply via email to