99 lines · c
1//===-- sanitizer_deadlock_detector_interface.h -----------------*- C++ -*-===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8//9// This file is a part of Sanitizer runtime.10// Abstract deadlock detector interface.11// FIXME: this is work in progress, nothing really works yet.12//13//===----------------------------------------------------------------------===//14 15#ifndef SANITIZER_DEADLOCK_DETECTOR_INTERFACE_H16#define SANITIZER_DEADLOCK_DETECTOR_INTERFACE_H17 18#ifndef SANITIZER_DEADLOCK_DETECTOR_VERSION19# define SANITIZER_DEADLOCK_DETECTOR_VERSION 120#endif21 22#include "sanitizer_internal_defs.h"23#include "sanitizer_atomic.h"24 25namespace __sanitizer {26 27// dd - deadlock detector.28// lt - logical (user) thread.29// pt - physical (OS) thread.30 31struct DDPhysicalThread;32struct DDLogicalThread;33 34struct DDMutex {35#if SANITIZER_DEADLOCK_DETECTOR_VERSION == 136 uptr id;37 u32 stk; // creation stack38#elif SANITIZER_DEADLOCK_DETECTOR_VERSION == 239 u32 id;40 u32 recursion;41 atomic_uintptr_t owner;42#else43# error "BAD SANITIZER_DEADLOCK_DETECTOR_VERSION"44#endif45 u64 ctx;46};47 48struct DDFlags {49 bool second_deadlock_stack;50};51 52struct DDReport {53 enum { kMaxLoopSize = 20 };54 int n; // number of entries in loop55 struct {56 u64 thr_ctx; // user thread context57 u64 mtx_ctx0; // user mutex context, start of the edge58 u64 mtx_ctx1; // user mutex context, end of the edge59 u32 stk[2]; // stack ids for the edge60 } loop[kMaxLoopSize];61};62 63struct DDCallback {64 DDPhysicalThread *pt;65 DDLogicalThread *lt;66 67 virtual u32 Unwind() { return 0; }68 virtual int UniqueTid() { return 0; }69 70 protected:71 ~DDCallback() {}72};73 74struct DDetector {75 static DDetector *Create(const DDFlags *flags);76 77 virtual DDPhysicalThread* CreatePhysicalThread() { return nullptr; }78 virtual void DestroyPhysicalThread(DDPhysicalThread *pt) {}79 80 virtual DDLogicalThread* CreateLogicalThread(u64 ctx) { return nullptr; }81 virtual void DestroyLogicalThread(DDLogicalThread *lt) {}82 83 virtual void MutexInit(DDCallback *cb, DDMutex *m) {}84 virtual void MutexBeforeLock(DDCallback *cb, DDMutex *m, bool wlock) {}85 virtual void MutexAfterLock(DDCallback *cb, DDMutex *m, bool wlock,86 bool trylock) {}87 virtual void MutexBeforeUnlock(DDCallback *cb, DDMutex *m, bool wlock) {}88 virtual void MutexDestroy(DDCallback *cb, DDMutex *m) {}89 90 virtual DDReport *GetReport(DDCallback *cb) { return nullptr; }91 92 protected:93 ~DDetector() {}94};95 96} // namespace __sanitizer97 98#endif // SANITIZER_DEADLOCK_DETECTOR_INTERFACE_H99