Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions configure.ac
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@ AM_PROG_AR
LT_PREREQ([2.2.6])
LT_INIT([dlopen disable-static])

AC_CHECK_HEADERS([stdatomic.h])

AC_ARG_WITH([rst2man],
AS_HELP_STRING(
[--with-rst2man=PATH],
Expand Down
52 changes: 16 additions & 36 deletions src/vmb.h
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@
*
* Author: Poul-Henning Kamp <phk@phk.freebsd.dk>
*
* SPDX-License-Identifier: BSD-2-Clause
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
Expand All @@ -27,60 +29,38 @@
*
* Memory barriers
*
* XXX: It is utterly braindamaged, that no standard facility for this
* XXX: is available. The "just use pthreads locking" excuse does not
* XXX: make sense, and does not apply to two unthreaded programs sharing
* XXX: a memory segment.
*/

#ifndef VMB_H_INCLUDED
#define VMB_H_INCLUDED

#if defined(__FreeBSD__)
#include <sys/param.h>
#endif

#if defined(__FreeBSD__) && __FreeBSD_version >= 800058
#if defined(HAVE_STDATOMIC_H) && !defined(__FLEXELINT__)

#include <sys/types.h>
#include <machine/atomic.h>
#define VMB() mb()
#define VWMB() wmb()
#define VRMB() rmb()
# include <stdatomic.h>
# define VWMB() atomic_thread_fence(memory_order_release)
# define VRMB() atomic_thread_fence(memory_order_acquire)

#elif defined(__amd64__) && defined(__GNUC__)

#define VMB() __asm __volatile("mfence;" : : : "memory")
#define VWMB() __asm __volatile("sfence;" : : : "memory")
#define VRMB() __asm __volatile("lfence;" : : : "memory")

#elif defined(__arm__)

#define VMB()
#define VWMB()
#define VRMB()
# define VWMB() __asm __volatile("sfence;" : : : "memory")
# define VRMB() __asm __volatile("lfence;" : : : "memory")

#elif defined(__i386__) && defined(__GNUC__)

#define VMB() __asm __volatile("lock; addl $0,(%%esp)" : : : "memory")
#define VWMB() __asm __volatile("lock; addl $0,(%%esp)" : : : "memory")
#define VRMB() __asm __volatile("lock; addl $0,(%%esp)" : : : "memory")
# define VWMB() __asm __volatile("lock; addl $0,(%%esp)" : : : "memory")
# define VRMB() __asm __volatile("lock; addl $0,(%%esp)" : : : "memory")

#elif defined(__sparc64__) && defined(__GNUC__)

#define VMB() __asm__ __volatile__ ("membar #MemIssue": : :"memory")
#define VWMB() VMB()
#define VRMB() VMB()
# define VWMB() __asm__ __volatile__ ("membar #MemIssue": : :"memory")
# define VRMB() __asm__ __volatile__ ("membar #MemIssue": : :"memory")

#else

#define VMB_NEEDS_PTHREAD_WORKAROUND_THIS_IS_BAD_FOR_PERFORMANCE 1

void vmb_pthread(void);

#define VMB() vmb_pthread()
#define VWMB() vmb_pthread()
#define VRMB() vmb_pthread()
# define VMB_NEEDS_PTHREAD_WORKAROUND_THIS_IS_BAD_FOR_PERFORMANCE 1
void vmb_pthread(void);
# define VWMB() vmb_pthread()
# define VRMB() vmb_pthread()

#endif

Expand Down