mirror of
https://github.com/netbirdio/gvisor.git
synced 2026-05-22 17:12:49 -07:00
timer_create(2) should return 0 on success
The timer ID is copied out to the argument. Fixes #1738 PiperOrigin-RevId: 293210801
This commit is contained in:
committed by
gVisor bot
parent
c5d4041623
commit
6823b5e244
@@ -146,7 +146,7 @@ func TimerCreate(t *kernel.Task, args arch.SyscallArguments) (uintptr, *kernel.S
|
||||
return 0, nil, err
|
||||
}
|
||||
|
||||
return uintptr(id), nil, nil
|
||||
return 0, nil, nil
|
||||
}
|
||||
|
||||
// TimerSettime implements linux syscall timer_settime(2).
|
||||
|
||||
@@ -297,9 +297,13 @@ class IntervalTimer {
|
||||
PosixErrorOr<IntervalTimer> TimerCreate(clockid_t clockid,
|
||||
const struct sigevent& sev) {
|
||||
int timerid;
|
||||
if (syscall(SYS_timer_create, clockid, &sev, &timerid) < 0) {
|
||||
int ret = syscall(SYS_timer_create, clockid, &sev, &timerid);
|
||||
if (ret < 0) {
|
||||
return PosixError(errno, "timer_create");
|
||||
}
|
||||
if (ret > 0) {
|
||||
return PosixError(EINVAL, "timer_create should never return positive");
|
||||
}
|
||||
MaybeSave();
|
||||
return IntervalTimer(timerid);
|
||||
}
|
||||
@@ -317,6 +321,18 @@ TEST(IntervalTimerTest, IsInitiallyStopped) {
|
||||
EXPECT_EQ(0, its.it_value.tv_nsec);
|
||||
}
|
||||
|
||||
// Kernel can create multiple timers without issue.
|
||||
//
|
||||
// Regression test for gvisor.dev/issue/1738.
|
||||
TEST(IntervalTimerTest, MultipleTimers) {
|
||||
struct sigevent sev = {};
|
||||
sev.sigev_notify = SIGEV_NONE;
|
||||
const auto timer1 =
|
||||
ASSERT_NO_ERRNO_AND_VALUE(TimerCreate(CLOCK_MONOTONIC, sev));
|
||||
const auto timer2 =
|
||||
ASSERT_NO_ERRNO_AND_VALUE(TimerCreate(CLOCK_MONOTONIC, sev));
|
||||
}
|
||||
|
||||
TEST(IntervalTimerTest, SingleShotSilent) {
|
||||
struct sigevent sev = {};
|
||||
sev.sigev_notify = SIGEV_NONE;
|
||||
|
||||
Reference in New Issue
Block a user