Use atomic int for reference count in wxWebRequest classes

This is required because these classes are copied in both the main and
the worker threads and using plain int is MT-unsafe.
This commit is contained in:
Vadim Zeitlin
2021-01-11 01:24:55 +01:00
parent de93f8be5b
commit 0f82a1e043
2 changed files with 48 additions and 4 deletions

View File

@@ -0,0 +1,42 @@
///////////////////////////////////////////////////////////////////////////////
// Name: wx/private/refcountermt.h
// Purpose: wxRefCounterMT class: MT-safe version of wxRefCounter
// Author: Vadim Zeitlin
// Created: 2021-01-11
// Copyright: (c) 2021 Vadim Zeitlin <vadim@wxwidgets.org>
// Licence: wxWindows licence
///////////////////////////////////////////////////////////////////////////////
#ifndef _WX_PRIVATE_REFCOUNTERMT_H_
#define _WX_PRIVATE_REFCOUNTERMT_H_
#include "wx/atomic.h"
// ----------------------------------------------------------------------------
// Version of wxRefCounter with MT-safe count
// ----------------------------------------------------------------------------
class wxRefCounterMT
{
public:
wxRefCounterMT() { m_count = 1; }
void IncRef() { wxAtomicInc(m_count); }
void DecRef()
{
if ( wxAtomicDec(m_count) == 0 )
delete this;
}
protected:
virtual ~wxRefCounterMT() { }
private:
// Ref count is atomic to allow IncRef() and DecRef() to be concurrently
// called from different threads.
wxAtomicInt m_count;
wxDECLARE_NO_COPY_CLASS(wxRefCounterMT);
};
#endif // _WX_PRIVATE_REFCOUNTERMT_H_

View File

@@ -14,13 +14,15 @@
#include "wx/hashmap.h"
#include "wx/scopedptr.h"
#include "wx/private/refcountermt.h"
WX_DECLARE_STRING_HASH_MAP(wxString, wxWebRequestHeaderMap);
// ----------------------------------------------------------------------------
// wxWebAuthChallengeImpl
// ----------------------------------------------------------------------------
class wxWebAuthChallengeImpl : public wxRefCounter
class wxWebAuthChallengeImpl : public wxRefCounterMT
{
public:
virtual ~wxWebAuthChallengeImpl() { }
@@ -43,7 +45,7 @@ private:
// wxWebRequestImpl
// ----------------------------------------------------------------------------
class wxWebRequestImpl : public wxRefCounter
class wxWebRequestImpl : public wxRefCounterMT
{
public:
virtual ~wxWebRequestImpl() { }
@@ -123,7 +125,7 @@ private:
// wxWebResponseImpl
// ----------------------------------------------------------------------------
class wxWebResponseImpl : public wxRefCounter
class wxWebResponseImpl : public wxRefCounterMT
{
public:
virtual ~wxWebResponseImpl();
@@ -190,7 +192,7 @@ public:
// wxWebSessionImpl
// ----------------------------------------------------------------------------
class wxWebSessionImpl : public wxRefCounter
class wxWebSessionImpl : public wxRefCounterMT
{
public:
virtual ~wxWebSessionImpl() { }