13ed852eea50f9d4cd633efb8c2b054b8e33c253cristy// This may look like C code, but it is really -*- C++ -*- 23ed852eea50f9d4cd633efb8c2b054b8e33c253cristy// 33ed852eea50f9d4cd633efb8c2b054b8e33c253cristy// Copyright Bob Friesenhahn, 1999, 2000, 2001, 2002, 2004 477328896b876314656427663695bc7b2c9be3f74dirk// Copyright Dirk Lemstra 2014-2015 53ed852eea50f9d4cd633efb8c2b054b8e33c253cristy// 63ed852eea50f9d4cd633efb8c2b054b8e33c253cristy// Implementation of Blob 73ed852eea50f9d4cd633efb8c2b054b8e33c253cristy// 83ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 93ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define MAGICKCORE_IMPLEMENTATION 1 103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define MAGICK_PLUSPLUS_IMPLEMENTATION 1 113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include "Magick++/Include.h" 133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include "Magick++/BlobRef.h" 14debd02e3cb441e34f5b63bbfbf69e404f8135159dirk#include "Magick++/Exception.h" 15debd02e3cb441e34f5b63bbfbf69e404f8135159dirk#include "Magick++/Thread.h" 163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include <string.h> 183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 19e8fddf8b0ee09a9ff393449b169dd2e24e7608e4dirkMagick::BlobRef::BlobRef(const void* data_,const size_t length_) 20debd02e3cb441e34f5b63bbfbf69e404f8135159dirk : allocator(Magick::Blob::NewAllocator), 2104a15bc961aeaded80e33141c68e2399f789f282dirk length(length_), 22debd02e3cb441e34f5b63bbfbf69e404f8135159dirk data((void*) NULL), 23debd02e3cb441e34f5b63bbfbf69e404f8135159dirk _mutexLock(), 24debd02e3cb441e34f5b63bbfbf69e404f8135159dirk _refCount(1) 253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 26debd02e3cb441e34f5b63bbfbf69e404f8135159dirk if (data_ != (const void*) NULL) 273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 2804a15bc961aeaded80e33141c68e2399f789f282dirk data=new unsigned char[length_]; 29debd02e3cb441e34f5b63bbfbf69e404f8135159dirk memcpy(data,data_,length_); 303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 3304a15bc961aeaded80e33141c68e2399f789f282dirkMagick::BlobRef::~BlobRef(void) 343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 3504a15bc961aeaded80e33141c68e2399f789f282dirk if (allocator == Magick::Blob::NewAllocator) 363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 3704a15bc961aeaded80e33141c68e2399f789f282dirk delete[] static_cast<unsigned char*>(data); 38debd02e3cb441e34f5b63bbfbf69e404f8135159dirk data=(void *) NULL; 393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 4004a15bc961aeaded80e33141c68e2399f789f282dirk else if (allocator == Magick::Blob::MallocAllocator) 41debd02e3cb441e34f5b63bbfbf69e404f8135159dirk data=(void *) RelinquishMagickMemory(data); 42debd02e3cb441e34f5b63bbfbf69e404f8135159dirk} 43debd02e3cb441e34f5b63bbfbf69e404f8135159dirk 44debd02e3cb441e34f5b63bbfbf69e404f8135159dirksize_t Magick::BlobRef::decrease() 45debd02e3cb441e34f5b63bbfbf69e404f8135159dirk{ 46debd02e3cb441e34f5b63bbfbf69e404f8135159dirk size_t 47debd02e3cb441e34f5b63bbfbf69e404f8135159dirk count; 48debd02e3cb441e34f5b63bbfbf69e404f8135159dirk 49debd02e3cb441e34f5b63bbfbf69e404f8135159dirk _mutexLock.lock(); 50debd02e3cb441e34f5b63bbfbf69e404f8135159dirk if (_refCount == 0) 513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 52debd02e3cb441e34f5b63bbfbf69e404f8135159dirk _mutexLock.unlock(); 5377328896b876314656427663695bc7b2c9be3f74dirk throwExceptionExplicit(MagickCore::OptionError, 5477328896b876314656427663695bc7b2c9be3f74dirk "Invalid call to decrease"); 553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 56debd02e3cb441e34f5b63bbfbf69e404f8135159dirk count=--_refCount; 57debd02e3cb441e34f5b63bbfbf69e404f8135159dirk _mutexLock.unlock(); 58debd02e3cb441e34f5b63bbfbf69e404f8135159dirk return(count); 59debd02e3cb441e34f5b63bbfbf69e404f8135159dirk} 60debd02e3cb441e34f5b63bbfbf69e404f8135159dirk 61debd02e3cb441e34f5b63bbfbf69e404f8135159dirkvoid Magick::BlobRef::increase() 62debd02e3cb441e34f5b63bbfbf69e404f8135159dirk{ 63debd02e3cb441e34f5b63bbfbf69e404f8135159dirk _mutexLock.lock(); 64debd02e3cb441e34f5b63bbfbf69e404f8135159dirk _refCount++; 65debd02e3cb441e34f5b63bbfbf69e404f8135159dirk _mutexLock.unlock(); 663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 67