mirror of
https://github.com/Gericom/teak-llvm.git
synced 2025-06-20 03:55:48 -04:00

to reflect the new license. We understand that people may be surprised that we're moving the header entirely to discuss the new license. We checked this carefully with the Foundation's lawyer and we believe this is the correct approach. Essentially, all code in the project is now made available by the LLVM project under our new license, so you will see that the license headers include that license only. Some of our contributors have contributed code under our old license, and accordingly, we have retained a copy of our old license notice in the top-level files in each project and repository. llvm-svn: 351636
93 lines
2.7 KiB
C++
93 lines
2.7 KiB
C++
//===-- sanitizer_deadlock_detector_interface.h -----------------*- 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
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This file is a part of Sanitizer runtime.
|
|
// Abstract deadlock detector interface.
|
|
// FIXME: this is work in progress, nothing really works yet.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef SANITIZER_DEADLOCK_DETECTOR_INTERFACE_H
|
|
#define SANITIZER_DEADLOCK_DETECTOR_INTERFACE_H
|
|
|
|
#ifndef SANITIZER_DEADLOCK_DETECTOR_VERSION
|
|
# define SANITIZER_DEADLOCK_DETECTOR_VERSION 1
|
|
#endif
|
|
|
|
#include "sanitizer_internal_defs.h"
|
|
#include "sanitizer_atomic.h"
|
|
|
|
namespace __sanitizer {
|
|
|
|
// dd - deadlock detector.
|
|
// lt - logical (user) thread.
|
|
// pt - physical (OS) thread.
|
|
|
|
struct DDPhysicalThread;
|
|
struct DDLogicalThread;
|
|
|
|
struct DDMutex {
|
|
#if SANITIZER_DEADLOCK_DETECTOR_VERSION == 1
|
|
uptr id;
|
|
u32 stk; // creation stack
|
|
#elif SANITIZER_DEADLOCK_DETECTOR_VERSION == 2
|
|
u32 id;
|
|
u32 recursion;
|
|
atomic_uintptr_t owner;
|
|
#else
|
|
# error "BAD SANITIZER_DEADLOCK_DETECTOR_VERSION"
|
|
#endif
|
|
u64 ctx;
|
|
};
|
|
|
|
struct DDFlags {
|
|
bool second_deadlock_stack;
|
|
};
|
|
|
|
struct DDReport {
|
|
enum { kMaxLoopSize = 20 };
|
|
int n; // number of entries in loop
|
|
struct {
|
|
u64 thr_ctx; // user thread context
|
|
u64 mtx_ctx0; // user mutex context, start of the edge
|
|
u64 mtx_ctx1; // user mutex context, end of the edge
|
|
u32 stk[2]; // stack ids for the edge
|
|
} loop[kMaxLoopSize];
|
|
};
|
|
|
|
struct DDCallback {
|
|
DDPhysicalThread *pt;
|
|
DDLogicalThread *lt;
|
|
|
|
virtual u32 Unwind() { return 0; }
|
|
virtual int UniqueTid() { return 0; }
|
|
};
|
|
|
|
struct DDetector {
|
|
static DDetector *Create(const DDFlags *flags);
|
|
|
|
virtual DDPhysicalThread* CreatePhysicalThread() { return nullptr; }
|
|
virtual void DestroyPhysicalThread(DDPhysicalThread *pt) {}
|
|
|
|
virtual DDLogicalThread* CreateLogicalThread(u64 ctx) { return nullptr; }
|
|
virtual void DestroyLogicalThread(DDLogicalThread *lt) {}
|
|
|
|
virtual void MutexInit(DDCallback *cb, DDMutex *m) {}
|
|
virtual void MutexBeforeLock(DDCallback *cb, DDMutex *m, bool wlock) {}
|
|
virtual void MutexAfterLock(DDCallback *cb, DDMutex *m, bool wlock,
|
|
bool trylock) {}
|
|
virtual void MutexBeforeUnlock(DDCallback *cb, DDMutex *m, bool wlock) {}
|
|
virtual void MutexDestroy(DDCallback *cb, DDMutex *m) {}
|
|
|
|
virtual DDReport *GetReport(DDCallback *cb) { return nullptr; }
|
|
};
|
|
|
|
} // namespace __sanitizer
|
|
|
|
#endif // SANITIZER_DEADLOCK_DETECTOR_INTERFACE_H
|