1219019Sgabor/* 2219019Sgabor * Copyright 2008, Axel D��rfler, axeld@pinc-software.de. 3219019Sgabor * Distributed under the terms of the MIT License. 4219019Sgabor */ 5219019Sgabor#ifndef _KERNEL_UTIL_ATOMIC_H 6219019Sgabor#define _KERNEL_UTIL_ATOMIC_H 7219019Sgabor 8219019Sgabor 9219019Sgabor#include <limits.h> 10219019Sgabor 11219019Sgabor#include <SupportDefs.h> 12219019Sgabor 13219019Sgabor#include <debug.h> 14219019Sgabor 15219019Sgabor 16219019Sgabor#ifdef __cplusplus 17219019Sgabor 18219019Sgabortemplate<typename PointerType> PointerType* 19219019Sgaboratomic_pointer_test_and_set(PointerType** _pointer, const PointerType* set, 20219019Sgabor const PointerType* test) 21219019Sgabor{ 22219019Sgabor#if LONG_MAX == INT_MAX 23219019Sgabor return (PointerType*)atomic_test_and_set((int32*)_pointer, (int32)set, 24219019Sgabor (int32)test); 25219019Sgabor#else 26219019Sgabor return (PointerType*)atomic_test_and_set64((int64*)_pointer, (int64)set, 27219019Sgabor (int64)test); 28219019Sgabor#endif 29219019Sgabor} 30219019Sgabor 31219019Sgabor 32219019Sgabortemplate<typename PointerType> PointerType* 33219019Sgaboratomic_pointer_get_and_set(PointerType** _pointer, const PointerType* set) 34219019Sgabor{ 35219019Sgabor#if LONG_MAX == INT_MAX 36219019Sgabor return (PointerType*)atomic_get_and_set((int32*)_pointer, (int32)set); 37219019Sgabor#else 38219019Sgabor return (PointerType*)atomic_get_and_set64((int64*)_pointer, (int64)set); 39219019Sgabor#endif 40219019Sgabor} 41219019Sgabor 42219019Sgabor 43219019Sgabortemplate<typename PointerType> void 44219019Sgaboratomic_pointer_set(PointerType** _pointer, const PointerType* set) 45219019Sgabor{ 46219019Sgabor ASSERT((addr_t(_pointer) & (sizeof(PointerType*) - 1)) == 0); 47219019Sgabor#if LONG_MAX == INT_MAX 48219019Sgabor atomic_set((int32*)_pointer, (int32)set); 49219019Sgabor#else 50219019Sgabor atomic_set64((int64*)_pointer, (int64)set); 51219019Sgabor#endif 52219019Sgabor} 53219019Sgabor 54219019Sgabor 55219019Sgabortemplate<typename PointerType> PointerType* 56219019Sgaboratomic_pointer_get(PointerType* const* _pointer) 57219019Sgabor{ 58219019Sgabor ASSERT((addr_t(_pointer) & (sizeof(PointerType*) - 1)) == 0); 59219019Sgabor#if LONG_MAX == INT_MAX 60219019Sgabor return (PointerType*)atomic_get((int32*)_pointer); 61219019Sgabor#else 62219019Sgabor return (PointerType*)atomic_get64((int64*)_pointer); 63219019Sgabor#endif 64219019Sgabor} 65219019Sgabor 66219019Sgabor#endif // __cplusplus 67219019Sgabor 68219019Sgabor#endif /* _KERNEL_UTIL_ATOMIC_H */ 69219019Sgabor