|
|
|
|
|
|
|
|
|
|
|
|||||||
00001 /* 00002 * File: comstl_memory_functions.h (originally MOMemory.h/.c, ::SynesisCom) 00003 * 00004 * Purpose: COM memory functions. 00005 * 00006 * Created: 2nd March 1996 00007 * Updated: 11th September 2004 00008 * 00009 * Home: http://stlsoft.org/ 00010 * 00011 * Copyright (c) 1996-2004, Matthew Wilson and Synesis Software 00012 * All rights reserved. 00013 * 00014 * Redistribution and use in source and binary forms, with or without 00015 * modification, are permitted provided that the following conditions are met: 00016 * 00017 * - Redistributions of source code must retain the above copyright notice, this 00018 * list of conditions and the following disclaimer. 00019 * - Redistributions in binary form must reproduce the above copyright notice, 00020 * this list of conditions and the following disclaimer in the documentation 00021 * and/or other materials provided with the distribution. 00022 * - Neither the name(s) of Matthew Wilson and Synesis Software nor the names of 00023 * any contributors may be used to endorse or promote products derived from 00024 * this software without specific prior written permission. 00025 * 00026 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 00027 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 00028 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 00029 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 00030 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 00031 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 00032 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 00033 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 00034 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 00035 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 00036 * POSSIBILITY OF SUCH DAMAGE. 00037 * 00038 * 00039 00040 00044 00045 #ifndef COMSTL_INCL_H_COMSTL_MEMORY_FUNCTIONS 00046 #define COMSTL_INCL_H_COMSTL_MEMORY_FUNCTIONS 00047 00048 #ifndef __STLSOFT_DOCUMENTATION_SKIP_SECTION 00049 # define COMSTL_VER_H_COMSTL_MEMORY_FUNCTIONS_MAJOR 2 00050 # define COMSTL_VER_H_COMSTL_MEMORY_FUNCTIONS_MINOR 0 00051 # define COMSTL_VER_H_COMSTL_MEMORY_FUNCTIONS_REVISION 1 00052 # define COMSTL_VER_H_COMSTL_MEMORY_FUNCTIONS_EDIT 24 00053 #endif /* !__STLSOFT_DOCUMENTATION_SKIP_SECTION */ 00054 00055 /* 00056 * Includes 00057 */ 00058 00059 #ifndef COMSTL_INCL_H_COMSTL 00060 # include "comstl.h" // Include the COMSTL root header 00061 #endif /* !COMSTL_INCL_H_COMSTL */ 00062 00063 /* 00064 * Namespace 00065 * 00066 * The COMSTL components are contained within the comstl namespace. This is 00067 * actually an alias for stlsoft::comstl_project, 00068 * 00069 * The definition matrix is as follows: 00070 * 00071 * _STLSOFT_NO_NAMESPACE _COMSTL_NO_NAMESPACE comstl definition 00072 * --------------------- -------------------- ----------------- 00073 * not defined not defined = stlsoft::comstl_project 00074 * not defined defined not defined 00075 * defined not defined comstl 00076 * defined defined not defined 00077 * 00078 */ 00079 00080 #ifndef _COMSTL_NO_NAMESPACE 00081 # if defined(_STLSOFT_NO_NAMESPACE) || \ 00082 defined(__STLSOFT_DOCUMENTATION_SKIP_SECTION) 00083 /* There is no stlsoft namespace, so must define ::comstl */ 00084 namespace comstl 00085 { 00086 # else 00087 /* Define stlsoft::comstl_project */ 00088 00089 namespace stlsoft 00090 { 00091 00092 namespace comstl_project 00093 { 00094 00095 # endif /* _STLSOFT_NO_NAMESPACE */ 00096 #endif /* !_COMSTL_NO_NAMESPACE */ 00097 00098 /* 00099 00104 00105 /* 00106 * Functions 00107 */ 00108 00109 /* CoTaskMemGetSize, CoTaskMemDidAlloc & CoTaskMemHeapMinimise 00110 */ 00111 00119 inline ULONG CoTaskMemGetSize(void *pv) 00120 { 00121 LPMALLOC lpmalloc; 00122 ULONG ulRet; 00123 HRESULT hr = ::CoGetMalloc(MEMCTX_TASK, &lpmalloc); 00124 00125 if(SUCCEEDED(hr)) 00126 { 00127 ulRet = lpmalloc->GetSize(pv); 00128 lpmalloc->Release(); 00129 } 00130 else 00131 { 00132 ulRet = 0; 00133 } 00134 00135 return ulRet; 00136 } 00137 00148 inline cs_sint_t CoTaskMemDidAlloc(void *pv) 00149 { 00150 LPMALLOC lpmalloc; 00151 cs_sint_t iRet; 00152 HRESULT hr = ::CoGetMalloc(MEMCTX_TASK, &lpmalloc); 00153 00154 if(SUCCEEDED(hr)) 00155 { 00156 iRet = lpmalloc->DidAlloc(pv); 00157 lpmalloc->Release(); 00158 } 00159 else 00160 { 00161 iRet = -1; 00162 } 00163 00164 return iRet; 00165 } 00166 00172 inline void CoTaskMemHeapMinimise() 00173 { 00174 LPMALLOC lpmalloc; 00175 00176 if(SUCCEEDED(::CoGetMalloc(MEMCTX_TASK, &lpmalloc))) 00177 { 00178 lpmalloc->HeapMinimize(); 00179 lpmalloc->Release(); 00180 } 00181 } 00182 00188 inline void CoTaskMemHeapMinimize() 00189 { 00190 CoTaskMemHeapMinimise(); 00191 } 00192 00194 // Unit-testing 00195 00196 #ifdef STLSOFT_UNITTEST 00197 00198 namespace unittest 00199 { 00200 ss_bool_t test_comstl_memory_functions(unittest_reporter *r) 00201 { 00202 using stlsoft::unittest::unittest_initialiser; 00203 00204 ss_bool_t bSuccess = true; 00205 00206 unittest_initialiser init(r, "COMSTL", "memory_functions", __FILE__); 00207 00208 void *pv = ::CoTaskMemAlloc(100); 00209 00210 if(CoTaskMemGetSize(pv) < 100) 00211 { 00212 r->report("Memory block has invalid size ", __LINE__); 00213 bSuccess = false; 00214 } 00215 00216 if(0 == CoTaskMemDidAlloc(pv)) 00217 { 00218 r->report("Memory block was not recognised by task allocator ", __LINE__); 00219 bSuccess = false; 00220 } 00221 00222 return bSuccess; 00223 } 00224 00225 unittest_registrar unittest_comstl_memory_functions(test_comstl_memory_functions); 00226 00227 } // namespace unittest 00228 00229 #endif /* STLSOFT_UNITTEST */ 00230 00231 /* 00232 00234 00235 /* 00236 00237 #ifndef _COMSTL_NO_NAMESPACE 00238 # if defined(_STLSOFT_NO_NAMESPACE) || \ 00239 defined(__STLSOFT_DOCUMENTATION_SKIP_SECTION) 00240 } // namespace comstl 00241 # else 00242 } // namespace stlsoft::comstl_project 00243 } // namespace stlsoft 00244 # endif /* _STLSOFT_NO_NAMESPACE */ 00245 #endif /* !_COMSTL_NO_NAMESPACE */ 00246 00247 /* 00248 00249 #endif /* !COMSTL_INCL_H_COMSTL_MEMORY_FUNCTIONS */ 00250 00251 /*
|
|
| STLSoft Libraries documentation © Synesis Software Pty Ltd, 2001-2004 |