From patchwork Thu Jan 14 15:40:27 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Lukasz Majewski X-Patchwork-Id: 41720 X-Patchwork-Delegate: azanella@linux.vnet.ibm.com Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id A7519387089A; Thu, 14 Jan 2021 15:40:58 +0000 (GMT) X-Original-To: libc-alpha@sourceware.org Delivered-To: libc-alpha@sourceware.org Received: from mail-out.m-online.net (mail-out.m-online.net [212.18.0.10]) by sourceware.org (Postfix) with ESMTPS id 71B1F385700A for ; Thu, 14 Jan 2021 15:40:53 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org 71B1F385700A Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=denx.de Authentication-Results: sourceware.org; spf=none smtp.mailfrom=lukma@denx.de Received: from frontend01.mail.m-online.net (unknown [192.168.8.182]) by mail-out.m-online.net (Postfix) with ESMTP id 4DGpS23Yfkz1rtyg; Thu, 14 Jan 2021 16:40:50 +0100 (CET) Received: from localhost (dynscan1.mnet-online.de [192.168.6.70]) by mail.m-online.net (Postfix) with ESMTP id 4DGpS22F70z1tSQh; Thu, 14 Jan 2021 16:40:50 +0100 (CET) X-Virus-Scanned: amavisd-new at mnet-online.de Received: from mail.mnet-online.de ([192.168.8.182]) by localhost (dynscan1.mail.m-online.net [192.168.6.70]) (amavisd-new, port 10024) with ESMTP id 6NlkZZkTUKf9; Thu, 14 Jan 2021 16:40:48 +0100 (CET) X-Auth-Info: pn6at5sbFuekbBBHDFJ4onEVqLDh8OWuOP45RR5M7vQ= Received: from localhost.localdomain (89-64-25-12.dynamic.chello.pl [89.64.25.12]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.mnet-online.de (Postfix) with ESMTPSA; Thu, 14 Jan 2021 16:40:48 +0100 (CET) From: Lukasz Majewski To: Joseph Myers , Adhemerval Zanella Subject: [PATCH v3] tst: Provide test for timerfd related functions Date: Thu, 14 Jan 2021 16:40:27 +0100 Message-Id: <20210114154027.3240-1-lukma@denx.de> X-Mailer: git-send-email 2.20.1 MIME-Version: 1.0 X-Spam-Status: No, score=-11.2 required=5.0 tests=BAYES_00, GIT_PATCH_0, KAM_DMARC_STATUS, KAM_LAZY_DOMAIN_SECURITY, KAM_SHORT, RCVD_IN_BARRACUDACENTRAL, RCVD_IN_DNSWL_LOW, RCVD_IN_MSPIKE_H3, RCVD_IN_MSPIKE_WL, SPF_HELO_NONE, SPF_NONE, TXREP autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on server2.sourceware.org X-BeenThere: libc-alpha@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Libc-alpha mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Florian Weimer , GNU C Library , Florian Weimer , Alistair Francis Errors-To: libc-alpha-bounces@sourceware.org Sender: "Libc-alpha" This change adds new test to assess functionality of timerfd_* functions. It creates new timer (operates on its file descriptor) and checks if time before and after sleep is between expected values. --- Changes for v2: - Provide extra space before opening '(' in function calls and definitions - Use the xclose instead of close - Remove the abs(diff) call - Refactor the code to replace tabs with spaces Changes for v3: - Use FAIL_EXIT where possible - Remove not needed {} --- sysdeps/unix/sysv/linux/Makefile | 3 +- sysdeps/unix/sysv/linux/tst-timerfd.c | 82 +++++++++++++++++++++++++++ 2 files changed, 84 insertions(+), 1 deletion(-) create mode 100644 sysdeps/unix/sysv/linux/tst-timerfd.c diff --git a/sysdeps/unix/sysv/linux/Makefile b/sysdeps/unix/sysv/linux/Makefile index 6df4779126..7503b356c8 100644 --- a/sysdeps/unix/sysv/linux/Makefile +++ b/sysdeps/unix/sysv/linux/Makefile @@ -107,7 +107,8 @@ tests += tst-clone tst-clone2 tst-clone3 tst-fanotify tst-personality \ tst-quota tst-sync_file_range tst-sysconf-iov_max tst-ttyname \ test-errno-linux tst-memfd_create tst-mlock2 tst-pkey \ tst-rlimit-infinity tst-ofdlocks tst-gettid tst-gettid-kill \ - tst-tgkill tst-sysvsem-linux tst-sysvmsg-linux tst-sysvshm-linux + tst-tgkill tst-sysvsem-linux tst-sysvmsg-linux tst-sysvshm-linux \ + tst-timerfd tests-internal += tst-ofdlocks-compat tst-sigcontext-get_pc CFLAGS-tst-sigcontext-get_pc.c = -fasynchronous-unwind-tables diff --git a/sysdeps/unix/sysv/linux/tst-timerfd.c b/sysdeps/unix/sysv/linux/tst-timerfd.c new file mode 100644 index 0000000000..130650fca2 --- /dev/null +++ b/sysdeps/unix/sysv/linux/tst-timerfd.c @@ -0,0 +1,82 @@ +/* Test for timerfd related functions + Copyright (C) 2021 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#include +#include +#include +#include +#include +#include +#include +#include + +static int +do_test (void) +{ + struct itimerspec settings = { { 2, 0 }, { 2, 0 } }; + struct itimerspec val1, val2; + int fd, ret; + + fd = timerfd_create (CLOCK_REALTIME, 0); + if (fd < 0) + FAIL_EXIT1 ("*** timerfd_create failed: %m"); + + /* Set the timer. */ + ret = timerfd_settime (fd, 0, &settings, NULL); + if (ret != 0) + { + xclose (fd); + FAIL_EXIT1 ("*** timerfd_settime failed: %m\n"); + } + + /* Read the timer just before sleep. */ + ret = timerfd_gettime (fd, &val1); + if (ret != 0) + { + xclose (fd); + FAIL_EXIT1 ("*** timerfd_gettime failed: %m\n"); + } + + /* Sleep for 1 second. */ + ret = usleep (1000000); + if (ret != 0) + { + xclose (fd); + FAIL_EXIT1 ("*** usleep failed: %m\n"); + } + + /* Read the timer just after sleep. */ + ret = timerfd_gettime (fd, &val2); + xclose (fd); + if (ret != 0) + FAIL_EXIT1 ("*** timerfd_gettime failed: %m\n"); + + /* Check difference between timerfd_gettime calls. */ + long long int diff = val2.it_value.tv_sec - val1.it_value.tv_sec; + diff *= 1000000000; + diff += val2.it_value.tv_nsec - val1.it_value.tv_nsec; + /* Subtrack time we have been sleeping (1s). */ + diff -= 1000000000; + + if (diff > 100000000) + FAIL_EXIT1 ("*** The diff between timerfd calls (%lld) is wrong!\n", diff); + + return 0; +} + +#include