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);
        }
Ejemplo n.º 2
0
        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();
            }
        }