Skip to content

Commit 0d2f66f

Browse files
committed
build: Engage with GC for rest of the heap types
1 parent 7df09fc commit 0d2f66f

3 files changed

Lines changed: 46 additions & 0 deletions

File tree

Modules/constants.c

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,44 @@ LDAPerror(PyObject *m, LDAP *l)
179179
return LDAPraise_for_message(m, l, NULL);
180180
}
181181

182+
/* GC protocol for heap types */
183+
int
184+
LDAPMod_traverse(PyObject *m, visitproc visit, void *arg)
185+
{
186+
LDAPModState *state = PyModule_GetState(m);
187+
size_t i = 0;
188+
189+
Py_VISIT(state->ldap_type);
190+
Py_VISIT(state->exception_class);
191+
for ( ; i < sizeof(state->errobjects)/sizeof(state->errobjects[0]); i++ ) {
192+
Py_VISIT(state->errobjects[i]);
193+
}
194+
195+
return 0;
196+
}
197+
198+
int
199+
LDAPMod_clear(PyObject *m)
200+
{
201+
LDAPModState *state = PyModule_GetState(m);
202+
size_t i = 0;
203+
204+
Py_CLEAR(state->ldap_type);
205+
Py_CLEAR(state->exception_class);
206+
for ( ; i < sizeof(state->errobjects)/sizeof(state->errobjects[0]); i++ ) {
207+
Py_CLEAR(state->errobjects[i]);
208+
}
209+
210+
return 0;
211+
}
212+
213+
/* destructor */
214+
void
215+
LDAPMod_free(void *m)
216+
{
217+
LDAPMod_clear(m);
218+
}
219+
182220
/* initialise the module constants */
183221

184222
int

Modules/ldapmodule.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,9 @@ static struct PyModuleDef ldap_moduledef = {
6767
.m_size = sizeof(LDAPModState),
6868
.m_methods = ldap_functions,
6969
.m_slots = ldap_slots,
70+
.m_traverse = LDAPMod_traverse,
71+
.m_clear = LDAPMod_clear,
72+
.m_free = LDAPMod_free,
7073
};
7174
struct PyModuleDef *LDAPMod_moduledef;
7275

Modules/pythonldap.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,11 @@ typedef struct LDAPModState {
119119
PyObject *errobjects[LDAP_ERROR_MAX - LDAP_ERROR_MIN + 1];
120120
} LDAPModState;
121121

122+
/* *** module level state *** */
123+
PYLDAP_FUNC(int) LDAPMod_traverse(PyObject *, visitproc, void *);
124+
PYLDAP_FUNC(int) LDAPMod_clear(PyObject *);
125+
PYLDAP_FUNC(void) LDAPMod_free(void *);
126+
122127
/* *** ldapcontrol *** */
123128
PYLDAP_FUNC(void) LDAPControl_List_DEL(LDAPControl **);
124129
PYLDAP_FUNC(int) LDAPControls_from_object(PyObject *, LDAPControl ***);

0 commit comments

Comments
 (0)