1/*
2 * Copyright 2008, Axel Dörfler, axeld@pinc-software.de.
3 * Distributed under the terms of the MIT License.
4 */
5#ifndef _KERNEL_UTIL_ATOMIC_H
6#define _KERNEL_UTIL_ATOMIC_H
7
8
9#include <limits.h>
10
11#include <SupportDefs.h>
12
13
14#ifdef __cplusplus
15
16template<typename PointerType> PointerType*
17atomic_pointer_test_and_set(PointerType** _pointer, const PointerType* set,
18	const PointerType* test)
19{
20#if LONG_MAX == INT_MAX
21	return (PointerType*)atomic_test_and_set((vint32*)_pointer, (int32)set,
22		(int32)test);
23#else
24	return (PointerType*)atomic_test_and_set64((vint64*)_pointer, (int64)set,
25		(int64)test);
26#endif
27}
28
29
30template<typename PointerType> PointerType*
31atomic_pointer_set(PointerType** _pointer, const PointerType* set)
32{
33#if LONG_MAX == INT_MAX
34	return (PointerType*)atomic_set((vint32*)_pointer, (int32)set);
35#else
36	return (PointerType*)atomic_set64((vint64*)_pointer, (int64)set);
37#endif
38}
39
40
41template<typename PointerType> PointerType*
42atomic_pointer_get(PointerType** _pointer)
43{
44#if LONG_MAX == INT_MAX
45	return (PointerType*)atomic_get((vint32*)_pointer);
46#else
47	return (PointerType*)atomic_get64((vint64*)_pointer);
48#endif
49}
50
51#endif	// __cplusplus
52
53#endif	/* _KERNEL_UTIL_ATOMIC_H */
54