From 7f5e542faef946632950300f3ab6f94d1017ead9 Mon Sep 17 00:00:00 2001
From: "Ryan C. Gordon" <[EMAIL REDACTED]>
Date: Sun, 13 Aug 2023 19:07:17 -0400
Subject: [PATCH] SDLNet_RefAddress should return the address, for convenience.
---
SDL_net.c | 12 +++++-------
SDL_net.h | 2 +-
2 files changed, 6 insertions(+), 8 deletions(-)
diff --git a/SDL_net.c b/SDL_net.c
index a77d402..afbc962 100644
--- a/SDL_net.c
+++ b/SDL_net.c
@@ -373,11 +373,12 @@ const char *SDLNet_GetAddressString(SDLNet_Address *addr)
return addr ? (const char *) SDL_AtomicGetPtr((void **) &addr->human_readable) : NULL;
}
-void SDLNet_RefAddress(SDLNet_Address *addr)
+SDLNet_Address *SDLNet_RefAddress(SDLNet_Address *addr)
{
if (addr) {
SDL_AtomicIncRef(&addr->refcount);
}
+ return addr;
}
void SDLNet_UnrefAddress(SDLNet_Address *addr)
@@ -766,8 +767,7 @@ SDLNet_Address *SDLNet_GetStreamSocketAddress(SDLNet_StreamSocket *sock)
SDL_InvalidParamError("sock");
return NULL;
}
- SDLNet_RefAddress(sock->addr);
- return sock->addr;
+ return SDLNet_RefAddress(sock->addr);
}
static void UpdateStreamSocketSimulatedFailure(SDLNet_StreamSocket *sock)
@@ -1119,10 +1119,9 @@ int SDLNet_SendDatagram(SDLNet_DatagramSocket *sock, SDLNet_Address *addr, Uint1
dgram->buf = (Uint8 *) (dgram+1);
SDL_memcpy(dgram->buf, buf, buflen);
- dgram->addr = addr;
+ dgram->addr = SDLNet_RefAddress(addr);
dgram->port = port;
dgram->buflen = buflen;
- SDLNet_RefAddress(addr);
sock->pending_output[sock->pending_output_len++] = dgram;
@@ -1226,10 +1225,9 @@ int SDLNet_ReceiveDatagram(SDLNet_DatagramSocket *sock, SDLNet_Datagram **dgram)
dg->buf = (Uint8 *) (dg+1);
SDL_memcpy(dg->buf, sock->recv_buffer, br);
- dg->addr = fromaddr;
+ dg->addr = SDLNet_RefAddress(fromaddr);
dg->port = (Uint16) SDL_atoi(portbuf);
dg->buflen = br;
- SDLNet_RefAddress(fromaddr);
*dgram = dg;
diff --git a/SDL_net.h b/SDL_net.h
index 44dbfc2..b803b26 100644
--- a/SDL_net.h
+++ b/SDL_net.h
@@ -29,7 +29,7 @@ extern DECLSPEC SDLNet_Address * SDLCALL SDLNet_ResolveHostname(const char *host
extern DECLSPEC int SDLCALL SDLNet_WaitForResolution(SDLNet_Address *address); /* blocks until success or failure. Optional. */
extern DECLSPEC int SDLCALL SDLNet_GetAddressStatus(SDLNet_Address *address); /* 0: still working, -1: failed (check SDL_GetError), 1: ready */
extern DECLSPEC const char * SDLCALL SDLNet_GetAddressString(SDLNet_Address *address); /* human-readable string, like "127.0.0.1" or "::1" or whatever. NULL if GetAddressStatus != 1. String owned by address! */
-extern DECLSPEC void SDLCALL SDLNet_RefAddress(SDLNet_Address *address); /* +1 refcount; SDLNet_ResolveHost starts at 1. */
+extern DECLSPEC SDLNet_Address *SDLCALL SDLNet_RefAddress(SDLNet_Address *address); /* +1 refcount; SDLNet_ResolveHost starts at 1. Returns `address` for convenience. */
extern DECLSPEC void SDLCALL SDLNet_UnrefAddress(SDLNet_Address *address); /* when totally unref'd, gets freed. */
extern DECLSPEC void SDLCALL SDLNet_SimulateAddressResolutionLoss(int percent_loss); /* make resolutions delay at random, fail some percent of them. */