473,289 Members | 1,959 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,289 software developers and data experts.

C Wrapper Function, crashing Python?

static PyObject *wrap_doStuff(PyObject *self, PyObject *args) {
// this will store the result in a Python object
PyObject *finalResult;

// get arguments from Python
char *result = 0;
char *in= 0;
char *aString = 0;
char *bString = 0;
MY_NUM *a;
MY_NUM *b;
int ok = PyArg_ParseTuple(args, "sss", &in, &aString, &bString);
if (!ok) return 0;

// do work to get a and b
// count - returns an int; GetVal - returns a char *
a = GetVal(aString, count(aString, ","));
b = GetVal(bString, count(bString, ","));

// make function call, which returns a char *
result = doStuff(in, a, b);

// save result in Python string
finalResult = PyString_FromString(result);

// free memory
PyMem_Free(result);
PyMem_Free(a);
PyMem_Free(b);

// return the result as a Python string
return finalResult;
}

....from python I can call this function 4 times...works fine. WHen I
call it for the fifth time python.exe crashes. im thinking some memory
problem in the wrapper function perhaps...but I am not sure. The
actually C function, doStuff can be called 5, 6,7...N times without a
problem
so i know its gotta be my wrapper.

Any ideas? Thanks!

Oct 12 '05 #1
14 2691
update:
if I use C's free(result), free(a) free(b) instead of PyMem_Free...I
only get one successfuly use/call of doStuff.

i.e.
// this works
doStuff(...)

// python crashes here
doStuff(...)

Java and Swing wrote:
static PyObject *wrap_doStuff(PyObject *self, PyObject *args) {
// this will store the result in a Python object
PyObject *finalResult;

// get arguments from Python
char *result = 0;
char *in= 0;
char *aString = 0;
char *bString = 0;
MY_NUM *a;
MY_NUM *b;
int ok = PyArg_ParseTuple(args, "sss", &in, &aString, &bString);
if (!ok) return 0;

// do work to get a and b
// count - returns an int; GetVal - returns a char *
a = GetVal(aString, count(aString, ","));
b = GetVal(bString, count(bString, ","));

// make function call, which returns a char *
result = doStuff(in, a, b);

// save result in Python string
finalResult = PyString_FromString(result);

// free memory
PyMem_Free(result);
PyMem_Free(a);
PyMem_Free(b);

// return the result as a Python string
return finalResult;
}

...from python I can call this function 4 times...works fine. WHen I
call it for the fifth time python.exe crashes. im thinking some memory
problem in the wrapper function perhaps...but I am not sure. The
actually C function, doStuff can be called 5, 6,7...N times without a
problem
so i know its gotta be my wrapper.

Any ideas? Thanks!


Oct 12 '05 #2
one more update...

if I remove PyMem_Free and free(...) ...so no memory clean up...I can
still only call doStuff 4 times, the 5th attemp crashes Python.

Java and Swing wrote:
update:
if I use C's free(result), free(a) free(b) instead of PyMem_Free...I
only get one successfuly use/call of doStuff.

i.e.
// this works
doStuff(...)

// python crashes here
doStuff(...)

Java and Swing wrote:
static PyObject *wrap_doStuff(PyObject *self, PyObject *args) {
// this will store the result in a Python object
PyObject *finalResult;

// get arguments from Python
char *result = 0;
char *in= 0;
char *aString = 0;
char *bString = 0;
MY_NUM *a;
MY_NUM *b;
int ok = PyArg_ParseTuple(args, "sss", &in, &aString, &bString);
if (!ok) return 0;

// do work to get a and b
// count - returns an int; GetVal - returns a char *
a = GetVal(aString, count(aString, ","));
b = GetVal(bString, count(bString, ","));

// make function call, which returns a char *
result = doStuff(in, a, b);

// save result in Python string
finalResult = PyString_FromString(result);

// free memory
PyMem_Free(result);
PyMem_Free(a);
PyMem_Free(b);

// return the result as a Python string
return finalResult;
}

