| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
Sorry, something went wrong.
Implement set_name() with SetThreadDescription() and _get_name() with GetThreadDescription(). If SetThreadDescription() or GetThreadDescription() is not available in kernelbase.dll, delete the method when the _thread module is imported. Truncate the thread name to an arbitrary limit of 64 characters. set_name() raises ValueError if the name contains an embedded null character. Co-authored-by: Eryk Sun <eryksun@gmail.com>
|
Code based on @eryksun's code: #59705 (comment). Differences with his code:
I copied this limit from @eryksun's code. Maybe it can be extended to 32766 characters?
If it's a blocker issue, I can write the code differently to truncate to the first null character instead. |
Sorry, something went wrong.
Sorry, something went wrong.
I misunderstood the code, in fact, the name is truncated at the first null character (ValueError is not raised): same behavior than Linux/macOS/FreeBSD/etc. |
Sorry, something went wrong.
Sorry, something went wrong.
|
The alternative to SetThreadDescription() (Windows 10 and newer) is to call RaiseException(0x406D1388, ...). Example: msys2-contrib/mingw-w64@0d95c79. From what I understsood, RaiseException(...) is only understood by debuggers. The Process Explorer tool doesn't show thread names. |
Sorry, something went wrong.
|
I'm not familiar with Windows API, but this looks right to me. A review from @python/windows-team would be great though :) (Specifically: this is a best-effort attempt to add info to aid debugging or understanding what's going on in a system: we want to as much as we reasonably can to the OS, but it's OK drop part of the name or not set it at all, and errors should be discarded since the user didn't really ask for this. And _get_name is private (test-only); this is not a reliable API to get back a Python string.) |
Sorry, something went wrong.
|
I plan to merge this change at the beginning of next week (January 20th). |
Sorry, something went wrong.
|
I fixed the truncation for surrogate pairs and I added tests with non-BMP characters (creating surrogate pairs on Windows). |
Sorry, something went wrong.
There was a problem hiding this comment.
I am not a Windows expert, but the code LGTM. Although I am not sure that we should set such small artificial limit.
There are also some issues in tests.
Sorry, something went wrong.
There was a problem hiding this comment.
LGTM.
Sorry, something went wrong.
Ok, I increased the limit from 64 to 32766 characters. |
Sorry, something went wrong.
|
Thanks for the reviews. I enabled auto-merge. |
Sorry, something went wrong.
|
|
||
| #ifdef MS_WINDOWS | ||
| HMODULE kernelbase = GetModuleHandleW(L"kernelbase.dll"); | ||
| if (kernelbase != NULL) { |
There was a problem hiding this comment.
If this check fails, we likely want to report a system error since everything is broken, but at least we should call DelAttr to remove the functions, since the function pointers will be null.
Sorry, something went wrong.
There was a problem hiding this comment.
set_name()/_get_name() is a minor feature of the _thread module, I would prefer to not prevent to import _thread if loading kernelbase.dll fails for whatever reason.
but at least we should call DelAttr to remove the functions, since the function pointers will be null.
Oops, my code was wrong. Fixed.
Sorry, something went wrong.
|
|
||
| // Truncate the thread name to 64 characters. The OS limit is 32766 wide | ||
| // characters, but long names aren't of practical use. | ||
| #define PYTHREAD_NAME_MAXLEN 64 |
There was a problem hiding this comment.
There's no reason for us to artificially limit this at all, but I'd rather be much closer to the real limit than this. "Aren't of practical use" is a value judgement, not a technical limit.
Also, there's no C API for this, so we probably don't need a public C constant for the limit.
Sorry, something went wrong.
There was a problem hiding this comment.
I changed the limit to 32766 characters.
Sorry, something went wrong.
There was a problem hiding this comment.
Also, there's no C API for this, so we probably don't need a public C constant for the limit.
I can rename the macro use _Py prefix. But that unrelated to the Windows implementation, so I would prefer to do it in a separated change. Non-Windows platforms use the same macro.
Sorry, something went wrong.
There was a problem hiding this comment.
Also, there's no C API for this, so we probably don't need a public C constant for the limit.
I created #128945 to make the macro private.
Sorry, something went wrong.
Remove the module methods if GetModuleHandleW() fails.
|
@zooba: Please review the updated PR. I fixed thread_module_exec() to remove the module methods if GetModuleHandleW() fails. |
Sorry, something went wrong.
|
LGTM |
Sorry, something went wrong.
|
Merged. Thanks for reviews. |
Sorry, something went wrong.
Implement set_name() with SetThreadDescription() and _get_name() with GetThreadDescription(). If SetThreadDescription() or GetThreadDescription() is not available in kernelbase.dll, delete the method when the _thread module is imported. Truncate the thread name to 32766 characters. Co-authored-by: Eryk Sun <eryksun@gmail.com>
| Back | FazBrowse Home | New Git URL |
Implement set_name() with SetThreadDescription() and _get_name() with GetThreadDescription(). If SetThreadDescription() or GetThreadDescription() is not available in kernelbase.dll, delete the method when the _thread module is imported.
Truncate the thread name to 32766 characters.
set_name() raises ValueError if the name contains an embedded null character.