Changeset - r28403:d4cdcb69255f
[Not reviewed]
master
0 2 0
Patric Stout - 11 months ago 2024-01-05 18:48:21
truebrain@openttd.org
Fix: race-condition when quitting the game with libcurl (#11688)

There could be a callback in _new_http_callbacks that is not
processed yet. All callbacks in _http_callbacks were cancelled,
but not the ones in _new_http_callbacks
2 files changed with 3 insertions and 18 deletions:
0 comments (0 inline, 0 general)
src/network/core/http_curl.cpp
Show inline comments
 
@@ -278,10 +278,9 @@ void NetworkHTTPUninitialize()
 
{
 
	_http_thread_exit = true;
 

	
 
	/* Queues must be cleared (and the queue CV signalled) after _http_thread_exit is set to ensure that the HTTP thread can exit */
 
	for (auto &callback : _http_callbacks) {
 
		callback->ClearQueue();
 
	}
 
	/* Ensure the callbacks are handled. This is mostly needed as we send
 
	 * a survey just before close, and that might be pending here. */
 
	NetworkHTTPSocketHandler::HTTPReceive();
 

	
 
	{
 
		std::lock_guard<std::mutex> lock(_http_mutex);
src/network/core/http_shared.h
Show inline comments
 
@@ -97,20 +97,6 @@ public:
 
		return this->queue.empty();
 
	}
 

	
 

	
 
	/**
 
	 * Clear everything in the queue.
 
	 *
 
	 * Should be called from the Game Thread.
 
	 */
 
	void ClearQueue()
 
	{
 
		std::lock_guard<std::mutex> lock(this->mutex);
 

	
 
		this->queue.clear();
 
		this->queue_cv.notify_all();
 
	}
 

	
 
	HTTPThreadSafeCallback(HTTPCallback *callback) : callback(callback) {}
 

	
 
	~HTTPThreadSafeCallback()
0 comments (0 inline, 0 general)