• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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-2019 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/script/license.php                               %
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 %
37 */
38 
39 /*
40   Include declarations.
41 */
42 #include "MagickWand/studio.h"
43 #include "MagickWand/MagickWand.h"
44 #include "MagickWand/magick-wand-private.h"
45 #include "MagickWand/wand.h"
46 
47 static SplayTreeInfo
48   *wand_ids = (SplayTreeInfo *) NULL;
49 
50 static MagickBooleanType
51   instantiate_wand = MagickFalse;
52 
53 static SemaphoreInfo
54   *wand_semaphore = (SemaphoreInfo *) NULL;
55 
56 /*
57 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
58 %                                                                             %
59 %                                                                             %
60 %                                                                             %
61 %   A c q u i r e W a n d I d                                                 %
62 %                                                                             %
63 %                                                                             %
64 %                                                                             %
65 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
66 %
67 %  AcquireWandId() returns a unique wand id.
68 %
69 %  The format of the AcquireWandId() method is:
70 %
71 %      size_t AcquireWandId()
72 %
73 */
AcquireWandId(void)74 WandExport size_t AcquireWandId(void)
75 {
76   static size_t
77     id = 0;
78 
79   size_t
80     wand_id;
81 
82   if (wand_semaphore == (SemaphoreInfo *) NULL)
83     ActivateSemaphoreInfo(&wand_semaphore);
84   LockSemaphoreInfo(wand_semaphore);
85   if (wand_ids == (SplayTreeInfo *) NULL)
86     wand_ids=NewSplayTree((int (*)(const void *,const void *)) NULL,
87       (void *(*)(void *)) NULL,(void *(*)(void *)) NULL);
88   wand_id=id++;
89   (void) AddValueToSplayTree(wand_ids,(const void *) wand_id,
90     (const void *) wand_id);
91   instantiate_wand=MagickTrue;
92   UnlockSemaphoreInfo(wand_semaphore);
93   return(wand_id);
94 }
95 
96 /*
97 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
98 %                                                                             %
99 %                                                                             %
100 %                                                                             %
101 %    D e s t r o y W a n d I d s                                              %
102 %                                                                             %
103 %                                                                             %
104 %                                                                             %
105 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
106 %
107 %  DestroyWandIds() deallocates memory associated with the wand id's.
108 %
109 %  The format of the DestroyWandIds() method is:
110 %
111 %      void DestroyWandIds(void)
112 %
113 %  A description of each parameter follows:
114 %
115 */
DestroyWandIds(void)116 WandExport void DestroyWandIds(void)
117 {
118   if (wand_semaphore == (SemaphoreInfo *) NULL)
119     ActivateSemaphoreInfo(&wand_semaphore);
120   LockSemaphoreInfo(wand_semaphore);
121   if (wand_ids != (SplayTreeInfo *) NULL)
122     wand_ids=DestroySplayTree(wand_ids);
123   instantiate_wand=MagickFalse;
124   UnlockSemaphoreInfo(wand_semaphore);
125   RelinquishSemaphoreInfo(&wand_semaphore);
126 }
127 
128 /*
129 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
130 %                                                                             %
131 %                                                                             %
132 %                                                                             %
133 %    R e l i n q u i s h W a n d I d                                          %
134 %                                                                             %
135 %                                                                             %
136 %                                                                             %
137 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
138 %
139 %  RelinquishWandId() relinquishes a unique wand id.
140 %
141 %  The format of the RelinquishWandId() method is:
142 %
143 %      void RelinquishWandId(const size_t *id)
144 %
145 %  A description of each parameter follows:
146 %
147 %    o id: a unique wand id.
148 %
149 */
RelinquishWandId(const size_t id)150 WandExport void RelinquishWandId(const size_t id)
151 {
152   LockSemaphoreInfo(wand_semaphore);
153   if (wand_ids != (SplayTreeInfo *) NULL)
154     (void) DeleteNodeFromSplayTree(wand_ids,(const void *) id);
155   UnlockSemaphoreInfo(wand_semaphore);
156 }
157