[gdal-dev] GDAL reference counting is thread unsafe

Martin Chapman mchapman at fortifieddatacom.com
Sat Nov 1 22:53:08 EDT 2008


If anyone is interested the following code has been used safely on Windows
and Linux for thread safe reference counting.  You can paste it into a
header file if you want, or use it as a guide.  It uses pthreads on Linux
and the Win32 thread functions on Windows with InterlockedIncrement() and
InterlockedDecrement().

Best regards,
Martin


#ifndef Increment_h
#define Increment_h

#define _WINDOWS_

#ifndef _WINDOWS_
#include <pthread.h>
#include <bits/pthreadtypes.h>
#endif

class CIncrement
{
public: 

	#ifdef _WINDOWS_
	CRITICAL_SECTION m_CS;
	#endif

CIncrement()
{
	#ifndef _WINDOWS_
	pthread_mutex_init(&m_Mutex, NULL);
	#endif
    
	#ifdef _WINDOWS_
	InitializeCriticalSection(&m_CS);
	#endif

	#ifdef _WINDOWS_
	EnterCriticalSection(&m_CS);
	#endif

	m_nVal = 0;

	#ifdef _WINDOWS_
	LeaveCriticalSection(&m_CS);
	#endif
}

~CIncrement()
{
	#ifndef _WINDOWS_
	pthread_mutex_destroy (&m_Mutex);
	#endif

	#ifdef _WINDOWS_
	DeleteCriticalSection(&m_CS);
	#endif
}

CIncrement& operator=(const CIncrement& thread)
{
    if (this == &thread)
        return *this;

	#ifndef _WINDOWS_
    pthread_mutex_lock(&m_Mutex);
    #endif

	#ifdef _WINDOWS_
	EnterCriticalSection(&m_CS);
	#endif

    m_nVal = thread.m_nVal;

	#ifdef _WINDOWS_
	DeleteCriticalSection(&m_CS);
	#endif
    
    #ifndef _WINDOWS_
    pthread_mutex_unlock(&m_Mutex);
    #endif
    
    return *this;
}   

int operator++(int nVal)
{
    return Add(1, true);
}

int operator++()
{
    return Add(1, false);
}
    
int operator--(int nVal)
{
    return Add(-1, true);
}

int operator--()
{
    return Add(-1, false);
}
    
bool operator==(const int nVal)
{
    #ifndef _WINDOWS_
    pthread_mutex_lock(&m_Mutex);
    #endif

	#ifdef _WINDOWS_
	EnterCriticalSection(&m_CS);
	#endif
    
    bool bReturn = (m_nVal == nVal);

	#ifdef _WINDOWS_
	LeaveCriticalSection(&m_CS);
	#endif

    #ifndef _WINDOWS_
    pthread_mutex_unlock(&m_Mutex);
    #endif
    
    return bReturn;
}

int Add(int nNum, bool bReturnNew)
{
    int rtn = 0;
    #ifdef _WINDOWS_
    return nNum > 0 ? InterlockedIncrement((volatile LONG*) &m_nVal)
					: InterlockedDecrement((volatile
LONG*) &m_nVal);

    #else
    pthread_mutex_lock(&m_Mutex);
    int oVal = m_nVal;
    m_nVal += nNum;
    rtn = bReturnNew ? m_nVal : oVal;
    pthread_mutex_unlock(&m_Mutex);
    #endif
    
    return rtn;
}

protected:
	int m_nVal;

	#ifdef _WINDOWS_
	void* m_Mutex;
	#else
	pthread_mutex_t m_Mutex;
	#endif
};

#endif











-----Original Message-----
From: gdal-dev-bounces at lists.osgeo.org
[mailto:gdal-dev-bounces at lists.osgeo.org] On Behalf Of Tamas Szekeres
Sent: Saturday, November 01, 2008 5:40 PM
To: gdal-dev at lists.osgeo.org
Subject: [gdal-dev] GDAL reference counting is thread unsafe

Folks,

I've found the following issue with the current refcounting
implementation in GDAL:
http://trac.osgeo.org/gdal/ticket/2648

Do you have idea whether we could handle this problem possibly for the
next release?


Best regards,

Tamas
_______________________________________________
gdal-dev mailing list
gdal-dev at lists.osgeo.org
http://lists.osgeo.org/mailman/listinfo/gdal-dev




More information about the gdal-dev mailing list