Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/sys/cddl/compat/opensolaris/kern/opensolaris_atomic.c
48383 views
1
/*-
2
* Copyright (c) 2007 Pawel Jakub Dawidek <[email protected]>
3
* All rights reserved.
4
*
5
* Redistribution and use in source and binary forms, with or without
6
* modification, are permitted provided that the following conditions
7
* are met:
8
* 1. Redistributions of source code must retain the above copyright
9
* notice, this list of conditions and the following disclaimer.
10
* 2. Redistributions in binary form must reproduce the above copyright
11
* notice, this list of conditions and the following disclaimer in the
12
* documentation and/or other materials provided with the distribution.
13
*
14
* THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND
15
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE
18
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24
* SUCH DAMAGE.
25
*/
26
27
#include <sys/param.h>
28
#include <sys/lock.h>
29
#include <sys/mutex.h>
30
#include <sys/atomic.h>
31
32
#if !defined(__LP64__) && !defined(__mips_n32) && \
33
!defined(ARM_HAVE_ATOMIC64) && !defined(I386_HAVE_ATOMIC64) && \
34
!defined(HAS_EMULATED_ATOMIC64)
35
36
#ifdef _KERNEL
37
#include <sys/kernel.h>
38
39
struct mtx atomic_mtx;
40
MTX_SYSINIT(atomic, &atomic_mtx, "atomic", MTX_DEF);
41
#else
42
#include <pthread.h>
43
44
#define mtx_lock(lock) pthread_mutex_lock(lock)
45
#define mtx_unlock(lock) pthread_mutex_unlock(lock)
46
47
static pthread_mutex_t atomic_mtx;
48
49
static __attribute__((constructor)) void
50
atomic_init(void)
51
{
52
pthread_mutex_init(&atomic_mtx, NULL);
53
}
54
#endif
55
56
void
57
atomic_add_64(volatile uint64_t *target, int64_t delta)
58
{
59
60
mtx_lock(&atomic_mtx);
61
*target += delta;
62
mtx_unlock(&atomic_mtx);
63
}
64
65
void
66
atomic_dec_64(volatile uint64_t *target)
67
{
68
69
mtx_lock(&atomic_mtx);
70
*target -= 1;
71
mtx_unlock(&atomic_mtx);
72
}
73
74
uint64_t
75
atomic_swap_64(volatile uint64_t *a, uint64_t value)
76
{
77
uint64_t ret;
78
79
mtx_lock(&atomic_mtx);
80
ret = *a;
81
*a = value;
82
mtx_unlock(&atomic_mtx);
83
return (ret);
84
}
85
86
uint64_t
87
atomic_load_64(volatile uint64_t *a)
88
{
89
uint64_t ret;
90
91
mtx_lock(&atomic_mtx);
92
ret = *a;
93
mtx_unlock(&atomic_mtx);
94
return (ret);
95
}
96
97
uint64_t
98
atomic_add_64_nv(volatile uint64_t *target, int64_t delta)
99
{
100
uint64_t newval;
101
102
mtx_lock(&atomic_mtx);
103
newval = (*target += delta);
104
mtx_unlock(&atomic_mtx);
105
return (newval);
106
}
107
108
uint64_t
109
atomic_cas_64(volatile uint64_t *target, uint64_t cmp, uint64_t newval)
110
{
111
uint64_t oldval;
112
113
mtx_lock(&atomic_mtx);
114
oldval = *target;
115
if (oldval == cmp)
116
*target = newval;
117
mtx_unlock(&atomic_mtx);
118
return (oldval);
119
}
120
#endif
121
122