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
Notes: sideshowbarker 2024-07-19 12:02:41 +09:00
15 changed files with 30 additions and 25 deletions

View file

@ -35,7 +35,7 @@ IRCClient::IRCClient()
, m_log(IRCLogBuffer::create())
, m_config(CConfigFile::get_for_app("IRCClient"))
{
m_socket = new CTCPSocket(this);
m_socket = CTCPSocket::construct(this);
m_nickname = m_config->read_entry("User", "Nickname", "seren1ty");
m_hostname = m_config->read_entry("Connection", "Server", "");
m_port = m_config->read_num_entry("Connection", "Port", 6667);

View file

@ -137,7 +137,7 @@ private:
String m_hostname;
int m_port { 6667 };
CTCPSocket* m_socket { nullptr };
ObjectPtr<CTCPSocket> m_socket;
String m_nickname;
ObjectPtr<CNotifier> m_notifier;

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")

View file

@ -10,9 +10,9 @@
#include "Client.h"
Client::Client(int id, CTCPSocket* socket, int ptm_fd)
Client::Client(int id, ObjectPtr<CTCPSocket> socket, int ptm_fd)
: m_id(id)
, m_socket(socket)
, m_socket(move(socket))
, m_ptm_fd(ptm_fd)
, m_ptm_notifier(CNotifier::create(ptm_fd, CNotifier::Read))
{

View file

@ -11,15 +11,15 @@
class Client : public RefCounted<Client> {
public:
static NonnullRefPtr<Client> create(int id, CTCPSocket* socket, int ptm_fd)
static NonnullRefPtr<Client> create(int id, ObjectPtr<CTCPSocket> socket, int ptm_fd)
{
return adopt(*new Client(id, socket, ptm_fd));
return adopt(*new Client(id, move(socket), ptm_fd));
}
Function<void()> on_exit;
protected:
Client(int id, CTCPSocket* socket, int ptm_fd);
Client(int id, ObjectPtr<CTCPSocket> socket, int ptm_fd);
void drain_socket();
void drain_pty();
@ -35,7 +35,7 @@ private:
// client id
int m_id { 0 };
// client resources
CTCPSocket* m_socket { nullptr };
ObjectPtr<CTCPSocket> m_socket;
Parser m_parser;
// pty resources
int m_ptm_fd { -1 };

View file

@ -107,7 +107,7 @@ int main(int argc, char** argv)
server.on_ready_to_accept = [&next_id, &clients, &server] {
int id = next_id++;
auto* client_socket = server.accept();
auto client_socket = server.accept();
if (!client_socket) {
perror("accept");
return;