/* * Tencent is pleased to support the open source community by making * Tencent GT (Version 2.4 and subsequent versions) available. * * Notwithstanding anything to the contrary herein, any previous version * of Tencent GT shall not be subject to the license hereunder. * All right, title, and interest, including all intellectual property rights, * in and to the previous version of Tencent GT (including any and all copies thereof) * shall be owned and retained by Tencent and subject to the license under the * Tencent GT End User License Agreement (http://gt.qq.com/wp-content/EULA_EN.html). * * Copyright (C) 2015 THL A29 Limited, a Tencent company. All rights reserved. * * Licensed under the MIT License (the "License"); you may not use this file * except in compliance with the License. You may obtain a copy of the License at * * http://opensource.org/licenses/MIT * * Unless required by applicable law or agreed to in writing, software distributed * under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR * CONDITIONS OF ANY KIND, either express or implied. See the License for the * specific language governing permissions and limitations under the License. */ package com.tencent.wstt.gt.ui.model; import java.util.ArrayList; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.List; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class GroupTimeEntry extends NamedEntry { private LinkedHashMap<TagQueryEntry, TagTimeEntry> tagMap = new LinkedHashMap<TagQueryEntry, TagTimeEntry>(); // UI对应的进程内跨线程差值变量缓存 private LinkedHashMap<String, TagTimeEntry> globalTagEntry = new LinkedHashMap<String, TagTimeEntry>(); // UI对应的线程差值变量缓存 private LinkedHashMap<String, TagTimeEntry> staticsThreadTagEntry = new LinkedHashMap<String, TagTimeEntry>(); /* * addEntry和entrys方法之间应加锁,保证不出容器并发问题,在万条记录级别上误差还是在1ms以内 */ private Lock lock; public GroupTimeEntry(String name) { this.name = name; this.lock = new ReentrantLock(); } public void addEntry(TagTimeEntry tagPerLogEntry) { TagQueryEntry queryEntry = new TagQueryEntry( tagPerLogEntry.getName(), tagPerLogEntry.getTid(), tagPerLogEntry.getExkey()); tagMap.put(queryEntry, tagPerLogEntry); if (tagPerLogEntry.getTid() == 0) { if (null == globalTagEntry.get(tagPerLogEntry)) { try{ lock.lock(); globalTagEntry.put(tagPerLogEntry.getName(), tagPerLogEntry); } finally { lock.unlock(); } } } else { if (null == staticsThreadTagEntry.get(queryEntry)) { try { lock.lock(); staticsThreadTagEntry.put(tagPerLogEntry.getName(), tagPerLogEntry); } finally { lock.unlock(); } } } } public void addStaticsEntry(TagTimeEntry tagPerLogEntry) { String key = tagPerLogEntry.getName(); long tid = tagPerLogEntry.getTid(); if (tid == 0) { if (null == globalTagEntry.get(key)) { try{ lock.lock(); globalTagEntry.put(key, tagPerLogEntry); } finally { lock.unlock(); } } } else { if (null == staticsThreadTagEntry.get(key)) { try { lock.lock(); staticsThreadTagEntry.put(key, tagPerLogEntry); } finally { lock.unlock(); } } } } /** * 获取统计用的线程耗时对象 * @param tag * @param tid * @return */ private TagTimeEntry getGlobalEntry(String tag) { return globalTagEntry.get(tag); } /** * 获取统计用的线程耗时对象 * @param tag * @param tid * @return */ private TagTimeEntry getStaticsThreadEntry(String tag) { return staticsThreadTagEntry.get(tag); } public TagTimeEntry getStaticsEntry(String tag, long tid) { if (tid == 0) { return getGlobalEntry(tag); } else { return getStaticsThreadEntry(tag); } } /** * 获取线程计算用的线程耗时对象 * @param tag * @param tid * @return */ public TagTimeEntry getThreadEntry(String tag, long tid, int exkey) { TagQueryEntry queryEntry = new TagQueryEntry(tag, tid, exkey); return tagMap.get(queryEntry); } /** * 返回给UI显示用的TagTimeEntry * @return */ public List<TagTimeEntry> entrys() { List<TagTimeEntry> result = new ArrayList<TagTimeEntry>(); try { lock.lock(); result.addAll(globalTagEntry.values()); result.addAll(staticsThreadTagEntry.values()); for (Iterator<TagTimeEntry> iter = result.iterator(); iter.hasNext();) { TagTimeEntry tte = iter.next(); if (null != tte && tte.getRecordSize() <= 0) { iter.remove(); } } } finally { lock.unlock(); } return result; } public void clear() { tagMap.clear(); globalTagEntry.clear(); staticsThreadTagEntry.clear(); } }