in reply to xs memoryleak

Yeah, XS is extremely difficult to do correctly. I don't see where your code causes a leak (not surprising, since this is usually quite complicated to figure out). So you would be wise to minimize the amount of XS code you write. For example, have a Perl wrapper that uses a simple pack and unpack and eliminate almost all of the "manipulate Perl internal data structure" stuff from your XS:

char * top_insert( up, down, init_step_ratio, ratio ) char * up char * down double init_step_ratio double ratio INIT: int up_num, down_num, sample_num; double *return_val = NULL; PPCODE: up_num = {length of arg 0}/sizeof(double)/3; down_num = {length of arg 1}/sizeof(double)/3; return_val = get_inter_line( up_num, (double*)up, down_num, (double*)down, init_step_ratio, ratio, &sample_num ); sample_num *= 3; {set return value SV to: copy of return_val w/ length sample_num*sizeof(double)} del_inter_line(return_val);

(The few bits of dealing with Perl internal data structures left as an exercise above as I don't have those memorized.)

- tye        

Replies are listed 'Best First'.
Re^2: xs memoryleak (xs--)
by yarp (Initiate) on Jul 25, 2012 at 16:56 UTC

    following tye's comments it's works ok, but bulk88's can't work. I don't know why. follow is my corrected code:

    #include "EXTERN.h" #include "perl.h" #include "XSUB.h" #include "ppport.h" #include "const-c.inc" #include "top_insert.h" MODULE = top_insert PACKAGE = top_insert INCLUDE: const-xs.inc void top_insert(up_v, up_num, down_v, down_num, init_step_ratio, ratio) char * up_v int up_num char * down_v int down_num double init_step_ratio double ratio INIT: int sample_num; int n; double *return_val = NULL; PPCODE: return_val = get_inter_line(up_num, (double *)up_v, down_num, +(double *)down_v, init_step_ratio, ratio, &sample_num); sample_num = sample_num*3; for (n=0; n<sample_num; n++){ XPUSHs(sv_2mortal(newSVnv(*(return_val + n)))); } del_inter_line(return_val);

    Thanks both of you very much.

    BTY, I use those pretty complex. c++ code buld to static lib for quickly algorithm. xs code link to perl mod. use perlctrl pack pm to Win32::OLE dll. use autoCad autoLisp to call OLE. so difficult to debug.