From 1caa970b32f931f0ea65df8e63d3bbc1ae2bc28e Mon Sep 17 00:00:00 2001 From: alperyoney Date: Thu, 4 Sep 2025 08:05:03 -0700 Subject: [PATCH 1/2] gh-116738: Test resource module on FT Python build --- Lib/test/test_free_threading/test_resource.py | 41 +++++++++++++++++++ Modules/resource.c | 6 +-- 2 files changed, 44 insertions(+), 3 deletions(-) create mode 100644 Lib/test/test_free_threading/test_resource.py diff --git a/Lib/test/test_free_threading/test_resource.py b/Lib/test/test_free_threading/test_resource.py new file mode 100644 index 00000000000000..ecd0e535c442b4 --- /dev/null +++ b/Lib/test/test_free_threading/test_resource.py @@ -0,0 +1,41 @@ +import unittest +from test.support import import_helper, threading_helper + +resource = import_helper.import_module("resource") + + +NTHREADS = 10 +LOOP_PER_THREAD = 1000 + + +@threading_helper.requires_working_threading() +class ResourceTest(unittest.TestCase): + @unittest.skipUnless(hasattr(resource, "getrusage"), "needs getrusage") + @unittest.skipUnless( + hasattr(resource, "RUSAGE_THREAD"), "needs RUSAGE_THREAD" + ) + def test_getrusage(self): + ru_utime_lst = [] + + def dummy_work(ru_utime_lst): + for _ in range(LOOP_PER_THREAD): + pass + + usage_process = resource.getrusage(resource.RUSAGE_SELF) + usage_thread = resource.getrusage(resource.RUSAGE_THREAD) + # Process user time should be greater than thread user time + self.assertGreater(usage_process.ru_utime, usage_thread.ru_utime) + ru_utime_lst.append(usage_thread.ru_utime) + + threading_helper.run_concurrently( + worker_func=dummy_work, args=(ru_utime_lst,), nthreads=NTHREADS + ) + + usage_process = resource.getrusage(resource.RUSAGE_SELF) + self.assertEqual(len(ru_utime_lst), NTHREADS) + # Process user time should be greater than sum of all thread user times + self.assertGreater(usage_process.ru_utime, sum(ru_utime_lst)) + + +if __name__ == "__main__": + unittest.main() diff --git a/Modules/resource.c b/Modules/resource.c index a463355f424d48..b3f4f6c5598599 100644 --- a/Modules/resource.c +++ b/Modules/resource.c @@ -364,10 +364,10 @@ resource_getpagesize_impl(PyObject *module) /*[clinic end generated code: output=9ba93eb0f3d6c3a9 input=546545e8c1f42085]*/ { long pagesize = 0; -#if defined(HAVE_GETPAGESIZE) - pagesize = getpagesize(); -#elif defined(HAVE_SYSCONF) && defined(_SC_PAGE_SIZE) +#if defined(HAVE_SYSCONF) && defined(_SC_PAGE_SIZE) pagesize = sysconf(_SC_PAGE_SIZE); +#elif defined(HAVE_GETPAGESIZE) + pagesize = getpagesize(); #else # error "unsupported platform: resource.getpagesize()" #endif From 7ab0c233120a3af0a8ff37c3f4814f7364090282 Mon Sep 17 00:00:00 2001 From: alperyoney Date: Mon, 8 Sep 2025 09:47:36 -0700 Subject: [PATCH 2/2] gh-116738: Remove pagesize() change --- Modules/resource.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Modules/resource.c b/Modules/resource.c index b3f4f6c5598599..a463355f424d48 100644 --- a/Modules/resource.c +++ b/Modules/resource.c @@ -364,10 +364,10 @@ resource_getpagesize_impl(PyObject *module) /*[clinic end generated code: output=9ba93eb0f3d6c3a9 input=546545e8c1f42085]*/ { long pagesize = 0; -#if defined(HAVE_SYSCONF) && defined(_SC_PAGE_SIZE) - pagesize = sysconf(_SC_PAGE_SIZE); -#elif defined(HAVE_GETPAGESIZE) +#if defined(HAVE_GETPAGESIZE) pagesize = getpagesize(); +#elif defined(HAVE_SYSCONF) && defined(_SC_PAGE_SIZE) + pagesize = sysconf(_SC_PAGE_SIZE); #else # error "unsupported platform: resource.getpagesize()" #endif