1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-26 05:07:35 +00:00

LibCore: Make CObject reference-counted

Okay, I've spent a whole day on this now, and it finally kinda works!
With this patch, CObject and all of its derived classes are reference
counted instead of tree-owned.

The previous, Qt-like model was nice and familiar, but ultimately also
outdated and difficult to reason about.

CObject-derived types should now be stored in RefPtr/NonnullRefPtr and
each class can be constructed using the forwarding construct() helper:

    auto widget = GWidget::construct(parent_widget);

Note that construct() simply forwards all arguments to an existing
constructor. It is inserted into each class by the C_OBJECT macro,
see CObject.h to understand how that works.

CObject::delete_later() disappears in this patch, as there is no longer
a single logical owner of a CObject.
This commit is contained in:
Andreas Kling 2019-09-22 00:17:53 +02:00
parent 0c72e0c09f
commit bc319d9e88
45 changed files with 174 additions and 233 deletions

View file

@ -17,9 +17,9 @@ class WSMenuBar;
class WSClientConnection final : public IPC::Server::Connection<WSAPI_ServerMessage, WSAPI_ClientMessage> {
C_OBJECT(WSClientConnection)
public:
explicit WSClientConnection(CLocalSocket&, int client_id);
~WSClientConnection() override;
void send_greeting() override;
virtual void send_greeting() override;
virtual void die() override;
bool handle_message(const WSAPI_ClientMessage&, const ByteBuffer&& = {}) override;
static WSClientConnection* from_client_id(int client_id);
@ -40,11 +40,14 @@ public:
WSMenu* find_menu_by_id(int menu_id)
{
// FIXME: Remove this const_cast when Optional knows how to vend a non-const fallback value somehow.
return const_cast<WSMenu*>(m_menus.get(menu_id).value_or(nullptr));
auto menu = m_menus.get(menu_id);
if (!menu.has_value())
return nullptr;
return const_cast<WSMenu*>(menu.value().ptr());
}
private:
explicit WSClientConnection(CLocalSocket&, int client_id);
virtual void event(CEvent&) override;
void on_request(const WSAPIClientRequest&);
@ -88,9 +91,9 @@ private:
void post_error(const String&);
HashMap<int, NonnullOwnPtr<WSWindow>> m_windows;
HashMap<int, NonnullRefPtr<WSWindow>> m_windows;
HashMap<int, NonnullOwnPtr<WSMenuBar>> m_menubars;
HashMap<int, NonnullOwnPtr<WSMenu>> m_menus;
HashMap<int, NonnullRefPtr<WSMenu>> m_menus;
WeakPtr<WSMenuBar> m_app_menubar;
int m_next_menubar_id { 10000 };