From bbb9d4f21b018bfffc41f790aab7b54975504027 Mon Sep 17 00:00:00 2001
From: Rider Linden <rider@lindenlab.com>
Date: Wed, 14 Oct 2015 17:46:24 -0700
Subject: MAINT-5732: Change to the way event polling handles error conditions
 and cancel calls. Refactor any remaining LLCore::HTTPHandlers to use
 boost::shared_ptr Started minor refactor in the materials manager into
 coroutines (unfinished)

---
 indra/llcorehttp/_httpoperation.cpp  | 29 +++++++--------------------
 indra/llcorehttp/_httpoperation.h    | 10 ++++++----
 indra/llcorehttp/_httpreplyqueue.cpp |  1 -
 indra/llcorehttp/_httpreplyqueue.h   | 17 +++++++---------
 indra/llcorehttp/httphandler.h       |  3 +++
 indra/llcorehttp/httprequest.cpp     | 38 ++++++++++++++++--------------------
 indra/llcorehttp/httprequest.h       | 34 +++++++++++++++++---------------
 7 files changed, 58 insertions(+), 74 deletions(-)

(limited to 'indra/llcorehttp')

diff --git a/indra/llcorehttp/_httpoperation.cpp b/indra/llcorehttp/_httpoperation.cpp
index fefe561f80..dc03b059a4 100755
--- a/indra/llcorehttp/_httpoperation.cpp
+++ b/indra/llcorehttp/_httpoperation.cpp
@@ -57,8 +57,8 @@ namespace LLCore
 
 HttpOperation::HttpOperation()
 	: LLCoreInt::RefCounted(true),
-	  mReplyQueue(NULL),
-	  mUserHandler(NULL),
+	  mReplyQueue(),
+	  mUserHandler(),
 	  mReqPolicy(HttpRequest::DEFAULT_POLICY_ID),
 	  mReqPriority(0U),
 	  mTracing(HTTP_TRACE_OFF)
@@ -69,30 +69,15 @@ HttpOperation::HttpOperation()
 
 HttpOperation::~HttpOperation()
 {
-	setReplyPath(NULL, NULL);
+    setReplyPath(HttpReplyQueue::ptr_t(), HttpHandler::ptr_t());
 }
 
 
-void HttpOperation::setReplyPath(HttpReplyQueue * reply_queue,
-								 HttpHandler * user_handler)
+void HttpOperation::setReplyPath(HttpReplyQueue::ptr_t reply_queue,
+								 HttpHandler::ptr_t user_handler)
 {
-	if (reply_queue != mReplyQueue)
-	{
-		if (mReplyQueue)
-		{
-			mReplyQueue->release();
-		}
-
-		if (reply_queue)
-		{
-			reply_queue->addRef();
-		}
-
-		mReplyQueue = reply_queue;
-	}
-
-	// Not refcounted
-	mUserHandler = user_handler;
+    mReplyQueue.swap(reply_queue);
+	mUserHandler.swap(user_handler);
 }
 
 
