Address src;
        public void run() {            short                  version;            boolean                is_message_list, multicast;            byte                   flags;            ExposedByteArrayInputStream  in_stream=null;            ExposedBufferedInputStream   buf_in_stream=null;            DataInputStream              dis=null;            try {                in_stream=new ExposedByteArrayInputStream(buf, offset, length);                buf_in_stream=new ExposedBufferedInputStream(in_stream);                dis=new DataInputStream(buf_in_stream);                version=dis.readShort();                if(Version.compareTo(version) == false) {                    if(warn) {                        StringBuffer sb=new StringBuffer();                        sb.append("packet from ").append(sender).append(" has different version (").append(version);                        sb.append(") from ours (").append(Version.printVersion()).append("). ");                        if(discard_incompatible_packets)                            sb.append("Packet is discarded");                        else                            sb.append("This may cause problems");                        log.warn(sb);                    }                    if(discard_incompatible_packets)                        return;                }                flags=dis.readByte();                is_message_list=(flags & LIST) == LIST;                multicast=(flags & MULTICAST) == MULTICAST;                Message msg;                Address src;                if(is_message_list) { // used if message bundling is enabled                    List l=bufferToList(dis, dest, multicast);                    for(Enumeration en=l.elements(); en.hasMoreElements();) {                        msg=(Message)en.nextElement();                        src=msg.getSrc();                        if(loopback && multicast && src != null && local_addr.equals(src)) {                            continue; // drop message that was already looped back and delivered                        }                        thread_pool.execute(new IncomingMessage(msg));                    }                }                else {                    msg=bufferToMessage(dis, dest, sender, multicast);                    src=msg.getSrc();                    if(loopback && multicast && src != null && local_addr.equals(src)) {                        ; // drop message that was already looped back and delivered                    }                    else                        thread_pool.execute(new IncomingMessage(msg));                }            }            catch(QueueClosedException closed_ex) {                ; // swallow exception            }            catch(Throwable t) {                if(log.isErrorEnabled())                    log.error("failed unmarshalling message", t);            }            finally {                Util.close(dis);                Util.close(buf_in_stream);                Util.close(in_stream);            }        }