public RuntimeGlobalAccessorImpl(IAutoMemoryManagerFabric gcFabric) { var stb = new NativeStructureBuilderImpl(this, "object"); _gcCtx = gcFabric.CreateManagerContext(this); if (_gcCtx.Integration != null) { _gcCtx.Integration.AugmentObjectLayout(stb); } stb.UseDefaultFieldAlignment = true; stb.FieldsAligmnent = null; stb.StructureAlignment = null; var typeIdFieldBuilder = stb.DefineField("typeId"); typeIdFieldBuilder.Size = IntPtr.Size; _objectLayout = stb.Complete(); _typeIdFieldInfo = _objectLayout.Fields.First(f => f.Number == typeIdFieldBuilder.Number); this.GenerateTypes(stb); _memoryManager = _gcCtx.CreateManager(_systemMemoryManager, this); }
private static void DoWork(IAutoMemoryManagerFabric gcFabric, GcSimulatorConfigurationType cfg) { Console.WriteLine("Using GC " + gcFabric.Name); var p = new MutatorParameters(); foreach (var item in cfg.Probabilities.Items.OrderBy(e => e.StackDepth)) { var entry = new MutatorParametersEntry(); entry.StackDepth = item.StackDepth; foreach (var attr in item.AnyAttr) { if (Enum.TryParse <MutatorActionKind>(attr.LocalName, true, out var actionKind) && int.TryParse(attr.Value, out var value)) { entry.SetValue(actionKind, value); } } p.Add(entry); } ////var p = new MutatorParameters() { //// // stackDepth, //// // | callProbability, //// // | | returnProbability, //// // | | | newobjProbability, //// // | | | | putStatic, //// // | | | | | changeStatic, //// // | | | | | | eraseStatic, //// // | | | | | | | putRefProbability, //// // | | | | | | | | changeRefProbability, //// // | | | | | | | | | eraseRefProbabilty //// // | | | | | | | | | | //// { 0, 100, 0, 75, 10, 10, 10, 90, 90, 90 }, //// { 100, 100, 100, 75, 10, 10, 10, 90, 90, 90 } ////}; ////p.Mode = MutatorParametersModeKind.Sequence; //var p = new MutatorParameters() { // // stackDepth, // // | callProbability, // // | | returnProbability, // // | | | newobjProbability, // // | | | | putStatic, // // | | | | | changeStatic, // // | | | | | | eraseStatic, // // | | | | | | | putRefProbability, // // | | | | | | | | changeRefProbability, // // | | | | | | | | | eraseRefProbabilty // // | | | | | | | | | | // { 0, 20, 00, 20, 10, 10, 10, 10, 10, 10 }, // { 100, 10, 10, 20, 10, 10, 10, 10, 10, 10 }, //}; //p.Mode = MutatorParametersModeKind.Flat; using (var runtime = new RuntimeGlobalAccessorImpl(gcFabric)) { var mutatorCtx = new MutatorContext(runtime); var m = mutatorCtx.CreateMutator(null, p); var mutatorWorkingEv = new ManualResetEvent(true); runtime.GetRoots += () => m.GetRoots().ToArray(); runtime.StopRequested += () => mutatorWorkingEv.Reset(); runtime.StopReleased += () => mutatorWorkingEv.Set(); var mutatorThread = new Thread(() => { foreach (var item in m.DoWork()) { Console.WriteLine(item); mutatorWorkingEv.WaitOne(); } }); mutatorThread.Start(); mutatorThread.Join(); } }