CMGDK r49-rc2
|
00001 / * C o p y r i g h t ( C ) 2 0 0 7 - 2 0 0 8 M y S Q L A B , 2 0 0 8 - 2 0 0 9 S u n M i c r o s y s t e m s , I n c . 00002 00003 T h i s p r o g r a m i s f r e e s o f t w a r e ; y o u c a n r e d i s t r i b u t e i t a n d / o r m o d i f y 00004 00005 i t u n d e r t h e t e r m s o f t h e G N U G e n e r a l P u b l i c L i c e n s e a s p u b l i s h e d b y 00006 00007 t h e F r e e S o f t w a r e F o u n d a t i o n ; v e r s i o n 2 o f t h e L i c e n s e . 00008 00009 T h i s p r o g r a m i s d i s t r i b u t e d i n t h e h o p e t h a t i t w i l l b e u s e f u l , 00010 00011 b u t W I T H O U T A N Y W A R R A N T Y ; w i t h o u t e v e n t h e i m p l i e d w a r r a n t y o f 00012 00013 M E R C H A N T A B I L I T Y o r F I T N E S S F O R A P A R T I C U L A R P U R P O S E . S e e t h e 00014 00015 G N U G e n e r a l P u b l i c L i c e n s e f o r m o r e d e t a i l s . 00016 00017 Y o u s h o u l d h a v e r e c e i v e d a c o p y o f t h e G N U G e n e r a l P u b l i c L i c e n s e 00018 00019 a l o n g w i t h t h i s p r o g r a m ; i f n o t , w r i t e t o t h e F r e e S o f t w a r e 00020 00021 F o u n d a t i o n , I n c . , 5 9 T e m p l e P l a c e , S u i t e 3 3 0 , B o s t o n , M A 0 2 1 1 1 - 1 3 0 7 U S A * / 00022 00023 # i f n d e f _ l f _ h 00024 00025 # d e f i n e _ l f _ h 00026 00027 # i n c l u d e < m y _ a t o m i c . h > 00028 00029 / * 00030 00031 H e l p e r s t o d e f i n e b o t h f u n c ( ) a n d _ f u n c ( ) , w h e r e 00032 00033 f u n c ( ) i s a _ f u n c ( ) p r o t e c t e d b y m y _ a t o m i c _ r w l o c k _ w r l o c k ( ) 00034 00035 * / 00036 00037 # d e f i n e l o c k _ w r a p ( f , t , p r o t o _ a r g s , a r g s , l o c k ) \ 00038 00039 t _ # # f p r o t o _ a r g s ; \ 00040 00041 s t a t i c i n l i n e t f p r o t o _ a r g s \ 00042 00043 { \ 00044 00045 t r e t ; \ 00046 00047 m y _ a t o m i c _ r w l o c k _ w r l o c k ( l o c k ) ; \ 00048 00049 r e t = _ # # f a r g s ; \ 00050 00051 m y _ a t o m i c _ r w l o c k _ w r u n l o c k ( l o c k ) ; \ 00052 00053 r e t u r n r e t ; \ 00054 00055 } 00056 00057 # d e f i n e l o c k _ w r a p _ v o i d ( f , p r o t o _ a r g s , a r g s , l o c k ) \ 00058 00059 v o i d _ # # f p r o t o _ a r g s ; \ 00060 00061 s t a t i c i n l i n e v o i d f p r o t o _ a r g s \ 00062 00063 { \ 00064 00065 m y _ a t o m i c _ r w l o c k _ w r l o c k ( l o c k ) ; \ 00066 00067 _ # # f a r g s ; \ 00068 00069 m y _ a t o m i c _ r w l o c k _ w r u n l o c k ( l o c k ) ; \ 00070 00071 } 00072 00073 # d e f i n e n o l o c k _ w r a p ( f , t , p r o t o _ a r g s , a r g s ) \ 00074 00075 t _ # # f p r o t o _ a r g s ; \ 00076 00077 s t a t i c i n l i n e t f p r o t o _ a r g s \ 00078 00079 { \ 00080 00081 r e t u r n _ # # f a r g s ; \ 00082 00083 } 00084 00085 # d e f i n e n o l o c k _ w r a p _ v o i d ( f , p r o t o _ a r g s , a r g s ) \ 00086 00087 v o i d _ # # f p r o t o _ a r g s ; \ 00088 00089 s t a t i c i n l i n e v o i d f p r o t o _ a r g s \ 00090 00091 { \ 00092 00093 _ # # f a r g s ; \ 00094 00095 } 00096 00097 / * 00098 00099 w a i t - f r e e d y n a m i c a r r a y , s e e l f _ d y n a r r a y . c 00100 00101 4 l e v e l s o f 2 5 6 e l e m e n t s e a c h m e a n 4 3 1 1 8 1 0 3 0 4 e l e m e n t s i n a n a r r a y - i t 00102 00103 s h o u l d b e e n o u g h f o r a w h i l e 00104 00105 * / 00106 00107 # d e f i n e L F _ D Y N A R R A Y _ L E V E L _ L E N G T H 2 5 6 00108 00109 # d e f i n e L F _ D Y N A R R A Y _ L E V E L S 4 00110 00111 t y p e d e f s t r u c t { 00112 00113 v o i d * v o l a t i l e l e v e l [ L F _ D Y N A R R A Y _ L E V E L S ] ; 00114 00115 u i n t s i z e _ o f _ e l e m e n t ; 00116 00117 m y _ a t o m i c _ r w l o c k _ t l o c k ; 00118 00119 } L F _ D Y N A R R A Y ; 00120 00121 t y p e d e f i n t ( * l f _ d y n a r r a y _ f u n c ) ( v o i d * , v o i d * ) ; 00122 00123 v o i d l f _ d y n a r r a y _ i n i t ( L F _ D Y N A R R A Y * a r r a y , u i n t e l e m e n t _ s i z e ) ; 00124 00125 v o i d l f _ d y n a r r a y _ d e s t r o y ( L F _ D Y N A R R A Y * a r r a y ) ; 00126 00127 n o l o c k _ w r a p ( l f _ d y n a r r a y _ v a l u e , v o i d * , 00128 00129 ( L F _ D Y N A R R A Y * a r r a y , u i n t i d x ) , 00130 00131 ( a r r a y , i d x ) ) 00132 00133 l o c k _ w r a p ( l f _ d y n a r r a y _ l v a l u e , v o i d * , 00134 00135 ( L F _ D Y N A R R A Y * a r r a y , u i n t i d x ) , 00136 00137 ( a r r a y , i d x ) , 00138 00139 & a r r a y - > l o c k ) 00140 00141 n o l o c k _ w r a p ( l f _ d y n a r r a y _ i t e r a t e , i n t , 00142 00143 ( L F _ D Y N A R R A Y * a r r a y , l f _ d y n a r r a y _ f u n c f u n c , v o i d * a r g ) , 00144 00145 ( a r r a y , f u n c , a r g ) ) 00146 00147 / * 00148 00149 p i n m a n a g e r f o r m e m o r y a l l o c a t o r , l f _ a l l o c - p i n . c 00150 00151 * / 00152 00153 # d e f i n e L F _ P I N B O X _ P I N S 4 00154 00155 # d e f i n e L F _ P U R G A T O R Y _ S I Z E 1 0 00156 00157 t y p e d e f v o i d l f _ p i n b o x _ f r e e _ f u n c ( v o i d * , v o i d * , v o i d * ) ; 00158 00159 t y p e d e f s t r u c t { 00160 00161 L F _ D Y N A R R A Y p i n a r r a y ; 00162 00163 l f _ p i n b o x _ f r e e _ f u n c * f r e e _ f u n c ; 00164 00165 v o i d * f r e e _ f u n c _ a r g ; 00166 00167 u i n t f r e e _ p t r _ o f f s e t ; 00168 00169 u i n t 3 2 v o l a t i l e p i n s t a c k _ t o p _ v e r ; / * t h i s i s a v e r s i o n e d p o i n t e r * / 00170 00171 u i n t 3 2 v o l a t i l e p i n s _ i n _ a r r a y ; / * n u m b e r o f e l e m e n t s i n a r r a y * / 00172 00173 } L F _ P I N B O X ; 00174 00175 t y p e d e f s t r u c t { 00176 00177 v o i d * v o l a t i l e p i n [ L F _ P I N B O X _ P I N S ] ; 00178 00179 L F _ P I N B O X * p i n b o x ; 00180 00181 v o i d * * s t a c k _ e n d s _ h e r e ; 00182 00183 v o i d * p u r g a t o r y ; 00184 00185 u i n t 3 2 p u r g a t o r y _ c o u n t ; 00186 00187 u i n t 3 2 v o l a t i l e l i n k ; 00188 00189 / * w e w a n t s i z e o f ( L F _ P I N S ) t o b e 6 4 t o a v o i d f a l s e s h a r i n g * / 00190 00191 # i f S I Z E O F _ I N T * 2 + S I Z E O F _ C H A R P * ( L F _ P I N B O X _ P I N S + 3 ) ! = 6 4 00192 00193 c h a r p a d [ 6 4 - s i z e o f ( u i n t 3 2 ) * 2 - s i z e o f ( v o i d * ) * ( L F _ P I N B O X _ P I N S + 3 ) ] ; 00194 00195 # e n d i f 00196 00197 } L F _ P I N S ; 00198 00199 / * 00200 00201 s h o r t c u t m a c r o s t o d o a n a t o m i c _ w r l o c k o n a s t r u c t u r e t h a t u s e s p i n s 00202 00203 ( e . g . l f _ h a s h ) . 00204 00205 * / 00206 00207 # d e f i n e l f _ r w l o c k _ b y _ p i n s ( P I N S ) \ 00208 00209 m y _ a t o m i c _ r w l o c k _ w r l o c k ( & ( P I N S ) - > p i n b o x - > p i n a r r a y . l o c k ) 00210 00211 # d e f i n e l f _ r w u n l o c k _ b y _ p i n s ( P I N S ) \ 00212 00213 m y _ a t o m i c _ r w l o c k _ w r u n l o c k ( & ( P I N S ) - > p i n b o x - > p i n a r r a y . l o c k ) 00214 00215 / * 00216 00217 c o m p i l e - t i m e a s s e r t , t o r e q u i r e " n o l e s s t h a n N " p i n s 00218 00219 i t ' s e n o u g h i f i t ' l l f a i l o n a t l e a s t o n e c o m p i l e r , s o 00220 00221 w e ' l l e n a b l e i t o n G C C o n l y , w h i c h s u p p o r t s z e r o - l e n g t h a r r a y s . 00222 00223 * / 00224 00225 # i f d e f i n e d ( _ _ G N U C _ _ ) & & d e f i n e d ( M Y _ L F _ E X T R A _ D E B U G ) 00226 00227 # d e f i n e L F _ R E Q U I R E _ P I N S ( N ) \ 00228 00229 s t a t i c c o n s t c h a r r e q u i r e _ p i n s [ L F _ P I N B O X _ P I N S - N ] \ 00230 00231 _ _ a t t r i b u t e _ _ ( ( u n u s e d ) ) ; \ 00232 00233 s t a t i c c o n s t i n t L F _ N U M _ P I N S _ I N _ T H I S _ F I L E = N ; 00234 00235 # d e f i n e _ l f _ p i n ( P I N S , P I N , A D D R ) \ 00236 00237 ( \ 00238 00239 a s s e r t ( P I N < L F _ N U M _ P I N S _ I N _ T H I S _ F I L E ) , \ 00240 00241 m y _ a t o m i c _ s t o r e p t r ( & ( P I N S ) - > p i n [ P I N ] , ( A D D R ) ) \ 00242 00243 ) 00244 00245 # e l s e 00246 00247 # d e f i n e L F _ R E Q U I R E _ P I N S ( N ) 00248 00249 # d e f i n e _ l f _ p i n ( P I N S , P I N , A D D R ) m y _ a t o m i c _ s t o r e p t r ( & ( P I N S ) - > p i n [ P I N ] , ( A D D R ) ) 00250 00251 # e n d i f 00252 00253 # d e f i n e _ l f _ u n p i n ( P I N S , P I N ) _ l f _ p i n ( P I N S , P I N , N U L L ) 00254 00255 # d e f i n e l f _ p i n ( P I N S , P I N , A D D R ) \ 00256 00257 d o { \ 00258 00259 l f _ r w l o c k _ b y _ p i n s ( P I N S ) ; \ 00260 00261 _ l f _ p i n ( P I N S , P I N , A D D R ) ; \ 00262 00263 l f _ r w u n l o c k _ b y _ p i n s ( P I N S ) ; \ 00264 00265 } w h i l e ( 0 ) 00266 00267 # d e f i n e l f _ u n p i n ( P I N S , P I N ) l f _ p i n ( P I N S , P I N , N U L L ) 00268 00269 # d e f i n e _ l f _ a s s e r t _ p i n ( P I N S , P I N ) a s s e r t ( ( P I N S ) - > p i n [ P I N ] ! = 0 ) 00270 00271 # d e f i n e _ l f _ a s s e r t _ u n p i n ( P I N S , P I N ) a s s e r t ( ( P I N S ) - > p i n [ P I N ] = = 0 ) 00272 00273 v o i d l f _ p i n b o x _ i n i t ( L F _ P I N B O X * p i n b o x , u i n t f r e e _ p t r _ o f f s e t , 00274 00275 l f _ p i n b o x _ f r e e _ f u n c * f r e e _ f u n c , v o i d * f r e e _ f u n c _ a r g ) ; 00276 00277 v o i d l f _ p i n b o x _ d e s t r o y ( L F _ P I N B O X * p i n b o x ) ; 00278 00279 l o c k _ w r a p ( l f _ p i n b o x _ g e t _ p i n s , L F _ P I N S * , 00280 00281 ( L F _ P I N B O X * p i n b o x ) , 00282 00283 ( p i n b o x ) , 00284 00285 & p i n b o x - > p i n a r r a y . l o c k ) 00286 00287 l o c k _ w r a p _ v o i d ( l f _ p i n b o x _ p u t _ p i n s , 00288 00289 ( L F _ P I N S * p i n s ) , 00290 00291 ( p i n s ) , 00292 00293 & p i n s - > p i n b o x - > p i n a r r a y . l o c k ) 00294 00295 l o c k _ w r a p _ v o i d ( l f _ p i n b o x _ f r e e , 00296 00297 ( L F _ P I N S * p i n s , v o i d * a d d r ) , 00298 00299 ( p i n s , a d d r ) , 00300 00301 & p i n s - > p i n b o x - > p i n a r r a y . l o c k ) 00302 00303 / * 00304 00305 m e m o r y a l l o c a t o r , l f _ a l l o c - p i n . c 00306 00307 * / 00308 00309 t y p e d e f s t r u c t s t _ l f _ a l l o c a t o r { 00310 00311 L F _ P I N B O X p i n b o x ; 00312 00313 u c h a r * v o l a t i l e t o p ; 00314 00315 u i n t e l e m e n t _ s i z e ; 00316 00317 u i n t 3 2 v o l a t i l e m a l l o c s ; 00318 00319 v o i d ( * c o n s t r u c t o r ) ( u c h a r * ) ; / * c a l l e d , w h e n a n o b j e c t i s m a l l o c ( ) ' e d * / 00320 00321 v o i d ( * d e s t r u c t o r ) ( u c h a r * ) ; / * c a l l e d , w h e n a n o b j e c t i s f r e e ( ) ' d * / 00322 00323 } L F _ A L L O C A T O R ; 00324 00325 v o i d l f _ a l l o c _ i n i t ( L F _ A L L O C A T O R * a l l o c a t o r , u i n t s i z e , u i n t f r e e _ p t r _ o f f s e t ) ; 00326 00327 v o i d l f _ a l l o c _ d e s t r o y ( L F _ A L L O C A T O R * a l l o c a t o r ) ; 00328 00329 u i n t l f _ a l l o c _ p o o l _ c o u n t ( L F _ A L L O C A T O R * a l l o c a t o r ) ; 00330 00331 / * 00332 00333 s h o r t c u t m a c r o s t o a c c e s s u n d e r l y i n g p i n b o x f u n c t i o n s f r o m a n L F _ A L L O C A T O R 00334 00335 s e e _ l f _ p i n b o x _ g e t _ p i n s ( ) a n d _ l f _ p i n b o x _ p u t _ p i n s ( ) 00336 00337 * / 00338 00339 # d e f i n e _ l f _ a l l o c _ f r e e ( P I N S , P T R ) _ l f _ p i n b o x _ f r e e ( ( P I N S ) , ( P T R ) ) 00340 00341 # d e f i n e l f _ a l l o c _ f r e e ( P I N S , P T R ) l f _ p i n b o x _ f r e e ( ( P I N S ) , ( P T R ) ) 00342 00343 # d e f i n e _ l f _ a l l o c _ g e t _ p i n s ( A ) _ l f _ p i n b o x _ g e t _ p i n s ( & ( A ) - > p i n b o x ) 00344 00345 # d e f i n e l f _ a l l o c _ g e t _ p i n s ( A ) l f _ p i n b o x _ g e t _ p i n s ( & ( A ) - > p i n b o x ) 00346 00347 # d e f i n e _ l f _ a l l o c _ p u t _ p i n s ( P I N S ) _ l f _ p i n b o x _ p u t _ p i n s ( P I N S ) 00348 00349 # d e f i n e l f _ a l l o c _ p u t _ p i n s ( P I N S ) l f _ p i n b o x _ p u t _ p i n s ( P I N S ) 00350 00351 # d e f i n e l f _ a l l o c _ d i r e c t _ f r e e ( A L L O C , A D D R ) m y _ f r e e ( ( u c h a r * ) ( A D D R ) , M Y F ( 0 ) ) 00352 00353 l o c k _ w r a p ( l f _ a l l o c _ n e w , v o i d * , 00354 00355 ( L F _ P I N S * p i n s ) , 00356 00357 ( p i n s ) , 00358 00359 & p i n s - > p i n b o x - > p i n a r r a y . l o c k ) 00360 00361 / * 00362 00363 e x t e n d i b l e h a s h , l f _ h a s h . c 00364 00365 * / 00366 00367 # i n c l u d e < h a s h . h > 00368 00369 # d e f i n e L F _ H A S H _ U N I Q U E 1 00370 00371 / * l f _ h a s h o v e r h e a d p e r e l e m e n t ( t h a t i s , s i z e o f ( L F _ S L I S T ) * / 00372 00373 e x t e r n c o n s t i n t L F _ H A S H _ O V E R H E A D ; 00374 00375 t y p e d e f s t r u c t { 00376 00377 L F _ D Y N A R R A Y a r r a y ; / * h a s h i t s e l f * / 00378 00379 L F _ A L L O C A T O R a l l o c ; / * a l l o c a t o r f o r e l e m e n t s * / 00380 00381 m y _ h a s h _ g e t _ k e y g e t _ k e y ; / * s e e H A S H * / 00382 00383 C H A R S E T _ I N F O * c h a r s e t ; / * s e e H A S H * / 00384 00385 u i n t k e y _ o f f s e t , k e y _ l e n g t h ; / * s e e H A S H * / 00386 00387 u i n t e l e m e n t _ s i z e ; / * s i z e o f m e m c p y ' e d a r e a o n i n s e r t * / 00388 00389 u i n t f l a g s ; / * L F _ H A S H _ U N I Q U E , e t c * / 00390 00391 i n t 3 2 v o l a t i l e s i z e ; / * s i z e o f a r r a y * / 00392 00393 i n t 3 2 v o l a t i l e c o u n t ; / * n u m b e r o f e l e m e n t s i n t h e h a s h * / 00394 00395 } L F _ H A S H ; 00396 00397 v o i d l f _ h a s h _ i n i t ( L F _ H A S H * h a s h , u i n t e l e m e n t _ s i z e , u i n t f l a g s , 00398 00399 u i n t k e y _ o f f s e t , u i n t k e y _ l e n g t h , m y _ h a s h _ g e t _ k e y g e t _ k e y , 00400 00401 C H A R S E T _ I N F O * c h a r s e t ) ; 00402 00403 v o i d l f _ h a s h _ d e s t r o y ( L F _ H A S H * h a s h ) ; 00404 00405 i n t l f _ h a s h _ i n s e r t ( L F _ H A S H * h a s h , L F _ P I N S * p i n s , c o n s t v o i d * d a t a ) ; 00406 00407 v o i d * l f _ h a s h _ s e a r c h ( L F _ H A S H * h a s h , L F _ P I N S * p i n s , c o n s t v o i d * k e y , u i n t k e y l e n ) ; 00408 00409 i n t l f _ h a s h _ d e l e t e ( L F _ H A S H * h a s h , L F _ P I N S * p i n s , c o n s t v o i d * k e y , u i n t k e y l e n ) ; 00410 00411 / * 00412 00413 s h o r t c u t m a c r o s t o a c c e s s u n d e r l y i n g p i n b o x f u n c t i o n s f r o m a n L F _ H A S H 00414 00415 s e e _ l f _ p i n b o x _ g e t _ p i n s ( ) a n d _ l f _ p i n b o x _ p u t _ p i n s ( ) 00416 00417 * / 00418 00419 # d e f i n e _ l f _ h a s h _ g e t _ p i n s ( H A S H ) _ l f _ a l l o c _ g e t _ p i n s ( & ( H A S H ) - > a l l o c ) 00420 00421 # d e f i n e l f _ h a s h _ g e t _ p i n s ( H A S H ) l f _ a l l o c _ g e t _ p i n s ( & ( H A S H ) - > a l l o c ) 00422 00423 # d e f i n e _ l f _ h a s h _ p u t _ p i n s ( P I N S ) _ l f _ p i n b o x _ p u t _ p i n s ( P I N S ) 00424 00425 # d e f i n e l f _ h a s h _ p u t _ p i n s ( P I N S ) l f _ p i n b o x _ p u t _ p i n s ( P I N S ) 00426 00427 # d e f i n e l f _ h a s h _ s e a r c h _ u n p i n ( P I N S ) l f _ u n p i n ( ( P I N S ) , 2 ) 00428 00429 / * 00430 00431 c l e a n u p 00432 00433 * / 00434 00435 # u n d e f l o c k _ w r a p _ v o i d 00436 00437 # u n d e f l o c k _ w r a p 00438 00439 # u n d e f n o l o c k _ w r a p _ v o i d 00440 00441 # u n d e f n o l o c k _ w r a p 00442 00443 # e n d i f 00444 00445