xref: /aoo4110/main/store/source/storbase.cxx (revision b1cdbd2c)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_store.hxx"
26 
27 #include "storbase.hxx"
28 
29 #include "sal/types.h"
30 #include "rtl/alloc.h"
31 #include "rtl/ref.hxx"
32 #include "osl/diagnose.h"
33 
34 #include "store/types.h"
35 #include "object.hxx"
36 
37 #ifndef INCLUDED_STDIO_H
38 #include <stdio.h>
39 #define INCLUDED_STDIO_H
40 #endif
41 
42 using namespace store;
43 
44 /*========================================================================
45  *
46  * SharedCount::Allocator.
47  *
48  *======================================================================*/
49 SharedCount::Allocator &
get()50 SharedCount::Allocator::get()
51 {
52     static Allocator g_aSharedCountAllocator;
53     return g_aSharedCountAllocator;
54 }
55 
Allocator()56 SharedCount::Allocator::Allocator()
57 {
58     m_cache = rtl_cache_create (
59         "store_shared_count_cache",
60         sizeof(long),
61         0, // objalign
62         0, // constructor
63         0, // destructor
64         0, // reclaim
65         0, // userarg
66         0, // default source
67         0  // flags
68         );
69 }
70 
~Allocator()71 SharedCount::Allocator::~Allocator()
72 {
73     rtl_cache_destroy (m_cache), m_cache = 0;
74 }
75 
76 /*========================================================================
77  *
78  * PageData::Allocator_Impl (default allocator).
79  *
80  *======================================================================*/
81 namespace store
82 {
83 
84 class PageData::Allocator_Impl :
85     public store::OStoreObject,
86     public store::PageData::Allocator
87 {
88 public:
89     /** Construction (two phase).
90      */
91     Allocator_Impl();
92 
93     storeError initialize (sal_uInt16 nPageSize);
94 
95     /** Delegate multiple inherited rtl::IReference.
96      */
acquire()97     virtual oslInterlockedCount SAL_CALL acquire()
98     {
99         return OStoreObject::acquire();
100     }
release()101     virtual oslInterlockedCount SAL_CALL release()
102     {
103         return OStoreObject::release();
104     }
105 
106 protected:
107     /** Destruction.
108      */
109     virtual ~Allocator_Impl();
110 
111 private:
112     /** Representation.
113      */
114     rtl_cache_type * m_page_cache;
115     sal_uInt16       m_page_size;
116 
117     /** PageData::Allocator implementation.
118      */
119     virtual void allocate_Impl (void ** ppPage, sal_uInt16 * pnSize);
120     virtual void deallocate_Impl (void * pPage);
121 
122     /** Not implemented.
123      */
124     Allocator_Impl (Allocator_Impl const &);
125     Allocator_Impl & operator= (Allocator_Impl const &);
126 };
127 
128 } // namespace store
129 
Allocator_Impl()130 PageData::Allocator_Impl::Allocator_Impl()
131     : m_page_cache(0), m_page_size(0)
132 {}
133 
134 storeError
initialize(sal_uInt16 nPageSize)135 PageData::Allocator_Impl::initialize (sal_uInt16 nPageSize)
136 {
137     char name[RTL_CACHE_NAME_LENGTH + 1];
138     sal_Size size = sal::static_int_cast< sal_Size >(nPageSize);
139     (void) snprintf (name, sizeof(name), "store_page_alloc_%lu", size);
140 
141     m_page_cache = rtl_cache_create (name, size, 0, 0, 0, 0, 0, 0, 0);
142     if (!m_page_cache)
143         return store_E_OutOfMemory;
144 
145     m_page_size = nPageSize;
146     return store_E_None;
147 }
148 
~Allocator_Impl()149 PageData::Allocator_Impl::~Allocator_Impl()
150 {
151     rtl_cache_destroy(m_page_cache), m_page_cache = 0;
152 }
153 
allocate_Impl(void ** ppPage,sal_uInt16 * pnSize)154 void PageData::Allocator_Impl::allocate_Impl (void ** ppPage, sal_uInt16 * pnSize)
155 {
156     OSL_PRECOND((ppPage != 0) && (pnSize != 0), "contract violation");
157     if ((ppPage != 0) && (pnSize != 0))
158         *ppPage = rtl_cache_alloc(m_page_cache), *pnSize = m_page_size;
159 }
160 
deallocate_Impl(void * pPage)161 void PageData::Allocator_Impl::deallocate_Impl (void * pPage)
162 {
163     OSL_PRECOND(pPage != 0, "contract violation");
164     rtl_cache_free(m_page_cache, pPage);
165 }
166 
167 /*========================================================================
168  *
169  * PageData::Allocator factory.
170  *
171  *======================================================================*/
172 
173 storeError
createInstance(rtl::Reference<PageData::Allocator> & rxAllocator,sal_uInt16 nPageSize)174 PageData::Allocator::createInstance (rtl::Reference< PageData::Allocator > & rxAllocator, sal_uInt16 nPageSize)
175 {
176     rtl::Reference< PageData::Allocator_Impl > xAllocator (new PageData::Allocator_Impl());
177     if (!xAllocator.is())
178         return store_E_OutOfMemory;
179 
180     rxAllocator = &*xAllocator;
181     return xAllocator->initialize (nPageSize);
182 }
183 
184 /*========================================================================
185  *
186  * OStorePageObject.
187  *
188  *======================================================================*/
189 /*
190  * ~OStorePageObject.
191  */
~OStorePageObject(void)192 OStorePageObject::~OStorePageObject (void)
193 {
194 }
195