#include "syncconsole.h"
//----------------------------------------------------------------------
// SynchConsole::SynchConsole(readfile,writefile)
// Initialize the synchronous interface, which in turn synchronizes
// the physical console. Pass NULL file names to use stdin and
// stdout.
//----------------------------------------------------------------------
SynchConsole::SynchConsole(char *readFile, char *writeFile)
{
lock = new Lock("Synch console lock");
readAvail = new Semaphore("Synch console read semaphore",0);
writeDone = new Semaphore("Synch console write semaphore",0);
console = new Console(readFile,writeFile,ReadAvail,WriteDone,0);
}
//----------------------------------------------------------------------
// SynchConsole::~SynchConsole()
// Clean up the console.
//----------------------------------------------------------------------
SynchConsole::~SynchConsole()
{
delete console;
delete lock;
delete readAvail;
delete writeDone;
}
void SynchConsole::ReadLine(char *databuf,int length)
{
int idx = 0;
lock->Acquire(); // sole access to the console
for (; length>0; length--) {
DEBUG('a',"getting char from console\n");
readAvail->P(); // wait for interrupt
databuf[idx++] = console->GetChar(); // input one character at a time
}
lock->Release();
}
void SynchConsole::WriteLine(char *databuf,int length)
{
int idx = 0;
lock->Acquire(); // sole access to the console
for (; length>0; length--) {
DEBUG('a',"Putting char to console\n");
console->PutChar(databuf[idx++]); // output one character at a time
writeDone->P(); // wait for interrupt
}
lock->Release();
}