/*
 * Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * This code is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 only, as
 * published by the Free Software Foundation.
 *
 * This code is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * version 2 for more details (a copy is included in the LICENSE file that
 * accompanied this code).
 *
 * You should have received a copy of the GNU General Public License version
 * 2 along with this work; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 * or visit www.oracle.com if you need additional information or have any
 * questions.
 *
 */

#ifndef SHARE_UTILITIES_SYSTEMMEMORYBARRIER_HPP
#define SHARE_UTILITIES_SYSTEMMEMORYBARRIER_HPP

#include "logging/log.hpp"
#include "runtime/globals.hpp"
#include "runtime/globals_extension.hpp"
#include "utilities/globalDefinitions.hpp"

#if defined(LINUX)
#include "systemMemoryBarrier_linux.hpp"
typedef LinuxSystemMemoryBarrier SystemMemoryBarrierDefault;
#elif defined(_WINDOWS)
#include "systemMemoryBarrier_windows.hpp"
typedef WindowsSystemMemoryBarrier SystemMemoryBarrierDefault;
#else
class NoSystemMemoryBarrier {
 public:
  static bool initialize() {
    log_info(os)("SystemMemoryBarrier not supported on this platform");
    return false;
  }
  static void emit() {
    fatal("No system memory barrier available");
  }
};
typedef NoSystemMemoryBarrier SystemMemoryBarrierDefault;
#endif

template <typename SystemMemoryBarrierImpl>
class SystemMemoryBarrierType : public AllStatic {
 public:
  static void initialize() {
    if (UseSystemMemoryBarrier) {
      if (!SystemMemoryBarrierImpl::initialize()) {
        if (!FLAG_IS_DEFAULT(UseSystemMemoryBarrier)) {
          warning("UseSystemMemoryBarrier specified, but not supported on this OS version. Use -Xlog:os=info for details.");
        }
        FLAG_SET_ERGO(UseSystemMemoryBarrier, false);
      }
    }
  }
  static void emit() { SystemMemoryBarrierImpl::emit(); }
};

typedef SystemMemoryBarrierType<SystemMemoryBarrierDefault> SystemMemoryBarrier;

#endif // SHARE_UTILITIES_SYSTEMMEMORYBARRIER_HPP
