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 19 Magick::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 33 Magick::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 44 size_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 61 void Magick::BlobRef::increase() 62 { 63 _mutexLock.lock(); 64 _refCount++; 65 _mutexLock.unlock(); 66 } 67