diff --git a/indra/llcorehttp/_httpoperation.h b/indra/llcorehttp/_httpoperation.h
index 937a61187d..f677e7aed8 100755
--- a/indra/llcorehttp/_httpoperation.h
+++ b/indra/llcorehttp/_httpoperation.h
@@ -72,6 +72,8 @@ class HttpService;
 class HttpOperation : public LLCoreInt::RefCounted
 {
 public:
+    typedef boost::shared_ptr<HttpReplyQueue> HttpReplyQueuePtr_t;
+
 	/// Threading:  called by consumer thread.
 	HttpOperation();
 
@@ -110,8 +112,8 @@ public:
 	///
 	/// Threading:  called by consumer thread.
 	///
-	void setReplyPath(HttpReplyQueue * reply_queue,
-					  HttpHandler * handler);
+	void setReplyPath(HttpReplyQueuePtr_t reply_queue,
+					  HttpHandler::ptr_t handler);
 
 	/// The three possible staging steps in an operation's lifecycle.
 	/// Asynchronous requests like HTTP operations move from the
@@ -163,8 +165,8 @@ protected:
 	void addAsReply();
 	
 protected:
-	HttpReplyQueue *			mReplyQueue;			// Have refcount
-	HttpHandler *				mUserHandler;			// Naked pointer
+    HttpReplyQueuePtr_t         mReplyQueue;
+	HttpHandler::ptr_t			mUserHandler;
 
 public:
 	// Request Data
diff --git a/indra/llcorehttp/_httpreplyqueue.cpp b/indra/llcorehttp/_httpreplyqueue.cpp
index 558b7bdee9..912655d328 100755
--- a/indra/llcorehttp/_httpreplyqueue.cpp
+++ b/indra/llcorehttp/_httpreplyqueue.cpp
@@ -39,7 +39,6 @@ namespace LLCore
 
 
 HttpReplyQueue::HttpReplyQueue()
-	: RefCounted(true)
 {
 }
 
diff --git a/indra/llcorehttp/_httpreplyqueue.h b/indra/llcorehttp/_httpreplyqueue.h
index 4220a09a3b..7ad65c581f 100755
--- a/indra/llcorehttp/_httpreplyqueue.h
+++ b/indra/llcorehttp/_httpreplyqueue.h
@@ -58,21 +58,17 @@ class HttpOperation;
 /// will be coded anyway so it shouldn't be too much of a
 /// burden.
 
-class HttpReplyQueue : public LLCoreInt::RefCounted
+class HttpReplyQueue : private boost::noncopyable
 {
-public:
-	/// Caller acquires a Refcount on construction
-	HttpReplyQueue();
 
-protected:
-	virtual ~HttpReplyQueue();							// Use release()
+public:
+    typedef boost::shared_ptr<HttpReplyQueue>   ptr_t;
 
-private:
-	HttpReplyQueue(const HttpReplyQueue &);				// Not defined
-	void operator=(const HttpReplyQueue &);				// Not defined
+	HttpReplyQueue();
+    virtual ~HttpReplyQueue();		
 
 public:
-	typedef std::vector<HttpOperation *> OpContainer;
+    typedef std::vector<HttpOperation *> OpContainer;
 
 	/// Insert an object at the back of the reply queue.
 	///
@@ -96,6 +92,7 @@ public:
 	void fetchAll(OpContainer & ops);
 	
 protected:
+
 	OpContainer							mQueue;
 	LLCoreInt::HttpMutex				mQueueMutex;
 	LLCoreInt::HttpConditionVariable	mQueueCV;
diff --git a/indra/llcorehttp/httphandler.h b/indra/llcorehttp/httphandler.h
index 7bc9096703..65e043f5d3 100755
--- a/indra/llcorehttp/httphandler.h
+++ b/indra/llcorehttp/httphandler.h
@@ -58,6 +58,9 @@ class HttpResponse;
 class HttpHandler 
 {
 public:
+    typedef boost::shared_ptr<HttpHandler>  ptr_t;
+    typedef boost::weak_ptr<HttpHandler>    wptr_t;
+
 	virtual ~HttpHandler()
 	{ }
 
diff --git a/indra/llcorehttp/httprequest.cpp b/indra/llcorehttp/httprequest.cpp
index 63233259fb..8380e48ddb 100755
--- a/indra/llcorehttp/httprequest.cpp
+++ b/indra/llcorehttp/httprequest.cpp
@@ -55,13 +55,13 @@ namespace LLCore
 
 
 HttpRequest::HttpRequest()
-	: mReplyQueue(NULL),
+	: mReplyQueue(),
 	  mRequestQueue(NULL)
 {
 	mRequestQueue = HttpRequestQueue::instanceOf();
 	mRequestQueue->addRef();
 
-	mReplyQueue = new HttpReplyQueue();
+	mReplyQueue.reset( new HttpReplyQueue() );
 }
 
 
@@ -73,11 +73,7 @@ HttpRequest::~HttpRequest()
 		mRequestQueue = NULL;
 	}
 
-	if (mReplyQueue)
-	{
-		mReplyQueue->release();
-		mReplyQueue = NULL;
-	}
+    mReplyQueue.reset();
 }
 
 
@@ -128,7 +124,7 @@ HttpStatus HttpRequest::setStaticPolicyOption(EPolicyOption opt, policy_t pclass
 }
 
 HttpHandle HttpRequest::setPolicyOption(EPolicyOption opt, policy_t pclass,
-										long value, HttpHandler * handler)
+										long value, HttpHandler::ptr_t handler)
 {
 	HttpStatus status;
 	HttpHandle handle(LLCORE_HTTP_HANDLE_INVALID);
@@ -156,7 +152,7 @@ HttpHandle HttpRequest::setPolicyOption(EPolicyOption opt, policy_t pclass,
 
 
 HttpHandle HttpRequest::setPolicyOption(EPolicyOption opt, policy_t pclass,
-										const std::string & value, HttpHandler * handler)
+										const std::string & value, HttpHandler::ptr_t handler)
 {
 	HttpStatus status;
 	HttpHandle handle(LLCORE_HTTP_HANDLE_INVALID);
@@ -199,7 +195,7 @@ HttpHandle HttpRequest::requestGet(policy_t policy_id,
 								   const std::string & url,
                                    const HttpOptions::ptr_t & options,
 								   const HttpHeaders::ptr_t & headers,
-								   HttpHandler * user_handler)
+								   HttpHandler::ptr_t user_handler)
 {
 	HttpStatus status;
 	HttpHandle handle(LLCORE_HTTP_HANDLE_INVALID);
@@ -233,7 +229,7 @@ HttpHandle HttpRequest::requestGetByteRange(policy_t policy_id,
 											size_t len,
                                             const HttpOptions::ptr_t & options,
 											const HttpHeaders::ptr_t & headers,
-											HttpHandler * user_handler)
+											HttpHandler::ptr_t user_handler)
 {
 	HttpStatus status;
 	HttpHandle handle(LLCORE_HTTP_HANDLE_INVALID);
@@ -266,7 +262,7 @@ HttpHandle HttpRequest::requestPost(policy_t policy_id,
 									BufferArray * body,
                                     const HttpOptions::ptr_t & options,
 									const HttpHeaders::ptr_t & headers,
-									HttpHandler * user_handler)
+									HttpHandler::ptr_t user_handler)
 {
 	HttpStatus status;
 	HttpHandle handle(LLCORE_HTTP_HANDLE_INVALID);
@@ -299,7 +295,7 @@ HttpHandle HttpRequest::requestPut(policy_t policy_id,
 								   BufferArray * body,
                                    const HttpOptions::ptr_t & options,
 								   const HttpHeaders::ptr_t & headers,
-								   HttpHandler * user_handler)
+								   HttpHandler::ptr_t user_handler)
 {
 	HttpStatus status;
 	HttpHandle handle(LLCORE_HTTP_HANDLE_INVALID);
@@ -330,7 +326,7 @@ HttpHandle HttpRequest::requestDelete(policy_t policy_id,
     const std::string & url,
     const HttpOptions::ptr_t & options,
     const HttpHeaders::ptr_t & headers,
-    HttpHandler * user_handler)
+    HttpHandler::ptr_t user_handler)
 {
     HttpStatus status;
     HttpHandle handle(LLCORE_HTTP_HANDLE_INVALID);
@@ -362,7 +358,7 @@ HttpHandle HttpRequest::requestPatch(policy_t policy_id,
     BufferArray * body,
     const HttpOptions::ptr_t & options,
     const HttpHeaders::ptr_t & headers,
-    HttpHandler * user_handler)
+    HttpHandler::ptr_t user_handler)
 {
     HttpStatus status;
     HttpHandle handle(LLCORE_HTTP_HANDLE_INVALID);
@@ -393,7 +389,7 @@ HttpHandle HttpRequest::requestCopy(policy_t policy_id,
     const std::string & url,
     const HttpOptions::ptr_t & options,
     const HttpHeaders::ptr_t & headers,
-    HttpHandler * user_handler)
+    HttpHandler::ptr_t user_handler)
 {
     HttpStatus status;
     HttpHandle handle(LLCORE_HTTP_HANDLE_INVALID);
@@ -424,7 +420,7 @@ HttpHandle HttpRequest::requestMove(policy_t policy_id,
     const std::string & url,
     const HttpOptions::ptr_t & options,
     const HttpHeaders::ptr_t & headers,
-    HttpHandler * user_handler)
+    HttpHandler::ptr_t user_handler)
 {
     HttpStatus status;
     HttpHandle handle(LLCORE_HTTP_HANDLE_INVALID);
@@ -451,7 +447,7 @@ HttpHandle HttpRequest::requestMove(policy_t policy_id,
 }
 
 
-HttpHandle HttpRequest::requestNoOp(HttpHandler * user_handler)
+HttpHandle HttpRequest::requestNoOp(HttpHandler::ptr_t user_handler)
 {
 	HttpStatus status;
 	HttpHandle handle(LLCORE_HTTP_HANDLE_INVALID);
@@ -521,7 +517,7 @@ HttpStatus HttpRequest::update(long usecs)
 // Request Management Methods
 // ====================================
 
-HttpHandle HttpRequest::requestCancel(HttpHandle request, HttpHandler * user_handler)
+HttpHandle HttpRequest::requestCancel(HttpHandle request, HttpHandler::ptr_t user_handler)
 {
 	HttpStatus status;
 	HttpHandle ret_handle(LLCORE_HTTP_HANDLE_INVALID);
@@ -543,7 +539,7 @@ HttpHandle HttpRequest::requestCancel(HttpHandle request, HttpHandler * user_han
 
 
 HttpHandle HttpRequest::requestSetPriority(HttpHandle request, priority_t priority,
-										   HttpHandler * handler)
+										   HttpHandler::ptr_t handler)
 {
 	HttpStatus status;
 	HttpHandle ret_handle(LLCORE_HTTP_HANDLE_INVALID);
@@ -609,7 +605,7 @@ HttpStatus HttpRequest::startThread()
 }
 
 
-HttpHandle HttpRequest::requestStopThread(HttpHandler * user_handler)
+HttpHandle HttpRequest::requestStopThread(HttpHandler::ptr_t user_handler)
 {
 	HttpStatus status;
 	HttpHandle handle(LLCORE_HTTP_HANDLE_INVALID);
diff --git a/indra/llcorehttp/httprequest.h b/indra/llcorehttp/httprequest.h
index 6c2449266f..2eb3caa11e 100755
--- a/indra/llcorehttp/httprequest.h
+++ b/indra/llcorehttp/httprequest.h
@@ -238,7 +238,7 @@ public:
 
 	/// Prototype for policy based callbacks.  The callback methods will be executed
 	/// on the worker thread so no modifications should be made to the HttpHandler object.
-    typedef boost::function<HttpStatus(const std::string &, HttpHandler const * const, void *)> policyCallback_t;
+    typedef boost::function<HttpStatus(const std::string &, const HttpHandler::ptr_t &, void *)> policyCallback_t;
 
 	/// Set a policy option for a global or class parameter at
 	/// startup time (prior to thread start).
@@ -270,9 +270,9 @@ public:
 	/// @return				Handle of dynamic request.  Use @see getStatus() if
 	///						the returned handle is invalid.
 	HttpHandle setPolicyOption(EPolicyOption opt, policy_t pclass, long value,
-							   HttpHandler * handler);
+							   HttpHandler::ptr_t handler);
 	HttpHandle setPolicyOption(EPolicyOption opt, policy_t pclass, const std::string & value,
-							   HttpHandler * handler);
+							   HttpHandler::ptr_t handler);
 
 	/// @}
 
@@ -350,7 +350,7 @@ public:
 						  const std::string & url,
                           const HttpOptions::ptr_t & options,
 						  const HttpHeaders::ptr_t & headers,
-						  HttpHandler * handler);
+						  HttpHandler::ptr_t handler);
 
 
 	/// Queue a full HTTP GET request to be issued with a 'Range' header.
@@ -393,7 +393,7 @@ public:
 								   size_t len,
                                    const HttpOptions::ptr_t & options,
 								   const HttpHeaders::ptr_t & headers,
-								   HttpHandler * handler);
+								   HttpHandler::ptr_t handler);
 
 
 	/// Queue a full HTTP POST.  Query arguments and body may
