Changeset: 123afa9e1bf0 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=123afa9e1bf0 Modified Files: monetdb5/extras/pyapi/pyapi.c Branch: pyapi Log Message:
Fix memory leak in parallel aggregations. diffs (66 lines): diff --git a/monetdb5/extras/pyapi/pyapi.c b/monetdb5/extras/pyapi/pyapi.c --- a/monetdb5/extras/pyapi/pyapi.c +++ b/monetdb5/extras/pyapi/pyapi.c @@ -106,6 +106,7 @@ struct _AggrParams{ str **args; PyObject **connection; PyObject **function; + PyObject **column_types_dict; str *pycall; str msg; size_t base; @@ -1171,6 +1172,7 @@ str PyAPIeval(Client cntxt, MalBlkPtr mb params->group_count = group_count; params->group_counts = &group_counts; params->pyinput_values = &pyinput_values; + params->column_types_dict = &pColumnTypes; params->split_bats = &split_bats; params->base = pci->retc + 2; params->function = &pFunc; @@ -2920,7 +2922,6 @@ PyObject* ComputeParallelAggregation(Agg // we first have to construct new PyObject *pArgsPartial = PyTuple_New(p->named_columns + p->additional_columns + 3); PyObject *pColumnsPartial = PyDict_New(); - PyObject *pColumnTypesPartial = PyDict_New(); PyObject *result; size_t group_elements = (*p->group_counts)[group_it]; ai = 0; @@ -2944,28 +2945,25 @@ PyObject* ComputeParallelAggregation(Agg return NULL; } } - // fill in _columns and _column_types arrays - { - PyObject *arg_type = PyString_FromString(BatType_Format(input.bat_type)); - PyDict_SetItemString(pColumnsPartial, (*p->args)[p->base + i], vararray); - PyDict_SetItemString(pColumnTypesPartial, (*p->args)[p->base + i], arg_type); - } + // fill in _columns array + PyDict_SetItemString(pColumnsPartial, (*p->args)[p->base + i], vararray); PyTuple_SetItem(pArgsPartial, ai++, vararray); } + // hacky fix because unnamed arguments (aggr_group, etc) are expected by the function, but we don't want to pass them + PyTuple_SetItem(pArgsPartial, ai++, Py_None); Py_INCREF(Py_None); + PyTuple_SetItem(pArgsPartial, ai++, Py_None); Py_INCREF(Py_None); + PyTuple_SetItem(pArgsPartial, ai++, Py_None); Py_INCREF(Py_None); + // additional parameters PyTuple_SetItem(pArgsPartial, ai++, pColumnsPartial); - PyTuple_SetItem(pArgsPartial, ai++, pColumnTypesPartial); - PyTuple_SetItem(pArgsPartial, ai++, *p->connection); - - // hacky fix because unnamed arguments (aggr_group, etc) are expected by the function, but we don't want to pass them - PyTuple_SetItem(pArgsPartial, ai++, Py_None); Py_INCREF(Py_None); - PyTuple_SetItem(pArgsPartial, ai++, Py_None); Py_INCREF(Py_None); - PyTuple_SetItem(pArgsPartial, ai++, Py_None); Py_INCREF(Py_None); + PyTuple_SetItem(pArgsPartial, ai++, *p->column_types_dict); Py_INCREF(*p->column_types_dict); + PyTuple_SetItem(pArgsPartial, ai++, *p->connection); Py_INCREF(*p->connection); // call the aggregation function result = PyObject_CallObject(*p->function, pArgsPartial); + Py_DECREF(pArgsPartial); if (result == NULL) { p->msg = PyError_CreateException("Python exception", *p->pycall); _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list