source: squid-ssl/trunk/fuentes/lib/MemPoolMalloc.cc @ 5495

Last change on this file since 5495 was 5495, checked in by Juanma, 2 years ago

Initial release

File size: 2.7 KB
Line 
1/*
2 * Copyright (C) 1996-2015 The Squid Software Foundation and contributors
3 *
4 * Squid software is distributed under GPLv2+ license and includes
5 * contributions from numerous individuals and organizations.
6 * Please see the COPYING and CONTRIBUTORS files for details.
7 */
8
9/*
10 * DEBUG: section 63    Low Level Memory Pool Management
11 * AUTHOR: Alex Rousskov, Andres Kroonmaa, Robert Collins, Henrik Nordstrom
12 */
13
14#include "squid.h"
15#include "MemPoolMalloc.h"
16
17#include <cassert>
18#include <cstring>
19
20/*
21 * XXX This is a boundary violation between lib and src.. would be good
22 * if it could be solved otherwise, but left for now.
23 */
24extern time_t squid_curtime;
25
26void *
27MemPoolMalloc::allocate()
28{
29    void *obj = NULL;
30    if (!freelist.empty()) {
31        obj = freelist.top();
32        freelist.pop();
33    }
34    if (obj) {
35        memMeterDec(meter.idle);
36        ++saved_calls;
37    } else {
38        if (doZero)
39            obj = xcalloc(1, obj_size);
40        else
41            obj = xmalloc(obj_size);
42        memMeterInc(meter.alloc);
43    }
44    memMeterInc(meter.inuse);
45    return obj;
46}
47
48void
49MemPoolMalloc::deallocate(void *obj, bool aggressive)
50{
51    memMeterDec(meter.inuse);
52    if (aggressive) {
53        xfree(obj);
54        memMeterDec(meter.alloc);
55    } else {
56        if (doZero)
57            memset(obj, 0, obj_size);
58        memMeterInc(meter.idle);
59        freelist.push(obj);
60    }
61}
62
63/* TODO extract common logic to MemAllocate */
64int
65MemPoolMalloc::getStats(MemPoolStats * stats, int accumulate)
66{
67    if (!accumulate)    /* need skip memset for GlobalStats accumulation */
68        memset(stats, 0, sizeof(MemPoolStats));
69
70    stats->pool = this;
71    stats->label = objectType();
72    stats->meter = &meter;
73    stats->obj_size = obj_size;
74    stats->chunk_capacity = 0;
75
76    stats->chunks_alloc += 0;
77    stats->chunks_inuse += 0;
78    stats->chunks_partial += 0;
79    stats->chunks_free += 0;
80
81    stats->items_alloc += meter.alloc.level;
82    stats->items_inuse += meter.inuse.level;
83    stats->items_idle += meter.idle.level;
84
85    stats->overhead += sizeof(MemPoolMalloc) + strlen(objectType()) + 1;
86
87    return meter.inuse.level;
88}
89
90int
91MemPoolMalloc::getInUseCount()
92{
93    return meter.inuse.level;
94}
95
96MemPoolMalloc::MemPoolMalloc(char const *aLabel, size_t aSize) : MemImplementingAllocator(aLabel, aSize)
97{
98}
99
100MemPoolMalloc::~MemPoolMalloc()
101{
102    assert(meter.inuse.level == 0);
103    clean(0);
104}
105
106bool
107MemPoolMalloc::idleTrigger(int shift) const
108{
109    return freelist.size() >> (shift ? 8 : 0);
110}
111
112void
113MemPoolMalloc::clean(time_t maxage)
114{
115    while (!freelist.empty()) {
116        void *obj = freelist.top();
117        freelist.pop();
118        memMeterDec(meter.idle);
119        memMeterDec(meter.alloc);
120        xfree(obj);
121    }
122}
123
Note: See TracBrowser for help on using the repository browser.