|
|
|
@ -121,6 +121,18 @@ inline void intrusive_ptr_release(Object* object) { |
|
|
|
template <typename T> |
|
|
|
using SharedPtr = boost::intrusive_ptr<T>; |
|
|
|
|
|
|
|
/** |
|
|
|
* Attempts to downcast the given Object pointer to a pointer to T. |
|
|
|
* @return Derived pointer to the object, or `nullptr` if `object` isn't of type T. |
|
|
|
*/ |
|
|
|
template <typename T> |
|
|
|
inline SharedPtr<T> DynamicObjectCast(SharedPtr<Object> object) { |
|
|
|
if (object != nullptr && object->GetHandleType() == T::HANDLE_TYPE) { |
|
|
|
return boost::static_pointer_cast<T>(std::move(object)); |
|
|
|
} |
|
|
|
return nullptr; |
|
|
|
} |
|
|
|
|
|
|
|
/// Class that represents a Kernel object that a thread can be waiting on |
|
|
|
class WaitObject : public Object { |
|
|
|
public: |
|
|
|
@ -163,6 +175,15 @@ private: |
|
|
|
std::vector<SharedPtr<Thread>> waiting_threads; |
|
|
|
}; |
|
|
|
|
|
|
|
// Specialization of DynamicObjectCast for WaitObjects |
|
|
|
template <> |
|
|
|
inline SharedPtr<WaitObject> DynamicObjectCast<WaitObject>(SharedPtr<Object> object) { |
|
|
|
if (object != nullptr && object->IsWaitable()) { |
|
|
|
return boost::static_pointer_cast<WaitObject>(std::move(object)); |
|
|
|
} |
|
|
|
return nullptr; |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* This class allows the creation of Handles, which are references to objects that can be tested |
|
|
|
* for validity and looked up. Here they are used to pass references to kernel objects to/from the |
|
|
|
@ -224,15 +245,11 @@ public: |
|
|
|
/** |
|
|
|
* Looks up a handle while verifying its type. |
|
|
|
* @return Pointer to the looked-up object, or `nullptr` if the handle is not valid or its |
|
|
|
* type differs from the handle type `T::HANDLE_TYPE`. |
|
|
|
* type differs from the requested one. |
|
|
|
*/ |
|
|
|
template <class T> |
|
|
|
SharedPtr<T> Get(Handle handle) const { |
|
|
|
SharedPtr<Object> object = GetGeneric(handle); |
|
|
|
if (object != nullptr && object->GetHandleType() == T::HANDLE_TYPE) { |
|
|
|
return boost::static_pointer_cast<T>(std::move(object)); |
|
|
|
} |
|
|
|
return nullptr; |
|
|
|
return DynamicObjectCast<T>(GetGeneric(handle)); |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
@ -241,11 +258,7 @@ public: |
|
|
|
* not a waitable object. |
|
|
|
*/ |
|
|
|
SharedPtr<WaitObject> GetWaitObject(Handle handle) const { |
|
|
|
SharedPtr<Object> object = GetGeneric(handle); |
|
|
|
if (object != nullptr && object->IsWaitable()) { |
|
|
|
return boost::static_pointer_cast<WaitObject>(std::move(object)); |
|
|
|
} |
|
|
|
return nullptr; |
|
|
|
return DynamicObjectCast<WaitObject>(GetGeneric(handle)); |
|
|
|
} |
|
|
|
|
|
|
|
/// Closes all handles held in this table. |
|
|
|
|