root/trunk/include/iprt/cache.h
| Revision 10848, 5.1 kB (checked in by vboxsync, 4 months ago) | |
|---|---|
| |
| Line | |
|---|---|
| 1 | /** @file |
| 2 | * IPRT - Object cache |
| 3 | */ |
| 4 | |
| 5 | /* |
| 6 | * Copyright (C) 2006-2007 Sun Microsystems, Inc. |
| 7 | * |
| 8 | * This file is part of VirtualBox Open Source Edition (OSE), as |
| 9 | * available from http://www.virtualbox.org. This file is free software; |
| 10 | * you can redistribute it and/or modify it under the terms of the GNU |
| 11 | * General Public License (GPL) as published by the Free Software |
| 12 | * Foundation, in version 2 as it comes in the "COPYING" file of the |
| 13 | * VirtualBox OSE distribution. VirtualBox OSE is distributed in the |
| 14 | * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind. |
| 15 | * |
| 16 | * The contents of this file may alternatively be used under the terms |
| 17 | * of the Common Development and Distribution License Version 1.0 |
| 18 | * (CDDL) only, as it comes in the "COPYING.CDDL" file of the |
| 19 | * VirtualBox OSE distribution, in which case the provisions of the |
| 20 | * CDDL are applicable instead of those of the GPL. |
| 21 | * |
| 22 | * You may elect to license modified versions of this file under the |
| 23 | * terms and conditions of either the GPL or the CDDL or both. |
| 24 | * |
| 25 | * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa |
| 26 | * Clara, CA 95054 USA or visit http://www.sun.com if you need |
| 27 | * additional information or have any questions. |
| 28 | */ |
| 29 | |
| 30 | |
| 31 | /******************************************************************************* |
| 32 | * Header Files * |
| 33 | *******************************************************************************/ |
| 34 | |
| 35 | #ifndef ___iprt_cache_h |
| 36 | #define ___iprt_cache_h |
| 37 | |
| 38 | #include <iprt/cdefs.h> |
| 39 | #include <iprt/types.h> |
| 40 | #include <iprt/critsect.h> |
| 41 | |
| 42 | __BEGIN_DECLS |
| 43 | |
| 44 | /** Protect the object requester against concurrent access from different threads. */ |
| 45 | #define RTOBJCACHE_PROTECT_REQUEST RT_BIT(0) |
| 46 | /** Protect the object insert function against concurrent access from different threads. */ |
| 47 | #define RTOBJCACHE_PROTECT_INSERT RT_BIT(1) |
| 48 | /** All valid protection flags. */ |
| 49 | #define RTOBJCACHE_PROTECT_VALID (RTOBJCACHE_PROTECT_REQUEST | RTOBJCACHE_PROTECT_INSERT) |
| 50 | |
| 51 | /** |
| 52 | * Object cache header for unlimited sized caches. |
| 53 | */ |
| 54 | typedef struct RTOBJCACHEHDR |
| 55 | { |
| 56 | /** Magic value for identifying .*/ |
| 57 | uint32_t uMagic; |
| 58 | /** Next element in the list. */ |
| 59 | volatile struct RTOBJCACHEHDR *pNext; |
| 60 | } RTOBJCACHEHDR, *PRTOBJCACHEHDR; |
| 61 | |
| 62 | /** |
| 63 | * Object cache |
| 64 | */ |
| 65 | typedef struct RTOBJCACHE |
| 66 | { |
| 67 | /** Size of the objects to cache. */ |
| 68 | size_t cbObj; |
| 69 | /** Spinlock protecting the object request function if requested. */ |
| 70 | RTSPINLOCK SpinlockRequest; |
| 71 | /** Spinlock protecting the object insert function if requested. */ |
| 72 | RTSPINLOCK SpinlockInsert; |
| 73 | /** Size of the cache - 0 if unlimited size. */ |
| 74 | uint32_t cElements; |
| 75 | /** Cache type dependent data. */ |
| 76 | union |
| 77 | { |
| 78 | /** Structure for unlimited cache. */ |
| 79 | struct |
| 80 | { |
| 81 | /** Pointer to the first element in the list. */ |
| 82 | volatile RTOBJCACHEHDR *pFirst; |
| 83 | /** Pointer to the last element in the list. */ |
| 84 | volatile RTOBJCACHEHDR *pLast; |
| 85 | } unlimited; |
| 86 | /** Structure for cache with defined size. */ |
| 87 | struct |
| 88 | { |
| 89 | /** Current fill rate. */ |
| 90 | volatile uint32_t cElementsInCache; |
| 91 | /** Next free element to get. */ |
| 92 | volatile uint32_t cNextObjRead; |
| 93 | /** Next free slot to write to. */ |
| 94 | volatile uint32_t cNextFreeSlotWrite; |
| 95 | /** Array of cached objects. - real size allocated on cache creation. */ |
| 96 | volatile void *apObjCached[1]; |
| 97 | } defined; |
| 98 | } u; |
| 99 | } RTOBJCACHE, *PRTOBJCACHE; |
| 100 | |
| 101 | |
| 102 | /** |
| 103 | * Create a cache for objects. |
| 104 | * |
| 105 | * @returns iprt status code. |
| 106 | * @param ppObjCache Where to store the pointer to the created cache. |
| 107 | * @param cElements Number of elements the cache can hold. |
| 108 | * 0 if unlimited size. |
| 109 | * @param cbElement Size of one element in bytes |
| 110 | * @param fProt Protection flags for protecting cache against concurrent access |
| 111 | * from different threads. |
| 112 | * RTOBJCACHE_PROTECT_REQUEST to protect the request function. |
| 113 | * RTOBJCACHE_PROTECT_INSERT to protect the insert function. |
| 114 | */ |
| 115 | RTDECL(int) RTCacheCreate(PRTOBJCACHE *ppCache, uint32_t cElements, size_t cbElement, uint32_t fProt); |
| 116 | |
| 117 | /** |
| 118 | * Destroy a cache freeing allocated memory. |
| 119 | * |
| 120 | * @returns iprt status code. |
| 121 | * @param pCache Pointer to the cache. |
| 122 | */ |
| 123 | RTDECL(int) RTCacheDestroy(PRTOBJCACHE pCache); |
| 124 | |
| 125 | /** |
| 126 | * Request an object from the cache. |
| 127 | * |
| 128 | * @returns iprt status |
| 129 | * VERR_CACHE_EMPTY if cache is not unlimited and there is no object left in cache. |
| 130 | * @param pCache Pointer to the cache to get an object from. |
| 131 | * @param ppObj Where to store the pointer to the object. |
| 132 | */ |
| 133 | RTDECL(int) RTCacheRequest(PRTOBJCACHE pCache, void **ppObj); |
| 134 | |
| 135 | /** |
| 136 | * Insert an object into the cache. |
| 137 | * |
| 138 | * @returns iprt status code. |
| 139 | * VERR_CACHE_FULL if cache is not unlimited and there is no free entry left in cache. |
| 140 | * @param pCache Pointer to the cache. |
| 141 | * @param pObj Pointer to the object to insert. |
| 142 | */ |
| 143 | RTDECL(int) RTCacheInsert(PRTOBJCACHE pCache, void *pObj); |
| 144 | |
| 145 | __END_DECLS |
| 146 | |
| 147 | #endif /* __iprt_cache_h */ |
Note: See TracBrowser for help on using the browser.

