TempCache.h

/* ***************************************************
* Copyright(c) Xiamen AutoNavi Company. Ltd.
* All Rights Reserved.
*
* File: segl_multicache.h
* Purpose: 复数内存块管理接口定义
*
* Author: wmh
*
*
* Version:
* Date: 24-Oct-2015 14:51:07
* Update: Create
*
*************************************************** */ #ifndef SEGL_TEMPCACHE_H
#define SEGL_TEMPCACHE_H #include "gtypes.h"
#include "segl_Def.h"
#include "segl_cvector.h" #ifdef __cplusplus
extern "C"
{
#endif/*__cplusplus */
#define DEFARG(name, defval) ((#name[0]) ? (name + 0) : defval)
//超大内存1.3M
#define SUPER_MEM_BLOCK_SIZE 1300000
//大内存300K
#define MAX_MEM_BLOCK_SIZE 300000
//小内存分界线100K
#define MIN_MEM_BLOCK_SIZE 100000
#define SKIP_MEM_BLOCK_SIZE 20000
typedef struct GSEGLTEMPCACHEMGR *GHSEGLTEMPCACHEMGR;
typedef struct tagCVector *CVector;
typedef struct tagTempCVector *TempCVector; /**
**********************************************************************
\brief 创建临时内存块管理器
\details 创建临时内存块管理器
\param[in] nBlockCnt 内存块个数
\param[in] nFixedSize 单一内存块中不变内存大小
\param[in] nUnFixedSize 单一内存块中变化内存期望大小
\param[out] phSeglMultiCacheMgr 内存管理器
\retval GD_ERR_OK 成功
\retval GD_ERR_INVALID_PARAM 参数无效
\retval GD_ERR_NO_MEMORY 内存不足
\since 8.0
\see SEGL_DestroyCacheMgr
\remark SEGL_DestroyCacheMgr成对调用,否则会内存泄漏
**********************************************************************/
GSTATUS SEGL_CreateTempCacheMgr(GHSEGLTEMPCACHEMGR *phSeglMultiCacheMgr,Gint32 nBlockCnt); /**
**********************************************************************
\brief 销毁内存块管理器
\details 销毁内存块管理器
\param[in] hSeglMultiCacheMgr 内存管理器
\retval GD_ERR_OK 成功
\retval GD_ERR_INVALID_PARAM 参数无效
\since 8.0
\see SEGL_CreateMultiCacheMgr
\remark SEGL_CreateMultiCacheMgr成对调用,否则会内存泄漏
**********************************************************************/
GSTATUS SEGL_DestroyTempCacheMgr(GHSEGLTEMPCACHEMGR hSeglMultiCacheMgr); /**
**********************************************************************
\brief 清空内存块状态,但不释放内存
\details 清空当前所有使用的内存块状态,释放内存管理器中占用空间超大的内存块,和释放过多的内存碎片
\param[in] hSeglMultiCacheMgr 内存管理器
\retval GD_ERR_OK 成功
\retval GD_ERR_INVALID_PARAM 参数无效
\since 8.0
**********************************************************************/
GSTATUS SEGL_ClearTempCacheMgr(GHSEGLTEMPCACHEMGR hSeglMultiCacheMgr); /**
**********************************************************************
\brief 获取指定空间的缓存对象
\details 根据输入的参数获取指定内存大小的指针
\param[in] hSeglMultiCacheMgr 内存管理器
\param[in] nLen 数据的长度
\param[in] nSize 单个元素占的空间大小
\retval 分配好的内存指针
\since 8.0
**********************************************************************/
Gint8* SEGL_GetNewTempMemCache(GHSEGLTEMPCACHEMGR hSeglMultiCacheMgr, Gint32 nLen, Gint32 nSize); /**
**********************************************************************
\brief 获取指定空间的缓存空间指针
\details 根据输入的参数获取指定内存大小的指针
\param[in] hSeglMultiCacheMgr 内存管理器
\param[in] nLen 数据的长度
\param[in] nSize 单个元素占的空间大小
\param[out] pnIdx 返回分配内存空间的索引号
\retval 分配好的内存指针
\since 8.0
**********************************************************************/
Gint8* SEGL_GetNewTempMemCacheWithPos(GHSEGLTEMPCACHEMGR hSeglMultiCacheMgr,Gint32 nLen,Gint32 nSize,Gint32 *pnIdx);
/**
**********************************************************************
\brief 获取指定空间的缓存对象
\details 根据输入的参数获取指定CVector对象
\param[in] hSeglMultiCacheMgr 内存管理器
\param[in] nLen 数据的长度
\param[in] nSize 单个元素占的空间大小
\param[out] pnIdx 返回分配内存空间的索引号
\retval 分配好的内存指针
\since 8.0
**********************************************************************/
CVector SEGL_GetNewTempCache(GHSEGLTEMPCACHEMGR hSeglMultiCacheMgr, Gint32 nLen, Gint32 nSize);
/**
**********************************************************************
\brief 回收缓存对象
\details 将输入的对象所占用的内存回收分配给其它模块
\param[in] hSeglMultiCacheMgr 内存管理器
\param[in] pstCVector 需要回收的CVector对象
\retval GD_ERR_OK 操作成功
GD_ERR_INVALID_PARAM 参数无效
GD_ERR_FAILED 操作失败
\since 8.0
**********************************************************************/
GSTATUS SEGL_RemoveTempCache(GHSEGLTEMPCACHEMGR hSeglMultiCacheMgr, CVector pstCVector); /**
**********************************************************************
\brief 获取指定的CVector对象
\details 根据输入的参数,获取指定的CVector对象
\param[in] hSeglMultiCacheMgr 内存管理器
\param[in] nIdx 所要获取的位置
\retval 返回指定的CVector对象
\since 8.0
**********************************************************************/
CVector SEGL_AtTempCache(GHSEGLTEMPCACHEMGR hSeglMultiCacheMgr, Gint32 nIdx); /**
**********************************************************************
\brief 获取指定的内存对象
\details 根据输入的参数,获取指定的内存对象
\param[in] hSeglMultiCacheMgr 内存管理器
\param[in] nIdx 所要获取的位置
\param[out] pnLen 返回内存块所占的空间
\retval 返回指定的内存对象指针
\since 8.0
**********************************************************************/
Gint8* SEGL_AtTempMemCache(GHSEGLTEMPCACHEMGR hSeglMultiCacheMgr, Gint32 nIdx,Gint32 * pnLen); /**
**********************************************************************
\brief 回收缓存对象
\details 将输入的指针所占用的内存回收
\param[in] hSeglMultiCacheMgr 内存管理器
\param[in] pvMemCache 需要回收内存块
\retval GD_ERR_OK 操作成功
GD_ERR_INVALID_PARAM 参数无效
GD_ERR_FAILED 操作失败
\since 8.0
**********************************************************************/
GSTATUS SEGL_RemoveTempMemCache(GHSEGLTEMPCACHEMGR hSeglMultiCacheMgr, Gint8* pvMemCache); /**
**********************************************************************
\brief 回收缓存对象
\details 将输入的指针所占用的内存回收
\param[in] hSeglMultiCacheMgr 内存管理器
\param[in] nIdx 需要对象的索引ID
\retval GD_ERR_OK 操作成功
GD_ERR_INVALID_PARAM 参数无效
GD_ERR_FAILED 操作失败
\since 8.0
**********************************************************************/
GSTATUS SEGL_RemoveTempCache_Idx(GHSEGLTEMPCACHEMGR hSeglMultiCacheMgr, Gint32 nIdx);
/**
**********************************************************************
\brief 获取指定CVector的缓存对象
\details 根据输入的参数获取指定内存大小的指针
\param[in] hSeglMultiCacheMgr 内存管理器
\param[in] nLen 数据的长度
\param[in] nSize 单个元素占的空间大小
\param[out] pnIdx 返回分配内存空间的索引号
\retval 分配好的内存指针
\since 8.0
**********************************************************************/
CVector SEGL_GetNewTempCacheWithPos(GHSEGLTEMPCACHEMGR hSeglMultiCacheMgr,Gint32 nLen,Gint32 nSize,Gint32 *pnIdx);
//Debug结果输出
void SEGL_TempCachePrintf(GHSEGLTEMPCACHEMGR hSeglMultiCacheMgr); #ifdef __cplusplus
}
#endif /* __cplusplus */ #endif // ! SEGL_MULTICACHE_H

