kernel: Add locking to BinaryFormat and DeviceRegistry
All checks were successful
continuous-integration/drone/push Build is passing
All checks were successful
continuous-integration/drone/push Build is passing
This commit is contained in:
parent
9c65dba412
commit
cea1b030ff
@ -1,6 +1,7 @@
|
||||
#include "binfmt/BinaryFormat.h"
|
||||
#include "binfmt/ELF.h"
|
||||
#include "binfmt/Script.h"
|
||||
#include "lib/Mutex.h"
|
||||
|
||||
struct BinaryFormatDescriptor
|
||||
{
|
||||
@ -10,6 +11,8 @@ struct BinaryFormatDescriptor
|
||||
|
||||
Vector<BinaryFormatDescriptor> g_binary_formats;
|
||||
|
||||
static Mutex g_lock;
|
||||
|
||||
Result<void> BinaryFormat::init()
|
||||
{
|
||||
TRY(register_binary_format(ELFLoader::create, nullptr));
|
||||
@ -20,6 +23,7 @@ Result<void> BinaryFormat::init()
|
||||
|
||||
Result<void> BinaryFormat::register_binary_format(binfmt_loader_creator_t creator, void* arg)
|
||||
{
|
||||
ScopedMutexLock lock(g_lock);
|
||||
return g_binary_formats.try_append({ creator, arg });
|
||||
}
|
||||
|
||||
@ -27,6 +31,8 @@ Result<SharedPtr<BinaryFormatLoader>> BinaryFormat::create_loader(SharedPtr<VFS:
|
||||
{
|
||||
if (recursion_level >= 8) return err(ELOOP);
|
||||
|
||||
ScopedMutexLock lock(g_lock);
|
||||
|
||||
for (const auto& format : g_binary_formats)
|
||||
{
|
||||
auto loader = TRY(format.creator(inode, format.arg, recursion_level));
|
||||
|
@ -12,6 +12,7 @@
|
||||
#include "fs/devices/UARTDevice.h"
|
||||
#include "fs/devices/ZeroDevice.h"
|
||||
#include "fs/tmpfs/FileSystem.h"
|
||||
#include "lib/Mutex.h"
|
||||
#include "thread/Thread.h"
|
||||
#include <luna/Vector.h>
|
||||
|
||||
@ -26,10 +27,14 @@ struct DeviceDescriptor
|
||||
|
||||
Vector<DeviceDescriptor> g_available_devices = {};
|
||||
|
||||
static Mutex g_lock;
|
||||
|
||||
namespace DeviceRegistry
|
||||
{
|
||||
Result<SharedPtr<Device>> fetch_special_device(u32 major, u32 minor)
|
||||
{
|
||||
ScopedMutexLock lock(g_lock);
|
||||
|
||||
for (const auto& descriptor : g_available_devices)
|
||||
{
|
||||
if (descriptor.major == major && descriptor.minor == minor) return descriptor.device;
|
||||
@ -38,7 +43,7 @@ namespace DeviceRegistry
|
||||
return err(ENODEV);
|
||||
}
|
||||
|
||||
Result<void> create_special_device_inode(SharedPtr<VFS::FileSystem> fs, const DeviceDescriptor& descriptor)
|
||||
static Result<void> create_special_device_inode(SharedPtr<VFS::FileSystem> fs, const DeviceDescriptor& descriptor)
|
||||
{
|
||||
auto inode = TRY(fs->create_device_inode(descriptor.major, descriptor.minor, descriptor.mode));
|
||||
TRY(fs->root_inode()->add_entry(inode, descriptor.name));
|
||||
@ -48,6 +53,8 @@ namespace DeviceRegistry
|
||||
|
||||
Result<void> register_special_device(u32 major, u32 minor, SharedPtr<Device> device, mode_t mode)
|
||||
{
|
||||
ScopedMutexLock lock(g_lock);
|
||||
|
||||
for (const auto& descriptor : g_available_devices)
|
||||
{
|
||||
if (descriptor.major == major && descriptor.minor == minor) return err(EEXIST);
|
||||
@ -82,7 +89,7 @@ namespace DeviceRegistry
|
||||
|
||||
dev_t next_null_device_id()
|
||||
{
|
||||
static u32 next_minor = 0;
|
||||
static Atomic<u32> next_minor = 0;
|
||||
return luna_dev_makedev(0, next_minor++);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user