//===--- rtsan_context.cpp - Realtime Sanitizer -----------------*- C++ -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
//
//===----------------------------------------------------------------------===//

#include "rtsan/rtsan_context.h"
#include "rtsan/rtsan.h"

#include "sanitizer_common/sanitizer_allocator_internal.h"
#include "sanitizer_common/sanitizer_placement_new.h"

#include <pthread.h>

using namespace __sanitizer;
using namespace __rtsan;

static pthread_key_t context_key;
static pthread_once_t key_once = PTHREAD_ONCE_INIT;

// InternalFree cannot be passed directly to pthread_key_create
// because it expects a signature with only one arg
static void InternalFreeWrapper(void *ptr) { __sanitizer::InternalFree(ptr); }

static __rtsan::Context &GetContextForThisThreadImpl() {
  auto MakeThreadLocalContextKey = []() {
    CHECK_EQ(pthread_key_create(&context_key, InternalFreeWrapper), 0);
  };

  pthread_once(&key_once, MakeThreadLocalContextKey);
  Context *current_thread_context =
      static_cast<Context *>(pthread_getspecific(context_key));
  if (current_thread_context == nullptr) {
    current_thread_context =
        static_cast<Context *>(InternalAlloc(sizeof(Context)));
    new (current_thread_context) Context();
    pthread_setspecific(context_key, current_thread_context);
  }

  return *current_thread_context;
}

__rtsan::Context::Context() = default;

void __rtsan::Context::RealtimePush() { realtime_depth_++; }

void __rtsan::Context::RealtimePop() { realtime_depth_--; }

void __rtsan::Context::BypassPush() { bypass_depth_++; }

void __rtsan::Context::BypassPop() { bypass_depth_--; }

bool __rtsan::Context::InRealtimeContext() const { return realtime_depth_ > 0; }

bool __rtsan::Context::IsBypassed() const { return bypass_depth_ > 0; }

Context &__rtsan::GetContextForThisThread() {
  return GetContextForThisThreadImpl();
}
