if(observer != null) observer.up(evt);
        private void handleMyMessage(Message msg, boolean multicast) {            if(stats) {                num_msgs_received++;                num_bytes_received+=msg.getLength();            }            Address src=msg.getSrc();            if(loopback && multicast && src != null && local_addr.equals(src)) {                return; // drop message that was already looped back and delivered            }            TpHeader hdr=(TpHeader)msg.getHeader(name); // replaced removeHeader() with getHeader()            if(hdr != null) {                String ch_name=hdr.channel_name;                // Discard if message's group name is not the same as our group name                if(channel_name != null && !channel_name.equals(ch_name)) {                    if(warn)                        log.warn(new StringBuffer("discarded message from different group \"").append(ch_name).                                append("\" (our group is \"").append(channel_name).append("\"). Sender was ").append(msg.getSrc()));                    return;                }            }            else {                if(trace)                    log.trace(new StringBuffer("message does not have a transport header, msg is ").append(msg).                            append(", headers are ").append(msg.getHeaders()).append(", will be discarded"));                return;            }            Event evt=new Event(Event.MSG, msg);            if(trace) {                StringBuffer sb=new StringBuffer("message is ").append(msg).append(", headers are ").append(msg.getHeaders());                log.trace(sb);            }            /* Because Protocol.up() is never called by this bottommost layer, we call up() directly in the observer.               This allows e.g. PerfObserver to get the time of reception of a message */            if(observer != null)                observer.up(evt);            passUp(evt);        }