Exemplo n.º 1
0
        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);
            }
        }
Exemplo n.º 2
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;
                    }
                }
            }
        }
Exemplo n.º 3
0
        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);
        }
Exemplo n.º 4
0
        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
            });
        }
Exemplo n.º 5
0
        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;
            }
        }