1// This may look like C code, but it is really -*- C++ -*- 2// 3// Copyright Bob Friesenhahn, 1999, 2000, 2001, 2002, 2004 4// Copyright Dirk Lemstra 2014-2015 5// 6// Implementation of Blob 7// 8 9#define MAGICKCORE_IMPLEMENTATION 1 10#define MAGICK_PLUSPLUS_IMPLEMENTATION 1 11 12#include "Magick++/Include.h" 13#include "Magick++/BlobRef.h" 14#include "Magick++/Exception.h" 15#include "Magick++/Thread.h" 16 17#include <string.h> 18 19Magick::BlobRef::BlobRef(const void* data_,const size_t length_) 20 : allocator(Magick::Blob::NewAllocator), 21 length(length_), 22 data((void*) NULL), 23 _mutexLock(), 24 _refCount(1) 25{ 26 if (data_ != (const void*) NULL) 27 { 28 data=new unsigned char[length_]; 29 memcpy(data,data_,length_); 30 } 31} 32 33Magick::BlobRef::~BlobRef(void) 34{ 35 if (allocator == Magick::Blob::NewAllocator) 36 { 37 delete[] static_cast<unsigned char*>(data); 38 data=(void *) NULL; 39 } 40 else if (allocator == Magick::Blob::MallocAllocator) 41 data=(void *) RelinquishMagickMemory(data); 42} 43 44size_t Magick::BlobRef::decrease() 45{ 46 size_t 47 count; 48 49 _mutexLock.lock(); 50 if (_refCount == 0) 51 { 52 _mutexLock.unlock(); 53 throwExceptionExplicit(MagickCore::OptionError, 54 "Invalid call to decrease"); 55 } 56 count=--_refCount; 57 _mutexLock.unlock(); 58 return(count); 59} 60 61void Magick::BlobRef::increase() 62{ 63 _mutexLock.lock(); 64 _refCount++; 65 _mutexLock.unlock(); 66} 67