77
88namespace jsb
99{
10+ class ObjectDB ;
11+
1012#if JSB_THREADING
1113# define JSB_OBJECT_DB_HANDLE (Type, Ptr ) Type(&lock_, Ptr)
1214# define JSB_OBJECT_DB_STATEMENT (Statement ) Statement
15+ # define JSB_OBJECT_DB_PREPARE_FOR_REMOVAL (Handle ) Handle.prepare_for_removal()
16+ #else
17+ # define JSB_OBJECT_DB_HANDLE (Type, Ptr ) (sizeof (Type), Ptr)
18+ # define JSB_OBJECT_DB_STATEMENT (Statement ) (void ) 0
19+ # define JSB_OBJECT_DB_PREPARE_FOR_REMOVAL (Handle ) Handle = nullptr
20+ #endif
1321
22+ #if JSB_THREADING
1423 struct ObjectHandlePtr
1524 {
1625 private:
26+ friend class ObjectDB ;
27+
1728 RWLock* lock_;
1829 internal::SArray<ObjectHandle, NativeObjectID>::Pointer ptr_;
1930
31+ // Release slot address scope while preserving ObjectDB write lock.
32+ jsb_force_inline void prepare_for_removal () { ptr_ = nullptr ; }
33+
2034 public:
21- ObjectHandlePtr (const ObjectHandlePtr& ) = delete ;
35+ ObjectHandlePtr (const ObjectHandlePtr&) = delete ;
2236
23- ObjectHandlePtr (): lock_(nullptr ) {}
37+ ObjectHandlePtr () : lock_(nullptr ) {}
2438 ObjectHandlePtr (RWLock* p_lock, internal::SArray<ObjectHandle, NativeObjectID>::Pointer&& p_ptr)
2539 : lock_(p_lock), ptr_(std::move(p_ptr))
2640 {
@@ -68,9 +82,9 @@ namespace jsb
6882 internal::SArray<ObjectHandle, NativeObjectID>::ConstPointer ptr_;
6983
7084 public:
71- ObjectHandleConstPtr (const ObjectHandleConstPtr& ) = delete ;
85+ ObjectHandleConstPtr (const ObjectHandleConstPtr&) = delete ;
7286
73- ObjectHandleConstPtr (): lock_(nullptr ) {}
87+ ObjectHandleConstPtr () : lock_(nullptr ) {}
7488 ObjectHandleConstPtr (const RWLock* p_lock, internal::SArray<ObjectHandle, NativeObjectID>::ConstPointer&& p_ptr)
7589 : lock_(p_lock), ptr_(std::move(p_ptr))
7690 {
@@ -110,9 +124,6 @@ namespace jsb
110124 }
111125 };
112126#else
113- # define JSB_OBJECT_DB_HANDLE (Type, Ptr ) (sizeof (Type), Ptr)
114- # define JSB_OBJECT_DB_STATEMENT (Statement ) (void ) 0
115-
116127 typedef internal::SArray<ObjectHandle, NativeObjectID>::Pointer ObjectHandlePtr;
117128 typedef internal::SArray<ObjectHandle, NativeObjectID>::ConstPointer ObjectHandleConstPtr;
118129#endif
@@ -131,6 +142,15 @@ namespace jsb
131142 RWLock lock_;
132143#endif
133144
145+ // Remove object entry while caller already holds ObjectDB write lock.
146+ jsb_force_inline void remove_object_internal (void * p_pointer)
147+ {
148+ const NativeObjectID* entry = objects_index_.getptr (p_pointer);
149+ jsb_check (entry);
150+ objects_.remove_at_checked (*entry);
151+ objects_index_.erase (p_pointer);
152+ }
153+
134154 public:
135155 ObjectDB (int p_capacity)
136156 {
@@ -222,17 +242,16 @@ namespace jsb
222242 }
223243
224244 // [MUTABLE]
225- void remove_object (void * p_pointer)
245+ jsb_force_inline void remove_object (ObjectHandlePtr& p_handle, void * p_pointer)
226246 {
227- JSB_OBJECT_DB_STATEMENT (lock_. write_lock ());
228- const NativeObjectID* entry = objects_index_. getptr ( p_pointer);
229- jsb_check (entry);
230- objects_. remove_at_checked (*entry );
231- objects_index_. erase (p_pointer);
232- JSB_OBJECT_DB_STATEMENT (lock_. write_unlock ()) ;
247+ # if JSB_DEBUG
248+ jsb_check (p_handle-> pointer == p_pointer);
249+ # endif
250+ JSB_OBJECT_DB_PREPARE_FOR_REMOVAL (p_handle );
251+ remove_object_internal (p_pointer);
252+ p_handle = nullptr ;
233253 }
234254 };
235255}
236256
237257#endif
238-
0 commit comments