1010
1111#include "WebRequest.h"
1212
13+ #ifdef WT_THREADED
14+ #include <boost/thread.hpp>
15+ #endif
16+
1317namespace Wt {
1418
1519LOGGER ("Http::ResponseContinuation" );
@@ -23,79 +27,106 @@ void ResponseContinuation::setData(const boost::any& data)
2327
2428void ResponseContinuation ::haveMoreData ()
2529{
26- if (isWaitingForMoreData ())
27- doContinue (WriteCompleted );
30+ WResource ::UseLock useLock ;
31+ WResource * resource = 0 ;
32+
33+ {
34+ #ifdef WT_THREADED
35+ boost ::recursive_mutex ::scoped_lock lock (* mutex_ );
36+ #endif // WT_THREADED
37+
38+ if (!useLock .use (resource_ ))
39+ return ;
40+
41+ if (waiting_ ) {
42+ waiting_ = false;
43+ if (readyToContinue_ ) {
44+ readyToContinue_ = false;
45+ resource = resource_ ;
46+ resource_ = 0 ;
47+ }
48+ }
49+ }
50+
51+ if (resource )
52+ resource -> doContinue (shared_from_this ());
2853}
2954
30- void ResponseContinuation ::doContinue (WebWriteEvent event )
55+ void ResponseContinuation ::readyToContinue (WebWriteEvent event )
3156{
3257 if (event == WriteError ) {
3358 LOG_ERROR ("WriteError" );
34- cancel ();
59+ cancel (false );
3560 return ;
3661 }
3762
38- /*
39- * Although we are waiting for more data, we're not yet ready to continue
40- * We'll remember to continue as soon as we become ready.
41- */
42- if (waiting_ && !readyToContinue_ ) {
43- needsContinue_ = true;
44- return ;
45- }
63+ WResource ::UseLock useLock ;
64+ WResource * resource = 0 ;
65+
66+ {
67+ #ifdef WT_THREADED
68+ boost ::recursive_mutex ::scoped_lock lock (* mutex_ );
69+ #endif // WT_THREADED
4670
47- waiting_ = false;
48- needsContinue_ = false ;
71+ if (! useLock . use ( resource_ ))
72+ return ;
4973
50- // We are certain that the continuation is still "alive" because it is
51- // protected by a mutex, and thus a simultaneous change with
52- // WebResponse::flush() is not possible: ResponseContinuation::cancel(),
53- // called from beingDeleted() and protected by the same mutex
54- // will not be called while we are here.
55- resource_ -> doContinue (this );
74+ readyToContinue_ = true;
75+
76+ if (!waiting_ ) {
77+ readyToContinue_ = false;
78+ resource = resource_ ;
79+ resource_ = 0 ;
80+ }
81+ }
82+
83+ if (resource )
84+ resource -> doContinue (shared_from_this ());
5685}
5786
5887ResponseContinuation ::ResponseContinuation (WResource * resource ,
5988 WebResponse * response )
60- : resource_ (resource ),
89+ :
90+ #ifdef WT_THREADED
91+ mutex_ (resource -> mutex_ ),
92+ #endif
93+ resource_ (resource ),
6194 response_ (response ),
6295 waiting_ (false ),
63- readyToContinue_ (false),
64- needsContinue_ (false)
65- {
66- resource_ -> continuations_ .push_back (this );
67- }
96+ readyToContinue_ (false )
97+ { }
6898
69- void ResponseContinuation ::cancel ()
99+ void ResponseContinuation ::cancel (bool resourceIsBeingDeleted )
70100{
71- Http ::Request request (* response_ , this );
72- resource_ -> handleAbort (request );
73- resource_ -> removeContinuation (this );
74-
75- response_ -> flush (WebResponse ::ResponseDone );
101+ WResource ::UseLock useLock ;
102+ WResource * resource = 0 ;
103+
104+ {
105+ #ifdef WT_THREADED
106+ boost ::recursive_mutex ::scoped_lock lock (* mutex_ );
107+ #endif // WT_THREADED
108+
109+ if (resourceIsBeingDeleted ) {
110+ if (!resource_ )
111+ return ;
112+ } else if (!useLock .use (resource_ ))
113+ return ;
114+
115+ resource = resource_ ;
116+ resource_ = 0 ;
117+ }
76118
77- delete this ;
119+ if (resource ) {
120+ Http ::Request request (* response_ , this );
121+ resource -> handleAbort (request );
122+ resource -> removeContinuation (shared_from_this ());
123+ response_ -> flush (WebResponse ::ResponseDone );
124+ }
78125}
79126
80127void ResponseContinuation ::waitForMoreData ()
81128{
82129 waiting_ = true;
83- needsContinue_ = false;
84- readyToContinue_ = false;
85- }
86-
87- void ResponseContinuation ::flagReadyToContinue (WebWriteEvent event )
88- {
89- if (event == WriteError ) {
90- LOG_ERROR ("WriteError" );
91- cancel ();
92- return ;
93- }
94-
95- readyToContinue_ = true;
96-
97- if (needsContinue_ )
98- doContinue (event );
99130}
100131
101132ResponseContinuation ::~ResponseContinuation ()
0 commit comments