From 51da410dea4389ad1a92ab2b172e40fc58c63a8b Mon Sep 17 00:00:00 2001 From: Jonas 'Sortie' Termansen Date: Sat, 29 Dec 2012 23:09:24 +0100 Subject: [PATCH] Add poll support to log terminal. --- sortix/logterminal.cpp | 29 +++++++++++++++++++++++++++++ sortix/logterminal.h | 4 ++++ 2 files changed, 33 insertions(+) diff --git a/sortix/logterminal.cpp b/sortix/logterminal.cpp index 02cd0a9d..0eb1e3fc 100644 --- a/sortix/logterminal.cpp +++ b/sortix/logterminal.cpp @@ -29,11 +29,15 @@ #include #include #include +#include + #include #include #include #include #include +#include + #include #include #include "utf8.h" @@ -155,6 +159,7 @@ void LogTerminal::ProcessKeystroke(int kbkey) numeofs++; if ( numwaiting ) kthread_cond_broadcast(&datacond); + poll_channel.Signal(POLLIN | POLLRDNORM); } return; } @@ -219,6 +224,7 @@ void LogTerminal::CommitLineBuffer() linebuffer.Commit(); if ( numwaiting ) kthread_cond_broadcast(&datacond); + poll_channel.Signal(POLLIN | POLLRDNORM); } ssize_t LogTerminal::read(ioctx_t* ctx, uint8_t* userbuf, size_t count) @@ -313,4 +319,27 @@ ssize_t LogTerminal::write(ioctx_t* ctx, const uint8_t* buf, size_t count) return count; } +short LogTerminal::PollEventStatus() +{ + short status = 0; + if ( linebuffer.CanPop() || numeofs ) + status |= POLLIN | POLLRDNORM; + if ( true /* can always write */ ) + status |= POLLOUT | POLLWRNORM; + return status; +} + +int LogTerminal::poll(ioctx_t* /*ctx*/, PollNode* node) +{ + ScopedLockSignal lock(&termlock); + short ret_status = PollEventStatus() & node->events; + if ( ret_status ) + { + node->revents |= ret_status; + return 0; + } + poll_channel.Register(node); + return errno = EAGAIN, -1; +} + } // namespace Sortix diff --git a/sortix/logterminal.h b/sortix/logterminal.h index 34850bc0..8763ee0d 100644 --- a/sortix/logterminal.h +++ b/sortix/logterminal.h @@ -28,6 +28,7 @@ #include #include #include +#include #include "linebuffer.h" namespace Sortix { @@ -46,6 +47,7 @@ public: virtual int tcgetwinsize(ioctx_t* ctx, struct winsize* ws); virtual int settermmode(ioctx_t* ctx, unsigned termmode); virtual int gettermmode(ioctx_t* ctx, unsigned* termmode); + virtual int poll(ioctx_t* ctx, PollNode* node); public: virtual void OnKeystroke(Keyboard* keyboard, void* user); @@ -54,8 +56,10 @@ private: void ProcessKeystroke(int kbkey); void QueueUnicode(uint32_t unicode); void CommitLineBuffer(); + short PollEventStatus(); private: + PollChannel poll_channel; mutable kthread_mutex_t termlock; kthread_cond_t datacond; size_t numwaiting;