private void updateAllLocationListeners(LocationInformation loc, 
            LocationProvider provider) {
        CallbackHandler callHandler = m_moduleData.getCallbackHandler();
        if(LOG.isDebug()) {
            LOG.debug("LocationModule.updateAllLocationListeners()",
                      "sending " + loc + " with " + loc.getMC2Position()
                      + " via " + callHandler);
        }

        //check first if there are any asynchronous listeners
        if (!m_asynchLocationListeners.isEmpty()) {
            //cancel last position notification if was not executed yet
            //maybe we should cancel anyway as it will be an old position
            if (m_lastLocationEventPosted!=null) m_lastLocationEventPosted.cancel();
            //notify all listeners in a single callback
            m_lastLocationEventPosted = new LocationEventRunnable(loc,provider);
            callHandler.callInvokeCallbackRunnable(m_lastLocationEventPosted);
        }
        
        //get the actual array of listeners  
        Object[] synchListeners = m_synchLocationListeners.getListenerInternalArray();
        
        //no synchronization needed as the array will not be changed 
        for(int i = 0; i < synchListeners.length; i++) {
            ListenerWrapper wr = (ListenerWrapper) synchListeners[i];
            if (loc.isAtLeastAsGoodAs(wr.m_criteria)) {
                wr.m_listener.locationUpdate(loc, provider);
            }
        }
    }