TempCache.c

  1 /* ***************************************************
2 * Copyright(c) Xiamen AutoNavi Company. Ltd.
3 * All Rights Reserved.
4 *
5 * File: segl_multicache.c
6 * Purpose: 复数内存块管理接口实现
7 *
8 * Author: wmh
9 *
10 *
11 * Version:
12 * Date: 24-Oct-2015 14:51:07
13 * Update: Create
14 *
15 *************************************************** */
16
17 #include "segl_tempcache.h"
18 #include "segl_utils.h"
19 #include "libgdc.h"
20 //#include "segl_cvector.h"
21 //#include <android/log.h>
22 //#define TAG "wmh"
23 /**
24 * 缓存管理
25 */
26 typedef struct GSEGLTEMPCACHEMGR
27 {
28 Gint32 nUsedBlockIdx; /**< 当前所使用到内存块个数 */
29 Gint32 nUsedBlockCnt; /**< 可用内存块总数 */
30 CVector ptList; /**< 定长内存列表 */
31 }GSEGLTEMPCACHEMGR;
32
33 typedef struct tagTempCVector
34 {
35 struct tagCVector base;//CVector对象
36 Gint32 nUseEnable;//是否使用
37 }tagTempCVector;
38
39
40 /**
41 **********************************************************************
42 \brief 创建临时内存块管理器
43 \details 创建临时内存块管理器
44 \param[in] nBlockCnt 内存块个数
45 \param[out] phSeglMultiCacheMgr 内存管理器
46 \retval GD_ERR_OK 成功
47 \retval GD_ERR_INVALID_PARAM 参数无效
48 \retval GD_ERR_NO_MEMORY 内存不足
49 \since 8.0
50 \see SEGL_DestroyCacheMgr
51 \remark SEGL_DestroyCacheMgr成对调用,否则会内存泄漏
52 **********************************************************************/
53 GSTATUS SEGL_CreateTempCacheMgr(GHSEGLTEMPCACHEMGR *phSeglMultiCacheMgr,Gint32 nBlockCnt)
54 {
55 GHSEGLTEMPCACHEMGR hSeglMultiCacheMgr = GNULL;
56 CVECTORSTATUS euCVStatus = CV_ERR_OK;
57
58 if ((phSeglMultiCacheMgr == GNULL) || (nBlockCnt <= 0) || *phSeglMultiCacheMgr != GNULL)
59 {
60 return(GD_ERR_INVALID_PARAM);
61 }
62 *phSeglMultiCacheMgr = GNULL;
63
64 hSeglMultiCacheMgr = (GHSEGLTEMPCACHEMGR)Gmalloc(sizeof(GSEGLTEMPCACHEMGR));
65 if (hSeglMultiCacheMgr == GNULL)
66 {
67 return(GD_ERR_NO_MEMORY);
68 }
69 Gmemset(hSeglMultiCacheMgr, 0, sizeof(GSEGLTEMPCACHEMGR));
70 hSeglMultiCacheMgr->ptList=(CVector)Gmalloc(sizeof(tagCVector));
71 Gmemset(hSeglMultiCacheMgr->ptList, 0, sizeof(tagCVector));
72 euCVStatus = CVector_Create(hSeglMultiCacheMgr->ptList,nBlockCnt,sizeof(tagTempCVector));
73
74 if (euCVStatus != CV_ERR_OK)
75 {
76 SEGL_DestroyTempCacheMgr(hSeglMultiCacheMgr);
77 return(GD_ERR_FAILED);
78 }
79 hSeglMultiCacheMgr->nUsedBlockIdx = 0;
80 hSeglMultiCacheMgr->nUsedBlockCnt = 0;//by wmh
81 *phSeglMultiCacheMgr = hSeglMultiCacheMgr;
82 return(GD_ERR_OK);
83 }
84
85 /**
86 **********************************************************************
87 \brief 摧毁复数内存块管理器
88 \details 摧毁复数内存块管理器
89 \param[in] hSeglMultiCacheMgr 内存管理器
90 \retval GD_ERR_OK 成功
91 \retval GD_ERR_INVALID_PARAM 参数无效
92 \since 8.0
93 \see SEGL_CreateMultiCacheMgr
94 \remark SEGL_CreateMultiCacheMgr成对调用,否则会内存泄漏
95 **********************************************************************/
96 GSTATUS SEGL_DestroyTempCacheMgr(GHSEGLTEMPCACHEMGR hSeglMultiCacheMgr)
97 {
98 Gint32 i = 0;
99 TempCVector pstCVector = GNULL;
100 if (hSeglMultiCacheMgr == GNULL)
101 {
102 return(GD_ERR_INVALID_PARAM);
103 }
104 if (hSeglMultiCacheMgr->ptList != GNULL)
105 {
106 if (hSeglMultiCacheMgr->ptList->cv_pdata != GNULL)
107 {
108 for (i = 0; i < hSeglMultiCacheMgr->nUsedBlockCnt; i++)
109 {
110 pstCVector = CVector_At_Idx(hSeglMultiCacheMgr->ptList, i);
111 CVector_Destroy((CVector)pstCVector);
112 pstCVector->nUseEnable=0;
113 }
114 CVector_Destroy(hSeglMultiCacheMgr->ptList);
115 }
116 Gfree(hSeglMultiCacheMgr->ptList);
117 hSeglMultiCacheMgr->ptList = GNULL;
118 }
119
120 Gfree(hSeglMultiCacheMgr);
121 hSeglMultiCacheMgr = GNULL;
122 return(GD_ERR_OK);
123 }
124
125 /**
126 **********************************************************************
127 \brief 清空内存块管理器,但不释放内存
128 \details 清空内存块管理器,但不释放内存
129 \param[in] hSeglMultiCacheMgr 内存管理器
130 \retval GD_ERR_OK 成功
131 \retval GD_ERR_INVALID_PARAM 参数无效
132 \since 8.0
133 \see SEGL_CreateMultiCacheMgr
134 \remark SEGL_CreateMultiCacheMgr成对调用,否则会内存泄漏
135 **********************************************************************/
136 GSTATUS SEGL_ClearTempCacheMgr(GHSEGLTEMPCACHEMGR hSeglMultiCacheMgr)
137 {
138 Gint32 i = 0;
139 Gint32 MaxMemIdx = -1;
140 TempCVector pstCVector = GNULL;
141 CVector pstMaxCVector = GNULL;
142 if (hSeglMultiCacheMgr == GNULL)
143 {
144 return(GD_ERR_INVALID_PARAM);
145 }
146 //__android_log_print(ANDROID_LOG_INFO, TAG, "SEGL_ClearTempCacheMgr S");
147 //SEGL_TempCachePrintf(hSeglMultiCacheMgr);
148 hSeglMultiCacheMgr->nUsedBlockIdx = 0;
149 if (hSeglMultiCacheMgr->ptList != GNULL)
150 {
151 if (hSeglMultiCacheMgr->ptList->cv_pdata != GNULL)
152 {
153 for (i = 0; i < hSeglMultiCacheMgr->nUsedBlockCnt; i++)
154 {
155 pstCVector = CVector_At_Idx(hSeglMultiCacheMgr->ptList, i);
156 pstCVector->nUseEnable = 0;
157 if (pstMaxCVector == GNULL || pstMaxCVector->cv_tot_len < pstCVector->base.cv_tot_len)
158 {
159 if (pstMaxCVector != GNULL && pstMaxCVector->cv_tot_len > MAX_MEM_BLOCK_SIZE)
160 {
161 CVector_Destroy((CVector)pstMaxCVector);
162 }
163 MaxMemIdx = i;
164 pstMaxCVector = (CVector)pstCVector;
165 }
166 else if (i > 3 || pstCVector->base.cv_tot_len > MAX_MEM_BLOCK_SIZE)
167 {
168 CVector_Destroy((CVector)pstCVector);
169 }
170 }
171 if (pstMaxCVector != GNULL && pstMaxCVector->cv_tot_len > SUPER_MEM_BLOCK_SIZE)
172 { //当内存超大时将释放
173 CVector_Destroy((CVector)pstMaxCVector);
174 }
175 }
176 }
177 //SEGL_TempCachePrintf(hSeglMultiCacheMgr);
178 return(GD_ERR_OK);
179 }
180 Gint8* SEGL_GetNewTempMemCache(GHSEGLTEMPCACHEMGR hSeglMultiCacheMgr,Gint32 length, Gint32 size)
181 {
182 return SEGL_GetNewTempMemCacheWithPos( hSeglMultiCacheMgr, length, size, GNULL);
183 }
184 //获取指定内存缓存区
185 Gint8* SEGL_GetNewTempMemCacheWithPos(GHSEGLTEMPCACHEMGR hSeglMultiCacheMgr, Gint32 length, Gint32 size, Gint32 *pPos)
186 {
187 CVector vector = SEGL_GetNewTempCacheWithPos(hSeglMultiCacheMgr,length,size,pPos);
188 if(vector == GNULL)
189 {
190 return GNULL;
191 }
192 return vector->cv_pdata;
193 }
194 //获取指定Vector
195 CVector SEGL_GetNewTempCache(GHSEGLTEMPCACHEMGR hSeglMultiCacheMgr,Gint32 length,Gint32 size){
196 return SEGL_GetNewTempCacheWithPos(hSeglMultiCacheMgr, length, size, GNULL);
197 }
198
199 //获取最合理的Vector对象
200 TempCVector GetTempVectorCache(GHSEGLTEMPCACHEMGR hSeglMultiCacheMgr, Gint32 length,Gint32 size)
201 {
202 Gint32 i=0;
203 TempCVector pstTmpVector = GNULL;
204 TempCVector pstRetVector = GNULL;
205 Gint32 nCurrentDiffSize=0;
206 Gint32 nDiffSize=0;
207 Gint32 nCurrentTotalSize=length*size;
208
209 for(i = 0;i < hSeglMultiCacheMgr->nUsedBlockCnt;i++)
210 {
211 pstTmpVector = (TempCVector)CVector_At_Idx(hSeglMultiCacheMgr->ptList, i);
212 if (pstTmpVector->nUseEnable ==0)
213 {
214 nDiffSize=pstTmpVector->base.cv_tot_len-nCurrentTotalSize;
215 if(nCurrentTotalSize < MAX_MEM_BLOCK_SIZE)
216 { //小内存分配
217 if(nDiffSize > 0 && nDiffSize < SKIP_MEM_BLOCK_SIZE)
218 { //空间够时判断
219 //索引差值小于10K.将当前数据块分配给当前模块
220 if(pstRetVector == GNULL)
221 { //未分配内存
222 pstRetVector = pstTmpVector;
223 nCurrentDiffSize = nDiffSize;
224 }
225 else if(nCurrentDiffSize > nDiffSize )
226 { //有更合适的内存
227 pstRetVector = pstTmpVector;
228 nCurrentDiffSize = nDiffSize;
229 }
230 }
231 else
232 { //未分配到内存
233 if (pstRetVector == GNULL)
234 {
235 pstRetVector = pstTmpVector;
236 nCurrentDiffSize = nDiffSize;
237 }
238 else if (nDiffSize > 0 && nCurrentDiffSize < nDiffSize)
239 {
240 //使用最合理的内存分配器
241 pstRetVector = pstTmpVector;
242 nCurrentDiffSize = nDiffSize;
243 }
244 }
245 }
246 else
247 {// 大内存分配
248 if(pstRetVector == GNULL)
249 {
250 pstRetVector = pstTmpVector;
251 nCurrentDiffSize = nDiffSize;
252 }
253 else if(nCurrentDiffSize < nDiffSize )
254 { //使用最大的内存分配器
255 pstRetVector = pstTmpVector;
256 nCurrentDiffSize = nDiffSize;
257 }
258 }
259 }
260 }
261 return pstRetVector;
262 }
263 //获取指定Vector
264 CVector SEGL_GetNewTempCacheWithPos(GHSEGLTEMPCACHEMGR hSeglMultiCacheMgr,Gint32 length,Gint32 size,Gint32 *poPos){
265
266 TempCVector pstTmpVector = GNULL;
267 Gint32 stats = 0;
268
269 if(hSeglMultiCacheMgr == GNULL || hSeglMultiCacheMgr->ptList == GNULL || size <= 0 )
270 {
271 return GNULL;
272 }
273 if (length <= 0)
274 {
275 length = 1;//最少创建一个元素
276 }
277 GLOG_POI_DEBUG(GT("SEGL_GetNewTempCacheWithPos len=%d ,size =%d\n"),length,size);
278 if(hSeglMultiCacheMgr->nUsedBlockIdx+1<hSeglMultiCacheMgr->nUsedBlockCnt)
279 {//返回已经存在的缓存
280 pstTmpVector = GetTempVectorCache(hSeglMultiCacheMgr,length,size);
281 if (pstTmpVector != GNULL)
282 {
283 stats = CVector_Resize(&(pstTmpVector->base),length,size);
284 if(stats != CVESUCCESS)
285 {
286 return GNULL;
287 }
288 pstTmpVector->base.cv_struct = CV_TEMP_STRUCT;
289 pstTmpVector->nUseEnable = 1;
290 CVector_Clear(&(pstTmpVector->base));
291 if(poPos != GNULL)
292 {
293 *poPos = CVector_At(hSeglMultiCacheMgr->ptList,pstTmpVector);
294 }
295 hSeglMultiCacheMgr->nUsedBlockIdx++;
296 return &(pstTmpVector->base);
297 }
298 }
299
300 {//创建新的缓存区
301
302 pstTmpVector= (TempCVector)CVector_NewEmpty(hSeglMultiCacheMgr->ptList);
303 stats = CVector_Create(&(pstTmpVector->base),length,size);
304
305 if(stats == CVESUCCESS)
306 {
307 pstTmpVector->base.cv_struct = CV_TEMP_STRUCT;
308 hSeglMultiCacheMgr->nUsedBlockCnt++;
309 pstTmpVector->nUseEnable = 1;
310 hSeglMultiCacheMgr->nUsedBlockIdx++;
311 // added by dongliang.huang 2016.06.22
312 if (poPos != GNULL)
313 {
314 *poPos = hSeglMultiCacheMgr->nUsedBlockCnt - 1;
315 }
316 return &(pstTmpVector->base);
317 }
318 else
319 {
320 CVector_Popback(hSeglMultiCacheMgr->ptList);
321 }
322 }
323 // printf("1.SEGL_GetNewTempCache start size=%d\n",CVector_Length(hSeglMultiCacheMgr->ptList));
324 // printf("getNewTempCache start nUsedBlockIdx=%d addr=%d,cv_pdata=%d,cv_len=%d,cv_size=%d,cv_tot_len=%d\n",hSeglMultiCacheMgr->nUsedBlockIdx,vector,vector->cv_pdata,vector->cv_len,vector->cv_size,vector->cv_tot_len);
325 return GNULL;
326 }
327 //回收内存块
328 GSTATUS SEGL_RemoveTempMemCache(GHSEGLTEMPCACHEMGR hSeglMultiCacheMgr, Gint8* array)
329 {
330 return SEGL_RemoveTempCache(hSeglMultiCacheMgr, (CVector)array);
331 }
332 //回收内存块
333 GSTATUS SEGL_RemoveTempCache(GHSEGLTEMPCACHEMGR hSeglMultiCacheMgr, CVector pstCVector)
334 {
335 if(hSeglMultiCacheMgr == GNULL || pstCVector == GNULL)
336 {
337 return GD_ERR_INVALID_PARAM;
338 }
339 if(pstCVector->cv_struct == CV_TEMP_STRUCT)
340 {
341 pstCVector->cv_size = 0;
342 pstCVector->cv_len = 0;
343 ((TempCVector)pstCVector)->nUseEnable = 0;
344
345 hSeglMultiCacheMgr->nUsedBlockIdx--;
346 return CVESUCCESS;
347 }
348 else
349 {
350 return GD_ERR_FAILED;
351 }
352 }
353 //回收内存块
354 GSTATUS SEGL_RemoveTempCache_Idx(GHSEGLTEMPCACHEMGR hSeglMultiCacheMgr, Gint32 index)
355 {
356 TempCVector pstTmpVector = GNULL;
357 if(hSeglMultiCacheMgr == GNULL || index <0 || index >= CVector_Length(hSeglMultiCacheMgr->ptList))
358 {
359 return GD_ERR_INVALID_PARAM;
360 }
361 pstTmpVector = (TempCVector)CVector_At_Idx(hSeglMultiCacheMgr->ptList, index);
362 return SEGL_RemoveTempCache(hSeglMultiCacheMgr, (CVector)pstTmpVector);
363 }
364
365 //获取指定Vector
366 CVector SEGL_AtTempCache(GHSEGLTEMPCACHEMGR hSeglMultiCacheMgr, Gint32 index){
367
368 if(hSeglMultiCacheMgr == GNULL || hSeglMultiCacheMgr->ptList == GNULL)
369 {
370 return GNULL;
371 }
372 if(hSeglMultiCacheMgr->nUsedBlockCnt > index){
373 return (CVector)CVector_At_Idx(hSeglMultiCacheMgr->ptList, index);
374 }
375 return GNULL;
376 }
377 //获取指定内存缓存区
378 Gint8* SEGL_AtTempMemCache(GHSEGLTEMPCACHEMGR hSeglMultiCacheMgr, Gint32 index,Gint32 * pnLen)
379 {
380 CVector vector = SEGL_AtTempCache(hSeglMultiCacheMgr,index);
381 if(vector == GNULL)
382 {
383 return GNULL;
384 }
385 if(pnLen != GNULL)
386 {
387 *pnLen =vector->cv_tot_len;
388 }
389 return vector->cv_pdata;
390 }
391
392
393 void SEGL_TempCachePrintf(GHSEGLTEMPCACHEMGR hSeglMultiCacheMgr)
394 {
395 #ifdef GLOG_ON
396 Gint32 i=0;
397 Gint32 total = 0;
398 CVector cv=hSeglMultiCacheMgr->ptList;
399 CVector temp = GNULL;
400 GLOG_POI_DEBUG(GT("TempCachePrintf S Vector.tot_len=%d Vector.len=%d nUsedBlockCnt =%d"),cv->cv_tot_len,CVector_Length(cv),hSeglMultiCacheMgr->nUsedBlockCnt);
401 for(i =0 ;i<CVector_Length(cv);i++)
402 {
403 temp= (CVector)CVector_At_Idx(cv, i);
404 GLOG_POI_DEBUG(GT("i=%d addr=%d,cv_pdata=%d,cv_len=%d,cv_size=%d,cv_tot_len=%d\n"),i,temp,temp->cv_pdata,temp->cv_len,temp->cv_size,temp->cv_tot_len);
405 //__android_log_print(ANDROID_LOG_INFO, TAG, "i=%d addr=%d,cv_pdata=%d,cv_tot_len=%d\n", i,temp,temp->cv_pdata,temp->cv_tot_len);
406 total += temp->cv_tot_len;
407 }
408 total = total;
409 GLOG_POI_DEBUG(GT("TempCachePrintf E tot_len=%d K"),total/1024);
410 #endif
411 }

