]> granicus.if.org Git - imagemagick/blob - MagickWand/wand.c
(no commit message)
[imagemagick] / MagickWand / wand.c
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 %                                John Cristy                                  %
17 %                                 May  2004                                   %
18 %                                                                             %
19 %                                                                             %
20 %  Copyright 1999-2013 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 %    http://www.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 \f
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 \f
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 \f
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 */
74 WandExport size_t AcquireWandId(void)
75 {
76   static size_t
77     id = 0;
78
79   if (wand_semaphore == (SemaphoreInfo *) NULL)
80     AcquireSemaphoreInfo(&wand_semaphore);
81   LockSemaphoreInfo(wand_semaphore);
82   if ((wand_ids == (SplayTreeInfo *) NULL) && IsMagickFalse(instantiate_wand))
83     {
84       wand_ids=NewSplayTree((int (*)(const void *,const void *)) NULL,
85         (void *(*)(void *)) NULL,(void *(*)(void *)) NULL);
86       instantiate_wand=MagickTrue;
87     }
88   id++;
89   (void) AddValueToSplayTree(wand_ids,(const void *) id,(const void *) id);
90   UnlockSemaphoreInfo(wand_semaphore);
91   return(id);
92 }
93 \f
94 /*
95 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
96 %                                                                             %
97 %                                                                             %
98 %                                                                             %
99 %    D e s t r o y W a n d I d s                                              %
100 %                                                                             %
101 %                                                                             %
102 %                                                                             %
103 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
104 %
105 %  DestroyWandIds() deallocates memory associated with the wand id's.
106 %
107 %  The format of the DestroyWandIds() method is:
108 %
109 %      void DestroyWandIds(void)
110 %
111 %  A description of each parameter follows:
112 %
113 */
114 WandExport void DestroyWandIds(void)
115 {
116   if (wand_semaphore == (SemaphoreInfo *) NULL)
117     AcquireSemaphoreInfo(&wand_semaphore);
118   LockSemaphoreInfo(wand_semaphore);
119   if (wand_ids != (SplayTreeInfo *) NULL)
120     wand_ids=DestroySplayTree(wand_ids);
121   instantiate_wand=MagickFalse;
122   UnlockSemaphoreInfo(wand_semaphore);
123   DestroySemaphoreInfo(&wand_semaphore);
124 }
125 \f
126 /*
127 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
128 %                                                                             %
129 %                                                                             %
130 %                                                                             %
131 %    R e l i n q u i s h W a n d I d                                          %
132 %                                                                             %
133 %                                                                             %
134 %                                                                             %
135 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
136 %
137 %  RelinquishWandId() relinquishes a unique wand id.
138 %
139 %  The format of the RelinquishWandId() method is:
140 %
141 %      void RelinquishWandId(const size_t *id)
142 %
143 %  A description of each parameter follows:
144 %
145 %    o id: a unique wand id.
146 %
147 */
148 WandExport void RelinquishWandId(const size_t id)
149 {
150   LockSemaphoreInfo(wand_semaphore);
151   if (wand_ids != (SplayTreeInfo *) NULL)
152     (void) DeleteNodeByValueFromSplayTree(wand_ids,(const void *) id);
153   UnlockSemaphoreInfo(wand_semaphore);
154 }