/* * 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.data.control; import java.util.ArrayList; import java.util.Collection; import java.util.List; import android.os.Bundle; import com.tencent.wstt.gt.AidlTask; import com.tencent.wstt.gt.BooleanEntry; import com.tencent.wstt.gt.InPara; import com.tencent.wstt.gt.OutPara; import com.tencent.wstt.gt.data.CommandTaskCache; import com.tencent.wstt.gt.data.LocalTimePerfCache; import com.tencent.wstt.gt.data.LogCache; import com.tencent.wstt.gt.data.ParaTaskCache; import com.tencent.wstt.gt.data.PerfInParaCache; import com.tencent.wstt.gt.data.PerfOutParaCache; import com.tencent.wstt.gt.data.PerfTaskCache; import com.tencent.wstt.gt.data.local.LocalNumberDataPerfEntry; public class DataCacheController { private CommandTaskCache commandTaskCache; private PerfTaskCache perfTaskCache; private ParaTaskCache paraTaskCache; private LogCache logCache; private LocalTimePerfCache localTimePerfCache; // 目前只有这一种需要单独加工的缓存数据 private PerfOutParaCache outParaCache; // 注意这个出参缓存只在Connecting状态下有效,应该在上层状态控制 private PerfInParaCache inParaCache; // 注意这个出参缓存只在Connecting状态下有效,应该在上层状态控制 public DataCacheController() { } /** * 该方法应在GTInternal中状态Connecting时启动 */ public void init() { commandTaskCache = new CommandTaskCache(); perfTaskCache = new PerfTaskCache(); paraTaskCache = new ParaTaskCache(); logCache = new LogCache(); localTimePerfCache = new LocalTimePerfCache(); outParaCache = new PerfOutParaCache(); inParaCache = new PerfInParaCache(); } /* * modify on 20150305 频繁使用下,localTimePerfCache等设置null在并发情况小概率 * 引起空指针,所以不再主动设置null,牺牲少量内存保证健壮性 */ public void dispose() { if (null != localTimePerfCache) { localTimePerfCache.clear(); // localTimePerfCache = null; } if (null != outParaCache) { outParaCache.clear(); // outParaCache = null; } if (null != inParaCache) { inParaCache.clear(); // inParaCache = null; } if (null != perfTaskCache) { perfTaskCache.clear(); // perfTaskCache = null; } if (null != paraTaskCache) { paraTaskCache.clear(); // paraTaskCache = null; } if (null != commandTaskCache) { commandTaskCache.clear(); // commandTaskCache = null; } if (null != logCache) { logCache.clear(); // logCache = null; } } /** * 日志生产者 * @param content * @return */ public boolean putLog(String[] content) { return logCache.offer(content); } /** * 直接给日志消费者线程调用的方法 * @return * @throws InterruptedException */ public String[] takeLog() throws InterruptedException { return logCache.take(); } /** * 加本地性能数据缓存 * @param dataEntry */ public void putPerfData(LocalNumberDataPerfEntry...dataEntry) { if (null == dataEntry || dataEntry.length == 0) { return; } for (LocalNumberDataPerfEntry e : dataEntry) { localTimePerfCache.put(e); } } public Bundle takeCommandTask() throws InterruptedException { return commandTaskCache.take(); } public AidlTask takePerfTask() throws InterruptedException { return perfTaskCache.take(); } public AidlTask takeParaTask() throws InterruptedException { return paraTaskCache.take(); } /** * 对于需要在控制台侧分析计算的,直接加消费队列准备送去控制台处理 * @param aidlTask */ public void putPerfTask(AidlTask aidlTask) { if (null != aidlTask) { // 加消费者队列 perfTaskCache.add(aidlTask); } } public void putParaTask(AidlTask aidlTask) { if (null != aidlTask) { // 加消费者队列 paraTaskCache.add(aidlTask); } } /** * 在这个方法中计算本地性能分析值,并加消费者队列 * @param queryEntry * @return */ public AidlTask profilerData(LocalNumberDataPerfEntry...endDataEntry) { AidlTask result = localTimePerfCache.profiler(endDataEntry); if (null != result) { // 加消费者队列 perfTaskCache.add(result); } return result; } /** * 只有在Connecting态才应该走缓存,Connected态应直接送队列 */ public void registerOutParaToCache(OutPara outPara) { if (null == outPara || null == outPara.getKey()) { return; } if (null == outPara.getValue()) { outPara.setValue(""); } outParaCache.register(outPara); } /** * 只有在Connecting态才应该走缓存,Connected态应直接送队列 */ public void setOutParaToCache(String paraName, Object value) { if (null != value) { outParaCache.put(paraName, value.toString()); } outParaCache.put(paraName, ""); } /** * 获取缓存中的出参值,只有在Connecting态才应该走缓存 * @param paraName * @return */ public String getOutParaFromCache(String paraName) { if (null == paraName || outParaCache == null) { return null; } OutPara result = outParaCache.get(paraName); return result == null ? "" : result.getValue(); } /** * 只有在Connecting态才应该走缓存,Connected态应直接送队列,这个是直接送队列 */ public void setOutPara(String paraName, Object value, boolean isGlobal) { OutPara outPara = new OutPara(); outPara.setKey(paraName); if (value == null) { value = ""; } outPara.setValue(value.toString()); outPara.setGlobal(isGlobal); paraTaskCache.add(outPara); } /** * 只有在Connecting态才应该走缓存,Connected态应直接送队列,这个是直接送队列 */ public void registerInParaToCache(InPara inPara) { if (null == inPara || null == inPara.getKey()) { return; } if (null == inPara.getValues()) { inPara.setValues(new ArrayList<String>()); } inParaCache.register(inPara); } /** * 只有在Connecting态才应该走缓存,Connected态应直接送队列 */ public void setInParaToCache(String paraName, Object newValue) { if (null != newValue) { inParaCache.put(paraName, newValue.toString()); } } /** * 获取缓存中的出参值,只有在Connecting态才应该走缓存 * @param paraName * @return */ public String getInParaFromCache(String paraName) { if (null == paraName || inParaCache == null) { return null; } InPara result = inParaCache.get(paraName); if(result == null || InPara.DISPLAY_DISABLE == result.getDisplayProperty()){ return null; } List<String> values = result.getValues(); if (values != null && values.size() > 0) { return values.get(0); } return null; } /** * 只有在Connecting态才应该走缓存,Connected态应直接送队列,这个是直接送队列 */ public void setInPara(String paraName, Object newValue, boolean isGlobal) { InPara inPara = new InPara(); inPara.setKey(paraName); if (newValue == null) { newValue = ""; } List<String> values = new ArrayList<String>(); values.add(newValue.toString()); inPara.setValues(values); inPara.setGlobal(isGlobal); paraTaskCache.add(inPara); } /** * 将缓存中的出入参数据全部传给控制台(注册与设值), * 完成后将outParaCache这个一次性缓存清理掉 */ public void transParasToConsole() { /* * 1.入参 */ if (inParaCache != null) { Collection<InPara> inParas = inParaCache.getAll(); if (inParas != null) { for (InPara para : inParas) { // 加消费者队列 paraTaskCache.add(para); } } // 完成后将outParaCache这个一次性缓存清理掉 inParaCache.clear(); inParaCache = null; } /* * 2.出参 */ if (outParaCache != null) { Collection<OutPara> outParas = outParaCache.getAll(); if (outParas != null) { for (OutPara para : outParas) { // 加消费者队列 paraTaskCache.add(para); } // 完成后将outParaCache这个一次性缓存清理掉 outParaCache.clear(); outParaCache = null; } } } public void putBooleanTask(BooleanEntry aidlTask) { if (null != aidlTask) { // 加消费者队列 paraTaskCache.add(aidlTask); } } /** * 对于需要在控制台侧处理的命令,直接放入队列准备送去控制台处理 * @param bundle 命令包 */ public void putCommandTask(Bundle bundle) { if (null != bundle) { // 加消费者队列 commandTaskCache.add(bundle); } } }