diff --git a/Core/Lock.cpp b/Core/Lock.cpp index 96fc21f..f0ed4b4 100644 --- a/Core/Lock.cpp +++ b/Core/Lock.cpp @@ -1,6 +1,7 @@ #include #include +#include #include "../kernel.h" @@ -8,13 +9,50 @@ static unsigned long DeadLocks = 0; extern "C" void DeadLockHandler(LockClass *Lock) { - warn("Potential deadlock in lock '%s' held by '%s' (%ld)", + CPUData *CoreData = GetCurrentCPU(); + long CCore = 0xdead; + if (CoreData) + CCore = CoreData->ID; + warn("Potential deadlock in lock '%s' held by '%s' (%ld) [%#lx-%ld] [%ld->%ld]", Lock->GetLockData()->AttemptingToGet, Lock->GetLockData()->CurrentHolder, - DeadLocks++); + DeadLocks++, + Lock->GetLockData()->LockData, + Lock->GetLockData()->Count, + CCore, + Lock->GetLockData()->Core); if (TaskManager) TaskManager->Schedule(); // TODO: Print on screen too. } + +int LockClass::Lock(const char *FunctionName) +{ + LockData.AttemptingToGet = FunctionName; + SpinLock_Lock(&LockData.LockData); + LockData.CurrentHolder = FunctionName; + LockData.Count++; + CPUData *CoreData = GetCurrentCPU(); + if (CoreData) + LockData.Core = CoreData->ID; + CPU::MemBar::Barrier(); + + // while (!__sync_bool_compare_and_swap(&IsLocked, false, true)) + // CPU::Pause(); + // __sync_synchronize(); + return 0; +} + +int LockClass::Unlock() +{ + SpinLock_Unlock(&LockData.LockData); + LockData.Count--; + CPU::MemBar::Barrier(); + + // __sync_synchronize(); + // __atomic_store_n(&IsLocked, false, __ATOMIC_SEQ_CST); + // IsLocked = false; + return 0; +} diff --git a/include/lock.hpp b/include/lock.hpp index 2f669b1..be40381 100644 --- a/include/lock.hpp +++ b/include/lock.hpp @@ -2,7 +2,6 @@ #define __FENNIX_KERNEL_LOCK_H__ #include - #include #pragma GCC diagnostic ignored "-Wvolatile" @@ -22,6 +21,7 @@ class LockClass const char *CurrentHolder; const char *AttemptingToGet; uint64_t Count; + long Core; }; private: @@ -30,32 +30,8 @@ private: public: SpinLockData *GetLockData() { return &LockData; } - - int Lock(const char *FunctionName) - { - LockData.AttemptingToGet = FunctionName; - SpinLock_Lock(&LockData.LockData); - LockData.CurrentHolder = FunctionName; - LockData.Count++; - CPU::MemBar::Barrier(); - - // while (!__sync_bool_compare_and_swap(&IsLocked, false, true)) - // CPU::Pause(); - // __sync_synchronize(); - return 0; - } - - int Unlock() - { - SpinLock_Unlock(&LockData.LockData); - LockData.Count--; - CPU::MemBar::Barrier(); - - // __sync_synchronize(); - // __atomic_store_n(&IsLocked, false, __ATOMIC_SEQ_CST); - // IsLocked = false; - return 0; - } + int Lock(const char *FunctionName); + int Unlock(); }; /** @brief Please use this macro to create a new smart lock. */ class SmartLockClass