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