Merge pull request #3973 from MarcZX100/codex/carry-rudp-end-terminate

fix(libSceRudp): correct End and Terminate functions
This commit is contained in:
Adrià 2026-10-13 13:40:04 +02:00 committed by GitHub
commit 2f969f147b
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 36 additions and 17 deletions

View File

@ -77,15 +77,7 @@ int APS5_VABI sceRudpGetStatus(void* status, std::size_t size) {
return 0;
}
int APS5_VABI sceRudpEnd(int ctx_id) {
std::lock_guard<std::mutex> lk(g_mutex);
if (!g_inited) {
return RUDP_ERROR_NOT_INITIALIZED;
}
return g_ctx.erase(ctx_id) != 0 ? 0 : RUDP_ERROR_INVALID_CONTEXT_ID;
}
int APS5_VABI sceRudpTerminate(void) {
int APS5_VABI sceRudpEnd(void) {
std::lock_guard<std::mutex> lk(g_mutex);
if (!g_inited) {
return RUDP_ERROR_NOT_INITIALIZED;
@ -95,6 +87,14 @@ int APS5_VABI sceRudpTerminate(void) {
return 0;
}
int APS5_VABI sceRudpTerminate(int ctx_id) {
std::lock_guard<std::mutex> lk(g_mutex);
if (!g_inited) {
return RUDP_ERROR_NOT_INITIALIZED;
}
return g_ctx.erase(ctx_id) != 0 ? 0 : RUDP_ERROR_INVALID_CONTEXT_ID;
}
int APS5_VABI sceRudpEnableInternalIOThread(uint32_t stack_size, uint32_t priority) {
(void)stack_size;
(void)priority;

View File

@ -26,7 +26,7 @@ int APS5_VABI sceNpEntitlementAccessPollServiceEntitlementInfo();
int APS5_VABI sceRudpInit_nid_postfix(void*, int);
int APS5_VABI sceRudpActivate();
int APS5_VABI sceRudpGetStatus(void*, std::size_t);
int APS5_VABI sceRudpTerminate();
int APS5_VABI sceRudpEnd();
}
static void Require(bool value) { if (!value) std::abort(); }
@ -101,6 +101,6 @@ int main() {
Require(sceRudpGetStatus(status.data(), status.size()) == 0);
for (unsigned char byte : status) Require(byte == 0);
Require(sceRudpGetStatus(nullptr, 0) == static_cast<int>(0x80770004));
Require(sceRudpTerminate() == 0);
Require(sceRudpEnd() == 0);
return 0;
}

View File

@ -7,8 +7,8 @@ extern "C" {
using GuestRudpEventHandler = void(APS5_VABI*)(int, int, int, void*);
int APS5_VABI sceRudpInit_nid_postfix(void*, int);
int APS5_VABI sceRudpCreateContext(GuestRudpEventHandler, void*, int*);
int APS5_VABI sceRudpEnd(int);
int APS5_VABI sceRudpTerminate();
int APS5_VABI sceRudpTerminate(int);
int APS5_VABI sceRudpEnd();
int APS5_VABI sceRudpGetNumberOfPacketsToRead(int);
int APS5_VABI sceRudpGetSizeWritable(int);
int APS5_VABI sceRudpGetSizeReadable(int);
@ -46,10 +46,10 @@ int main() {
Require(sceRudpGetNumberOfPacketsToRead(context) == 0);
Require(sceRudpGetSizeWritable(context) == notAcceptable);
Require(sceRudpGetSizeReadable(context) == notAcceptable);
Require(sceRudpEnd(context) == 0);
Require(sceRudpTerminate(context) == 0);
Require(sceRudpGetNumberOfPacketsToRead(context) == invalidContext);
Require(sceRudpGetSizeWritable(context) == invalidContext);
Require(sceRudpGetSizeReadable(context) == invalidContext);
Require(sceRudpTerminate() == 0);
Require(sceRudpEnd() == 0);
return 0;
}

View File

@ -8,7 +8,7 @@
extern "C" {
int APS5_VABI sceRudpInit_nid_postfix(void*, int);
int APS5_VABI sceRudpTerminate();
int APS5_VABI sceRudpEnd();
int APS5_VABI sceRudpProcessEvents();
int APS5_VABI sceRudpNetFlush();
int APS5_VABI sceRudpGetMaxSegmentSize(std::uint16_t*);
@ -43,7 +43,7 @@ int main() {
std::uint16_t segment[3] = {0, 0, 0x5a5a};
CHECK(sceRudpGetMaxSegmentSize(&segment[1]) == 0);
CHECK(segment[0] == 0 && segment[1] == 1410 && segment[2] == 0x5a5a);
CHECK(sceRudpTerminate() == 0);
CHECK(sceRudpEnd() == 0);
segmentSize = 0x5a5a;
CHECK(sceRudpGetMaxSegmentSize(&segmentSize) == notInitialized);

View File

@ -11,6 +11,8 @@ using GuestRudpEventHandler = void(APS5_VABI*)(int, int, int, void*);
int APS5_VABI sceRudpInit_nid_postfix(void*, int);
int APS5_VABI sceRudpGetStatus(void*, std::size_t);
int APS5_VABI sceRudpCreateContext(GuestRudpEventHandler, void*, int*);
int APS5_VABI sceRudpTerminate(int);
int APS5_VABI sceRudpEnd();
}
static void Require(bool value) { if (!value) std::abort(); }
@ -20,6 +22,7 @@ static void APS5_VABI Handler(int, int, int, void*) {}
int main() {
constexpr int notInitialized = static_cast<int>(0x80770001);
constexpr int alreadyInitialized = static_cast<int>(0x80770002);
constexpr int invalidContextId = static_cast<int>(0x80770003);
constexpr int invalidArgument = static_cast<int>(0x80770004);
constexpr int memory = static_cast<int>(0x80770007);
constexpr std::size_t statusSize = 0xF8;
@ -33,6 +36,8 @@ int main() {
Require(sceRudpGetStatus(nullptr, 0) == notInitialized);
Require(sceRudpGetStatus(status.data(), statusSize + 1) == notInitialized);
Require(status == untouched);
Require(sceRudpEnd() == notInitialized);
Require(sceRudpTerminate(0) == notInitialized);
Require(sceRudpInit_nid_postfix(nullptr, sizeof(pool)) == invalidArgument);
Require(sceRudpInit_nid_postfix(pool, 0) == invalidArgument);
@ -69,5 +74,19 @@ int main() {
Require(sceRudpGetStatus(status.data(), 1) == 0);
Require(status[0] == 0);
for (std::size_t i = 1; i < status.size(); ++i) Require(status[i] == 0x5a);
Require(sceRudpTerminate(first) == 0);
Require(sceRudpTerminate(first) == invalidContextId);
Require(sceRudpGetStatus(status.data(), statusSize) == 0);
std::memcpy(&contexts, status.data() + currentContexts, sizeof(contexts));
Require(contexts == 1);
Require(sceRudpEnd() == 0);
Require(sceRudpEnd() == notInitialized);
Require(sceRudpTerminate(second) == notInitialized);
Require(sceRudpGetStatus(status.data(), statusSize) == notInitialized);
Require(sceRudpInit_nid_postfix(pool + 8, 0xC58) == 0);
Require(sceRudpTerminate(second) == invalidContextId);
Require(sceRudpEnd() == 0);
return 0;
}