num_elements_updated=updateFromOtherDigest(d, sender);
num_elements_updated=updateLocalDigest(d, sender);
    private void handleStableGossip(Address sender, Digest d) {        if(d == null || sender == null) {            if(log.isErrorEnabled()) log.error("digest or sender is null");            return;        }        if(suspended) {            if(log.isTraceEnabled())                log.trace("STABLE message will not be handled as I'm suspended");            return;        }        if(log.isTraceEnabled())            log.trace(new StringBuffer("received stable msg from ").append(sender).append(": ").append(d.printHighSeqnos()));        if(!heard_from.contains(sender)) {  // already received gossip from sender; discard it            if(log.isTraceEnabled()) log.trace("already received stable msg from " + sender);            return;        }        Digest copy;        synchronized(digest) {            int num_elements_expected=digest.size(), num_elements_updated;            num_elements_updated=updateFromOtherDigest(d, sender);            // we can only remove the sender from heard_from if *all* elements of my digest were updated            if(num_elements_updated != num_elements_expected)                return;            copy=digest.copy();        }        boolean was_last=removeFromHeardFromList(sender);        if(was_last) {            sendStabilityMessage(copy);        }    }