internal IntPtr ToNative(PinCollection pinCollection) { var nativeContextMap = new NativeTypes.FABRIC_EVENT_CONTEXT_MAP(); if (this.Context != null && this.Context.Any()) { int count = this.Context.ContainsKey(ChaosConstants.KeyForDummyContextEntry) ? this.Context.Count - 1 : this.Context.Count; var nativeContextArray = new NativeTypes.FABRIC_EVENT_CONTEXT_MAP_ITEM[count]; for (int i = 0, j = 0; i < this.Context.Count; ++i) { if (!this.Context.ElementAt(i).Key.Equals(ChaosConstants.KeyForDummyContextEntry, StringComparison.OrdinalIgnoreCase)) { nativeContextArray[j].Key = pinCollection.AddObject(this.Context.ElementAt(i).Key); nativeContextArray[j].Value = pinCollection.AddObject(this.Context.ElementAt(i).Value); ++j; } } nativeContextMap.Count = (uint)nativeContextArray.Length; nativeContextMap.Items = pinCollection.AddBlittable(nativeContextArray); } var ex1 = new NativeTypes.FABRIC_CHAOS_PARAMETERS_EX1 { ClusterHealthPolicy = this.ClusterHealthPolicy.ToNative(pinCollection) }; var ex2 = new NativeTypes.FABRIC_CHAOS_PARAMETERS_EX2 { ChaosTargetFilter = this.ChaosTargetFilter == null ? IntPtr.Zero : this.ChaosTargetFilter.ToNative(pinCollection) }; ex1.Reserved = pinCollection.AddBlittable(ex2); var nativeChaosParameters = new NativeTypes.FABRIC_CHAOS_PARAMETERS { MaxClusterStabilizationTimeoutInSeconds = Convert.ToUInt32(this.MaxClusterStabilizationTimeout.TotalSeconds), MaxConcurrentFaults = Convert.ToUInt32(this.MaxConcurrentFaults), EnableMoveReplicaFaults = NativeTypes.ToBOOLEAN(this.EnableMoveReplicaFaults), WaitTimeBetweenIterationsInSeconds = Convert.ToUInt32(this.WaitTimeBetweenIterations.TotalSeconds), WaitTimeBetweenFaultsInSeconds = Convert.ToUInt32(this.WaitTimeBetweenFaults.TotalSeconds), TimeToRunInSeconds = Convert.ToUInt32(this.TimeToRun.TotalSeconds), Context = nativeContextMap.Count > 0 ? pinCollection.AddBlittable(nativeContextMap) : IntPtr.Zero, Reserved = pinCollection.AddBlittable(ex1) }; return(pinCollection.AddBlittable(nativeChaosParameters)); }
internal static unsafe ChaosParameters CreateFromNative(IntPtr nativeRaw) { NativeTypes.FABRIC_CHAOS_PARAMETERS native = *(NativeTypes.FABRIC_CHAOS_PARAMETERS *)nativeRaw; TimeSpan maxClusterStabilizationTimeout = TimeSpan.FromSeconds(native.MaxClusterStabilizationTimeoutInSeconds); var maxConcurrentFaults = native.MaxConcurrentFaults; TimeSpan waitTimeBetweenIterations = TimeSpan.FromSeconds(native.WaitTimeBetweenIterationsInSeconds); TimeSpan waitTimeBetweenFaults = TimeSpan.FromSeconds(native.WaitTimeBetweenFaultsInSeconds); TimeSpan timeToRun = TimeSpan.FromSeconds(native.TimeToRunInSeconds); var enabledMoveReplicaFaults = NativeTypes.FromBOOLEAN(native.EnableMoveReplicaFaults); var contextMap = new Dictionary <string, string>(); if (native.Context != IntPtr.Zero) { var nativeMapPtr = (NativeTypes.FABRIC_EVENT_CONTEXT_MAP *)native.Context; var bytesPerItem = Marshal.SizeOf(typeof(NativeTypes.FABRIC_EVENT_CONTEXT_MAP_ITEM)); for (int i = 0; i < nativeMapPtr->Count; ++i) { var nativeItemPtr = nativeMapPtr->Items + (i * bytesPerItem); var nativeMapItemPtr = (NativeTypes.FABRIC_EVENT_CONTEXT_MAP_ITEM *)nativeItemPtr; contextMap.Add( NativeTypes.FromNativeString(nativeMapItemPtr->Key), NativeTypes.FromNativeString(nativeMapItemPtr->Value)); } } var parameters = new ChaosParameters( maxClusterStabilizationTimeout, maxConcurrentFaults, enabledMoveReplicaFaults, timeToRun, contextMap, waitTimeBetweenIterations, waitTimeBetweenFaults); if (native.Reserved != IntPtr.Zero) { var ex1 = *((NativeTypes.FABRIC_CHAOS_PARAMETERS_EX1 *)native.Reserved); if (ex1.ClusterHealthPolicy != IntPtr.Zero) { parameters.ClusterHealthPolicy = ClusterHealthPolicy.FromNative(ex1.ClusterHealthPolicy); } if (ex1.Reserved != IntPtr.Zero) { var ex2 = *(NativeTypes.FABRIC_CHAOS_PARAMETERS_EX2 *)ex1.Reserved; parameters.ChaosTargetFilter = ChaosTargetFilter.FromNative(ex2.ChaosTargetFilter); } } return(parameters); }