@@ -434,7 +434,7 @@ public:
 						   BufferArray * body,
                            const HttpOptions::ptr_t & options,
 						   const HttpHeaders::ptr_t & headers,
-						   HttpHandler * handler);
+						   HttpHandler::ptr_t handler);
 
 
 	/// Queue a full HTTP PUT.  Query arguments and body may
@@ -475,7 +475,7 @@ public:
 						  BufferArray * body,
                           const HttpOptions::ptr_t & options,
 						  const HttpHeaders::ptr_t & headers,
-						  HttpHandler * handler);
+						  HttpHandler::ptr_t handler);
 
 
     /// Queue a full HTTP DELETE.  Query arguments and body may
@@ -495,7 +495,7 @@ public:
             const std::string & url,
             const HttpOptions::ptr_t & options,
             const HttpHeaders::ptr_t & headers,
-            HttpHandler * user_handler);
+            HttpHandler::ptr_t user_handler);
 
     /// Queue a full HTTP PATCH.  Query arguments and body may
     /// be provided.  Caller is responsible for escaping and
@@ -518,7 +518,7 @@ public:
             BufferArray * body,
             const HttpOptions::ptr_t & options,
             const HttpHeaders::ptr_t & headers,
-            HttpHandler * user_handler);
+            HttpHandler::ptr_t user_handler);
 
     /// Queue a full HTTP COPY.  Query arguments and body may
     /// be provided.  Caller is responsible for escaping and