...from python I can call this function 4 times...works fine. WHen I
call it for the fifth time python.exe crashes. im thinking some memory
problem in the wrapper function perhaps...but I am not sure. The
actually C function, doStuff can be called 5, 6,7...N times without a
problem
so i know its gotta be my wrapper.

Any ideas? Thanks!


Oct 12 '05 #3
Op 2005-10-12, Java and Swing schreef <co*******@gmail.com>:
static PyObject *wrap_doStuff(PyObject *self, PyObject *args) {
// this will store the result in a Python object
PyObject *finalResult;

// get arguments from Python
char *result = 0;
char *in= 0;
char *aString = 0;
char *bString = 0;
MY_NUM *a;
MY_NUM *b;
int ok = PyArg_ParseTuple(args, "sss", &in, &aString, &bString);
if (!ok) return 0;

// do work to get a and b
// count - returns an int; GetVal - returns a char *
a = GetVal(aString, count(aString, ","));
b = GetVal(bString, count(bString, ","));

// make function call, which returns a char *
result = doStuff(in, a, b);

// save result in Python string
finalResult = PyString_FromString(result);

// free memory
PyMem_Free(result);
PyMem_Free(a);
PyMem_Free(b);

// return the result as a Python string
return finalResult;
}

...from python I can call this function 4 times...works fine. WHen I
call it for the fifth time python.exe crashes. im thinking some memory
problem in the wrapper function perhaps...but I am not sure. The
actually C function, doStuff can be called 5, 6,7...N times without a
problem
so i know its gotta be my wrapper.

Any ideas? Thanks!


Well assuming your doStuff is a C function that knows nothing of python.
it might be the PyMem_Free(result).
http://docs.python.org/api/memoryInterface.html says the following:

void PyMem_Free(void *p)
Frees the memory block pointed to by p, which must have been
returned by a previous call to PyMem_Malloc() or PyMem_Realloc().
Otherwise, or if PyMem_Free(p) has been called before, undefined
behavior occurs. If p is NULL, no operation is performed.

But your result wasn't allocated by a PyMem_Malloc, it was returned
to you by a C function.

--
Antoon Pardon
Oct 12 '05 #4
Antoon,
I just saw that to. I updated the code like so...

