[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); }