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