mirror of
https://github.com/wichtounet/thor-os.git
synced 2025-09-09 20:43:34 -04:00
Use RAII for packet memory
This commit is contained in:
parent
08f846dcb4
commit
c01d9b799a
@ -108,10 +108,6 @@ int main(int argc, char* argv[]) {
|
|||||||
tlib::printf("Reply received from %s\n", ip.c_str());
|
tlib::printf("Reply received from %s\n", ip.c_str());
|
||||||
handled = true;
|
handled = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// The rest of the packets are simply ignored
|
|
||||||
|
|
||||||
tlib::release_packet(p);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (handled) {
|
if (handled) {
|
||||||
|
@ -12,26 +12,37 @@
|
|||||||
|
|
||||||
#include "tlib/net_constants.hpp"
|
#include "tlib/net_constants.hpp"
|
||||||
#include "tlib/config.hpp"
|
#include "tlib/config.hpp"
|
||||||
|
#include "tlib/malloc.hpp"
|
||||||
|
|
||||||
ASSERT_ONLY_THOR_PROGRAM
|
ASSERT_ONLY_THOR_PROGRAM
|
||||||
|
|
||||||
namespace tlib {
|
namespace tlib {
|
||||||
|
|
||||||
struct packet {
|
struct packet {
|
||||||
size_t fd;
|
size_t fd; ///< The packet file descriptor
|
||||||
char* payload;
|
char* payload; ///< The payload pointer
|
||||||
size_t index;
|
size_t index; ///< The index at which to read or write
|
||||||
|
|
||||||
|
packet();
|
||||||
|
|
||||||
|
packet(const packet& p) = delete;
|
||||||
|
packet& operator=(const packet& p) = delete;
|
||||||
|
|
||||||
|
packet(packet&& rhs);
|
||||||
|
|
||||||
|
packet& operator=(packet&& rhs);
|
||||||
|
|
||||||
|
~packet();
|
||||||
};
|
};
|
||||||
|
|
||||||
std::expected<size_t> socket_open(socket_domain domain, socket_type type, socket_protocol protocol);
|
std::expected<size_t> socket_open(socket_domain domain, socket_type type, socket_protocol protocol);
|
||||||
void socket_close(size_t socket_fd);
|
void socket_close(size_t socket_fd);
|
||||||
|
|
||||||
std::expected<packet> prepare_packet(size_t socket_fd, void* desc);
|
std::expected<packet> prepare_packet(size_t socket_fd, void* desc);
|
||||||
std::expected<void> finalize_packet(size_t socket_fd, packet p);
|
std::expected<void> finalize_packet(size_t socket_fd, const packet& p);
|
||||||
std::expected<void> listen(size_t socket_fd, bool l);
|
std::expected<void> listen(size_t socket_fd, bool l);
|
||||||
std::expected<packet> wait_for_packet(size_t socket_fd);
|
std::expected<packet> wait_for_packet(size_t socket_fd);
|
||||||
std::expected<packet> wait_for_packet(size_t socket_fd, size_t ms);
|
std::expected<packet> wait_for_packet(size_t socket_fd, size_t ms);
|
||||||
void release_packet(packet& packet);
|
|
||||||
|
|
||||||
struct socket {
|
struct socket {
|
||||||
socket(socket_domain domain, socket_type type, socket_protocol protocol);
|
socket(socket_domain domain, socket_type type, socket_protocol protocol);
|
||||||
@ -69,7 +80,7 @@ struct socket {
|
|||||||
void listen(bool l);
|
void listen(bool l);
|
||||||
|
|
||||||
packet prepare_packet(void* desc);
|
packet prepare_packet(void* desc);
|
||||||
void finalize_packet(packet p);
|
void finalize_packet(const packet& p);
|
||||||
packet wait_for_packet();
|
packet wait_for_packet();
|
||||||
packet wait_for_packet(size_t ms);
|
packet wait_for_packet(size_t ms);
|
||||||
|
|
||||||
|
@ -8,6 +8,32 @@
|
|||||||
#include "tlib/net.hpp"
|
#include "tlib/net.hpp"
|
||||||
#include "tlib/malloc.hpp"
|
#include "tlib/malloc.hpp"
|
||||||
|
|
||||||
|
tlib::packet::packet() : fd(0), payload(nullptr), index(0) {
|
||||||
|
//Nothing else to init
|
||||||
|
}
|
||||||
|
|
||||||
|
tlib::packet::packet(packet&& rhs) : fd(rhs.fd), payload(rhs.payload), index(rhs.index) {
|
||||||
|
rhs.payload = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
tlib::packet& tlib::packet::operator=(packet&& rhs) {
|
||||||
|
if (this != &rhs) {
|
||||||
|
this->fd = rhs.fd;
|
||||||
|
this->payload = rhs.payload;
|
||||||
|
this->index = rhs.index;
|
||||||
|
|
||||||
|
rhs.payload = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
tlib::packet::~packet() {
|
||||||
|
if (payload) {
|
||||||
|
tlib::free(payload);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
std::expected<size_t> tlib::socket_open(socket_domain domain, socket_type type, socket_protocol protocol) {
|
std::expected<size_t> tlib::socket_open(socket_domain domain, socket_type type, socket_protocol protocol) {
|
||||||
int64_t fd;
|
int64_t fd;
|
||||||
asm volatile("mov rax, 0x3000; mov rbx, %[type]; mov rcx, %[type]; mov rdx, %[protocol]; int 50; mov %[fd], rax"
|
asm volatile("mov rax, 0x3000; mov rbx, %[type]; mov rcx, %[type]; mov rdx, %[protocol]; int 50; mov %[fd], rax"
|
||||||
@ -46,11 +72,11 @@ std::expected<tlib::packet> tlib::prepare_packet(size_t socket_fd, void* desc) {
|
|||||||
p.fd = fd;
|
p.fd = fd;
|
||||||
p.index = index;
|
p.index = index;
|
||||||
p.payload = static_cast<char*>(buffer);
|
p.payload = static_cast<char*>(buffer);
|
||||||
return std::make_expected<packet>(p);
|
return std::make_expected<packet>(std::move(p));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
std::expected<void> tlib::finalize_packet(size_t socket_fd, tlib::packet p) {
|
std::expected<void> tlib::finalize_packet(size_t socket_fd, const tlib::packet& p) {
|
||||||
auto packet_fd = p.fd;
|
auto packet_fd = p.fd;
|
||||||
|
|
||||||
int64_t code;
|
int64_t code;
|
||||||
@ -64,8 +90,6 @@ std::expected<void> tlib::finalize_packet(size_t socket_fd, tlib::packet p) {
|
|||||||
} else {
|
} else {
|
||||||
return std::make_expected();
|
return std::make_expected();
|
||||||
}
|
}
|
||||||
|
|
||||||
free(p.payload);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
std::expected<void> tlib::listen(size_t socket_fd, bool l) {
|
std::expected<void> tlib::listen(size_t socket_fd, bool l) {
|
||||||
@ -99,7 +123,7 @@ std::expected<tlib::packet> tlib::wait_for_packet(size_t socket_fd) {
|
|||||||
tlib::packet p;
|
tlib::packet p;
|
||||||
p.index = code;
|
p.index = code;
|
||||||
p.payload = reinterpret_cast<char*>(payload);
|
p.payload = reinterpret_cast<char*>(payload);
|
||||||
return std::make_expected<packet>(p);
|
return std::make_expected<packet>(std::move(p));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -120,13 +144,7 @@ std::expected<tlib::packet> tlib::wait_for_packet(size_t socket_fd, size_t ms) {
|
|||||||
tlib::packet p;
|
tlib::packet p;
|
||||||
p.index = code;
|
p.index = code;
|
||||||
p.payload = reinterpret_cast<char*>(payload);
|
p.payload = reinterpret_cast<char*>(payload);
|
||||||
return std::make_expected<packet>(p);
|
return std::make_expected<packet>(std::move(p));
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void tlib::release_packet(packet& packet) {
|
|
||||||
if (packet.payload) {
|
|
||||||
free(packet.payload);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -189,11 +207,11 @@ tlib::packet tlib::socket::prepare_packet(void* desc) {
|
|||||||
error_code = packet.error();
|
error_code = packet.error();
|
||||||
return tlib::packet();
|
return tlib::packet();
|
||||||
} else {
|
} else {
|
||||||
return *packet;
|
return std::move(*packet);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void tlib::socket::finalize_packet(tlib::packet p) {
|
void tlib::socket::finalize_packet(const tlib::packet& p) {
|
||||||
if (!good() || !open()) {
|
if (!good() || !open()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -215,7 +233,7 @@ tlib::packet tlib::socket::wait_for_packet() {
|
|||||||
error_code = p.error();
|
error_code = p.error();
|
||||||
return tlib::packet();
|
return tlib::packet();
|
||||||
} else {
|
} else {
|
||||||
return *p;
|
return std::move(*p);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -230,6 +248,6 @@ tlib::packet tlib::socket::wait_for_packet(size_t ms) {
|
|||||||
error_code = p.error();
|
error_code = p.error();
|
||||||
return tlib::packet();
|
return tlib::packet();
|
||||||
} else {
|
} else {
|
||||||
return *p;
|
return std::move(*p);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user