bool pei::EventManager::ProcessSyncEvents( EventPtr event )
{
	// we run the event list in reverse because we draw from bottom up if the z-order is equal
    LOCK_EM();

	// ref to smart_ptr is fine...we won't go out of scope while we are in here
    EventHandlerMap::iterator fit = m_SyncHandlers.find( event->GetType() );
    if ( fit != m_SyncHandlers.end() ) {
        EventHandlerList& eventProcessors = fit->second;
        EventHandlerList::reverse_iterator eit = eventProcessors.rbegin();
        while ( eit != eventProcessors.rend() ) {
            EventProcessorPtr& processor = *eit++;
            if ( processor->Call( m_RenderManager, event ) ) {
                return true;
            }
        }
    }

    // Sync Event Handling
    EventHandlerList::reverse_iterator eit = m_SyncEventProcessors.rbegin();
    while ( eit != m_SyncEventProcessors.rend() ) {
        EventProcessorPtr& processor = *eit++;
        if ( processor->Call( m_RenderManager, event ) ) {
            return true;
        }
    }
    return false;
}
bool pei::EventManager::ProcessAsyncEvents( EventPtr event )
{
	// we run the event list in reverse because we draw from bottom up if the z-order is equal
    LOCK_EM();

	// Do not create a thread per event - is hard to synchronize later.
	// E.g drop 5 files and you'll get 5 threads loading assets - trying to update the tree 5 times - and maybe spawning child threads...ends in a mess!
    // ref to smart_ptr is fine...we won't go out of scope while we are in here

    // per event handlers - only these are called async
    EventHandlerMap::iterator fit = m_AsyncHandlers.find( event->GetType() );
    if ( fit != m_AsyncHandlers.end() ) {
        EventHandlerList& eventProcessors = fit->second;
        EventHandlerList::reverse_iterator eit = eventProcessors.rbegin();
        while ( eit != eventProcessors.rend() ) {
            EventProcessorPtr& processor = *eit++;
            // default async method. only spawn thread for events which request that - no global async events
#ifdef NO_ASYNC_EVENTS
            boost::shared_ptr<boost::thread>( new boost::thread( &pei::EventProcessor::Call, processor, m_RenderManager, event ));
#else
           if ( processor->Call( *this, m_RenderManager, event ) ) {
               return true ;
           }
#endif
        }
    }

    // Async Event Handling - this should probably be called before sync - but will introduce lag!
	EventHandlerList::reverse_iterator eit = m_AsyncEventProcessors.rbegin();
	while ( eit != m_AsyncEventProcessors.rend() ) {
		EventProcessorPtr& processor = *eit++;
        if ( processor->Call( m_RenderManager, event ) ) {
            return true;
        }
	}
    return false;
}