TempCache 临时内存缓存器的更多相关文章

  1. Memory Cache(内存缓存)

    当Google测试了Google Search服务的可用性后,发现速度是最影响Web应用的可用性的因素之一.相对于作用相同但是速度慢的应用,用户更喜欢速度快的应用.多来年,Google已经掌握了如何使 ...

  2. Memcached内存缓存技术

    Memcached是什么,有什么作用? Memcached是一个开源的.高性能的内存缓存软件,从名称上看Mem就是内存的意思,而Cache就是缓存的意思. Memcached通过在事先规划好的内存空间 ...

  3. spark内存管理器--MemoryManager源码解析

    MemoryManager内存管理器 内存管理器可以说是spark内核中最重要的基础模块之一,shuffle时的排序,rdd缓存,展开内存,广播变量,Task运行结果的存储等等,凡是需要使用内存的地方 ...

  4. [Android]异步加载图片,内存缓存,文件缓存,imageview显示图片时增加淡入淡出动画

    以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/3574131.html  这个可以实现ImageView异步加载 ...

  5. php内存缓存

    1.文件方式缓存 哈希子目录缓存 2.APC APC,全称是Alternative PHP Cache,官方翻译叫”可选PHP缓存”.它为我们提供了缓存和优化PHP的中间代码的框架. APC的缓存分两 ...

  6. 【转】图片缓存之内存缓存技术LruCache、软引用 比较

    每当碰到一些大图片的时候,我们如果不对图片进行处理就会报OOM异常,这个问题曾经让我觉得很烦恼,后来终于得到了解决,那么现在就让我和大家一起分享一下吧.这篇博文要讲的图片缓存机制,我接触到的有两钟,一 ...

  7. JAVA字符串缓存器全部方法功能及其作用

    不知道干嘛的 serialVersionUID 构造一个没有字符的字符串缓冲区,初始容量为16个字符. StringBuffer() 构造一个没有字符的字符串缓冲区和指定的初始容量. StringBu ...

  8. 最简单的基于FFmpeg的内存读写的例子:内存播放器

    ===================================================== 最简单的基于FFmpeg的内存读写的例子系列文章列表: 最简单的基于FFmpeg的内存读写的 ...

  9. C/C++内存管理器

    C标准库提供了malloc,free,calloc,realloc,C++标准库还提供了new, new[], delete, delete[].这些用来管理内存,看起来够用了,为啥还要自己写一个内存 ...

