public unsafe XoshiroImpl() { #if WINDOWS ulong *ptr = stackalloc ulong[4]; #elif EFI EfiImpl byteGen = new(); //TODO Use stackalloc? byte[] bPtr = new byte[4 * sizeof(ulong)]; #endif do { //TODO Add this function as soon as having reference type static fields is possible, this would avoid reinitialising EfiImpl or //at least not using LocateHandle/OpenProtocol every time in order to access EFI_RNG_PROTOCOL.GetBytes #if WINDOWS Interop.GetRandomBytes((byte *)ptr, 4 * sizeof(ulong)); #elif EFI byteGen.NextBytes(bPtr); ulong[] ptr = Unsafe.As <ulong[]>(bPtr); #endif _s0 = ptr[0]; _s1 = ptr[1]; _s2 = ptr[2]; _s3 = ptr[3]; #if EFI ptr.Free(); #endif }while ((_s0 | _s1 | _s2 | _s3) == 0); // at least one value must be non-zero #if EFI bPtr.Free(); byteGen.Free(); #endif }
private void GrowStackTrace() { IntPtr[] newArray = new IntPtr[_corDbgStackTrace.Length * 2]; for (int i = 0; i < _corDbgStackTrace.Length; i++) { newArray[i] = _corDbgStackTrace[i]; } _corDbgStackTrace.Free(); _corDbgStackTrace = newArray; }