bpo-41798: Allocate the _curses._C_API on the heap memory. #24186
Conversation
| @@ -4732,9 +4732,28 @@ PyInit__curses(void) | |||
| return NULL; | |||
| ModDict = d; /* For PyCurses_InitScr to use later */ | |||
|
|
|||
| void **PyCurses_API = PyMem_Calloc(PyCurses_API_pointers, sizeof(void *)); | |||
vstinner
Jan 20, 2021
Member
This API is weird. Would you be interested to add a structure of 4 pointers? Something like PyDateTime_CAPI.
The 4 pointers are used by:
#define PyCursesWindow_Type (*(PyTypeObject *) PyCurses_API[0])
#define PyCursesSetupTermCalled {if (! ((int (*)(void))PyCurses_API[1]) () ) return NULL;}
#define PyCursesInitialised {if (! ((int (*)(void))PyCurses_API[2]) () ) return NULL;}
#define PyCursesInitialisedColor {if (! ((int (*)(void))PyCurses_API[3]) () ) return NULL;}
Maybe you can name the 4 members as:
PyTypeObject *Window_Type
int SetupTermCalled(void)
int Initialised(void)
int InitialisedColor(void)
Or I can merge this PR and then you work on a new PR to add a structure. As you want, tell me what do you prefer ;-)
This API is weird. Would you be interested to add a structure of 4 pointers? Something like PyDateTime_CAPI.
The 4 pointers are used by:
#define PyCursesWindow_Type (*(PyTypeObject *) PyCurses_API[0])
#define PyCursesSetupTermCalled {if (! ((int (*)(void))PyCurses_API[1]) () ) return NULL;}
#define PyCursesInitialised {if (! ((int (*)(void))PyCurses_API[2]) () ) return NULL;}
#define PyCursesInitialisedColor {if (! ((int (*)(void))PyCurses_API[3]) () ) return NULL;}
Maybe you can name the 4 members as:
PyTypeObject *Window_Type
int SetupTermCalled(void)
int Initialised(void)
int InitialisedColor(void)
Or I can merge this PR and then you work on a new PR to add a structure. As you want, tell me what do you prefer ;-)
shihai1991
Jan 21, 2021
Author
Member
Or I can merge this PR and then you work on a new PR to add a structure. As you want, tell me what do you prefer ;-)
Oh, I perfer to use another PR to add this structure in this weekend :)
Or I can merge this PR and then you work on a new PR to add a structure. As you want, tell me what do you prefer ;-)
Oh, I perfer to use another PR to add this structure in this weekend :)
| c_api_object = PyCapsule_New(PyCurses_API, PyCurses_CAPSULE_NAME, | ||
| curses_destructor); | ||
| if (c_api_object == NULL) { | ||
| PyMem_Free(PyCurses_API); |
vstinner
Jan 21, 2021
Member
Hum, there is no a refleak here. Does it work to call curses_destructor() here?
Hum, there is no a refleak here. Does it work to call curses_destructor() here?
shihai1991
Jan 22, 2021
Author
Member
Oh, thanks, updated.
Weird. ./python Lib/test/regrtest.py -ucurses test_curses -vv -R 3:3 can not catch this refleak.
Oh, thanks, updated.
Weird. ./python Lib/test/regrtest.py -ucurses test_curses -vv -R 3:3 can not catch this refleak.
shihai1991
Jan 22, 2021
Author
Member
Does it work to call curses_destructor() here?
No, it's can not work because capsule object haven't created
Does it work to call curses_destructor() here?
No, it's can not work because capsule object haven't created
vstinner
Jan 22, 2021
Member
Weird. ./python Lib/test/regrtest.py -ucurses test_curses -vv -R 3:3 can not catch this refleak.
test_curses doesn't test memory allocation failures. See _testcapi.set_nomemory() for that.
Weird. ./python Lib/test/regrtest.py -ucurses test_curses -vv -R 3:3 can not catch this refleak.
test_curses doesn't test memory allocation failures. See _testcapi.set_nomemory() for that.
vstinner
Jan 22, 2021
Member
Ah, and _curses doesn't use multiphase init API yet.
Ah, and _curses doesn't use multiphase init API yet.
shihai1991
Jan 23, 2021
Author
Member
Got it.
Got it.
2f12a1b
into
python:master
https://bugs.python.org/issue41798