Exemple #1
0
        [CommandHipc(31)] // 7.0.0+
        // EventFd(u64 initval, nn::socket::EventFdFlags flags) -> (i32 ret, u32 bsd_errno)
        public ResultCode EventFd(ServiceCtx context)
        {
            ulong        initialValue = context.RequestData.ReadUInt64();
            EventFdFlags flags        = (EventFdFlags)context.RequestData.ReadUInt32();

            EventFileDescriptor newEventFile = new EventFileDescriptor(initialValue, flags);

            LinuxError errno = LinuxError.SUCCESS;

            int newSockFd = _context.RegisterFileDescriptor(newEventFile);

            if (newSockFd == -1)
            {
                errno = LinuxError.EBADF;
            }

            return(WriteBsdResult(context, newSockFd, errno));
        }
        public LinuxError Poll(List <PollEvent> events, int timeoutMilliseconds, out int updatedCount)
        {
            updatedCount = 0;

            List <ManualResetEvent> waiters = new List <ManualResetEvent>();

            for (int i = 0; i < events.Count; i++)
            {
                PollEvent evnt = events[i];

                EventFileDescriptor socket = (EventFileDescriptor)evnt.FileDescriptor;

                bool isValidEvent = false;

                if (evnt.Data.InputEvents.HasFlag(PollEventTypeMask.Input) ||
                    evnt.Data.InputEvents.HasFlag(PollEventTypeMask.UrgentInput))
                {
                    waiters.Add(socket.ReadEvent);

                    isValidEvent = true;
                }
                if (evnt.Data.InputEvents.HasFlag(PollEventTypeMask.Output))
                {
                    waiters.Add(socket.WriteEvent);

                    isValidEvent = true;
                }

                if (!isValidEvent)
                {
                    Logger.Warning?.Print(LogClass.ServiceBsd, $"Unsupported Poll input event type: {evnt.Data.InputEvents}");

                    return(LinuxError.EINVAL);
                }
            }

            int index = WaitHandle.WaitAny(waiters.ToArray(), timeoutMilliseconds);

            if (index != WaitHandle.WaitTimeout)
            {
                for (int i = 0; i < events.Count; i++)
                {
                    PollEvent evnt = events[i];

                    EventFileDescriptor socket = (EventFileDescriptor)evnt.FileDescriptor;

                    if ((evnt.Data.InputEvents.HasFlag(PollEventTypeMask.Input) ||
                         evnt.Data.InputEvents.HasFlag(PollEventTypeMask.UrgentInput)) &&
                        socket.ReadEvent.WaitOne(0))
                    {
                        waiters.Add(socket.ReadEvent);
                    }
                    if ((evnt.Data.InputEvents.HasFlag(PollEventTypeMask.Output)) &&
                        socket.WriteEvent.WaitOne(0))
                    {
                        waiters.Add(socket.WriteEvent);
                    }
                }
            }
            else
            {
                return(LinuxError.ETIMEDOUT);
            }

            return(LinuxError.SUCCESS);
        }