@@ -537,7 +537,7 @@ public:
             const std::string & url,
             const HttpOptions::ptr_t & options,
             const HttpHeaders::ptr_t & headers,
-            HttpHandler * user_handler);
+            HttpHandler::ptr_t user_handler);
 
     /// Queue a full HTTP MOVE.  Query arguments and body may
     /// be provided.  Caller is responsible for escaping and
@@ -556,7 +556,7 @@ public:
             const std::string & url,
             const HttpOptions::ptr_t & options,
             const HttpHeaders::ptr_t & headers,
-            HttpHandler * user_handler);
+            HttpHandler::ptr_t user_handler);
 
     /// Queue a NoOp request.
 	/// The request is queued and serviced by the working thread which
@@ -566,7 +566,7 @@ public:
 	/// @param	handler			@see requestGet()
 	/// @return					"
 	///
-	HttpHandle requestNoOp(HttpHandler * handler);
+	HttpHandle requestNoOp(HttpHandler::ptr_t handler);
 
 	/// While all the heavy work is done by the worker thread, notifications
 	/// must be performed in the context of the application thread.  These
@@ -591,7 +591,7 @@ public:
 	///
 	/// @{
 	
-	HttpHandle requestCancel(HttpHandle request, HttpHandler *);
+	HttpHandle requestCancel(HttpHandle request, HttpHandler::ptr_t);
 
 	/// Request that a previously-issued request be reprioritized.
 	/// The status of whether the change itself succeeded arrives
