Coverage Report

Created: 2026-05-16 07:22

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/imagemagick/MagickWand/wand.c
Line
Count
Source
1
/*
2
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3
%                                                                             %
4
%                                                                             %
5
%                                                                             %
6
%                         W   W   AAA   N   N  DDDD                           %
7
%                         W   W  A   A  NN  N  D   D                          %
8
%                         W W W  AAAAA  N N N  D   D                          %
9
%                         WW WW  A   A  N  NN  D   D                          %
10
%                         W   W  A   A  N   N  DDDD                           %
11
%                                                                             %
12
%                                                                             %
13
%                         MagickWand Support Methods                          %
14
%                                                                             %
15
%                              Software Design                                %
16
%                                   Cristy                                    %
17
%                                  May 2004                                   %
18
%                                                                             %
19
%                                                                             %
20
%  Copyright @ 1999 ImageMagick Studio LLC, a non-profit organization         %
21
%  dedicated to making software imaging solutions freely available.           %
22
%                                                                             %
23
%  You may not use this file except in compliance with the License.  You may  %
24
%  obtain a copy of the License at                                            %
25
%                                                                             %
26
%    https://imagemagick.org/license/                                         %
27
%                                                                             %
28
%  Unless required by applicable law or agreed to in writing, software        %
29
%  distributed under the License is distributed on an "AS IS" BASIS,          %
30
%  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.   %
31
%  See the License for the specific language governing permissions and        %
32
%  limitations under the License.                                             %
33
%                                                                             %
34
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
35
%
36
% Assign unique ID's to each magick wand.  We store the ID's in a splay-tree
37
% to track which ID's persist and which were destroyed.
38
%
39
%
40
*/
41

42
/*
43
  Include declarations.
44
*/
45
#include "MagickWand/studio.h"
46
#include "MagickWand/MagickWand.h"
47
#include "MagickWand/magick-wand-private.h"
48
#include "MagickWand/wand.h"
49

50
static SplayTreeInfo
51
  *wand_ids = (SplayTreeInfo *) NULL;
52
53
static MagickBooleanType
54
  instantiate_wand = MagickFalse;
55
56
static SemaphoreInfo
57
  *wand_semaphore = (SemaphoreInfo *) NULL;
58

59
/*
60
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
61
%                                                                             %
62
%                                                                             %
63
%                                                                             %
64
%   A c q u i r e W a n d I d                                                 %
65
%                                                                             %
66
%                                                                             %
67
%                                                                             %
68
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
69
%
70
%  AcquireWandId() returns a unique wand id.
71
%
72
%  The format of the AcquireWandId() method is:
73
%
74
%      size_t AcquireWandId()
75
%
76
*/
77
WandExport size_t AcquireWandId(void)
78
0
{
79
0
  MagickAddressType
80
0
    wand_id;
81
82
0
  static size_t
83
0
    id = 0;
84
85
0
  if (wand_semaphore == (SemaphoreInfo *) NULL)
86
0
    ActivateSemaphoreInfo(&wand_semaphore);
87
0
  LockSemaphoreInfo(wand_semaphore);
88
0
  if (wand_ids == (SplayTreeInfo *) NULL)
89
0
    wand_ids=NewSplayTree((int (*)(const void *,const void *)) NULL,
90
0
      (void *(*)(void *)) NULL,(void *(*)(void *)) NULL);
91
0
  wand_id=id++;
92
0
  (void) AddValueToSplayTree(wand_ids,(const void *) wand_id,(const void *)
93
0
    wand_id);
94
0
  instantiate_wand=MagickTrue;
95
0
  UnlockSemaphoreInfo(wand_semaphore);
96
0
  return((size_t) wand_id);
97
0
}
98

99
/*
100
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
101
%                                                                             %
102
%                                                                             %
103
%                                                                             %
104
%    D e s t r o y W a n d I d s                                              %
105
%                                                                             %
106
%                                                                             %
107
%                                                                             %
108
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
109
%
110
%  DestroyWandIds() deallocates memory associated with the wand id's.
111
%
112
%  The format of the DestroyWandIds() method is:
113
%
114
%      void DestroyWandIds(void)
115
%
116
%  A description of each parameter follows:
117
%
118
*/
119
WandExport void DestroyWandIds(void)
120
0
{
121
0
  if (wand_semaphore == (SemaphoreInfo *) NULL)
122
0
    ActivateSemaphoreInfo(&wand_semaphore);
123
0
  LockSemaphoreInfo(wand_semaphore);
124
0
  if (wand_ids != (SplayTreeInfo *) NULL)
125
0
    wand_ids=DestroySplayTree(wand_ids);
126
0
  instantiate_wand=MagickFalse;
127
0
  UnlockSemaphoreInfo(wand_semaphore);
128
0
  RelinquishSemaphoreInfo(&wand_semaphore);
129
0
}
130

131
/*
132
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
133
%                                                                             %
134
%                                                                             %
135
%                                                                             %
136
%    R e l i n q u i s h W a n d I d                                          %
137
%                                                                             %
138
%                                                                             %
139
%                                                                             %
140
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
141
%
142
%  RelinquishWandId() relinquishes a unique wand id.
143
%
144
%  The format of the RelinquishWandId() method is:
145
%
146
%      void RelinquishWandId(const size_t *id)
147
%
148
%  A description of each parameter follows:
149
%
150
%    o id: a unique wand id.
151
%
152
*/
153
WandExport void RelinquishWandId(const size_t id)
154
0
{
155
0
  MagickAddressType
156
0
    wand_id = (MagickAddressType) id;
157
158
0
  LockSemaphoreInfo(wand_semaphore);
159
0
  if (wand_ids != (SplayTreeInfo *) NULL)
160
0
    (void) DeleteNodeFromSplayTree(wand_ids,(const void *) wand_id);
161
0
  UnlockSemaphoreInfo(wand_semaphore);
162
0
}