addressed comments.

Signed-off-by: doujiang24 <doujiang24@gmail.com>
This commit is contained in:
doujiang24 2023-03-24 09:14:19 +08:00
parent f068245cb5
commit 93dc64ad98
2 changed files with 3 additions and 11 deletions

View File

@ -49,14 +49,6 @@ _cgo_wait_runtime_init_done(void) {
// The key and x_cgo_pthread_key_created are for the whole program, // The key and x_cgo_pthread_key_created are for the whole program,
// whereas the specific and destructor is per thread. // whereas the specific and destructor is per thread.
// We assume pthread_key_create will always succeed, otherwise,
// there might be a very very small race could leads extra M leaking,
// in such case:
// 1. pthread_key_create failed, so x_cgo_pthread_key_created is 0,
// 2. then, it won't bindm in runtime.needAndBindM,
// 3. but, it may skip dropm in runtime.cgocallback,
// when another C thread call pthread_key_create success,
// 4. pthread_key_destructor won't be invoked to dropm when the C thread is exiting.
if (x_cgo_pthread_key_created == 0 && pthread_key_create(&pthread_g, pthread_key_destructor) == 0) { if (x_cgo_pthread_key_created == 0 && pthread_key_create(&pthread_g, pthread_key_destructor) == 0) {
x_cgo_pthread_key_created = 1; x_cgo_pthread_key_created = 1;
} }
@ -88,8 +80,8 @@ _cgo_wait_runtime_init_done(void) {
void x_cgo_bindm(void* g) { void x_cgo_bindm(void* g) {
// We assume this will always succeed, otherwise, there might be extra M leaking, // We assume this will always succeed, otherwise, there might be extra M leaking,
// when a C thread exits after a cgo call. // when a C thread exits after a cgo call.
// Since we only invoke this function once per thread in runtime.needAndBindM, // We only invoke this function once per thread in runtime.needAndBindM,
// and the next calls just reuse the binded m. // and the next calls just reuse the bound m.
pthread_setspecific(pthread_g, g); pthread_setspecific(pthread_g, g);
} }

View File

@ -1965,7 +1965,7 @@ func needm() {
func needAndBindM() { func needAndBindM() {
needm() needm()
if _cgo_pthread_key_created != nil && *(*int)(_cgo_pthread_key_created) != 0 { if _cgo_pthread_key_created != nil && *(*uintptr)(_cgo_pthread_key_created) != 0 {
cgoBindM() cgoBindM()
} }
} }