mirror of
https://github.com/microsoft/WSL.git
synced 2025-12-10 00:44:55 -06:00
* link: Collect WSL logs (recommended method) Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * link: Advanced Authoring Tests in C++ Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * link: CMake Documentation and Community Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * link: Collect WSL logs for networking issues Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * link: Collect WSL logs (recommended method) Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: ; otherwise, Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: a Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: access Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: accessible Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: across Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: actively Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: adapters Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: address Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: addresses Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: and Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: appropriate Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: argument Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: associated Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: attach Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: available Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: beginning Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: between Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: binaries Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: bound Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: buffer Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: buffers Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: cannot Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: canonical Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: capabilities Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: case-insensitive Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: case-sensitive Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: certified Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: command Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: committer Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: communication Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: complains Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: configuration Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: consumed Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: continue Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: converted Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: currently Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: customers Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: daemon Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: deferred Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: definitions Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: delimiter Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: delivered Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: dellink Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: derived Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: descriptor Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: destined Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: destruct Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: destructible Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: destructor Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: detach Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: differentiate Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: directories Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: disassociate Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: disposition Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: distribution Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: distro Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: duping Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: emitted Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: empty Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: environment Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: every time Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: exclusive Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: expected Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: expire Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: explicitly Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: fall back Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: false Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: fastfail Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: filesystem Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: first Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: followed Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: for Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: functionality Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: functionally Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: github Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: greater Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: guarantee Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: guaranteed Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: handles Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: hangup Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: hierarchy Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: hogwarts Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: hydrated Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: icrnl Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: implementation Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: implementing Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: initialize Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: instance Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: instantiate Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: instantiations Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: intentionally Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: interpret Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: interpreter Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: irreversibly Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: iteration Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: iterator Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: its Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: kernel Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: kmsg Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: knowledge Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: maximum Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: mirrored Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: msftconnecttest Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: multi Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: multiple Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: mutable Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: namespace Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: nonexistent Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: notifications Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: occurred Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: occurring Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: otherwise, Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: outstanding Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: overridden Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: partition Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: pass through Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: passthrough Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: performs Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: periodically Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: positional Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: precedence Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: preexisting Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: preferring Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: prepopulate Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: previous Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: privileges Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: process Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: processes Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: programmatically Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: protection Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: provided Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: reasonable Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: receive Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: received Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: red hat Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: reentrant Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: registered Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: regularly Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: relay Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: release Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: representing Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: requests Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: response Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: resurrect Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: retention Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: returned Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: security Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: semaphore Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: separate Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: separator Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: service Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: set up Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: setup Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: severely Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: should Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: signal Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: similarly Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: simple Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: simplified Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: single Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: specified Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: splitting Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: standard Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: stress Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: succeed Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: success Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: successfully Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: supplementary Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: synced Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: system Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: take Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: than Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: that opening Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: the Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: threadpool Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: to Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: true Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: truncate Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: tunneling Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: unexpected Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: uninitialize Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: unique Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: unprivileged Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: unregistered Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: untrusted Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: upgrade Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: utility Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: validating Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: variant Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: variation Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: variations Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: verify Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: visible Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: whether Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: winget Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: worker Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: written Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: wslservice Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * format source --------- Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> Co-authored-by: Ben Hillis <benhillis@gmail.com> Co-authored-by: Ben Hillis <benhill@ntdev.microsoft.com>
473 lines
11 KiB
C
473 lines
11 KiB
C
/*++
|
|
|
|
Copyright (c) Microsoft. All rights reserved.
|
|
|
|
Module Name:
|
|
|
|
timerfd.c
|
|
|
|
Abstract:
|
|
|
|
This file is a timerfd test.
|
|
|
|
--*/
|
|
|
|
#include "lxtcommon.h"
|
|
#include "unittests.h"
|
|
// #include <sys/timerfd.h>
|
|
#include <sys/epoll.h>
|
|
#include <sys/time.h>
|
|
#include <unistd.h>
|
|
#include <sys/stat.h>
|
|
#include <sys/types.h>
|
|
#include <fcntl.h>
|
|
|
|
#define LXT_NAME "timerfd"
|
|
#define LXT_EVENT_ARRAY_SIZE (10)
|
|
#define LXT_BASIC_TEST_LOOP_COUNT (3)
|
|
|
|
int TimerFdBasic(PLXT_ARGS Args);
|
|
|
|
int TimerFdEpoll(PLXT_ARGS Args);
|
|
|
|
//
|
|
// Global constants
|
|
//
|
|
|
|
static const LXT_VARIATION g_LxtVariations[] = {{"Timerfd Basic", TimerFdBasic}, {"Timerfd Epoll", TimerFdEpoll}};
|
|
|
|
//
|
|
// Global variables
|
|
//
|
|
|
|
static struct timespec g_SignalTime;
|
|
static int g_SignalCount;
|
|
|
|
int TimerFdTestEntry(int Argc, char* Argv[])
|
|
|
|
/*++
|
|
--*/
|
|
|
|
{
|
|
|
|
LXT_ARGS Args;
|
|
int Result;
|
|
|
|
LxtCheckResult(LxtInitialize(Argc, Argv, &Args, LXT_NAME));
|
|
LxtCheckResult(LxtRunVariations(&Args, g_LxtVariations, LXT_COUNT_OF(g_LxtVariations)));
|
|
|
|
ErrorExit:
|
|
LxtUninitialize();
|
|
return !LXT_SUCCESS(Result);
|
|
}
|
|
|
|
int TimerFdBasic(PLXT_ARGS Args)
|
|
|
|
/*++
|
|
--*/
|
|
|
|
{
|
|
|
|
struct epoll_event Event;
|
|
struct epoll_event Events[LXT_EVENT_ARRAY_SIZE];
|
|
int EpollFd;
|
|
struct stat FileStat;
|
|
int Flags;
|
|
int Index;
|
|
int LoopIndex;
|
|
struct itimerspec NewTimer;
|
|
struct itimerspec OldTimer;
|
|
int ReadyFdCount;
|
|
int Result;
|
|
struct timespec SleepDuration;
|
|
uint64_t TimerExpirationCount;
|
|
int TimerFd;
|
|
|
|
//
|
|
// Initialize locals.
|
|
//
|
|
|
|
EpollFd = -1;
|
|
TimerFd = -1;
|
|
|
|
//
|
|
// Create invalid timers.
|
|
//
|
|
|
|
TimerFd = timerfd_create(-1, O_NONBLOCK);
|
|
if (TimerFd >= 0)
|
|
{
|
|
LxtLogError("timerfd_create was supposed to fail because of invalid parameters but did not fail.");
|
|
Result = TimerFd;
|
|
goto ErrorExit;
|
|
}
|
|
|
|
TimerFd = timerfd_create(CLOCK_MONOTONIC, -1);
|
|
if (TimerFd >= 0)
|
|
{
|
|
LxtLogError("timerfd_create was supposed to fail because of invalid parameters but did not fail.");
|
|
Result = TimerFd;
|
|
goto ErrorExit;
|
|
}
|
|
|
|
TimerFd = timerfd_create(-1, -1);
|
|
if (TimerFd >= 0)
|
|
{
|
|
LxtLogError("timerfd_create was supposed to fail because of invalid parameters but did not fail.");
|
|
Result = TimerFd;
|
|
goto ErrorExit;
|
|
}
|
|
|
|
//
|
|
// Create a timer fd.
|
|
//
|
|
|
|
TimerFd = timerfd_create(CLOCK_MONOTONIC, O_NONBLOCK);
|
|
if (TimerFd < 0)
|
|
{
|
|
LxtLogError("timerfd_create failed");
|
|
Result = TimerFd;
|
|
goto ErrorExit;
|
|
}
|
|
|
|
//
|
|
// Create epoll fd to monitor the file for read events.
|
|
//
|
|
|
|
EpollFd = epoll_create(LXT_EVENT_ARRAY_SIZE);
|
|
if (EpollFd < 0)
|
|
{
|
|
LxtLogError("epoll create failed");
|
|
Result = EpollFd;
|
|
goto ErrorExit;
|
|
}
|
|
|
|
Event.events = EPOLLIN;
|
|
Event.data.fd = TimerFd;
|
|
Result = epoll_ctl(EpollFd, EPOLL_CTL_ADD, TimerFd, &Event);
|
|
if (Result < 0)
|
|
{
|
|
LxtLogError("epoll_ctl failed.");
|
|
goto ErrorExit;
|
|
}
|
|
|
|
//
|
|
// Set timer fd to expire at one second interval.
|
|
//
|
|
|
|
Flags = 0;
|
|
NewTimer.it_interval.tv_sec = 1;
|
|
NewTimer.it_interval.tv_nsec = 0;
|
|
NewTimer.it_value.tv_sec = 1;
|
|
NewTimer.it_value.tv_nsec = 0;
|
|
|
|
//
|
|
// Set timer with invalid parameters.
|
|
//
|
|
|
|
Result = timerfd_settime(-1, Flags, &NewTimer, &OldTimer);
|
|
if (Result >= 0)
|
|
{
|
|
LxtLogError("timerfd_settime was supposed to fail because of invalid parameters but did not fail.");
|
|
goto ErrorExit;
|
|
}
|
|
|
|
//
|
|
// Set timer with valid parameters.
|
|
//
|
|
|
|
Result = timerfd_settime(TimerFd, Flags, &NewTimer, &OldTimer);
|
|
if (Result < 0)
|
|
{
|
|
LxtLogError("timerfd_settime failed");
|
|
goto ErrorExit;
|
|
}
|
|
|
|
//
|
|
// Read with invalid buffer size.
|
|
//
|
|
|
|
Result = read(TimerFd, &TimerExpirationCount, sizeof(TimerExpirationCount) - 1);
|
|
if (Result >= 0)
|
|
{
|
|
LxtLogError("read was supposed to fail because of invalid parameters but did not fail.");
|
|
goto ErrorExit;
|
|
}
|
|
|
|
//
|
|
// Loop three times. In each iteration increase the wait time by one seconds.
|
|
// this should increase the expiration count by one in each iteration.
|
|
//
|
|
|
|
for (LoopIndex = 1; LoopIndex <= LXT_BASIC_TEST_LOOP_COUNT; LoopIndex += 1)
|
|
{
|
|
|
|
//
|
|
// Sleep for a factor of a second.
|
|
//
|
|
|
|
SleepDuration.tv_sec = LoopIndex;
|
|
SleepDuration.tv_nsec = 0;
|
|
nanosleep(&SleepDuration, NULL);
|
|
ReadyFdCount = epoll_wait(EpollFd, Events, LXT_EVENT_ARRAY_SIZE, 0);
|
|
if (ReadyFdCount < 0)
|
|
{
|
|
LxtLogError("epoll_wait failed.");
|
|
Result = ReadyFdCount;
|
|
goto ErrorExit;
|
|
}
|
|
|
|
for (Index = 0; Index < ReadyFdCount; Index += 1)
|
|
{
|
|
|
|
//
|
|
// Look out for TimerFd.
|
|
//
|
|
|
|
if (Events[Index].data.fd == TimerFd)
|
|
{
|
|
TimerExpirationCount = 0;
|
|
if (read(TimerFd, &TimerExpirationCount, sizeof(TimerExpirationCount)) != -1)
|
|
{
|
|
LxtLogInfo("Number of times the timer expired in %d seconds is : %lld", SleepDuration.tv_sec, (long long)TimerExpirationCount);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
//
|
|
// Read even before the timer has expired. Set a 10 second expiration window
|
|
// and do a read after that. The read should fail with EAGAIN.
|
|
//
|
|
|
|
Flags = 0;
|
|
NewTimer.it_interval.tv_sec = 10;
|
|
NewTimer.it_interval.tv_nsec = 0;
|
|
Result = timerfd_settime(TimerFd, Flags, &NewTimer, &OldTimer);
|
|
if (Result < 0)
|
|
{
|
|
LxtLogError("timerfd_settime failed");
|
|
goto ErrorExit;
|
|
}
|
|
|
|
Result = read(TimerFd, &TimerExpirationCount, sizeof(TimerExpirationCount));
|
|
if (Result != -1)
|
|
{
|
|
LxtLogError("Read was supposed to fail with eagain but it did not %d", Result);
|
|
}
|
|
|
|
//
|
|
// Call get time with invalid parameters.
|
|
//
|
|
|
|
Result = timerfd_gettime(-1, &OldTimer);
|
|
if (Result >= 0)
|
|
{
|
|
LxtLogError("timerfd_gettime was supposed to fail because of invalid parameters but did not fail.");
|
|
goto ErrorExit;
|
|
}
|
|
|
|
Result = timerfd_gettime(TimerFd, NULL);
|
|
if (Result >= 0)
|
|
{
|
|
LxtLogError("timerfd_gettime was supposed to fail because of invalid parameters but did not fail.");
|
|
goto ErrorExit;
|
|
}
|
|
|
|
Result = timerfd_gettime(-1, NULL);
|
|
if (Result >= 0)
|
|
{
|
|
LxtLogError("timerfd_gettime was supposed to fail because of invalid parameters but did not fail.");
|
|
goto ErrorExit;
|
|
}
|
|
|
|
NewTimer.it_value.tv_sec = 60;
|
|
NewTimer.it_interval.tv_sec = 60;
|
|
Result = timerfd_settime(TimerFd, Flags, &NewTimer, &OldTimer);
|
|
if (Result < 0)
|
|
{
|
|
LxtLogError("timerfd_settime failed");
|
|
goto ErrorExit;
|
|
}
|
|
|
|
Result = timerfd_gettime(TimerFd, &OldTimer);
|
|
if (Result < 0)
|
|
{
|
|
LxtLogError("timerfd_gettime failed.");
|
|
goto ErrorExit;
|
|
}
|
|
|
|
LxtLogInfo(
|
|
"Current timer settings: Interval (seconds: %d, nanoseconds: %lu),"
|
|
"time till next expiration (seconds %d, nanoseconds %ld, %d)",
|
|
OldTimer.it_interval.tv_sec,
|
|
OldTimer.it_interval.tv_nsec,
|
|
OldTimer.it_value.tv_sec,
|
|
OldTimer.it_value.tv_nsec,
|
|
OldTimer.it_value.tv_nsec);
|
|
|
|
//
|
|
// Stat on the TimerFd.
|
|
//
|
|
|
|
Result = fstat(TimerFd, &FileStat);
|
|
if (Result < 0)
|
|
{
|
|
LxtLogError("stat on timerfd failed.");
|
|
goto ErrorExit;
|
|
}
|
|
|
|
LxtLogInfo("File Size: %d bytes", FileStat.st_size);
|
|
LxtLogInfo("Number of Links: %d", FileStat.st_nlink);
|
|
LxtLogInfo("File inode: %d", FileStat.st_ino);
|
|
LxtLogInfo("Symbolic link: %c ", (S_ISLNK(FileStat.st_mode)) ? 'Y' : 'N');
|
|
LxtLogInfo("Mode: %d", FileStat.st_mode);
|
|
LxtLogInfo("Mode: %lu", FileStat.st_mode);
|
|
|
|
//
|
|
// Invalid parameter variations.
|
|
//
|
|
|
|
memset(&NewTimer, 0, sizeof(NewTimer));
|
|
NewTimer.it_value.tv_sec = -1;
|
|
LxtCheckErrnoFailure(timerfd_settime(TimerFd, 0, &NewTimer, NULL), EINVAL);
|
|
memset(&NewTimer, 0, sizeof(NewTimer));
|
|
NewTimer.it_value.tv_nsec = 999999999 + 1;
|
|
LxtCheckErrnoFailure(timerfd_settime(TimerFd, 0, &NewTimer, NULL), EINVAL);
|
|
memset(&NewTimer, 0, sizeof(NewTimer));
|
|
NewTimer.it_interval.tv_sec = -1;
|
|
LxtCheckErrnoFailure(timerfd_settime(TimerFd, 0, &NewTimer, NULL), EINVAL);
|
|
memset(&NewTimer, 0, sizeof(NewTimer));
|
|
NewTimer.it_interval.tv_nsec = 999999999 + 1;
|
|
LxtCheckErrnoFailure(timerfd_settime(TimerFd, 0, &NewTimer, NULL), EINVAL);
|
|
|
|
Result = LXT_RESULT_SUCCESS;
|
|
|
|
ErrorExit:
|
|
if (EpollFd > 0)
|
|
{
|
|
LxtClose(EpollFd);
|
|
}
|
|
|
|
if (TimerFd > 0)
|
|
{
|
|
LxtClose(TimerFd);
|
|
}
|
|
|
|
return Result;
|
|
}
|
|
|
|
int TimerFdEpoll(PLXT_ARGS Args)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
This routine validates the various epoll states of timer FD.
|
|
|
|
Arguments:
|
|
|
|
Args - Supplies the command line arguments.
|
|
|
|
Return Value:
|
|
|
|
Returns 0 on success, -1 on failure.
|
|
|
|
--*/
|
|
|
|
{
|
|
|
|
struct epoll_event Event;
|
|
struct epoll_event Events[LXT_EVENT_ARRAY_SIZE];
|
|
int EpollFd;
|
|
struct itimerspec NewTimer;
|
|
struct itimerspec OldTimer;
|
|
int ReadyFdCount;
|
|
int Result;
|
|
struct timespec SleepDuration;
|
|
uint64_t TimerExpirationCount;
|
|
int TimerFd;
|
|
|
|
//
|
|
// Initialize locals.
|
|
//
|
|
|
|
EpollFd = -1;
|
|
TimerFd = -1;
|
|
|
|
//
|
|
// Create a timer fd.
|
|
//
|
|
|
|
LxtCheckErrno((TimerFd = timerfd_create(CLOCK_MONOTONIC, O_NONBLOCK)));
|
|
|
|
//
|
|
// Create epoll fd to monitor the file for read events.
|
|
//
|
|
|
|
LxtCheckErrno((EpollFd = epoll_create(LXT_EVENT_ARRAY_SIZE)));
|
|
|
|
//
|
|
// EPOLLIN is the only interesting event for timer FD.
|
|
//
|
|
|
|
Event.events = EPOLLIN;
|
|
Event.data.fd = TimerFd;
|
|
LxtCheckErrno(epoll_ctl(EpollFd, EPOLL_CTL_ADD, TimerFd, &Event));
|
|
|
|
//
|
|
// Soon after creation, there shouldn't be any epoll set on the timer FD.
|
|
//
|
|
|
|
LxtCheckErrno((ReadyFdCount = epoll_wait(EpollFd, &Event, 1, 10)));
|
|
LxtCheckEqual(ReadyFdCount, 0, "%d");
|
|
|
|
//
|
|
// Set the timer to fire soon (1ms).
|
|
//
|
|
|
|
NewTimer.it_interval.tv_sec = 0;
|
|
NewTimer.it_interval.tv_nsec = 0;
|
|
NewTimer.it_value.tv_sec = 0;
|
|
NewTimer.it_value.tv_nsec = 1000;
|
|
|
|
//
|
|
// Set the timer.
|
|
//
|
|
|
|
LxtCheckErrno(timerfd_settime(TimerFd, 0, &NewTimer, &OldTimer));
|
|
|
|
//
|
|
// Wait for EPOLL for a timeout > timer. `epoll_wait` takes time in ms.
|
|
//
|
|
|
|
LxtCheckErrno((ReadyFdCount = epoll_wait(EpollFd, &Event, 1, 1000)));
|
|
LxtCheckEqual(ReadyFdCount, 1, "%d");
|
|
|
|
//
|
|
// Setting the timer to 0 should reset the timer and the epoll.
|
|
//
|
|
|
|
NewTimer.it_interval.tv_sec = 0;
|
|
NewTimer.it_interval.tv_nsec = 0;
|
|
NewTimer.it_value.tv_sec = 0;
|
|
NewTimer.it_value.tv_nsec = 0;
|
|
LxtCheckErrno(timerfd_settime(TimerFd, 0, &NewTimer, &OldTimer));
|
|
LxtCheckErrno((ReadyFdCount = epoll_wait(EpollFd, &Event, 1, 10)));
|
|
LxtCheckEqual(ReadyFdCount, 0, "%d");
|
|
Result = LXT_RESULT_SUCCESS;
|
|
|
|
ErrorExit:
|
|
if (EpollFd > 0)
|
|
{
|
|
close(EpollFd);
|
|
}
|
|
|
|
if (TimerFd > 0)
|
|
{
|
|
close(TimerFd);
|
|
}
|
|
|
|
return Result;
|
|
}
|