/** 规定不区分线程的tid为0,被测程序的线程号为正数,GT控制台的线程号为负数 */ public void startTime(long tid, String group, String tag, int exKey, long start, int funcId) { if (null != group && null != tag) { GroupTimeEntry groupEntry = groupMap.get(group); if (null == groupEntry) { groupEntry = new GroupTimeEntry(group); lock.lock(); groupMap.put(group, groupEntry); lock.unlock(); } // 从Group中取出由tag, tid, exKey共同标示的TagTimeEntry对象 TagTimeEntry tagEntry = groupEntry.getThreadEntry(tag, tid, exKey); if (null == tagEntry) { tagEntry = new TagTimeEntry(groupEntry); tagEntry.setName(tag); tagEntry.setTid(tid); tagEntry.setExkey(exKey); /* * funcId用的是PERF_START_TIME_GLOBAL或PERF_START_DIGITAL_GLOBAL * 对于后面的使用只是保证UI精度,不会做其他依赖funcId的逻辑计算 */ tagEntry.setFunctionId(funcId); groupEntry.addEntry(tagEntry); } tagEntry.setLastStart(start); } }
public void setState(boolean flag) { started = flag; if (flag) { startedOnceUntilNotClear = true; } // GTPref.getGTPref().edit().putBoolean(GTPref.PERF_MASTER_SWITCH, started).commit(); if (!started) { for (GroupTimeEntry gte : groupMap.values()) { for (TagTimeEntry tte : gte.entrys()) { /* * 后面处理注意,这个操作之后如果TagTimeEntry对象收到对应的 * 一条endTime消息,则是上次消费的,需要丢弃, * 即在lastStart==0时,只有收到startTime消息才是开始有效的。 * 同一个线程内,不需要担心乱序、多条的问题 */ tte.setLastStart(0); } } } }
public long endTime(long tid, String group, String tag, int exKey, long end, int funcId) { if (null != group && null != tag) { GroupTimeEntry groupEntry = null; TagTimeEntry tagEntry = null; if (null == groupMap.get(group)) { return -1; } groupEntry = groupMap.get(group); if (null == groupEntry) { return -1; } tagEntry = groupEntry.getThreadEntry(tag, tid, exKey); if (null == tagEntry) { return -1; } if (tagEntry.getLastStart() <= 0) { return -1; } long reduce = end - tagEntry.getLastStart(); tagEntry.setLastStart(0); if (started) { // 在对应的统计对象中加入差值,注意统计值是不关注exKey的 TagTimeEntry staticsTagTimeEntry = groupEntry.getStaticsEntry(tag, tid); staticsTagTimeEntry.add(reduce); } return reduce; } return -1; }