if(log.isInfoEnabled()) log.info("stability_task=" + stability_task + ", delay is " + delay);
if(log.isDebugEnabled()) log.debug("stability_task=" + stability_task + ", delay is " + delay);
    void sendStabilityMessage(Digest tmp) {        long delay;        if(timer == null) {            if(log.isErrorEnabled())                log.error("timer is null, cannot schedule stability message to be sent");            timer=stack != null ? stack.timer : null;            return;        }        // give other members a chance to mcast STABILITY message. if we receive STABILITY by the end of        // our random sleep, we will not send the STABILITY msg. this prevents that all mbrs mcast a        // STABILITY msg at the same time        delay=Util.random(stability_delay);        if(log.isInfoEnabled())            log.info("stability_task=" + stability_task + ", delay is " + delay);        synchronized(stability_mutex) {            if(stability_task != null && !stability_task.cancelled())  // schedule only if not yet running                return;            stability_task=new StabilitySendTask(this, tmp, delay);            timer.add(stability_task, true); // run it 1x after delay msecs. use fixed-rate scheduling        }    }