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 }