随机推荐

  1. Contest 2050 and Codeforces Round #718 (Div. 1 + Div. 2) 题解

    竟然上 GM 了,incredible( A 首先如果 \(2050\nmid n\) 那显然就 \(-1\) 了,否则答案显然为 \(\dfrac{n}{2050}\) 的各位数字和. B 显然这个 ...

  2. ss 显示socket状态

    ss ===show socket用于显示socket状态 所有的TCP sockets 所有的UDP sockets 所有ssh/ftp/ttp/https持久连接 所有连接到Xserver的本地进 ...

  3. mysql—从字符串中提取数字(类型1)

    select reason,CHAR_LENGTH(reason),mid(reason,5,CHAR_LENGTH(reason)-5)+0 from `table` 解释: CHAR_LENGTH ...

  4. 37-Invert Binary Tree

    Invert Binary Tree My Submissions QuestionEditorial Solution Total Accepted: 87818 Total Submissions ...

  5. cmd查看同一个局域网内电脑IP

    win+R,cmd  #快速打开cmd窗口 net view  #查看本地局域网内开启了哪些计算机共享  运行后可以看到已共享的计算机名称 net view ip  #查看对方局域网内开启了哪些共享 ...

  6. Java 数据类型转化

    目录 Java类型转化 基本数据类型自动类型转换 自动类型提升 强制类型转换 - 自动类型提升的逆运算 int与long int类型与String类型 int类型转换成String类型 方法1:+ 拼 ...

  7. day12 form组件

    day12 form组件 今日内容 form组件前戏 form组件基本定义 form组件数据校验功能 form组件渲染标签 form组件提示信息 数据校验进阶 form组件补充 form组件源码探索 ...

  8. 在 Apple Silicon Mac 上 DFU 模式恢复 macOS 固件

    DFU 模式全新安装 macOS Big Sur 或 macOS Monterey 请访问原文链接:https://sysin.org/blog/apple-silicon-mac-dfu/,查看最新 ...

  9. express系列(1)概述

    在 Node.js 出现之前,前后端的开发必须使用不同的语言进行.为此你需要学习多种的语言和框架.有了 Node.js 之后,你就可以使用一门语言在前后端开发中自由切换,这是最吸引人的地方. 什么是 ...

  10. RB-Tree深度探索

    关联式容器就是通过key值来寻找value,这个和数据库很相像,为了提升查找效率,因此关联式容器底层大多数用红黑树或哈希表来实现. 红黑树是高度平衡的二叉树,它也被称为平衡二元搜索树. 如上所示,正常 ...