static PyObject *wrap_doStuff(PyObject *self, PyObject *args) {
// this will store the result in a Python object
PyObject *finalResult;

// get arguments from Python
char *result = 0;
char *in= 0;
char *aString = 0;
char *bString = 0;
MY_NUM *a = (MY_NUM *) PyMem_Malloc((20 * sizeof(MY_NUM) + 1); //
the array will be 20 long
MY_NUM *b = (MY_NUM *) PyMem_Malloc((20 * sizeof(MY_NUM) + 1); //
the array will be 20 long
int ok = PyArg_ParseTuple(args, "sss", &in, &aString, &bString);
if (!ok) return 0;

// do work to get a and b
// count - returns an int; GetVal - returns a MY_NUM * (a pointer
to a MY_NUM array)
a = GetVal(aString, count(aString, ","));
b = GetVal(bString, count(bString, ","));

// make function call, which returns a char *
result = doStuff(in, a, b);

// save result in Python string
finalResult = PyString_FromString(result);

// free memory
PyMem_Free(a);
PyMem_Free(b);
free(aString);
free(bString);
free(result);

// return the result as a Python string
return finalResult;
}

...as you can see, i malloc'ed memory, and free'd the memory. However,
I still have python crashing (after only 3 successful calls to
doStuff). And yes, doStuff is a plain C function...nothing related to
Python.
Antoon Pardon wrote:
Op 2005-10-12, Java and Swing schreef <co*******@gmail.com>:
static PyObject *wrap_doStuff(PyObject *self, PyObject *args) {
// this will store the result in a Python object
PyObject *finalResult;

// get arguments from Python
char *result = 0;
char *in= 0;
char *aString = 0;
char *bString = 0;
MY_NUM *a;
MY_NUM *b;
int ok = PyArg_ParseTuple(args, "sss", &in, &aString, &bString);
if (!ok) return 0;

// do work to get a and b
// count - returns an int; GetVal - returns a char *
a = GetVal(aString, count(aString, ","));
b = GetVal(bString, count(bString, ","));

// make function call, which returns a char *
result = doStuff(in, a, b);

// save result in Python string
finalResult = PyString_FromString(result);

// free memory
PyMem_Free(result);
PyMem_Free(a);
PyMem_Free(b);

// return the result as a Python string
return finalResult;
}

...from python I can call this function 4 times...works fine. WHen I
call it for the fifth time python.exe crashes. im thinking some memory
problem in the wrapper function perhaps...but I am not sure. The
actually C function, doStuff can be called 5, 6,7...N times without a
problem
so i know its gotta be my wrapper.

Any ideas? Thanks!


Well assuming your doStuff is a C function that knows nothing of python.
it might be the PyMem_Free(result).
http://docs.python.org/api/memoryInterface.html says the following:

void PyMem_Free(void *p)
Frees the memory block pointed to by p, which must have been
returned by a previous call to PyMem_Malloc() or PyMem_Realloc().
Otherwise, or if PyMem_Free(p) has been called before, undefined
behavior occurs. If p is NULL, no operation is performed.

But your result wasn't allocated by a PyMem_Malloc, it was returned
to you by a C function.

--
Antoon Pardon


Oct 12 '05 #5
Antoon,
I just saw that to. I updated the code like so...

static PyObject *wrap_doStuff(PyObject *self, PyObject *args) {
// this will store the result in a Python object
PyObject *finalResult;

// get arguments from Python
char *result = 0;
char *in= 0;
char *aString = 0;
char *bString = 0;
MY_NUM *a = (MY_NUM *) PyMem_Malloc((20 * sizeof(MY_NUM) + 1); //
the array will be 20 long
MY_NUM *b = (MY_NUM *) PyMem_Malloc((20 * sizeof(MY_NUM) + 1); //
the array will be 20 long
int ok = PyArg_ParseTuple(args, "sss", &in, &aString, &bString);
if (!ok) return 0;

// do work to get a and b
// count - returns an int; GetVal - returns a MY_NUM * (a pointer
to a MY_NUM array)
a = GetVal(aString, count(aString, ","));
b = GetVal(bString, count(bString, ","));

// make function call, which returns a char *
result = doStuff(in, a, b);

// save result in Python string
finalResult = PyString_FromString(result);

// free memory
PyMem_Free(a);
PyMem_Free(b);
free(aString);
free(bString);
free(result);

// return the result as a Python string
return finalResult;
}

...as you can see, i malloc'ed memory, and free'd the memory. However,
I still have python crashing (after only 3 successful calls to
doStuff). And yes, doStuff is a plain C function...nothing related to
Python.
Antoon Pardon wrote:
Op 2005-10-12, Java and Swing schreef <co*******@gmail.com>:
static PyObject *wrap_doStuff(PyObject *self, PyObject *args) {
// this will store the result in a Python object
PyObject *finalResult;

// get arguments from Python
char *result = 0;
char *in= 0;
char *aString = 0;
char *bString = 0;
MY_NUM *a;
MY_NUM *b;
int ok = PyArg_ParseTuple(args, "sss", &in, &aString, &bString);
if (!ok) return 0;

// do work to get a and b
// count - returns an int; GetVal - returns a char *
a = GetVal(aString, count(aString, ","));
b = GetVal(bString, count(bString, ","));

// make function call, which returns a char *
result = doStuff(in, a, b);

// save result in Python string
finalResult = PyString_FromString(result);

// free memory
PyMem_Free(result);
PyMem_Free(a);
PyMem_Free(b);

// return the result as a Python string
return finalResult;
}

...from python I can call this function 4 times...works fine. WHen I
call it for the fifth time python.exe crashes. im thinking some memory
problem in the wrapper function perhaps...but I am not sure. The
actually C function, doStuff can be called 5, 6,7...N times without a
problem
so i know its gotta be my wrapper.

Any ideas? Thanks!


Well assuming your doStuff is a C function that knows nothing of python.
it might be the PyMem_Free(result).
http://docs.python.org/api/memoryInterface.html says the following:

void PyMem_Free(void *p)
Frees the memory block pointed to by p, which must have been
returned by a previous call to PyMem_Malloc() or PyMem_Realloc().
Otherwise, or if PyMem_Free(p) has been called before, undefined
behavior occurs. If p is NULL, no operation is performed.

But your result wasn't allocated by a PyMem_Malloc, it was returned
to you by a C function.

--
Antoon Pardon


Oct 12 '05 #6
Sorry about the double post...

anyhow, after putting in debug statements I found that it was crashing
when it called, free(result)....so I removed the free(result).

now it crashes when it gets to, b = GetVal(bString, count(bString,
","));

...any ideas?

Java and Swing wrote:
Antoon,
I just saw that to. I updated the code like so...

static PyObject *wrap_doStuff(PyObject *self, PyObject *args) {
// this will store the result in a Python object
PyObject *finalResult;

// get arguments from Python
char *result = 0;
char *in= 0;
char *aString = 0;
char *bString = 0;
MY_NUM *a = (MY_NUM *) PyMem_Malloc((20 * sizeof(MY_NUM) + 1); //
the array will be 20 long
MY_NUM *b = (MY_NUM *) PyMem_Malloc((20 * sizeof(MY_NUM) + 1); //
the array will be 20 long
int ok = PyArg_ParseTuple(args, "sss", &in, &aString, &bString);
if (!ok) return 0;

// do work to get a and b
// count - returns an int; GetVal - returns a MY_NUM * (a pointer
to a MY_NUM array)
a = GetVal(aString, count(aString, ","));
b = GetVal(bString, count(bString, ","));

// make function call, which returns a char *
result = doStuff(in, a, b);

// save result in Python string
finalResult = PyString_FromString(result);

// free memory
PyMem_Free(a);
PyMem_Free(b);
free(aString);
free(bString);
free(result);

// return the result as a Python string
return finalResult;
}

..as you can see, i malloc'ed memory, and free'd the memory. However,
I still have python crashing (after only 3 successful calls to
doStuff). And yes, doStuff is a plain C function...nothing related to
Python.
Antoon Pardon wrote:
Op 2005-10-12, Java and Swing schreef <co*******@gmail.com>:
static PyObject *wrap_doStuff(PyObject *self, PyObject *args) {
// this will store the result in a Python object
PyObject *finalResult;

// get arguments from Python
char *result = 0;
char *in= 0;
char *aString = 0;
char *bString = 0;
MY_NUM *a;
MY_NUM *b;
int ok = PyArg_ParseTuple(args, "sss", &in, &aString, &bString);
if (!ok) return 0;

// do work to get a and b
// count - returns an int; GetVal - returns a char *
a = GetVal(aString, count(aString, ","));
b = GetVal(bString, count(bString, ","));

// make function call, which returns a char *
result = doStuff(in, a, b);

// save result in Python string
finalResult = PyString_FromString(result);

// free memory
PyMem_Free(result);
PyMem_Free(a);
PyMem_Free(b);

// return the result as a Python string
return finalResult;
}

...from python I can call this function 4 times...works fine. WHen I
call it for the fifth time python.exe crashes. im thinking some memory
problem in the wrapper function perhaps...but I am not sure. The
actually C function, doStuff can be called 5, 6,7...N times without a
problem
so i know its gotta be my wrapper.

Any ideas? Thanks!


Well assuming your doStuff is a C function that knows nothing of python.
it might be the PyMem_Free(result).
http://docs.python.org/api/memoryInterface.html says the following:

void PyMem_Free(void *p)
Frees the memory block pointed to by p, which must have been
returned by a previous call to PyMem_Malloc() or PyMem_Realloc().
Otherwise, or if PyMem_Free(p) has been called before, undefined
behavior occurs. If p is NULL, no operation is performed.

But your result wasn't allocated by a PyMem_Malloc, it was returned
to you by a C function.

--
Antoon Pardon


Oct 12 '05 #7
ok, further digging...I found that in the C function GetVal...it is
crashing where I try to malloc some memory. Note, I have no problems
when running this from C..just from Python using my wrapper.

GetVal looks something like..
MY_NUM *GetVal(const char *in, const int x) {
MY_NUM *results, *returnResults;
results = (MY_NUM *) malloc((x * sizeof(MY_NUM) + 1);
returnResults = results;
// ..do more work..
return returnResults;
}

I put in print statements into the C code and found that it is crashing
at the line where I malloc some space for "results".

....any ideas why this is crashing when calling from Python via C
wrapper?

Java and Swing wrote:
Sorry about the double post...

anyhow, after putting in debug statements I found that it was crashing
when it called, free(result)....so I removed the free(result).

now it crashes when it gets to, b = GetVal(bString, count(bString,
","));

..any ideas?

Java and Swing wrote:
Antoon,
I just saw that to. I updated the code like so...

static PyObject *wrap_doStuff(PyObject *self, PyObject *args) {
// this will store the result in a Python object
PyObject *finalResult;

// get arguments from Python
char *result = 0;
char *in= 0;
char *aString = 0;
char *bString = 0;
MY_NUM *a = (MY_NUM *) PyMem_Malloc((20 * sizeof(MY_NUM) + 1); //
the array will be 20 long
MY_NUM *b = (MY_NUM *) PyMem_Malloc((20 * sizeof(MY_NUM) + 1); //
the array will be 20 long
int ok = PyArg_ParseTuple(args, "sss", &in, &aString, &bString);
if (!ok) return 0;

// do work to get a and b
// count - returns an int; GetVal - returns a MY_NUM * (a pointer
to a MY_NUM array)
a = GetVal(aString, count(aString, ","));
b = GetVal(bString, count(bString, ","));

// make function call, which returns a char *
result = doStuff(in, a, b);

// save result in Python string
finalResult = PyString_FromString(result);

// free memory
PyMem_Free(a);
PyMem_Free(b);
free(aString);
free(bString);
free(result);

// return the result as a Python string
return finalResult;
}

..as you can see, i malloc'ed memory, and free'd the memory. However,
I still have python crashing (after only 3 successful calls to
doStuff). And yes, doStuff is a plain C function...nothing related to
Python.
Antoon Pardon wrote:
Op 2005-10-12, Java and Swing schreef <co*******@gmail.com>:
> static PyObject *wrap_doStuff(PyObject *self, PyObject *args) {
> // this will store the result in a Python object
> PyObject *finalResult;
>
> // get arguments from Python
> char *result = 0;
> char *in= 0;
> char *aString = 0;
> char *bString = 0;
> MY_NUM *a;
> MY_NUM *b;
> int ok = PyArg_ParseTuple(args, "sss", &in, &aString, &bString);
> if (!ok) return 0;
>
> // do work to get a and b
> // count - returns an int; GetVal - returns a char *
> a = GetVal(aString, count(aString, ","));
> b = GetVal(bString, count(bString, ","));
>
> // make function call, which returns a char *
> result = doStuff(in, a, b);
>
> // save result in Python string
> finalResult = PyString_FromString(result);
>
> // free memory
> PyMem_Free(result);
> PyMem_Free(a);
> PyMem_Free(b);
>
> // return the result as a Python string
> return finalResult;
> }
>
> ...from python I can call this function 4 times...works fine. WHen I
> call it for the fifth time python.exe crashes. im thinking some memory
> problem in the wrapper function perhaps...but I am not sure. The
> actually C function, doStuff can be called 5, 6,7...N times without a
> problem
> so i know its gotta be my wrapper.
>
> Any ideas? Thanks!

Well assuming your doStuff is a C function that knows nothing of python.
it might be the PyMem_Free(result).
http://docs.python.org/api/memoryInterface.html says the following:

void PyMem_Free(void *p)
Frees the memory block pointed to by p, which must have been
returned by a previous call to PyMem_Malloc() or PyMem_Realloc().
Otherwise, or if PyMem_Free(p) has been called before, undefined
behavior occurs. If p is NULL, no operation is performed.

But your result wasn't allocated by a PyMem_Malloc, it was returned
to you by a C function.

--
Antoon Pardon


Oct 12 '05 #8
"Java and Swing" <co*******@gmail.com> writes:
static PyObject *wrap_doStuff(PyObject *self, PyObject *args) { [...] char *aString = 0;
char *bString = 0; [...] int ok = PyArg_ParseTuple(args, "sss", &in, &aString, &bString); [...] free(aString);
free(bString);


aString and bString are pointers to memory managed by the strings in
your args tuple. You must not free them! The memory is automatically
managed by Python.

Bernhard

--
Intevation GmbH http://intevation.de/
Skencil http://skencil.org/
Thuban http://thuban.intevation.org/
Oct 12 '05 #9
thanks for the tip, however even when I do not free aString or bString,
i'm still crashing at the malloc in the c function, not the wrapper.
Bernhard Herzog wrote:
"Java and Swing" <co*******@gmail.com> writes:
static PyObject *wrap_doStuff(PyObject *self, PyObject *args) {

[...]
char *aString = 0;
char *bString = 0;

[...]
int ok = PyArg_ParseTuple(args, "sss", &in, &aString, &bString);

[...]
free(aString);
free(bString);


aString and bString are pointers to memory managed by the strings in
your args tuple. You must not free them! The memory is automatically
managed by Python.

Bernhard

--
Intevation GmbH http://intevation.de/
Skencil http://skencil.org/
Thuban http://thuban.intevation.org/


Oct 12 '05 #10
"Java and Swing" <co*******@gmail.com> writes:
thanks for the tip, however even when I do not free aString or bString,
i'm still crashing at the malloc in the c function, not the wrapper.


Do you have any more places where you use free incorrectly? In my
experience, calling free with invalid values can corrupt the data
structures used by the memory allocator in such a way that subsequent
malloc calls crash.

Bernhard

--
Intevation GmbH http://intevation.de/
Skencil http://skencil.org/
Thuban http://thuban.intevation.org/
Oct 12 '05 #11
As far as my C Wrapper functions are concerned...I no longer have the
need for free(...). I do use PyMem_Free, for structures I allocated by
using PyMem_New(...).

In my C code I do have things such as...

char *foo(const char *in) {
char *tmp;
tmp = (char *) malloc((strlen(in) * sizeof(char)) + 1);
strcpy(tmp, in);
...
...
free(tmp);
return someValue;
}

Is that appropriate? I was under the impression that when you malloc
memory, you free it when done.

I also have things like...

char *bar(char *in) {
char *results, *finalResults;
results = (char *) malloc(...);
finalResults = results;

while (...) { *results++ = some_val; }

return finalResults;
}

....is that correct?

As I mentioned earlier, when I run these functions from C I have no
troubles...I can run them 5, 10, 15 times, etc. From Python, using my
wrapper function is when I have trouble.

Thanks in advance.

Bernhard Herzog wrote:
"Java and Swing" <co*******@gmail.com> writes:
thanks for the tip, however even when I do not free aString or bString,
i'm still crashing at the malloc in the c function, not the wrapper.


Do you have any more places where you use free incorrectly? In my
experience, calling free with invalid values can corrupt the data
structures used by the memory allocator in such a way that subsequent
malloc calls crash.

Bernhard

--
Intevation GmbH http://intevation.de/
Skencil http://skencil.org/
Thuban http://thuban.intevation.org/


Oct 12 '05 #12
"Java and Swing" <co*******@gmail.com> writes:
char *foo(const char *in) {
char *tmp;
tmp = (char *) malloc((strlen(in) * sizeof(char)) + 1);
strcpy(tmp, in);
...
...
free(tmp);
return someValue;
}

Is that appropriate? I was under the impression that when you malloc
memory, you free it when done.
Looks fine. I hope someValue does not point somewhere into the tmp
buffer, though.
I also have things like...

char *bar(char *in) {
char *results, *finalResults;
results = (char *) malloc(...);
finalResults = results;

while (...) { *results++ = some_val; }

return finalResults;
}


Seems OK, too, assuming the results buffer is big enough.

Bernhard

--
Intevation GmbH http://intevation.de/
Skencil http://skencil.org/
Thuban http://thuban.intevation.org/
Oct 12 '05 #13

Bernhard Herzog wrote:
"Java and Swing" <co*******@gmail.com> writes:
char *foo(const char *in) {
char *tmp;
tmp = (char *) malloc((strlen(in) * sizeof(char)) + 1);
strcpy(tmp, in);
...
...
free(tmp);
return someValue;
}

Is that appropriate? I was under the impression that when you malloc
memory, you free it when done.
Looks fine. I hope someValue does not point somewhere into the tmp
buffer, though.


someValue doesn't.
I also have things like...

char *bar(char *in) {
char *results, *finalResults;
results = (char *) malloc(...);
finalResults = results;

while (...) { *results++ = some_val; }

return finalResults;
}


Seems OK, too, assuming the results buffer is big enough.


results = (char *) malloc((sizeof(char) * strlen(in) + 1);
..should be big enough. At any rate, it works four times in a row
before it fails.

I wonder what else or how else to solve this. Why is malloc'ing
the memory crashing it!?

Oct 12 '05 #14
In article <11********************@o13g2000cwo.googlegroups.c om>,
"Java and Swing" <co*******@gmail.com> wrote:
one more update...

if I remove PyMem_Free and free(...) ...so no memory clean up...I can
still only call doStuff 4 times, the 5th attemp crashes Python.

Java and Swing wrote:
update:
if I use C's free(result), free(a) free(b) instead of PyMem_Free...I
only get one successfuly use/call of doStuff.

i.e.
// this works
doStuff(...)

// python crashes here
doStuff(...)

Java and Swing wrote:
static PyObject *wrap_doStuff(PyObject *self, PyObject *args) {
// this will store the result in a Python object
PyObject *finalResult;

// get arguments from Python
char *result = 0;
char *in= 0;
char *aString = 0;
char *bString = 0;
MY_NUM *a;
MY_NUM *b;
int ok = PyArg_ParseTuple(args, "sss", &in, &aString, &bString);
if (!ok) return 0;

// do work to get a and b
// count - returns an int; GetVal - returns a char *
a = GetVal(aString, count(aString, ","));
b = GetVal(bString, count(bString, ","));

// make function call, which returns a char *
result = doStuff(in, a, b);

// save result in Python string
finalResult = PyString_FromString(result);

// free memory
PyMem_Free(result);
PyMem_Free(a);
PyMem_Free(b);

// return the result as a Python string
return finalResult;
}

...from python I can call this function 4 times...works fine. WHen I
call it for the fifth time python.exe crashes. im thinking some memory
problem in the wrapper function perhaps...but I am not sure. The
actually C function, doStuff can be called 5, 6,7...N times without a
problem
so i know its gotta be my wrapper.

Any ideas? Thanks!


I think your wrapper should look something like:

static PyObject *wrap_doStuff(PyObject *self, PyObject *args)
{
// this will store the result in a Python object
PyObject *finalResult;

// get arguments from Python
char *result = 0;
char *in= 0;
char *aString = 0;
char *bString = 0;
MY_NUM *a;
MY_NUM *b;

int ok = PyArg_ParseTuple(args, "sss", &in, &aString, &bString);
if (!ok) return 0;

// do work to get a and b
// count - returns an int; GetVal - returns a char *
a = GetVal(aString, count(aString, ","));
b = GetVal(bString, count(bString, ","));

// make function call, which returns a char *
result = doStuff(in, a, b);

// save result in Python string
finalResult = PyString_FromString(result);

// free memory
free(result);
free(a);
free(b);

// return the result as a Python string
return finalResult;
}

You must match malloc() with free(), and PyMem_Malloc() with
PyMem_Free(). Malloc() and free() usually crash /after/ the call that
did the damage. You may wish to avail yourself of your platform's
malloc debugging facilities.

Note that I don't do this stuff in C, I do it in pyrex, and I'm new to
it anyway, so there may still be something wrong. Unless you are
determined to learn how to do this in C, I think you should switch to
pyrex.
__________________________________________________ ______________________
TonyN.:' *firstname*nlsnews@georgea*lastname*.com
' <http://www.georgeanelson.com/>
Oct 15 '05 #15

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

1
by: Mark McEahern | last post by:
I just wrote a very simple wrapper for the PayFlow Pro SDK (see below). A friend of mine did this before, but I didn't have access to his source, so I took it as a learning opportunity for me to...
2
by: James S | last post by:
Hi, Basically I've been fighting with this code for a few days now and can't seem to work around this problem. Included is the output, the program I use to get this error and the source code for...
1
by: Garett Shulman | last post by:
Hello, I am trying to create a wrapper for a function with the following prototype: int ap_get_playlist(int session, int *argc, char ***the_list); I'm not quite sure how to construct the...
12
by: Egil M?ller | last post by:
Is there any way to create transparent wrapper objects in Python? I thought implementing __getattribute__ on either the wrapper class or its metaclass would do the trick, but it does not work for...
5
by: Java and Swing | last post by:
I am having trouble with a wrapper function... My C code looks like ----------------------- #include <stdlib.h> #include <string.h> #include "Python.h" int doStuff(const char *input, const...
10
by: Fredrik Tolf | last post by:
If I have a variable which points to a function, can I check if certain argument list matches what the function wants before or when calling it? Currently, I'm trying to catch a TypeError when...
0
by: andrew.gregory | last post by:
If compiling a SWIG wrapper with MinGW 3.2.3 (Windows) get the following compilation error: pyprog_wrap.cxx: In function `int SWIG_Python_ConvertFunctionPtr(PyObject*, void**,...
2
by: GinTon | last post by:
EyeDB is a free ODBMS based on the ODMG 3 specification with programming interfaces for C++ and Java. It is very powerfull, mature, safe and stable. In fact, it was developed in 1992 for the Genome...
2
by: andrew cooke | last post by:
Hi, Within Python (2.5): Help on method-wrapper object: __str__ = class method-wrapper(object) | Methods defined here: | | __call__(...) | x.__call__(...) <==x(...)
2
isladogs
by: isladogs | last post by:
The next Access Europe meeting will be on Wednesday 7 Feb 2024 starting at 18:00 UK time (6PM UTC) and finishing at about 19:30 (7.30PM). In this month's session, the creator of the excellent VBE...
0
by: MeoLessi9 | last post by:
I have VirtualBox installed on Windows 11 and now I would like to install Kali on a virtual machine. However, on the official website, I see two options: "Installer images" and "Virtual machines"....
0
by: DolphinDB | last post by:
The formulas of 101 quantitative trading alphas used by WorldQuant were presented in the paper 101 Formulaic Alphas. However, some formulas are complex, leading to challenges in calculation. Take...
0
by: Aftab Ahmad | last post by:
So, I have written a code for a cmd called "Send WhatsApp Message" to open and send WhatsApp messaage. The code is given below. Dim IE As Object Set IE =...
0
by: marcoviolo | last post by:
Dear all, I would like to implement on my worksheet an vlookup dynamic , that consider a change of pivot excel via win32com, from an external excel (without open it) and save the new file into a...
0
by: Vimpel783 | last post by:
Hello! Guys, I found this code on the Internet, but I need to modify it a little. It works well, the problem is this: Data is sent from only one cell, in this case B5, but it is necessary that data...
0
by: jfyes | last post by:
As a hardware engineer, after seeing that CEIWEI recently released a new tool for Modbus RTU Over TCP/UDP filtering and monitoring, I actively went to its official website to take a look. It turned...
0
by: ArrayDB | last post by:
The error message I've encountered is; ERROR:root:Error generating model response: exception: access violation writing 0x0000000000005140, which seems to be indicative of an access violation...
1
by: PapaRatzi | last post by:
Hello, I am teaching myself MS Access forms design and Visual Basic. I've created a table to capture a list of Top 30 singles and forms to capture new entries. The final step is a form (unbound)...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.