示例#1
0
        public static void HandleIOCP(IOCompletion iocp, int retval, int new_pos)
        {
            var current = iocp.thr;

            switch (iocp.type)
            {
                case IOCompletion.Type.Read:
                    HandleReadAsync(current, iocp, retval, new_pos);
                    return;
                case IOCompletion.Type.Write:
                    HandleWriteAsync(current, iocp, retval, new_pos);
                    return;
            }
        }
示例#2
0
        public static void HandleIOCP(IOCompletion iocp, int retval, int new_pos)
        {
            var current = iocp.thr;

            switch (iocp.type)
            {
            case IOCompletion.Type.Read:
                HandleReadAsync(current, iocp, retval, new_pos);
                return;

            case IOCompletion.Type.Write:
                HandleWriteAsync(current, iocp, retval, new_pos);
                return;
            }
        }
示例#3
0
        private static void HandleReadAsync(Thread current, IOCompletion iocp, int retval, int new_pos)
        {
            if (retval < 0)
            {
                iocp.Dispose();
                current.ReturnFromCompletion(retval);
                return;
            }

            var notWritten = iocp.userBuf.Write(current, new Pointer(iocp.buf.Location), retval);

            if (iocp.posToUpdate != null)
            {
                iocp.posToUpdate.position = (uint)(new_pos - notWritten);
            }

            iocp.Dispose();
            current.ReturnFromCompletion(retval);
        }
示例#4
0
        private static void HandleWriteAsync(Thread current, IOCompletion iocp, int retval, int new_pos)
        {
            if (retval < 0)
            {
                iocp.Dispose();
                current.ReturnFromCompletion(retval);
                return;
            }

            if (iocp.posToUpdate != null)
            {
                var inode = iocp.posToUpdate.inode;
                iocp.posToUpdate.position = (uint)new_pos;
                // If position went beyond size, update size.
                if (new_pos > inode.Size)
                {
                    inode.Size = (uint)new_pos;
                }
            }

            iocp.Dispose();
            current.ReturnFromCompletion(retval);
        }
示例#5
0
        internal int ArchWrite(Thread current, ref ExceptionRegisters regs, ref ByteBufferRef buf, int len, uint pos, File file)
        {
            if (!Globals.CompletionQueueAllocator.Contains(buf))
            {
                Arch.Console.WriteLine("inode-write: unimplemented");
                Arch.ArchDefinition.Panic();
            }

            var iocp = IOCompletion.CreateWriteIOCP(current, file, buf);
            var r    = IPCStubs.WriteAsync(current.Parent.helperPid, current.impl._value.thread._value, new Pointer(buf.Location), fd, len, pos);

            if (r < 0)
            {
                iocp.Dispose();
                return(r);
            }

            Globals.CompletionQueue.Enqueue(iocp);
            current.SaveState(ref regs);
            current.AsyncReturn = true;
            // Take the buffer
            buf = ByteBufferRef.Empty;
            return(0);
        }
示例#6
0
        internal int ArchRead(Thread current, ref ExceptionRegisters regs, UserPtr userBuf, int len, uint pos, File file)
        {
            var buf = Globals.AllocateAlignedCompletionBuffer(len);

            if (!buf.isValid)
            {
                return(-ErrorCode.ENOMEM);
            }

            var iocp = IOCompletion.CreateReadIOCP(current, userBuf, len, file, buf);

            var r = IPCStubs.ReadAsync(current.Parent.helperPid, current.impl._value.thread._value, new Pointer(buf.Location), fd, len, pos);

            if (r < 0)
            {
                iocp.Dispose();
                return(r);
            }

            Globals.CompletionQueue.Enqueue(iocp);
            current.SaveState(ref regs);
            current.AsyncReturn = true;
            return(0);
        }
示例#7
0
        private static void HandleWriteAsync(Thread current, IOCompletion iocp, int retval, int new_pos)
        {
            if (retval < 0)
            {
                iocp.Dispose();
                current.ReturnFromCompletion(retval);
                return;
            }

            if (iocp.posToUpdate != null)
            {
                var inode = iocp.posToUpdate.inode;
                iocp.posToUpdate.position = (uint)new_pos;
                // If position went beyond size, update size.
                if (new_pos > inode.Size)
                    inode.Size = (uint)new_pos;
            }

            iocp.Dispose();
            current.ReturnFromCompletion(retval);
        }
示例#8
0
        private static void HandleReadAsync(Thread current, IOCompletion iocp, int retval, int new_pos)
        {
            if (retval < 0)
            {
                iocp.Dispose();
                current.ReturnFromCompletion(retval);
                return;
            }

            var notWritten = iocp.userBuf.Write(current, new Pointer(iocp.buf.Location), retval);
            if (iocp.posToUpdate != null)
            {
                iocp.posToUpdate.position = (uint)(new_pos - notWritten);
            }

            iocp.Dispose();
            current.ReturnFromCompletion(retval);
        }