From 88a1c914c935c04cd4af42b927bf4dfa8b74d9bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ciro=20Santilli=20=E5=85=AD=E5=9B=9B=E4=BA=8B=E4=BB=B6=20?= =?UTF-8?q?=E6=B3=95=E8=BD=AE=E5=8A=9F?= Date: Wed, 26 Jun 2019 00:00:00 +0000 Subject: [PATCH] c++: move atomic in from cpp-cheat TODO: README improve, link to x86 LOCK docs --- common.py | 2 ++ path_properties.py | 1 - userland/cpp/atomic.cpp | 31 +++++++++++++++++++++++++++---- 3 files changed, 29 insertions(+), 5 deletions(-) diff --git a/common.py b/common.py index 7d6685b..a245d8f 100644 --- a/common.py +++ b/common.py @@ -1541,6 +1541,8 @@ https://github.com/cirosantilli/linux-kernel-module-cheat#gem5-debug-build not my_path_properties['extra_objs_disable_baremetal_bootloader'] ): extra_objs.extend(extra_objs_baremetal_bootloader) + if self.env['mode'] == 'userland': + cc_flags_after.extend(['-pthread', LF]) if self.need_rebuild([in_path] + extra_objs + extra_deps, out_path): cc_flags.extend(my_path_properties['cc_flags']) cc_flags_after.extend(my_path_properties['cc_flags_after']) diff --git a/path_properties.py b/path_properties.py index 9efb79e..d9ddb3c 100644 --- a/path_properties.py +++ b/path_properties.py @@ -507,7 +507,6 @@ path_properties_tuples = ( 'proc_events.c': {'requires_sudo': True}, 'sched_getaffinity.c': {'requires_syscall_getcpu': True}, 'sched_getaffinity_threads.c': { - 'cc_flags_after': ['-pthread', LF], 'more_than_1s': True, 'requires_syscall_getcpu': True, }, diff --git a/userland/cpp/atomic.cpp b/userland/cpp/atomic.cpp index 64a041f..34e9aab 100644 --- a/userland/cpp/atomic.cpp +++ b/userland/cpp/atomic.cpp @@ -16,12 +16,31 @@ #if __cplusplus >= 201103L std::atomic_ulong my_atomic_ulong(0); unsigned long my_non_atomic_ulong = 0; +#if defined(__x86_64__) +unsigned long my_arch_atomic_ulong = 0; +unsigned long my_arch_non_atomic_ulong = 0; +#endif size_t niters; void threadMain() { for (size_t i = 0; i < niters; ++i) { my_atomic_ulong++; my_non_atomic_ulong++; +#if defined(__x86_64__) + __asm__ __volatile__ ( + "incq %0;" + : "+m" (my_arch_non_atomic_ulong) + : + : + ); + __asm__ __volatile__ ( + "lock;" + "incq %0;" + : "+m" (my_arch_atomic_ulong) + : + : + ); +#endif } } #endif @@ -37,7 +56,7 @@ int main(int argc, char **argv) { if (argc > 2) { niters = std::stoull(argv[2], NULL, 0); } else { - niters = 1000; + niters = 10000; } std::vector threads(nthreads); for (size_t i = 0; i < nthreads; ++i) @@ -45,8 +64,12 @@ int main(int argc, char **argv) { for (size_t i = 0; i < nthreads; ++i) threads[i].join(); assert(my_atomic_ulong.load() == nthreads * niters); - // Same as above through `operator T`. - assert(my_atomic_ulong == nthreads * niters); - std::cout << my_non_atomic_ulong << std::endl; + // We can also use the atomics direclty through `operator T` conversion. + assert(my_atomic_ulong == my_atomic_ulong.load()); + std::cout << "my_non_atomic_ulong " << my_non_atomic_ulong << std::endl; +#if defined(__x86_64__) + assert(my_arch_atomic_ulong == nthreads * niters); + std::cout << "my_arch_non_atomic_ulong " << my_arch_non_atomic_ulong << std::endl; +#endif #endif }