Files
AnyPS5/core/libs/tests/GuestPthreadCondattr.cpp
T
milescovielloandClaude Opus 5.5 62ac8d655f fix(libkernel): return EINVAL from scePthreadCondattrSetclock and Destroy for a null attribute
Both threw std::invalid_argument for a null or uninitialized attribute.
FreeBSD's libthr returns EINVAL for one, as the other scePthread
attribute calls here already do. The clock id is still stored as
given.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-17 06:42:41 +00:00

36 lines
1.5 KiB
C++

#include "SceTypes.hpp"
#include <cstdlib>
#include <initializer_list>
extern "C" {
int APS5_VABI scePthreadCondattrInit(PthreadCondattr* attr);
int APS5_VABI scePthreadCondattrDestroy(PthreadCondattr* attr);
int APS5_VABI scePthreadCondattrSetclock(PthreadCondattr* attr, KernelClockid clockId);
int APS5_VABI pthread_condattr_setclock_nid_postfix(PthreadCondattr* attr, KernelClockid clockId);
}
static constexpr int SCE_OK = 0;
static constexpr int SceEinval = static_cast<int>(0x80020016u);
static constexpr int GuestEinval = 22;
static constexpr KernelClockid Monotonic = 4;
static void Require(bool value) { if (!value) std::abort(); }
int main() {
PthreadCondattr unset = nullptr;
Require(scePthreadCondattrSetclock(nullptr, Monotonic) == SceEinval);
Require(scePthreadCondattrSetclock(&unset, Monotonic) == SceEinval);
Require(scePthreadCondattrDestroy(nullptr) == SceEinval);
Require(scePthreadCondattrDestroy(&unset) == SceEinval);
Require(pthread_condattr_setclock_nid_postfix(&unset, Monotonic) == GuestEinval);
PthreadCondattr attr = nullptr;
Require(scePthreadCondattrInit(&attr) == SCE_OK);
for (const KernelClockid clock : {0, 1, 2, Monotonic, 5, 12}) {
Require(scePthreadCondattrSetclock(&attr, clock) == SCE_OK);
Require(pthread_condattr_setclock_nid_postfix(&attr, clock) == 0);
}
Require(scePthreadCondattrDestroy(&attr) == SCE_OK && attr == nullptr);
Require(scePthreadCondattrDestroy(&attr) == SceEinval);
}