Updated lock

This commit is contained in:
Alex 2022-11-07 06:12:42 +02:00
parent 6025ef2e54
commit 2904ae14da
Signed by untrusted user who does not match committer: enderice2
GPG Key ID: EACC3AD603BAB4DD
2 changed files with 43 additions and 29 deletions

View File

@ -1,6 +1,7 @@
#include <lock.hpp>
#include <debug.h>
#include <smp.hpp>
#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;
}

View File

@ -2,7 +2,6 @@
#define __FENNIX_KERNEL_LOCK_H__
#include <types.h>
#include <cpu.hpp>
#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