package org.sef4j.callstack.stats.dto; import org.sef4j.callstack.stats.PendingPerfCount; import org.sef4j.callstack.stats.ThreadTimeUtils; import org.sef4j.core.util.ICopySupport; /** * DTO for PendingPerfCount * */ public class PendingPerfCountDTO implements ICopySupport<PendingPerfCountDTO> { private int pendingCount; /** * cf PendingPerfCount: * sum of startTime for all currently pending threads. * notice that will probably overflow long (2^64 bits), so the value is "correct modulo 2^64" * * to compute average until given timeNow, use <code>(pendingCount * timeNow - pendingSumStartTime) / pendingCount</code> * see getPendingAverageTimeUntilTime(timeNow) */ private long pendingSumStartTime; // ------------------------------------------------------------------------ public PendingPerfCountDTO() { } public PendingPerfCountDTO(PendingPerfCountDTO src) { set(src); } public PendingPerfCountDTO(PendingPerfCount src) { set(src); } // ------------------------------------------------------------------------ public int getPendingCount() { return pendingCount; } public void setPendingCount(int p) { this.pendingCount = p; } public long getPendingSumStartTime() { return pendingSumStartTime; } public void setPendingSumStartTime(long p) { this.pendingSumStartTime = p; } @Override /* java.lang.Object */ public PendingPerfCountDTO clone() { return copy(); } @Override /* ICopySupport<> */ public PendingPerfCountDTO copy() { return new PendingPerfCountDTO(this); } public void set(PendingPerfCountDTO src) { this.pendingCount = src.pendingCount; this.pendingSumStartTime = src.pendingSumStartTime; } public void set(PendingPerfCount src) { this.pendingCount = src.getPendingCount(); this.pendingSumStartTime = src.getPendingSumStartTime(); } public void clear() { this.pendingCount = 0; this.pendingSumStartTime = 0; } public void incr(PendingPerfCountDTO src) { this.pendingCount += src.pendingCount; this.pendingSumStartTime += src.pendingSumStartTime; } public void incr(PendingPerfCount src) { this.pendingCount += src.getPendingCount(); this.pendingSumStartTime += src.getPendingSumStartTime(); } // ------------------------------------------------------------------------ @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + pendingCount; result = prime * result + (int) (pendingSumStartTime ^ (pendingSumStartTime >>> 32)); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; PendingPerfCountDTO other = (PendingPerfCountDTO) obj; if (pendingCount != other.pendingCount) return false; if (pendingSumStartTime != other.pendingSumStartTime) return false; return true; } public String toStringUntil(long timeNow) { final int count = pendingCount; if (count == 0) return "-"; final long sumStart = pendingSumStartTime; long avgNanos = (count * timeNow - sumStart) / count; long avgMillis = ThreadTimeUtils.nanosToMillis(avgNanos); return "count:" + count + ", avgPending:" + avgMillis + " ms"; } @Override public String toString() { final int count = pendingCount; if (count == 0) return "PendingPerfCountsDTO[]"; final long sumStart = pendingSumStartTime; long timeNow = ThreadTimeUtils.getTime(); long avgNanos = (count * timeNow - sumStart) / count; long avgMillis = ThreadTimeUtils.nanosToMillis(avgNanos); return "PendingPerfCountsDTO[" + "count:" + count + ", sum:" + sumStart + ", avgPending:" + avgMillis + " ms until now(" + timeNow + ")" + "]"; } }