You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
68 lines
1.4 KiB
68 lines
1.4 KiB
// This may look like C code, but it is really -*- C++ -*-
|
|
//
|
|
// Copyright Bob Friesenhahn, 1999, 2000, 2001, 2002, 2004
|
|
// Copyright Dirk Lemstra 2014-2015
|
|
//
|
|
// Implementation of Blob
|
|
//
|
|
|
|
#define MAGICKCORE_IMPLEMENTATION 1
|
|
#define MAGICK_PLUSPLUS_IMPLEMENTATION 1
|
|
|
|
#include "Magick++/Include.h"
|
|
#include "Magick++/BlobRef.h"
|
|
#include "Magick++/Exception.h"
|
|
#include "Magick++/Thread.h"
|
|
|
|
#include <string.h>
|
|
|
|
Magick::BlobRef::BlobRef(const void* data_,const size_t length_)
|
|
: allocator(Magick::Blob::NewAllocator),
|
|
length(length_),
|
|
data((void*) NULL),
|
|
_mutexLock(),
|
|
_refCount(1)
|
|
{
|
|
if (data_ != (const void*) NULL)
|
|
{
|
|
data=new unsigned char[length_];
|
|
memcpy(data,data_,length_);
|
|
}
|
|
}
|
|
|
|
Magick::BlobRef::~BlobRef(void)
|
|
{
|
|
if (allocator == Magick::Blob::NewAllocator)
|
|
{
|
|
delete[] static_cast<unsigned char*>(data);
|
|
data=(void *) NULL;
|
|
}
|
|
else if (allocator == Magick::Blob::MallocAllocator)
|
|
data=(void *) RelinquishMagickMemory(data);
|
|
}
|
|
|
|
size_t Magick::BlobRef::decrease()
|
|
{
|
|
size_t
|
|
count;
|
|
|
|
_mutexLock.lock();
|
|
if (_refCount == 0)
|
|
{
|
|
_mutexLock.unlock();
|
|
throwExceptionExplicit(MagickCore::OptionError,
|
|
"Invalid call to decrease");
|
|
return(0);
|
|
}
|
|
count=--_refCount;
|
|
_mutexLock.unlock();
|
|
return(count);
|
|
}
|
|
|
|
void Magick::BlobRef::increase()
|
|
{
|
|
_mutexLock.lock();
|
|
_refCount++;
|
|
_mutexLock.unlock();
|
|
}
|