// Blocker.cpp
 
#include <new>
 
#include "Blocker.h"
 
// Data
struct Blocker::Data {
	Data()
		: semaphore(create_sem(0, "blocker")),
		  references(1),
		  userData(0)
	{
	}
 
	Data(sem_id semaphore)
		: semaphore(semaphore),
		  references(1)
	{
	}
 
	~Data()
	{
		if (semaphore >= 0)
			delete_sem(semaphore);
	}
 
	sem_id	semaphore;
	int32	references;
	int32	userData;
};
 
// constructor
Blocker::Blocker()
	: fData(new(std::nothrow) Data)
{
}
 
// constructor
Blocker::Blocker(sem_id semaphore)
	: fData(new(std::nothrow) Data(semaphore))
{
	if (!fData)
		delete_sem(semaphore);
}
 
// copy constructor
Blocker::Blocker(const Blocker& other)
	: fData(NULL)
{
	*this = other;
}
 
// destructor
Blocker::~Blocker()
{
	_Unset();
}
 
// InitCheck
status_t
Blocker::InitCheck() const
{
	if (!fData)
		return B_NO_MEMORY;
	return (fData->semaphore < 0 ? fData->semaphore : B_OK);
}
 
// PrepareForUse
status_t
Blocker::PrepareForUse()
{
	// check initialization
	if (!fData || fData->semaphore < 0)
		return B_NO_INIT;
	// get semaphore count
	int32 count;
	status_t error = get_sem_count(fData->semaphore, &count);
	if (error != B_OK)
		return error;
	// set the semaphore count to zero
	if (count > 0)
		error = acquire_sem_etc(fData->semaphore, count, B_RELATIVE_TIMEOUT, 0);
	else if (count < 0)
		error = release_sem_etc(fData->semaphore, -count, 0);
	return error;
}
 
// Block
status_t
Blocker::Block(int32* userData)
{
	if (!fData || fData->semaphore < 0)
		return B_NO_INIT;
 
	status_t error = acquire_sem(fData->semaphore);
 
	if (userData)
		*userData = fData->userData;
 
	return error;
}
 
// Unblock
status_t
Blocker::Unblock(int32 userData)
{
	if (!fData || fData->semaphore < 0)
		return B_NO_INIT;
 
	fData->userData = userData;
 
	return release_sem(fData->semaphore);
}
 
// =
Blocker&
Blocker::operator=(const Blocker& other)
{
	_Unset();
	fData = other.fData;
	if (fData)
		fData->references++;
	return *this;
}
 
// ==
bool
Blocker::operator==(const Blocker& other) const
{
	return (fData == other.fData);
}
 
// !=
bool
Blocker::operator!=(const Blocker& other) const
{
	return (fData != other.fData);
}
 
// _Unset
void
Blocker::_Unset()
{
	if (fData) {
		if (--fData->references == 0)
			delete fData;
		fData = NULL;
	}
}
 

V730 Not all members of a class are initialized inside the constructor. Consider inspecting: userData.