private void Notify(GameEvent e)
    {
        string           tag      = e.GetTag();
        ListenerNotifier notifier = null;

        if (m_Notifiers.TryGetValue(tag, out notifier))
        {
            notifier.Notify(e);
        }
    }
    public void Unregister(System.Object objectToNotify, string tag)
    {
        Assert.IsFalse(m_DispatchGuard, "Cannot unregister a listener while dispatching !");
        ListenerNotifier notifier = null;

        if (!m_Notifiers.TryGetValue(tag, out notifier))
        {
            Assert.IsTrue(false, "Trying to unregister to GameEvents from " + tag + " but no notifier was found.");
        }

        notifier.RemoveListener(objectToNotify, tag);
    }
    public void Register(System.Object objectToNotify, string tag, params System.Type[] GameEventTypes)
    {
        Assert.IsFalse(m_DispatchGuard, "Cannot register a listener while dispatching !");
        ListenerNotifier notifier = null;

        if (!m_Notifiers.TryGetValue(tag, out notifier))
        {
            notifier = new ListenerNotifier(tag);
            m_Notifiers.Add(tag, notifier);
        }

        Assert.IsTrue(notifier != null);
        notifier.AddListener(objectToNotify, tag, GameEventTypes);
    }
        private void StartThreadGroup(AbstractThreadGroup group, int groupCount, SearchByType <AbstractThreadGroup> searcher, LinkedList <Object> testLevelElements, ListenerNotifier notifier)
        {
            int numThreads = group.GetNumThreads();

            NetMeterContextManager.AddTotalThreads(numThreads);
            Boolean onErrorStopTest      = group.GetOnErrorStopTest();
            Boolean onErrorStopTestNow   = group.GetOnErrorStopTestNow();
            Boolean onErrorStopThread    = group.GetOnErrorStopThread();
            Boolean onErrorStartNextLoop = group.GetOnErrorStartNextLoop();
            String  groupName            = group.GetName();

            log.Info("Starting " + numThreads + " threads for group " + groupName + ".");

            if (onErrorStopTest)
            {
                log.Info("Test will stop on error");
            }
            else if (onErrorStopTestNow)
            {
                log.Info("Test will stop abruptly on error");
            }
            else if (onErrorStopThread)
            {
                log.Info("Thread will stop on error");
            }
            else if (onErrorStartNextLoop)
            {
                log.Info("Thread will start next loop on error");
            }
            else
            {
                log.Info("Thread will continue on error");
            }
            OrderedHashTree threadGroupTree = (OrderedHashTree)searcher.GetSubTree(group);

            threadGroupTree.Put(group, testLevelElements);

            groups.Add(group);
            group.Start(groupCount, notifier, threadGroupTree, this);
        }
        public void Run()
        {
            log.Info("Running the test!");
            running = true;

            NetMeterContextManager.StartTest();
            //try
            //{
            //    PreCompiler compiler = new PreCompiler();
            //    test.Traverse(compiler);
            //}
            //catch (Exception ex)
            //{
            //    log.Error(String.Format("Error occurred compiling the tree: {0}", ex.Message));
            //    return; // no point continuing
            //}

            /**
             * Notification of test listeners needs to happen after function
             * replacement, but before setting RunningVersion to true.
             */
            SearchByType <TestStateListener> testListeners = new SearchByType <TestStateListener>(); // TL - S&E

            test.Traverse(testListeners);

            // Merge in any additional test listeners
            // currently only used by the function parser
            testListeners.GetSearchResults().AddRange(testList);
            testList.Clear(); // no longer needed

            //if (!startListenersLater )
            //{
            //    NotifyTestListenersOfStart(testListeners);
            //}
            test.Traverse(new TurnElementsOn());
            //if (startListenersLater)
            //{
            //    NotifyTestListenersOfStart(testListeners);
            //}

            LinkedList <Object> testLevelElements = new LinkedList <Object>(test.list(test.GetArray()[0]));

            RemoveThreadGroups(testLevelElements);

            SearchByType <AbstractThreadGroup> searcher = new SearchByType <AbstractThreadGroup>();

            test.Traverse(searcher);

            TestCompiler.Initialize();

            ListenerNotifier notifier = new ListenerNotifier();

            int groupCount = 0;

            NetMeterContextManager.ClearTotalThreads();

            /*
             * Here's where the test really starts. Run a Full GC now: it's no harm
             * at all (just delays test start by a tiny amount) and hitting one too
             * early in the test can impair results for short tests.
             */
            NetMeterUtils.helpGC();

            NetMeterContextManager.GetContext().SetSamplingStarted(true);
            Boolean mainGroups = running; // still running at this point, i.e. setUp was not cancelled

            while (running)
            {
                foreach (AbstractThreadGroup group in searcher.GetSearchResults())
                {
                    groupCount++;
                    String groupName = group.GetName();
                    log.Info(String.Format("Starting ThreadGroup: {0} : {1}", groupCount, groupName));
                    StartThreadGroup(group, groupCount, searcher, testLevelElements, notifier);
                    if (serialized)
                    {
                        log.Info(String.Format("Waiting for thread group: {0} to finish before starting next group", groupName));
                        group.WaitThreadsStopped();
                    }
                }
            }

            if (groupCount == 0)
            { // No TGs found
                log.Info("No enabled thread groups found");
            }
            else
            {
                if (running)
                {
                    log.Info("All thread groups have been started");
                }
                else
                {
                    log.Info("Test stopped - no more thread groups will be started");
                }
            }

            //wait for all Test Threads To Exit
            WaitThreadsStopped();
            NotifyTestListenersOfEnd(testListeners);
        }