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