public int DataAvailable(int timeout) { vfsMessageTypes.ReadWriteMessage rwm = new vfsMessageTypes.ReadWriteMessage(); rwm.buf = new byte[1]; rwm.buf_offset = 0; rwm.count = 1; tysos.Syscalls.DebugFunctions.DebugWrite("Console: KeyAvailable: called (timeout = " + timeout.ToString() + ")\n"); tysos.Syscalls.IPCFunctions.SendMessage(GetConsoleProcess(), new tysos.IPCMessage { Type = vfsMessageTypes.PEEK, Message = rwm }); /* Block on either receiving a character or the timeout, whichever comes first */ tysos.WaitAnyEvent wae = new tysos.WaitAnyEvent(); wae.Children.Add(rwm.completed); wae.Children.Add(new tysos.TimerEvent(timeout)); tysos.Syscalls.SchedulerFunctions.Block(wae); //lock (rwm.completed) { if (rwm.completed.IsSet) { tysos.Syscalls.DebugFunctions.DebugWrite("Console: KeyAvailable: returning true\n"); return((int)rwm.count); } rwm.completed.Set(); tysos.Syscalls.DebugFunctions.DebugWrite("Console: KeyAvailable: returning false\n"); return(0); } }
private void process_pending_reads() { while (pending_reads.Count > 0) { //lock (pending_awaits[0].completed) { vfsMessageTypes.ReadWriteMessage rwm = pending_reads[0].Message as vfsMessageTypes.ReadWriteMessage; if (rwm == null) { pending_reads.RemoveAt(0); continue; } if (rwm.completed.IsSet) { pending_reads.RemoveAt(0); continue; } if (read_buffer.Count > 0) { int count_read = 0; if (pending_reads[0].Type == vfsMessageTypes.READ) { while ((read_buffer.Count > 0) && (count_read < rwm.count)) { rwm.buf[rwm.buf_offset + count_read] = read_buffer[0]; read_buffer.RemoveAt(0); count_read++; } } else { count_read = read_buffer.Count; if (rwm.count < count_read) { count_read = rwm.count; } } rwm.count_read = count_read; rwm.completed.Set(); pending_reads.RemoveAt(0); continue; } else { break; } } } }
public int Read(byte[] dest, int dest_offset, int count) { vfsMessageTypes.ReadWriteMessage rwm = new vfsMessageTypes.ReadWriteMessage(); rwm.buf = dest; rwm.buf_offset = dest_offset; rwm.count = count; tysos.Syscalls.IPCFunctions.SendMessage(GetConsoleProcess(), new tysos.IPCMessage { Type = vfsMessageTypes.READ, Message = rwm }); tysos.Syscalls.SchedulerFunctions.Block(rwm.completed); tysos.Syscalls.DebugFunctions.DebugWrite("Console: Read: returning " + rwm.count_read.ToString() + "\n"); return(rwm.count_read); }
public void Write(byte[] src, int src_offset, int count) { vfsMessageTypes.ReadWriteMessage rwm = new vfsMessageTypes.ReadWriteMessage(); rwm.buf = new byte[count]; for (int i = 0; i < count; i++) { rwm.buf[i] = src[i + src_offset]; } rwm.buf_offset = 0; rwm.count = count; tysos.Syscalls.IPCFunctions.SendMessage(GetConsoleProcess(), new tysos.IPCMessage { Type = vfsMessageTypes.WRITE, Message = rwm }); }
private void handle_message(tysos.IPCMessage msg) { switch (msg.Type) { case vfsMessageTypes.READ: { vfsMessageTypes.ReadWriteMessage rwm = msg.Message as vfsMessageTypes.ReadWriteMessage; if (rwm != null) { if (read_buffer.Count > 0) { int count_read = 0; while ((read_buffer.Count > 0) && (count_read < rwm.count)) { rwm.buf[rwm.buf_offset + count_read] = read_buffer[0]; read_buffer.RemoveAt(0); count_read++; } rwm.count_read = count_read; rwm.completed.Set(); } else { pending_reads.Add(msg); } } } break; case vfsMessageTypes.WRITE: { vfsMessageTypes.ReadWriteMessage rwm = msg.Message as vfsMessageTypes.ReadWriteMessage; if (rwm != null) { _Write(rwm.buf, rwm.buf_offset, rwm.count); } } break; case vfsMessageTypes.PEEK: { vfsMessageTypes.ReadWriteMessage rwm = msg.Message as vfsMessageTypes.ReadWriteMessage; if (rwm != null) { //lock (rwm.completed) { if (read_buffer.Count >= rwm.count) { rwm.count_read = rwm.count; rwm.completed.Set(); } else { pending_reads.Add(msg); } } } } break; case GuiMessageTypes.KEYPRESS_MESSAGE: { GuiMessageTypes.KeyPressMessage kpm = msg.Message as GuiMessageTypes.KeyPressMessage; if (kpm != null) { read_buffer.Add((byte)kpm.key); process_pending_reads(); } } break; } }