summaryrefslogtreecommitdiff
path: root/store/source/storcach.hxx
blob: 661343657be50c5ba755434c3232d3342b705a3c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
/*************************************************************************
 *
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * Copyright 2008 by Sun Microsystems, Inc.
 *
 * OpenOffice.org - a multi-platform office productivity suite
 *
 * $RCSfile: storcach.hxx,v $
 * $Revision: 1.6 $
 *
 * This file is part of OpenOffice.org.
 *
 * OpenOffice.org is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License version 3
 * only, as published by the Free Software Foundation.
 *
 * OpenOffice.org is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Lesser General Public License version 3 for more details
 * (a copy is included in the LICENSE file that accompanied this code).
 *
 * You should have received a copy of the GNU Lesser General Public License
 * version 3 along with OpenOffice.org.  If not, see
 * <http://www.openoffice.org/license.html>
 * for a copy of the LGPLv3 License.
 *
 ************************************************************************/

#ifndef _STORE_STORCACH_HXX
#define _STORE_STORCACH_HXX "$Revision: 1.6 $"

#include <sal/types.h>
#include <osl/mutex.hxx>
#include <store/types.h>

#ifndef INCLUDED_CSTDDEF
#include <cstddef>
#define INCLUDED_CSTDDEF
#endif

namespace store
{

struct OStorePageDescriptor;
struct OStorePageData;
class  OStorePageBIOS;

/*========================================================================
 *
 * OStorePageCache interface.
 * (OStorePageData in external representation)
 *
 *======================================================================*/
#define STORE_LIMIT_CACHEPAGES   256
#define STORE_DEFAULT_CACHEPAGES STORE_LIMIT_CACHEPAGES

struct OStorePageCacheEntry;

class OStorePageCache
{
    typedef OStorePageCacheEntry entry;

public:
    /** Allocation.
     */
    static void * operator new (std::size_t n) SAL_THROW(());
    static void   operator delete (void * p, std::size_t) SAL_THROW(());

    /** Construction.
    */
    OStorePageCache (
        sal_uInt16 nPages = STORE_DEFAULT_CACHEPAGES);

    /** Destruction.
    */
    ~OStorePageCache (void);

    /** load.
    */
    storeError load (
        const OStorePageDescriptor &rDescr,
        OStorePageData             &rData,
        OStorePageBIOS             &rBIOS,
        osl::Mutex                 *pMutex = NULL);

    /** update.
    */
    enum UpdateMode
    {
        UPDATE_WRITE_THROUGH = 0,
        UPDATE_WRITE_DELAYED = 1
    };

    storeError update (
        const OStorePageDescriptor &rDescr,
        const OStorePageData       &rData,
        OStorePageBIOS             &rBIOS,
        osl::Mutex                 *pMutex = NULL,
        UpdateMode                  eMode  = UPDATE_WRITE_THROUGH);

    /** invalidate.
    */
    storeError invalidate (
        const OStorePageDescriptor &rDescr,
        osl::Mutex                 *pMutex = NULL);

    /** flush.
    */
    storeError flush (
        OStorePageBIOS &rBIOS,
        osl::Mutex     *pMutex = NULL);

    /** hitRatio [nHit / (nHit + nMissed)].
     */
    inline double hitRatio (void) const;

    /** usageRatio [nUsed / nSize].
    */
    inline double usageRatio (void) const;

private:
    /** Representation.
    */
    sal_uInt16  m_nSize;
    sal_uInt16  m_nUsed;
    entry      *m_pData[STORE_LIMIT_CACHEPAGES];
    entry      *m_pHead;

    sal_uInt32  m_nHit;
    sal_uInt32  m_nMissed;
    sal_uInt32  m_nUpdHit;
    sal_uInt32  m_nUpdLRU;
    sal_uInt32  m_nWrtBack;

    /** Implementation.
    */
    sal_uInt16 find (const OStorePageDescriptor &rDescr) const;
    void       move (sal_uInt16 nSI, sal_uInt16 nDI);

    /** insert.
    */
    enum InsertMode
    {
        INSERT_CLEAN = 0,
        INSERT_DIRTY = 1
    };

    storeError insert (
        sal_uInt16                  nIndex,
        const OStorePageDescriptor &rDescr,
        const OStorePageData       &rData,
        OStorePageBIOS             &rBIOS,
        InsertMode                  eMode = INSERT_CLEAN);

    /** Not implemented.
    */
    OStorePageCache (const OStorePageCache& rOther);
    OStorePageCache& operator= (const OStorePageCache& rOther);
};

/*
 * hitRatio [nHit / (nHit + nMissed)].
 */
inline double OStorePageCache::hitRatio (void) const
{
    if (m_nHit || m_nMissed)
        return ((double)m_nHit / (double)(m_nHit + m_nMissed));
    else
        return 1.0;
}

/*
 * usageRatio [nUsed / nSize].
 */
inline double OStorePageCache::usageRatio (void) const
{
    if (m_nUsed < m_nSize)
        return ((double)m_nUsed / (double)m_nSize);
    else
        return 1.0;
}

/*========================================================================
 *
 * The End.
 *
 *======================================================================*/

} // namespace store

#endif /* !_STORE_STORCACH_HXX */