![]() |
pl-nk v0.4.5
Plonk|Plink|Plank are a set of cross-platform C/C++ frameworks for audio software development
|
00001 /* 00002 ------------------------------------------------------------------------------- 00003 This file is part of the Plink, Plonk, Plank libraries 00004 by Martin Robinson 00005 00006 http://code.google.com/p/pl-nk/ 00007 00008 Copyright University of the West of England, Bristol 2011-14 00009 All rights reserved. 00010 00011 Redistribution and use in source and binary forms, with or without 00012 modification, are permitted provided that the following conditions are met: 00013 00014 * Redistributions of source code must retain the above copyright 00015 notice, this list of conditions and the following disclaimer. 00016 * Redistributions in binary form must reproduce the above copyright 00017 notice, this list of conditions and the following disclaimer in the 00018 documentation and/or other materials provided with the distribution. 00019 * Neither the name of University of the West of England, Bristol nor 00020 the names of its contributors may be used to endorse or promote products 00021 derived from this software without specific prior written permission. 00022 00023 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 00024 ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 00025 WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 00026 DISCLAIMED. IN NO EVENT SHALL UNIVERSITY OF THE WEST OF ENGLAND, BRISTOL BE 00027 LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 00028 CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE 00029 GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 00030 HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 00031 LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 00032 OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 00033 00034 This software makes use of third party libraries. For more information see: 00035 doc/license.txt included in the distribution. 00036 ------------------------------------------------------------------------------- 00037 */ 00038 00039 #ifndef PLANK_ATOMIC_H 00040 #define PLANK_ATOMIC_H 00041 00042 PLANK_BEGIN_C_LINKAGE 00043 00052 static void pl_AtomicMemoryBarrier(); 00053 00056 //------------------------------------------------------------------------------ 00057 00068 typedef struct PlankAtomicI* PlankAtomicIRef; 00069 00072 PlankAtomicIRef pl_AtomicI_CreateAndInit(); 00073 00076 PlankAtomicIRef pl_AtomicI_Create(); 00077 00081 static inline PlankResult pl_AtomicI_Init (PlankAtomicIRef p); 00082 00086 static inline PlankResult pl_AtomicI_DeInit (PlankAtomicIRef p); 00087 00091 PlankResult pl_AtomicI_Destroy (PlankAtomicIRef p); 00092 00097 static PlankI pl_AtomicI_Get (PlankAtomicIRef p); 00098 00102 static PlankI pl_AtomicI_GetUnchecked (PlankAtomicIRef p); 00103 00107 PlankUI pl_AtomicI_GetExtra (PlankAtomicIRef p); 00108 00112 PlankUI pl_AtomicI_GetExtraUnchecked (PlankAtomicIRef p); 00113 00118 static PlankI pl_AtomicI_Swap (PlankAtomicIRef p, PlankI newValue); 00119 00124 static void pl_AtomicI_SwapOther (PlankAtomicIRef p1, PlankAtomicIRef p2); 00125 00129 static void pl_AtomicI_Set (PlankAtomicIRef p, PlankI newValue); 00130 00131 void pl_AtomicI_SetUnchecked (PlankAtomicIRef p, PlankI newValue); 00132 00133 00138 static PlankI pl_AtomicI_Add (PlankAtomicIRef p, PlankI operand); 00139 00144 static PlankI pl_AtomicI_Subtract (PlankAtomicIRef p, PlankI operand); 00145 00149 static PlankI pl_AtomicI_Increment (PlankAtomicIRef p); 00150 00154 static PlankI pl_AtomicI_Decrement (PlankAtomicIRef p); 00155 00166 static PlankB pl_AtomicI_CompareAndSwap (PlankAtomicIRef p, PlankI oldValue, PlankI newValue); 00167 00170 //------------------------------------------------------------------------------ 00171 00184 typedef struct PlankAtomicL* PlankAtomicLRef; 00185 00188 PlankAtomicLRef pl_AtomicL_CreateAndInit(); 00189 00192 PlankAtomicLRef pl_AtomicL_Create(); 00193 00197 static inline PlankResult pl_AtomicL_Init (PlankAtomicLRef p); 00198 00202 static inline PlankResult pl_AtomicL_DeInit (PlankAtomicLRef p); 00203 00207 PlankResult pl_AtomicL_Destroy (PlankAtomicLRef p); 00208 00212 static PlankL pl_AtomicL_Get (PlankAtomicLRef p); 00213 00217 static PlankL pl_AtomicL_GetUnchecked (PlankAtomicLRef p); 00218 00222 PlankUL pl_AtomicL_GetExtra (PlankAtomicLRef p); 00223 00227 PlankUL pl_AtomicL_GetExtraUnchecked (PlankAtomicLRef p); 00228 00233 static PlankL pl_AtomicL_Swap (PlankAtomicLRef p, PlankL newValue); 00234 00239 static void pl_AtomicL_SwapOther (PlankAtomicLRef p1, PlankAtomicLRef p2); 00240 00244 static void pl_AtomicL_Set (PlankAtomicLRef p, PlankL newValue); 00245 00246 void pl_AtomicL_SetUnchecked (PlankAtomicLRef p, PlankL newValue); 00247 00252 static PlankL pl_AtomicL_Add (PlankAtomicLRef p, PlankL operand); 00253 00258 static PlankL pl_AtomicL_Subtract (PlankAtomicLRef p, PlankL operand); 00259 00263 static PlankL pl_AtomicL_Increment (PlankAtomicLRef p); 00264 00268 static PlankL pl_AtomicL_Decrement (PlankAtomicLRef p); 00269 00280 static PlankB pl_AtomicL_CompareAndSwap (PlankAtomicLRef p, PlankL oldValue, PlankL newValue); 00281 00284 //------------------------------------------------------------------------------ 00285 00299 typedef struct PlankAtomicLL* PlankAtomicLLRef; 00300 00303 PlankAtomicLLRef pl_AtomicLL_CreateAndInit(); 00304 00307 PlankAtomicLLRef pl_AtomicLL_Create(); 00308 00312 static PlankResult pl_AtomicLL_Init (PlankAtomicLLRef p); 00313 00317 static PlankResult pl_AtomicLL_DeInit (PlankAtomicLLRef p); 00318 00322 PlankResult pl_AtomicLL_Destroy (PlankAtomicLLRef p); 00323 00327 static PlankLL pl_AtomicLL_Get (PlankAtomicLLRef p); 00328 00332 static PlankLL pl_AtomicLL_GetUnchecked (PlankAtomicLLRef p); 00333 00337 PlankULL pl_AtomicLL_GetExtra (PlankAtomicLLRef p); 00338 00342 PlankULL pl_AtomicLL_GetExtraUnchecked (PlankAtomicLLRef p); 00343 00348 static PlankLL pl_AtomicLL_Swap (PlankAtomicLLRef p, PlankLL newValue); 00349 00354 static void pl_AtomicLL_SwapOther (PlankAtomicLLRef p1, PlankAtomicLLRef p2); 00355 00359 static void pl_AtomicLL_Set (PlankAtomicLLRef p, PlankLL newValue); 00360 00361 void pl_AtomicLL_SetUnchecked (PlankAtomicLLRef p, PlankLL newValue); 00362 00367 static PlankLL pl_AtomicLL_Add (PlankAtomicLLRef p, PlankLL operand); 00368 00373 static PlankLL pl_AtomicLL_Subtract (PlankAtomicLLRef p, PlankLL operand); 00374 00378 static PlankLL pl_AtomicLL_Increment (PlankAtomicLLRef p); 00379 00383 static PlankLL pl_AtomicLL_Decrement (PlankAtomicLLRef p); 00384 00395 //#if !PLANK_NOATOMIC64BIT || DOXYGEN 00396 //static 00397 //#endif 00398 static PlankB pl_AtomicLL_CompareAndSwap (PlankAtomicLLRef p, PlankLL oldValue, PlankLL newValue); 00399 00402 //------------------------------------------------------------------------------ 00403 00414 typedef struct PlankAtomicF* PlankAtomicFRef; 00415 00418 PlankAtomicFRef pl_AtomicF_CreateAndInit(); 00419 00422 PlankAtomicFRef pl_AtomicF_Create(); 00423 00427 static inline PlankResult pl_AtomicF_Init (PlankAtomicFRef p); 00428 00432 static inline PlankResult pl_AtomicF_DeInit (PlankAtomicFRef p); 00433 00437 PlankResult pl_AtomicF_Destroy (PlankAtomicFRef p); 00438 00442 static PlankF pl_AtomicF_Get (PlankAtomicFRef p); 00443 00447 static PlankF pl_AtomicF_GetUnchecked (PlankAtomicFRef p); 00448 00452 PlankUI pl_AtomicF_GetExtra (PlankAtomicFRef p); 00453 00457 PlankUI pl_AtomicF_GetExtraUnchecked (PlankAtomicFRef p); 00458 00463 static PlankF pl_AtomicF_Swap (PlankAtomicFRef p, PlankF newValue); 00464 00469 static void pl_AtomicF_SwapOther (PlankAtomicFRef p1, PlankAtomicFRef p2); 00470 00474 static void pl_AtomicF_Set (PlankAtomicFRef p, PlankF newValue); 00475 00476 void pl_AtomicF_SetUnchecked (PlankAtomicFRef p, PlankF newValue); 00477 00482 static PlankF pl_AtomicF_Add (PlankAtomicFRef p, PlankF operand); 00483 00488 static PlankF pl_AtomicF_Subtract (PlankAtomicFRef p, PlankF operand); 00489 00493 static PlankF pl_AtomicF_Increment (PlankAtomicFRef p); 00494 00498 static PlankF pl_AtomicF_Decrement (PlankAtomicFRef p); 00499 00516 static PlankB pl_AtomicF_CompareAndSwap (PlankAtomicFRef p, PlankF oldValue, PlankF newValue); 00517 00520 //------------------------------------------------------------------------------ 00521 00535 typedef struct PlankAtomicD* PlankAtomicDRef; 00536 00539 PlankAtomicDRef pl_AtomicD_CreateAndInit(); 00540 00543 PlankAtomicDRef pl_AtomicD_Create(); 00544 00548 static PlankResult pl_AtomicD_Init (PlankAtomicDRef p); 00549 00553 static PlankResult pl_AtomicD_DeInit (PlankAtomicDRef p); 00554 00558 PlankResult pl_AtomicD_Destroy (PlankAtomicDRef p); 00559 00563 static PlankD pl_AtomicD_Get (PlankAtomicDRef p); 00564 00568 static PlankD pl_AtomicD_GetUnchecked (PlankAtomicDRef p); 00569 00573 PlankULL pl_AtomicD_GetExtra (PlankAtomicDRef p); 00574 00578 PlankULL pl_AtomicD_GetExtraUnchecked (PlankAtomicDRef p); 00579 00584 static PlankD pl_AtomicD_Swap (PlankAtomicDRef p, PlankD newValue); 00585 00590 static void pl_AtomicD_SwapOther (PlankAtomicDRef p1, PlankAtomicDRef p2); 00591 00595 static void pl_AtomicD_Set (PlankAtomicDRef p, PlankD newValue); 00596 00597 void pl_AtomicD_SetUnchecked (PlankAtomicDRef p, PlankD newValue); 00598 00603 static PlankD pl_AtomicD_Add (PlankAtomicDRef p, PlankD operand); 00604 00609 static PlankD pl_AtomicD_Subtract (PlankAtomicDRef p, PlankD operand); 00610 00614 static PlankD pl_AtomicD_Increment (PlankAtomicDRef p); 00615 00619 static PlankD pl_AtomicD_Decrement (PlankAtomicDRef p); 00620 00637 static PlankB pl_AtomicD_CompareAndSwap (PlankAtomicDRef p, PlankD oldValue, PlankD newValue); 00638 00641 //------------------------------------------------------------------------------ 00642 00655 typedef struct PlankAtomicP* PlankAtomicPRef; 00656 00659 PlankAtomicPRef pl_AtomicP_CreateAndInit(); 00660 00663 PlankAtomicPRef pl_AtomicP_Create(); 00664 00668 static inline PlankResult pl_AtomicP_Init (PlankAtomicPRef p); 00669 00673 static inline PlankResult pl_AtomicP_DeInit (PlankAtomicPRef p); 00674 00678 PlankResult pl_AtomicP_Destroy (PlankAtomicPRef p); 00679 00683 static PlankP pl_AtomicP_Get (PlankAtomicPRef p); 00684 00688 static PlankP pl_AtomicP_GetUnchecked (PlankAtomicPRef p); 00689 00694 PlankUL pl_AtomicP_GetExtra (PlankAtomicPRef p); 00695 00700 PlankUL pl_AtomicP_GetExtraUnchecked (PlankAtomicPRef p); 00701 00706 static PlankP pl_AtomicP_Swap (PlankAtomicPRef p, PlankP newPtr); 00707 00712 static void pl_AtomicP_SwapOther (PlankAtomicPRef p1, PlankAtomicPRef p2); 00713 00717 static void pl_AtomicP_Set (PlankAtomicPRef p, PlankP newPtr); 00718 00719 void pl_AtomicP_SetUnchecked (PlankAtomicPRef p, PlankP newPtr); 00720 00725 static PlankP pl_AtomicP_Add (PlankAtomicPRef p, PlankL operand); 00726 00731 static PlankP pl_AtomicP_Subtract (PlankAtomicPRef p, PlankL operand); 00732 00736 static PlankP pl_AtomicP_Increment (PlankAtomicPRef p); 00737 00741 static PlankP pl_AtomicP_Decrement (PlankAtomicPRef p); 00742 00753 static PlankB pl_AtomicP_CompareAndSwap (PlankAtomicPRef p, PlankP oldPtr, PlankP newPtr); 00754 00757 //------------------------------------------------------------------------------ 00758 00775 typedef struct PlankAtomicPX* PlankAtomicPXRef; 00776 00779 static PlankAtomicPXRef pl_AtomicPX_CreateAndInit(); 00780 00784 static PlankAtomicPXRef pl_AtomicPX_Create(); 00785 00789 static PlankResult pl_AtomicPX_Init (PlankAtomicPXRef p); 00790 00794 static PlankResult pl_AtomicPX_DeInit (PlankAtomicPXRef p); 00795 00799 static PlankResult pl_AtomicPX_Destroy (PlankAtomicPXRef p); 00800 00807 static PlankP pl_AtomicPX_Get (PlankAtomicPXRef p); 00808 00812 static PlankP pl_AtomicPX_GetUnchecked (PlankAtomicPXRef p); 00813 00819 static PlankUL pl_AtomicPX_GetExtra (PlankAtomicPXRef p); 00820 00826 static PlankUL pl_AtomicPX_GetExtraUnchecked (PlankAtomicPXRef p); 00827 00834 static PlankP pl_AtomicPX_SwapAll (PlankAtomicPXRef p, PlankP newPtr, PlankUL newExtra, PlankUL* oldExtra); 00835 00841 static PlankP pl_AtomicPX_Swap (PlankAtomicPXRef p, PlankP newPtr); 00842 00847 static void pl_AtomicPX_SwapOther (PlankAtomicPXRef p1, PlankAtomicPXRef p2); 00848 00853 static void pl_AtomicPX_SetAll (PlankAtomicPXRef p, PlankP newPtr, PlankUL newExtra); 00854 00855 static inline void pl_AtomicPX_SetAllUnchecked (PlankAtomicPXRef p, PlankP newPtr, PlankUL newExtra); 00856 00861 static void pl_AtomicPX_Set (PlankAtomicPXRef p, PlankP newPtr); 00862 00868 static PlankP pl_AtomicPX_Add (PlankAtomicPXRef p, PlankL operand); 00869 00875 static PlankP pl_AtomicPX_Subtract (PlankAtomicPXRef p, PlankL operand); 00876 00881 static PlankP pl_AtomicPX_Increment (PlankAtomicPXRef p); 00882 00887 static PlankP pl_AtomicPX_Decrement (PlankAtomicPXRef p); 00888 00906 static PlankB pl_AtomicPX_CompareAndSwap (PlankAtomicPXRef p, PlankP oldPtr, PlankUL oldExtra, PlankP newPtr, PlankUL newExtra); 00907 00908 static PlankB pl_AtomicPX_CompareAndSwapP (PlankAtomicPXRef p, PlankP oldPtr, PlankP newPtr); 00909 00910 00914 //------------------------------------------------------------------------------ 00915 00916 PLANK_END_C_LINKAGE 00917 00918 #define PLANK_INLINING_FUNCTIONS 1 00919 #include "plank_AtomicInline.h" 00920 #undef PLANK_INLINING_FUNCTIONS 00921 00922 #endif // PLANK_ATOMIC_H