mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2024-12-04 05:20:30 +00:00
5582a0a254
Since we know who's holding the lock, and we're gonna have to yield anyway, we can just ask the scheduler to donate any remaining ticks to that process.
47 lines
1.2 KiB
C++
47 lines
1.2 KiB
C++
#include "PTYMultiplexer.h"
|
|
#include "MasterPTY.h"
|
|
#include <Kernel/Process.h>
|
|
#include <LibC/errno_numbers.h>
|
|
|
|
static const unsigned s_max_pty_pairs = 8;
|
|
static PTYMultiplexer* s_the;
|
|
|
|
PTYMultiplexer& PTYMultiplexer::the()
|
|
{
|
|
ASSERT(s_the);
|
|
return *s_the;
|
|
}
|
|
|
|
PTYMultiplexer::PTYMultiplexer()
|
|
: CharacterDevice(5, 2)
|
|
, m_lock("PTYMultiplexer")
|
|
{
|
|
s_the = this;
|
|
m_freelist.ensure_capacity(s_max_pty_pairs);
|
|
for (int i = s_max_pty_pairs; i > 0; --i)
|
|
m_freelist.unchecked_append(i - 1);
|
|
}
|
|
|
|
PTYMultiplexer::~PTYMultiplexer()
|
|
{
|
|
}
|
|
|
|
RetainPtr<FileDescriptor> PTYMultiplexer::open(int& error, int options)
|
|
{
|
|
LOCKER(m_lock);
|
|
if (m_freelist.is_empty()) {
|
|
error = -EBUSY;
|
|
return nullptr;
|
|
}
|
|
auto master_index = m_freelist.take_last();
|
|
auto master = adopt(*new MasterPTY(master_index));
|
|
dbgprintf("PTYMultiplexer::open: Vending master %u\n", master->index());
|
|
return VFS::the().open(move(master), error, options);
|
|
}
|
|
|
|
void PTYMultiplexer::notify_master_destroyed(Badge<MasterPTY>, unsigned index)
|
|
{
|
|
LOCKER(m_lock);
|
|
m_freelist.append(index);
|
|
dbgprintf("PTYMultiplexer: %u added to freelist\n", index);
|
|
}
|