diff --git a/Doc/library/_thread.rst b/Doc/library/_thread.rst index ed29ac70035597..1d00d05817eb6a 100644 --- a/Doc/library/_thread.rst +++ b/Doc/library/_thread.rst @@ -120,13 +120,16 @@ This module defines the following constants and functions: Its value may be used to uniquely identify this particular thread system-wide (until the thread terminates, after which the value may be recycled by the OS). - .. availability:: Windows, FreeBSD, Linux, macOS, OpenBSD, NetBSD, AIX, DragonFlyBSD, GNU/kFreeBSD. + .. availability:: Windows, FreeBSD, Linux, macOS, OpenBSD, NetBSD, AIX, DragonFlyBSD, GNU/kFreeBSD, Solaris. .. versionadded:: 3.8 .. versionchanged:: 3.13 Added support for GNU/kFreeBSD. + .. versionchanged:: next + Added support for Solaris. + .. function:: stack_size([size]) diff --git a/Doc/library/threading.rst b/Doc/library/threading.rst index cabb41442f8419..9a0aeb7c1287ee 100644 --- a/Doc/library/threading.rst +++ b/Doc/library/threading.rst @@ -191,13 +191,16 @@ This module defines the following functions: Its value may be used to uniquely identify this particular thread system-wide (until the thread terminates, after which the value may be recycled by the OS). - .. availability:: Windows, FreeBSD, Linux, macOS, OpenBSD, NetBSD, AIX, DragonFlyBSD, GNU/kFreeBSD. + .. availability:: Windows, FreeBSD, Linux, macOS, OpenBSD, NetBSD, AIX, DragonFlyBSD, GNU/kFreeBSD, Solaris. .. versionadded:: 3.8 .. versionchanged:: 3.13 Added support for GNU/kFreeBSD. + .. versionchanged:: next + Added support for Solaris. + .. function:: enumerate() diff --git a/Include/pythread.h b/Include/pythread.h index 82247daf8e0aa0..a8a28b8572acb6 100644 --- a/Include/pythread.h +++ b/Include/pythread.h @@ -42,7 +42,8 @@ PyAPI_FUNC(unsigned long) PyThread_get_thread_ident(void); #if (defined(__APPLE__) || defined(__linux__) || defined(_WIN32) \ || defined(__FreeBSD__) || defined(__FreeBSD_kernel__) \ || defined(__OpenBSD__) || defined(__NetBSD__) \ - || defined(__DragonFly__) || defined(_AIX)) + || defined(__DragonFly__) || defined(_AIX) \ + || (defined(__sun__) && SIZEOF_LONG >= 8)) #define PY_HAVE_THREAD_NATIVE_ID PyAPI_FUNC(unsigned long) PyThread_get_thread_native_id(void); #endif diff --git a/Lib/calendar.py b/Lib/calendar.py index fd6c561a9d39b8..678c7be5aac094 100644 --- a/Lib/calendar.py +++ b/Lib/calendar.py @@ -378,7 +378,7 @@ def formatweekday(self, day, width): """ Returns a formatted week day name. """ - if width >= 9: + if width >= max(map(len, day_name)): names = day_name else: names = day_abbr diff --git a/Lib/test/test_calendar.py b/Lib/test/test_calendar.py index 589a21baf7bd61..410063e01582f9 100644 --- a/Lib/test/test_calendar.py +++ b/Lib/test/test_calendar.py @@ -696,6 +696,52 @@ def test_locale_calendar_formatweekday(self): except locale.Error: raise unittest.SkipTest('cannot set the en_US locale') + # These locales have weekday names all shorter than English's longest + # 'Wednesday'. They should not be abbreviated unnecessarily + @support.run_with_locales("LC_ALL", + 'Chinese', 'zh_CN.UTF-8', + 'French', 'fr_FR.UTF-8', + 'Norwegian', 'nb_NO.UTF-8', + 'Malay', 'ms_MY.UTF8' + ) + def test_locale_calendar_short_weekday_names(self): + names = (datetime.date(2001, 1, i+1).strftime('%A') for i in range(7)) + max_length = max(map(len, names)) + if max_length >= 9: + self.skipTest('weekday names are too long') + + def get_weekday_names(width): + return calendar.TextCalendar().formatweekheader(width).split() + + # Weekday names should not be abbreviated if the width is sufficient + self.assertEqual( + get_weekday_names(max_length), + get_weekday_names(max_length + 10) + ) + + # Any width shorter than necessary should produce abbreviations + self.assertNotEqual( + get_weekday_names(max_length), + get_weekday_names(max_length - 1) + ) + + # These locales have a weekday name longer than 'Wednesday' + # They should be properly abbreviated rather than truncated + @support.run_with_locales("LC_ALL", + 'Portuguese', 'pt_PT.UTF-8', + 'German', 'de_DE.UTF-8', + 'Russian', 'ru_RU.UTF-8', + ) + def test_locale_calendar_long_weekday_names(self): + names = (datetime.date(2001, 1, i+1).strftime('%A') for i in range(7)) + max_length = max(map(len, names)) + if max_length <= 9: + self.skipTest('weekday names are too short') + + def get_weekday_names(width): + return calendar.TextCalendar().formatweekheader(width).split() + self.assertEqual(get_weekday_names(4), get_weekday_names(9)) + def test_locale_calendar_formatmonthname(self): try: # formatmonthname uses the same month names regardless of the width argument. diff --git a/Misc/NEWS.d/next/Library/2025-08-06-16-54-22.gh-issue-137481.eSTkK0.rst b/Misc/NEWS.d/next/Library/2025-08-06-16-54-22.gh-issue-137481.eSTkK0.rst new file mode 100644 index 00000000000000..57d8d0521e39aa --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-08-06-16-54-22.gh-issue-137481.eSTkK0.rst @@ -0,0 +1,2 @@ +Calendar uses the lengths of the locale's weekdays to decide if the width +requires abbreviation. diff --git a/Misc/NEWS.d/next/Library/2025-08-19-00-12-57.gh-issue-137884.4faCA_.rst b/Misc/NEWS.d/next/Library/2025-08-19-00-12-57.gh-issue-137884.4faCA_.rst new file mode 100644 index 00000000000000..c28f62ba3ce7b7 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-08-19-00-12-57.gh-issue-137884.4faCA_.rst @@ -0,0 +1,2 @@ +Add :func:`threading.get_native_id` support for Illumos/Solaris. Patch by +Yüce Tekol. diff --git a/Python/thread_pthread.h b/Python/thread_pthread.h index 13992f95723866..8496f91db2eec2 100644 --- a/Python/thread_pthread.h +++ b/Python/thread_pthread.h @@ -30,6 +30,8 @@ # include /* _lwp_self() */ #elif defined(__DragonFly__) # include /* lwp_gettid() */ +#elif defined(__sun__) && SIZEOF_LONG >= 8 +# include #endif /* The POSIX spec requires that use of pthread_attr_setstacksize @@ -399,6 +401,8 @@ PyThread_get_thread_native_id(void) #elif defined(__DragonFly__) lwpid_t native_id; native_id = lwp_gettid(); +#elif defined(__sun__) && SIZEOF_LONG >= 8 + unsigned long native_id = (unsigned long)getpid() << 32 | thr_self(); #endif return (unsigned long) native_id; }