From patchwork Sat Jun 27 12:48:24 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ondrej Marek X-Patchwork-Id: 137941 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from vm01.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id A88294BA2E3B for ; Sat, 27 Jun 2026 12:49:01 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org A88294BA2E3B Authentication-Results: sourceware.org; dkim=pass (2048-bit key, unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20251104 header.b=N8oPUXDJ X-Original-To: libc-alpha@sourceware.org Delivered-To: libc-alpha@sourceware.org Received: from mail-wm1-x329.google.com (mail-wm1-x329.google.com [IPv6:2a00:1450:4864:20::329]) by sourceware.org (Postfix) with ESMTPS id 4D44F4BA2E27 for ; Sat, 27 Jun 2026 12:48:30 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 4D44F4BA2E27 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=gmail.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 4D44F4BA2E27 Authentication-Results: sourceware.org; arc=none smtp.remote-ip=2a00:1450:4864:20::329 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1782564510; cv=none; b=WEEJrNUDOlg8gL4wkGAVYD64K2o9ihcMKLZVcfHxg2sTCSX2ls0YRvwJ3tfs2slw1WMar6Z7PzxaemJizH0iuLsBJ/pIbnwFABMr4dYlmX81Ykv/UHW/cd5vph9IABLl1BP9rr5KURbgxilBmBW3ER8sMTigMsptBqTBxcFPQKQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1782564510; c=relaxed/simple; bh=Ng9TOQ8W2lo/i21+tTPH77fHPskjK7A8LNAW9PRhaMw=; h=DKIM-Signature:From:To:Subject:Date:Message-ID:MIME-Version; b=SAzE3e/O2KCX+NQkSwd3SDWf3w4oqWjgiUjbqmyv5HK/DT+J07GEJDePoH20KkLdV/4NjHIaZg0Buntyw2FaAOwTWID6g8xKE9i4IsW+KVgKlKSV4kcXsmKObZQPJL9bsCsEMjkz7oWLDUM6tW6cbt5gL5o9ck6STyha4JR7aoo= ARC-Authentication-Results: i=1; sourceware.org; dkim=pass (2048-bit key, unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20251104 header.b=N8oPUXDJ DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 4D44F4BA2E27 Received: by mail-wm1-x329.google.com with SMTP id 5b1f17b1804b1-490cf322ed0so13450285e9.1 for ; Sat, 27 Jun 2026 05:48:30 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1782564509; x=1783169309; darn=sourceware.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=VZ+lO8bg+kUUJEo8qRM0MAgAHO80IYGPNqrrCC8e51s=; b=N8oPUXDJZW/z5mFcHv1tSLk9xdOgCn2fpaiFgcwhX8SDgCthF6xYI8ri1X434DJtNC GnkSpBWrcUevYHyftbHWwKI/UREDbwHF1O1A8JrU490h061v74ZX8v5Yx8TPwgo19Kit LYVsZ2wpml938Y1k2CVYg1zQV3Vv3MCMQQmUNPxK5Zgp2G3J36Xsjis1As/lMsYdBjza lS7Oc4qtlkmvDIoVpr7gKxqrwBpc0bPrYIpP24XuaGfGb4fydqgSYyR5HC2oZNeG3iR7 WQ/ipAbPRlNWADc5ElNiU/e+d1X+oF+XWwr/fWpemEYO49aQRELQTL36M16WkNQkFlC+ sW0w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1782564509; x=1783169309; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=VZ+lO8bg+kUUJEo8qRM0MAgAHO80IYGPNqrrCC8e51s=; b=WqHhlu6fzaus4M6qHid7pms3dOGpTPoO+KLXKDU3xqaIKVvpSJSqnH5Soam7FNsy9U MDwR1rLH8BtWIEA+FbaEUIZ1VvYBt22dMgGtpkjtL9yLXFYkSn4LGfuQjpv3WjSgaGtF 4aeNgM9szDTHUfS0ywNh8bHN6FEVKlnLL6w/RYo8j3KX7Cq5CwEhPTDfBnbfApfUJXue wdL3egPAkjei00EIIZ5Ku6kF/UBjQdksnhQhECW8rc9uQj6tXTqArkAkQgbInmHJy3A2 G0Dupy1kuTvU084kuOZ06Mg21x3Ev6UpXpM6Wc+e3/BstnXvW2PWhZSLnABmIJZ12jHj o7gQ== X-Gm-Message-State: AOJu0YzGejGkeFcj+lGT2Ch6j22SHU/kKM+lbsG8pK1eJ+zm3nHIMHsX kO1DHajjkp80B+58LNmdvJAHH0FpSM/9ezeUrqDBlZE4GIxoZw+6b09/5kiyhL4Z X-Gm-Gg: AfdE7ckx8G5XWxCqtg7fej4FeQzDqoUcCtp2XsWWIgTd94Xk1G//qhxj0z675hGdDU5 YvC2/aZq1LE3Yyk4m+0vuvYFOSoDiO1i8MWnlRWt1zFdhVOEHHvelFq4et0EepHS9lsJe1tLAis EeY5mV9eriY4+OViO15LoRfnbVnQywMNTIpCny3b2UOX2+z+Wgvay6cC0GBuo6vFVXjNS+d3UOX xs/tnUKJVbgwqBsO/dqcP6hEb9p0fuEtj0kWvu1QZAz5iV7Ohh/MB/NvGZb4I23xbXVfKITWZIi ntfywxelBsME32Q3F5zTejV+O0lmJvqrDw7j5z6hRLncoqE+sHPe2+P7oKvq1vi8bP4wQuI9UP8 kP1MVY8wUkGhDFNledUclnDSOcCrf1XCrT1y0NbFnAMS9Pt6OQIlgBGu7kvwMdHfsZi3bADJ0eI gIWSM6oBk3zNOz/my7mW0Smreni1ckHA== X-Received: by 2002:a05:600c:4512:b0:492:53e2:7712 with SMTP id 5b1f17b1804b1-492668856fdmr166652955e9.21.1782564508719; Sat, 27 Jun 2026 05:48:28 -0700 (PDT) Received: from debian13.fi.muni.cz ([2001:718:801:21a:f1:1ff:fef7:41f]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-46e3d6ba143sm21235349f8f.33.2026.06.27.05.48.28 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 27 Jun 2026 05:48:28 -0700 (PDT) From: Ondrej Marek To: libc-alpha@sourceware.org Cc: collin.funk1@gmail.com, Ondrej Marek , Frantisek Cech Subject: [PATCH] getrusage: Add smoke test for getrusage Date: Sat, 27 Jun 2026 14:48:24 +0200 Message-ID: <20260627124824.109855-1-ondrejm4rek@gmail.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260620090030.96705-1-ondrejm4rek@gmail.com> References: <20260620090030.96705-1-ondrejm4rek@gmail.com> MIME-Version: 1.0 X-Spam-Status: No, score=-12.7 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, FREEMAIL_FROM, GIT_PATCH_0, KAM_SHORT, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP shortcircuit=no autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on sourceware.org X-BeenThere: libc-alpha@sourceware.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Libc-alpha mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: libc-alpha-bounces~patchwork=sourceware.org@sourceware.org Add smoke test verifying that getrusage returns non-negative user time and fails with invalid who value. Co-authored-by: Frantisek Cech Signed-off-by: Ondrej Marek --- v2: - use volatile variables to prevent compiler from optimizing away the loop - RUSAGE_CHILDREN test forks new processes - use both fields of timeval struct for elapsed time comparison resource/Makefile | 1 + resource/tst-getrusage.c | 139 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 140 insertions(+) create mode 100644 resource/tst-getrusage.c diff --git a/resource/Makefile b/resource/Makefile index 589b73f44f..dac48434dd 100644 --- a/resource/Makefile +++ b/resource/Makefile @@ -28,6 +28,7 @@ routines := getrlimit setrlimit getrlimit64 setrlimit64 getrusage ulimit \ tests := \ bug-ulimit1 \ tst-getrlimit \ + tst-getrusage \ # tests diff --git a/resource/tst-getrusage.c b/resource/tst-getrusage.c new file mode 100644 index 0000000000..c50456b9bc --- /dev/null +++ b/resource/tst-getrusage.c @@ -0,0 +1,139 @@ +/* Test of the getrusage function. + Copyright (C) 2005-2026 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 +get_child_elapsed_time (long *result) +{ + pid_t pid; + pid = fork (); + + if (pid == -1) + { + perror ("Fork failed"); + return 1; + } + else if (pid > 0) + { + int status; + if (waitpid (pid, &status, 0) == -1) + { + perror ("waitpid"); + return 1; + } + + if (!WIFEXITED (status)) + { + puts ("An error occured in the child process\n"); + return 1; + } + + struct rusage rusage = { 0 }; + + int ret_val = getrusage (RUSAGE_CHILDREN, &rusage); + TEST_VERIFY_EXIT (ret_val == 0); + long elapsed_time = (rusage.ru_utime.tv_sec * 1000000L) + rusage.ru_utime.tv_usec; + TEST_VERIFY_EXIT (elapsed_time >= 0); + + *result = elapsed_time; + return 0; + } + else + { + /* Simulate some work */ + volatile unsigned long long sink = 0; + + for (unsigned long long i = 0; i < 1000000000ULL; i++) { + sink += i; + } + + _exit(0); + } +} + +static void +test_getrusage_children (void) +{ + long elapsed_time_before; + long elapsed_time_after; + + int ret_val = get_child_elapsed_time (&elapsed_time_before); + TEST_VERIFY_EXIT (ret_val == 0); + int ret_val2 = get_child_elapsed_time (&elapsed_time_after); + TEST_VERIFY_EXIT (ret_val2 == 0); + TEST_VERIFY_EXIT (elapsed_time_after >= elapsed_time_before); +} + +static void +test_getrusage (int who) +{ + struct rusage before_usage = { 0 }; + struct rusage after_usage = { 0 }; + + int ret_val = getrusage (who, &before_usage); + TEST_VERIFY_EXIT (ret_val == 0); + long elapsed_time_before = (before_usage.ru_utime.tv_sec * 1000000L) + before_usage.ru_utime.tv_usec; + TEST_VERIFY_EXIT (elapsed_time_before >= 0); + + /* Simulate some work */ + volatile unsigned long long sink = 0; + + for (unsigned long long i = 0; i < 1000000000ULL; i++) + { + sink += i; + } + + int ret_val2 = getrusage (who, &after_usage); + TEST_VERIFY_EXIT (ret_val2 == 0); + + long elapsed_time_after = (after_usage.ru_utime.tv_sec * 1000000L) + after_usage.ru_utime.tv_usec; + TEST_VERIFY_EXIT (elapsed_time_after >= elapsed_time_before); +} + +static int +do_test (void) +{ + int whos[] = { RUSAGE_SELF, RUSAGE_THREAD }; + for (int i = 0; i < sizeof (whos) / sizeof (int); i++) + { + int who = whos[i]; + test_getrusage (who); + } + + /* RUSAGE_CHILDREN test case with forking children */ + test_getrusage_children (); + + /* Invalid who value test case */ + struct rusage usage_struct = { 0 }; + int invalid_who = 999; + int ret_val = getrusage (invalid_who, &usage_struct); + TEST_VERIFY (ret_val == -1); + + puts ("Everything OK\n"); + return 0; +} + +#include