Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches

◆ Select()

static unsafe SocketError System.Net.Sockets.SocketPal.Select ( IList checkRead,
IList checkWrite,
IList checkError,
int microseconds )
inlinestatic

Definition at line 711 of file SocketPal.cs.

712 {
713 IntPtr[] lease2 = null;
714 IntPtr[] lease3 = null;
715 IntPtr[] lease4 = null;
716 int refsAdded = 0;
717 try
718 {
722 Socket.SocketListToFileDescriptorSet(checkRead, span4, ref refsAdded);
725 Socket.SocketListToFileDescriptorSet(checkWrite, span6, ref refsAdded);
728 Socket.SocketListToFileDescriptorSet(checkError, span8, ref refsAdded);
729 int num;
730 fixed (IntPtr* readfds = &MemoryMarshal.GetReference(span4))
731 {
732 fixed (IntPtr* writefds = &MemoryMarshal.GetReference(span6))
733 {
734 fixed (IntPtr* exceptfds = &MemoryMarshal.GetReference(span8))
735 {
736 if (microseconds != -1)
737 {
738 global::Interop.Winsock.TimeValue socketTime = default(global::Interop.Winsock.TimeValue);
740 num = global::Interop.Winsock.select(0, readfds, writefds, exceptfds, ref socketTime);
741 }
742 else
743 {
744 num = global::Interop.Winsock.select(0, readfds, writefds, exceptfds, IntPtr.Zero);
745 }
746 }
747 }
748 }
749 if (System.Net.NetEventSource.Log.IsEnabled())
750 {
751 System.Net.NetEventSource.Info(null, $"Interop.Winsock.select returns socketCount:{num}", "Select");
752 }
753 if (num == -1)
754 {
755 return GetLastSocketError();
756 }
757 Socket.SelectFileDescriptor(checkRead, span4, ref refsAdded);
758 Socket.SelectFileDescriptor(checkWrite, span6, ref refsAdded);
759 Socket.SelectFileDescriptor(checkError, span8, ref refsAdded);
760 return SocketError.Success;
761 }
762 finally
763 {
764 if (lease2 != null)
765 {
766 ArrayPool<IntPtr>.Shared.Return(lease2);
767 }
768 if (lease3 != null)
769 {
770 ArrayPool<IntPtr>.Shared.Return(lease3);
771 }
772 if (lease4 != null)
773 {
774 ArrayPool<IntPtr>.Shared.Return(lease4);
775 }
776 Socket.SocketListDangerousReleaseRefs(checkRead, ref refsAdded);
777 Socket.SocketListDangerousReleaseRefs(checkWrite, ref refsAdded);
778 Socket.SocketListDangerousReleaseRefs(checkError, ref refsAdded);
779 }
780 static bool ShouldStackAlloc(IList list, ref IntPtr[] lease, out Span<IntPtr> span)
781 {
782 int count;
783 if (list == null || (count = list.Count) == 0)
784 {
785 span = default(Span<IntPtr>);
786 return false;
787 }
788 if (count >= 64)
789 {
790 span = (lease = ArrayPool<IntPtr>.Shared.Rent(count + 1));
791 return false;
792 }
793 span = default(Span<IntPtr>);
794 return true;
795 }
796 }
static readonly System.Net.NetEventSource Log
static void Info(object thisOrContextObject, FormattableString formattableString=null, [CallerMemberName] string memberName=null)
static void MicrosecondsToTimeValue(long microseconds, ref global::Interop.Winsock.TimeValue socketTime)
Definition SocketPal.cs:16
static SocketError GetLastSocketError()
Definition SocketPal.cs:22

References System.count, System.Net.Sockets.SocketPal.GetLastSocketError(), System.Net.NetEventSource.Info(), System.list, System.Net.NetEventSource.Log, System.Net.Sockets.SocketPal.MicrosecondsToTimeValue(), System.Net.Sockets.Socket.SelectFileDescriptor(), System.Net.Sockets.Socket.SocketListDangerousReleaseRefs(), System.Net.Sockets.Socket.SocketListToFileDescriptorSet(), and System.IntPtr.Zero.

Referenced by System.Net.Sockets.Socket.Select().