Finishing unique_ptr'ing and fixing file memory management (for now).

This commit is contained in:
Ben Vanik
2014-08-21 07:54:19 -07:00
parent c59d053404
commit 08b0226a16
26 changed files with 152 additions and 175 deletions

View File

@@ -9,29 +9,23 @@
#include <xenia/core/run_loop.h>
typedef struct xe_run_loop { xe_ref_t ref; } xe_run_loop_t;
typedef struct xe_run_loop {
xe_ref_t ref;
} xe_run_loop_t;
#define WM_XE_RUN_LOOP_QUIT (WM_APP + 0x100)
#define WM_XE_RUN_LOOP_CALL (WM_APP + 0x101)
#define WM_XE_RUN_LOOP_QUIT (WM_APP + 0x100)
#define WM_XE_RUN_LOOP_CALL (WM_APP + 0x101)
typedef struct xe_run_loop_call {
xe_run_loop_callback callback;
void* data;
xe_run_loop_callback callback;
void* data;
} xe_run_loop_call_t;
xe_run_loop_ref xe_run_loop_create() {
xe_run_loop_ref run_loop = (xe_run_loop_ref)xe_calloc(sizeof(xe_run_loop_t));
xe_run_loop_ref run_loop = (xe_run_loop_ref)calloc(1, sizeof(xe_run_loop_t));
xe_ref_init((xe_ref)run_loop);
return run_loop;
}
void xe_run_loop_dealloc(xe_run_loop_ref run_loop) {
}
void xe_run_loop_dealloc(xe_run_loop_ref run_loop) {}
xe_run_loop_ref xe_run_loop_retain(xe_run_loop_ref run_loop) {
xe_ref_retain((xe_ref)run_loop);
@@ -48,19 +42,19 @@ int xe_run_loop_pump(xe_run_loop_ref run_loop) {
TranslateMessage(&msg);
DispatchMessage(&msg);
switch (msg.message) {
case WM_XE_RUN_LOOP_CALL:
if (msg.wParam == (WPARAM)run_loop) {
xe_run_loop_call_t* call = (xe_run_loop_call_t*)msg.lParam;
call->callback(call->data);
xe_free(call);
}
break;
case WM_XE_RUN_LOOP_QUIT:
if (msg.wParam == (WPARAM)run_loop) {
// Done!
return 1;
}
break;
case WM_XE_RUN_LOOP_CALL:
if (msg.wParam == (WPARAM)run_loop) {
xe_run_loop_call_t* call = (xe_run_loop_call_t*)msg.lParam;
call->callback(call->data);
free(call);
}
break;
case WM_XE_RUN_LOOP_QUIT:
if (msg.wParam == (WPARAM)run_loop) {
// Done!
return 1;
}
break;
}
}
return 0;
@@ -70,11 +64,11 @@ void xe_run_loop_quit(xe_run_loop_ref run_loop) {
PostMessage(NULL, WM_XE_RUN_LOOP_QUIT, (WPARAM)run_loop, 0);
}
void xe_run_loop_call(xe_run_loop_ref run_loop,
xe_run_loop_callback callback, void* data) {
void xe_run_loop_call(xe_run_loop_ref run_loop, xe_run_loop_callback callback,
void* data) {
xe_run_loop_call_t* call =
(xe_run_loop_call_t*)xe_calloc(sizeof(xe_run_loop_call_t));
call->callback = callback;
call->data = data;
(xe_run_loop_call_t*)calloc(1, sizeof(xe_run_loop_call_t));
call->callback = callback;
call->data = data;
PostMessage(NULL, WM_XE_RUN_LOOP_CALL, (WPARAM)run_loop, (LPARAM)call);
}

View File

@@ -16,10 +16,8 @@
#include <winsock2.h>
#include <ws2tcpip.h>
// TODO(benvanik): win32 calls
void xe_socket_init() {
WSADATA wsa_data;
int result = WSAStartup(MAKEWORD(2, 2), &wsa_data);
@@ -41,12 +39,8 @@ void xe_socket_close(socket_t socket) {
struct linger so_linger;
so_linger.l_onoff = TRUE;
so_linger.l_linger = 30;
setsockopt(
socket,
SOL_SOCKET,
SO_LINGER,
(const char*)&so_linger,
sizeof so_linger);
setsockopt(socket, SOL_SOCKET, SO_LINGER, (const char*)&so_linger,
sizeof so_linger);
shutdown(socket, SD_SEND);
closesocket(socket);
}
@@ -57,32 +51,32 @@ void xe_socket_set_keepalive(socket_t socket, bool value) {
alive.keepalivetime = 7200000;
alive.keepaliveinterval = 6000;
DWORD bytes_returned;
WSAIoctl(socket, SIO_KEEPALIVE_VALS, &alive, sizeof(alive),
NULL, 0, &bytes_returned, NULL, NULL);
WSAIoctl(socket, SIO_KEEPALIVE_VALS, &alive, sizeof(alive), NULL, 0,
&bytes_returned, NULL, NULL);
}
void xe_socket_set_reuseaddr(socket_t socket, bool value) {
int opt_value = value ? 1 : 0;
setsockopt(socket, SOL_SOCKET, SO_REUSEADDR,
(const char*)&opt_value, sizeof(opt_value));
setsockopt(socket, SOL_SOCKET, SO_REUSEADDR, (const char*)&opt_value,
sizeof(opt_value));
}
void xe_socket_set_nodelay(socket_t socket, bool value) {
int opt_value = value ? 1 : 0;
setsockopt(socket, IPPROTO_TCP, TCP_NODELAY,
(const char*)&opt_value, sizeof(opt_value));
setsockopt(socket, IPPROTO_TCP, TCP_NODELAY, (const char*)&opt_value,
sizeof(opt_value));
}
void xe_socket_set_nonblock(socket_t socket, bool value) {
u_long mode = value ? 1 : 0;
ioctlsocket(socket, FIONBIO, &mode);
ioctlsocket(socket, FIONBIO, &mode);
}
int xe_socket_bind(socket_t socket, uint32_t port) {
struct sockaddr_in socket_addr;
socket_addr.sin_family = AF_INET;
socket_addr.sin_family = AF_INET;
socket_addr.sin_addr.s_addr = htonl(INADDR_ANY);
socket_addr.sin_port = htons(port);
socket_addr.sin_port = htons(port);
int r = bind(socket, (struct sockaddr*)&socket_addr, sizeof(socket_addr));
if (r == SOCKET_ERROR) {
return 1;
@@ -92,9 +86,9 @@ int xe_socket_bind(socket_t socket, uint32_t port) {
int xe_socket_bind_loopback(socket_t socket) {
struct sockaddr_in socket_addr;
socket_addr.sin_family = AF_INET;
socket_addr.sin_family = AF_INET;
socket_addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
socket_addr.sin_port = htons(0);
socket_addr.sin_port = htons(0);
int r = bind(socket, (struct sockaddr*)&socket_addr, sizeof(socket_addr));
if (r == SOCKET_ERROR) {
return 1;
@@ -113,8 +107,8 @@ int xe_socket_listen(socket_t socket) {
int xe_socket_accept(socket_t socket, xe_socket_connection_t* out_client_info) {
struct sockaddr_in client_addr;
int client_count = sizeof(client_addr);
socket_t client_socket_id = accept(
socket, (struct sockaddr*)&client_addr, &client_count);
socket_t client_socket_id =
accept(socket, (struct sockaddr*)&client_addr, &client_count);
if (client_socket_id == INVALID_SOCKET) {
return 1;
}
@@ -122,8 +116,8 @@ int xe_socket_accept(socket_t socket, xe_socket_connection_t* out_client_info) {
out_client_info->socket = client_socket_id;
int client_ip = client_addr.sin_addr.s_addr;
inet_ntop(AF_INET, &client_ip,
out_client_info->addr, poly::countof(out_client_info->addr));
inet_ntop(AF_INET, &client_ip, out_client_info->addr,
poly::countof(out_client_info->addr));
return 0;
}
@@ -153,16 +147,16 @@ int64_t xe_socket_recv(socket_t socket, uint8_t* data, size_t length, int flags,
}
struct xe_socket_loop {
socket_t socket;
socket_t socket;
socket_t notify_rd_id;
socket_t notify_wr_id;
socket_t notify_rd_id;
socket_t notify_wr_id;
WSAPOLLFD events[2];
bool pending_queued_write;
bool pending_recv;
bool pending_send;
bool pending_queued_write;
bool pending_recv;
bool pending_send;
};
namespace {
@@ -188,8 +182,8 @@ int Win32SocketPair(socket_t sockets[2]) {
sockaddr client_name;
int client_name_len = sizeof(client_name);
r = getsockname(client, &client_name, &client_name_len);
const char *pc = (const char*)&client_name;
const char *pn = (const char*)&listener_name;
const char* pc = (const char*)&client_name;
const char* pn = (const char*)&listener_name;
for (size_t n = 0; n < sizeof(client_name); n++) {
if (pc[n] != pn[n]) {
closesocket(listener);
@@ -208,28 +202,28 @@ int Win32SocketPair(socket_t sockets[2]) {
}
xe_socket_loop_t* xe_socket_loop_create(socket_t socket) {
xe_socket_loop_t* loop = (xe_socket_loop_t*)xe_calloc(
sizeof(xe_socket_loop_t));
xe_socket_loop_t* loop =
(xe_socket_loop_t*)calloc(1, sizeof(xe_socket_loop_t));
loop->socket = socket;
socket_t notify_ids[2] = { 0, 0 };
socket_t notify_ids[2] = {0, 0};
for (int retry = 0; retry < 5; retry++) {
if (!Win32SocketPair(notify_ids)) {
break;
}
}
if (!notify_ids[0]) {
xe_free(loop);
free(loop);
return NULL;
}
loop->notify_rd_id = notify_ids[0];
loop->notify_wr_id = notify_ids[1];
loop->events[0].fd = socket;
loop->events[0].events = POLLIN;
loop->events[1].fd = loop->notify_rd_id;
loop->events[1].events = POLLIN;
loop->events[0].fd = socket;
loop->events[0].events = POLLIN;
loop->events[1].fd = loop->notify_rd_id;
loop->events[1].events = POLLIN;
return loop;
}
@@ -237,11 +231,11 @@ xe_socket_loop_t* xe_socket_loop_create(socket_t socket) {
void xe_socket_loop_destroy(xe_socket_loop_t* loop) {
closesocket(loop->notify_rd_id);
closesocket(loop->notify_wr_id);
xe_free(loop);
free(loop);
}
int xe_socket_loop_poll(xe_socket_loop_t* loop,
bool check_read, bool check_write) {
int xe_socket_loop_poll(xe_socket_loop_t* loop, bool check_read,
bool check_write) {
// Prep events object.
loop->events[0].events = 0;
if (check_read) {