1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-27 03:57:44 +00:00

LibCore: Convert CTCPSocket to ObjectPtr, add construct() helper

The C_OBJECT macro now also inserts a static construct(...) helper into
the class. Now we can make the constructor(s) private and instead call:

    auto socket = CTCPSocket::construct(arguments);

construct() returns an ObjectPtr<T>, which we'll later switch to being
a NonnullRefPtr<T>, once everything else in in place for ref-counting.
This commit is contained in:
Andreas Kling 2019-09-21 10:13:34 +02:00
parent 1f5a9762a2
commit 4298ba25c3
15 changed files with 30 additions and 25 deletions

View file

@ -116,7 +116,7 @@ void CHttpJob::finish_up()
void CHttpJob::start()
{
ASSERT(!m_socket);
m_socket = new CTCPSocket(this);
m_socket = CTCPSocket::construct(this);
m_socket->on_connected = [this] {
dbg() << "CHttpJob: on_connected callback";
on_socket_connected();

View file

@ -26,7 +26,7 @@ private:
};
CHttpRequest m_request;
CTCPSocket* m_socket { nullptr };
ObjectPtr<CTCPSocket> m_socket;
State m_state { State::InStatus };
int m_code { -1 };
HashMap<String, String> m_headers;

View file

@ -1,11 +1,12 @@
#pragma once
#include <AK/String.h>
#include <AK/Function.h>
#include <AK/IntrusiveList.h>
#include <AK/StdLibExtras.h>
#include <AK/String.h>
#include <AK/Vector.h>
#include <AK/Weakable.h>
#include <LibCore/ObjectPtr.h>
namespace AK {
class JsonObject;
@ -16,9 +17,14 @@ class CChildEvent;
class CCustomEvent;
class CTimerEvent;
#define C_OBJECT(klass) \
public: \
virtual const char* class_name() const override { return #klass; }
#define C_OBJECT(klass) \
public: \
virtual const char* class_name() const override { return #klass; } \
template<class... Args> \
static inline ObjectPtr<klass> construct(Args&&... args) \
{ \
return ObjectPtr<klass>(new klass(forward<Args>(args)...)); \
}
class CObject : public Weakable<CObject> {
// NOTE: No C_OBJECT macro for CObject itself.

View file

@ -40,7 +40,7 @@ bool CTCPServer::listen(const IPv4Address& address, u16 port)
return true;
}
CTCPSocket* CTCPServer::accept()
ObjectPtr<CTCPSocket> CTCPServer::accept()
{
ASSERT(m_listening);
sockaddr_in in;
@ -51,5 +51,5 @@ CTCPSocket* CTCPServer::accept()
return nullptr;
}
return new CTCPSocket({}, accepted_fd);
return CTCPSocket::construct(accepted_fd);
}

View file

@ -15,7 +15,7 @@ public:
bool is_listening() const { return m_listening; }
bool listen(const IPv4Address& address, u16 port);
CTCPSocket* accept();
ObjectPtr<CTCPSocket> accept();
Function<void()> on_ready_to_accept;

View file

@ -2,7 +2,7 @@
#include <sys/socket.h>
#include <errno.h>
CTCPSocket::CTCPSocket(Badge<CTCPServer>, int fd, CObject* parent)
CTCPSocket::CTCPSocket(int fd, CObject* parent)
: CSocket(CSocket::Type::TCP, parent)
{
set_fd(fd);

View file

@ -8,7 +8,9 @@ class CTCPServer;
class CTCPSocket final : public CSocket {
C_OBJECT(CTCPSocket)
public:
explicit CTCPSocket(CObject* parent = nullptr);
CTCPSocket(Badge<CTCPServer>, int fd, CObject* parent = nullptr);
virtual ~CTCPSocket() override;
private:
CTCPSocket(int fd, CObject* parent = nullptr);
explicit CTCPSocket(CObject* parent = nullptr);
};

View file

@ -47,7 +47,6 @@ namespace Client {
template<typename ServerMessage, typename ClientMessage>
class Connection : public CObject {
C_OBJECT(Connection)
public:
Connection(const StringView& address)
: m_connection(this)
@ -238,7 +237,6 @@ namespace Client {
template<typename Endpoint>
class ConnectionNG : public CObject {
C_OBJECT(Connection)
public:
ConnectionNG(const StringView& address)
: m_connection(this)

View file

@ -64,7 +64,6 @@ namespace Server {
template<typename ServerMessage, typename ClientMessage>
class Connection : public CObject {
C_OBJECT(Connection)
public:
Connection(CLocalSocket& socket, int client_id)
: m_socket(socket)
@ -206,7 +205,6 @@ namespace Server {
template<typename Endpoint>
class ConnectionNG : public CObject {
C_OBJECT(Connection)
public:
ConnectionNG(Endpoint& endpoint, CLocalSocket& socket, int client_id)
: m_endpoint(endpoint)

View file

@ -11,6 +11,7 @@ class CNotifier;
class GWindow;
class GWindowServerConnection : public IPC::Client::Connection<WSAPI_ServerMessage, WSAPI_ClientMessage> {
C_OBJECT(GWindowServerConnection)
public:
GWindowServerConnection()
: Connection("/tmp/wsportal")