00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef ISC_ATOMIC_H
00020 #define ISC_ATOMIC_H 1
00021
00022 #include <isc/platform.h>
00023 #include <isc/types.h>
00024
00025 #ifdef ISC_PLATFORM_USEGCCASM
00026
00027
00028 #error "impossible case. check build configuration"
00029
00030 #elif defined(ISC_PLATFORM_USESTDASM)
00031
00032
00033
00034
00035
00036
00037
00038 #include <isc/util.h>
00039
00040 static isc_int32_t
00041 isc_atomic_xadd(isc_int32_t *p, isc_int32_t val) {
00042 UNUSED(p);
00043 UNUSED(val);
00044
00045 __asm (
00046 "movq %rdi, %rdx\n"
00047 "movl %esi, %eax\n"
00048 #ifdef ISC_PLATFORM_USETHREADS
00049 "lock;"
00050 #endif
00051 "xadd %eax, (%rdx)\n"
00052
00053
00054
00055 );
00056 }
00057
00058 #ifdef ISC_PLATFORM_HAVEXADDQ
00059 static isc_int64_t
00060 isc_atomic_xaddq(isc_int64_t *p, isc_int64_t val) {
00061 UNUSED(p);
00062 UNUSED(val);
00063
00064 __asm (
00065 "movq %rdi, %rdx\n"
00066 "movq %rsi, %rax\n"
00067 #ifdef ISC_PLATFORM_USETHREADS
00068 "lock;"
00069 #endif
00070 "xaddq %rax, (%rdx)\n"
00071
00072
00073
00074 );
00075 }
00076 #endif
00077
00078 static void
00079 isc_atomic_store(isc_int32_t *p, isc_int32_t val) {
00080 UNUSED(p);
00081 UNUSED(val);
00082
00083 __asm (
00084 "movq %rdi, %rax\n"
00085 "movl %esi, %edx\n"
00086 #ifdef ISC_PLATFORM_USETHREADS
00087 "lock;"
00088 #endif
00089 "xchgl (%rax), %edx\n"
00090
00091
00092
00093 );
00094 }
00095
00096 static isc_int32_t
00097 isc_atomic_cmpxchg(isc_int32_t *p, isc_int32_t cmpval, isc_int32_t val) {
00098 UNUSED(p);
00099 UNUSED(cmpval);
00100 UNUSED(val);
00101
00102 __asm (
00103 "movl %edx, %ecx\n"
00104 "movl %esi, %eax\n"
00105 "movq %rdi, %rdx\n"
00106
00107 #ifdef ISC_PLATFORM_USETHREADS
00108 "lock;"
00109 #endif
00110
00111
00112
00113
00114 "cmpxchgl %ecx, (%rdx)"
00115 );
00116 }
00117
00118 #else
00119
00120 #error "unsupported compiler. disable atomic ops by --disable-atomic"
00121
00122 #endif
00123 #endif