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#include <debug.h>
14
15
16#ifdef __cplusplus
17
18template<typename PointerType> PointerType*
19atomic_pointer_test_and_set(PointerType** _pointer, const PointerType* set,
20	const PointerType* test)
21{
22#if LONG_MAX == INT_MAX
23	return (PointerType*)atomic_test_and_set((int32*)_pointer, (int32)set,
24		(int32)test);
25#else
26	return (PointerType*)atomic_test_and_set64((int64*)_pointer, (int64)set,
27		(int64)test);
28#endif
29}
30
31
32template<typename PointerType> PointerType*
33atomic_pointer_get_and_set(PointerType** _pointer, const PointerType* set)
34{
35#if LONG_MAX == INT_MAX
36	return (PointerType*)atomic_get_and_set((int32*)_pointer, (int32)set);
37#else
38	return (PointerType*)atomic_get_and_set64((int64*)_pointer, (int64)set);
39#endif
40}
41
42
43template<typename PointerType> void
44atomic_pointer_set(PointerType** _pointer, const PointerType* set)
45{
46	ASSERT((addr_t(_pointer) & (sizeof(PointerType*) - 1)) == 0);
47#if LONG_MAX == INT_MAX
48	atomic_set((int32*)_pointer, (int32)set);
49#else
50	atomic_set64((int64*)_pointer, (int64)set);
51#endif
52}
53
54
55template<typename PointerType> PointerType*
56atomic_pointer_get(PointerType* const* _pointer)
57{
58	ASSERT((addr_t(_pointer) & (sizeof(PointerType*) - 1)) == 0);
59#if LONG_MAX == INT_MAX
60	return (PointerType*)atomic_get((int32*)_pointer);
61#else
62	return (PointerType*)atomic_get64((int64*)_pointer);
63#endif
64}
65
66#endif	// __cplusplus
67
68#endif	/* _KERNEL_UTIL_ATOMIC_H */
69