RavEngine
Loading...
Searching...
No Matches
PxcThreadCoherentCache.h
1// Redistribution and use in source and binary forms, with or without
2// modification, are permitted provided that the following conditions
3// are met:
4// * Redistributions of source code must retain the above copyright
5// notice, this list of conditions and the following disclaimer.
6// * Redistributions in binary form must reproduce the above copyright
7// notice, this list of conditions and the following disclaimer in the
8// documentation and/or other materials provided with the distribution.
9// * Neither the name of NVIDIA CORPORATION nor the names of its
10// contributors may be used to endorse or promote products derived
11// from this software without specific prior written permission.
12//
13// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY
14// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
17// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24//
25// Copyright (c) 2008-2022 NVIDIA Corporation. All rights reserved.
26// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved.
27// Copyright (c) 2001-2004 NovodeX AG. All rights reserved.
28
29#ifndef PXC_THREAD_COHERENT_CACHE_H
30#define PXC_THREAD_COHERENT_CACHE_H
31
32#include "foundation/PxMutex.h"
33#include "foundation/PxAllocator.h"
34#include "foundation/PxSList.h"
35
36namespace physx
37{
38
39class PxsContext;
50template<class T, class Params>
51class PxcThreadCoherentCache : public PxAlignedAllocator<16, PxReflectionAllocator<T> >
52{
54 PX_NOCOPY(PxcThreadCoherentCache)
55public:
56
57 typedef PxSListEntry EntryBase;
58
59 PX_INLINE PxcThreadCoherentCache(Params* params, const Allocator& alloc = Allocator()) : Allocator(alloc), mParams(params)
60 {
61 }
62
64 {
65 T* np = static_cast<T*>(root.pop());
66
67 while(np!=NULL)
68 {
69 np->~T();
70 Allocator::deallocate(np);
71 np = static_cast<T*>(root.pop());
72 }
73 }
74
75 PX_INLINE T* get()
76 {
77 T* rv = static_cast<T*>(root.pop());
78 if(rv==NULL)
79 {
80 rv = reinterpret_cast<T*>(Allocator::allocate(sizeof(T), __FILE__, __LINE__));
81 PX_PLACEMENT_NEW(rv, T(mParams));
82 }
83
84 return rv;
85 }
86
87 PX_INLINE void put(T* item)
88 {
89 root.push(*item);
90 }
91
92
93private:
94 PxSList root;
95 Params* mParams;
96
97 template<class T2, class P2>
99};
100
107template<class T, class Params>
109{
110public:
112 {
113 mNext = cache.root.flush();
114 mFirst = mNext;
115 }
117 {
118 PxSListEntry* np = mFirst;
119 while(np != NULL)
120 {
121 PxSListEntry* npNext = np->next();
122 mCache.root.push(*np);
123 np = npNext;
124 }
125 }
126
127 PX_INLINE T* getNext()
128 {
129 if(mNext == NULL)
130 return NULL;
131
132 T* rv = static_cast<T*>(mNext);
133 mNext = mNext->next();
134
135 return rv;
136 }
137private:
138
141 PxSListEntry* mNext;
142 PxSListEntry* mFirst;
143
144};
145
146}
147
148#endif
Definition PxAlignedMalloc.h:54
Definition PxSList.h:53
Definition PxSList.h:90
Definition PxcThreadCoherentCache.h:109
Definition PxcThreadCoherentCache.h:52
#define PX_INLINE
Definition PxPreprocessor.h:320
Sorts an array of objects in ascending order, assuming that the predicate implements the < operator:
Definition PxBoxController.h:39