pl-nk v0.4.5
Plonk|Plink|Plank are a set of cross-platform C/C++ frameworks for audio software development
plank_Atomic.h
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
 All Classes Functions Typedefs Enumerations Enumerator Properties