sanket wrote:
On Apr 14, 4:00 pm, MRAB <goo...@mrabarnett.plus.com> wrote:
sanket wrote:
Hello All,
I am dealing with this weird bug.
I have a function in C and I have written python bindings for it using
ctypes.
I can call this function for couple of times and then suddenly it
gives me seg fault.
But I can call same function from a C code for any number of times.
I cannot get what's going on.
here is my code.
/**********************************************/
/* C Function I am calling */
int get_hash(char *filename,int rate,int ch,unsigned char* hash,
unsigned int* hash_size,short* avg_f,short* avg_d){
/* some variable declarations here */
fp = fopen(filename,"rb");
You should check the value of 'fp' here.

data = (signed short *)malloc(sizeof(signed short) * N_BLOCKS);
You should check the value of 'data' here.

whereami = WAVE_HEADER_SIZE;
What is 'whereami'?

while((!feof(fp)) && (fp_more == 1) && !ferror(fp)){
     fp_data_size = fread(data,sizeof(signed short),N_BLOCKS,fp);
'fp_data_size' will be the number of signed shorts read, not the number
of bytes. Is this OK?

     whereami += fp_data_size;
The final value of 'whereami' will be WAVE_HEADER_SIZE + the total
number of signed shorts read.

     fp_more = fp_feed_short(fooid,data,fp_data_size); // call to some
library funtion
 } //end while
/* some arithmetic calculations here */
  n = my_fp_calculate(fooid,audio_length,fp_fingerprint,&fit,&dom);
  if (data != NULL)
      free(data)
I don't that 'free()' will complain if 'data' happens to be NULL,
although you should've already checked whether 'data' is NULL when you
malloc'ed! :-)

  fclose(fp)
  return n;
}
/************************* END OF C FUNCTION
*********************************/
--------------------------------------------------------------------
Python code
---------------------------------------------------------------------
from ctypes import *
lib = cdll.LoadLibrary("/usr/lib/libclient.so")
def my_func(filename,rate,ch):
    hash = (c_ubyte * 424)()
    hash_size = c_uint()
    avg_f = c_short(0)
    avg_d = c_short(0)
    n = lib.get_hash(filename,rate,ch,hash,byref(hash_size),byref
(avg_f),byref(avg_d))
    hash = None
def main():
    for filename in os.listdir(MY_DIR):
            print filename
            my_func(filename,100,10)
            print
"----------------------------------------------------"
if __name__ == "__main__":
    main()
============== END OF PYTHON CODE ==========================
Thank you in advance,
sanket
--
http://mail.python.org/mailman/listinfo/python-list


Thank you for your reply.

I will make check for fp and data pointers.
But my point is this function runs fine while calling it from a C
code.
it only breaks while calling from python. So I wonder if there can be
anything wrong with ctypes module.

It's more likely that it's a bug in your code.
--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to