@@ -603,7 +603,7 @@ public:
 	/// @param	handler			@see requestGet()
 	/// @return					"
 	///
-	HttpHandle requestSetPriority(HttpHandle request, priority_t priority, HttpHandler * handler);
+	HttpHandle requestSetPriority(HttpHandle request, priority_t priority, HttpHandler::ptr_t handler);
 
 	/// @}
 
@@ -641,7 +641,7 @@ public:
 	///							As the request cannot be cancelled, the handle
 	///							is generally not useful.
 	///
-	HttpHandle requestStopThread(HttpHandler * handler);
+	HttpHandle requestStopThread(HttpHandler::ptr_t handler);
 
 	/// Queue a Spin request.
 	/// DEBUG/TESTING ONLY.  This puts the worker into a CPU spin for
@@ -658,11 +658,13 @@ protected:
 	void generateNotification(HttpOperation * op);
 
 private:
+    typedef boost::shared_ptr<HttpReplyQueue> HttpReplyQueuePtr_t;
+
 	/// @name InstanceData
 	///
 	/// @{
 	HttpStatus			mLastReqStatus;
-	HttpReplyQueue *	mReplyQueue;
+    HttpReplyQueuePtr_t	mReplyQueue;
 	HttpRequestQueue *	mRequestQueue;
 	
 	/// @}
-- 
cgit v1.2.3