@@ -30,15 +30,19 @@ class GCHandleUtilities
30
30
GCHandleUtilities () = delete ;
31
31
};
32
32
33
- void ValidateHandleAndAppDomain (OBJECTHANDLE handle);
33
+ void ValidateObjectAndAppDomain (OBJECTREF objRef, ADIndex appDomainIndex);
34
+ void ValidateHandleAssignment (OBJECTHANDLE handle, OBJECTREF objRef);
34
35
35
36
// Given a handle, returns an OBJECTREF for the object it refers to.
36
37
inline OBJECTREF ObjectFromHandle (OBJECTHANDLE handle)
37
38
{
38
39
_ASSERTE (handle);
39
40
40
41
#ifdef _DEBUG_IMPL
41
- ValidateHandleAndAppDomain (handle);
42
+ DWORD context = (DWORD)GCHandleUtilities::GetGCHandleManager ()->GetHandleContext (handle);
43
+ OBJECTREF objRef = ObjectToOBJECTREF (*(Object**)handle);
44
+
45
+ ValidateObjectAndAppDomain (objRef, ADIndex (context));
42
46
#endif // _DEBUG_IMPL
43
47
44
48
// Wrap the raw OBJECTREF and return it
@@ -169,6 +173,34 @@ inline OBJECTHANDLE CreateVariableHandle(IGCHandleStore* store, OBJECTREF object
169
173
return store->CreateHandleWithExtraInfo (OBJECTREFToObject (object), HNDTYPE_VARIABLE, (void *)((uintptr_t )type));
170
174
}
171
175
176
+ // Handle object manipulation convenience functions
177
+
178
+ inline void StoreObjectInHandle (OBJECTHANDLE handle, OBJECTREF object)
179
+ {
180
+ ValidateHandleAssignment (handle, object);
181
+
182
+ GCHandleUtilities::GetGCHandleManager ()->StoreObjectInHandle (handle, OBJECTREFToObject (object));
183
+ }
184
+
185
+ inline bool StoreFirstObjectInHandle (OBJECTHANDLE handle, OBJECTREF object)
186
+ {
187
+ ValidateHandleAssignment (handle, object);
188
+
189
+ return GCHandleUtilities::GetGCHandleManager ()->StoreObjectInHandleIfNull (handle, OBJECTREFToObject (object));
190
+ }
191
+
192
+ inline void * InterlockedCompareExchangeObjectInHandle (OBJECTHANDLE handle, OBJECTREF object, OBJECTREF comparandObject)
193
+ {
194
+ ValidateHandleAssignment (handle, object);
195
+
196
+ return GCHandleUtilities::GetGCHandleManager ()->InterlockedCompareExchangeObjectInHandle (handle, OBJECTREFToObject (object), OBJECTREFToObject (comparandObject));
197
+ }
198
+
199
+ inline void ResetOBJECTHANDLE (OBJECTHANDLE handle)
200
+ {
201
+ GCHandleUtilities::GetGCHandleManager ()->StoreObjectInHandle (handle, NULL );
202
+ }
203
+
172
204
// Handle destruction convenience functions
173
205
174
206
inline void DestroyHandle (OBJECTHANDLE handle)
@@ -309,6 +341,7 @@ typedef Wrapper<OBJECTHANDLE, DoNothing<OBJECTHANDLE>, DestroyRefcountedHandle>
309
341
typedef Holder<OBJECTHANDLE, DoNothing<OBJECTHANDLE>, DestroyLongWeakHandle> LongWeakHandleHolder;
310
342
typedef Holder<OBJECTHANDLE, DoNothing<OBJECTHANDLE>, DestroyGlobalStrongHandle> GlobalStrongHandleHolder;
311
343
typedef Holder<OBJECTHANDLE, DoNothing<OBJECTHANDLE>, DestroyGlobalShortWeakHandle> GlobalShortWeakHandleHolder;
344
+ typedef Holder<OBJECTHANDLE, DoNothing<OBJECTHANDLE>, ResetOBJECTHANDLE> ObjectInHandleHolder;
312
345
313
346
class RCOBJECTHANDLEHolder : public RefCountedOHWrapper
314
347
{
0 commit comments