Discussion:
perl crash with Inline  / APPCRASH  // WINDOWS ### GOOD MAIL ###
lh
2012-10-18 19:28:01 UTC
Permalink
Hello,

--->I' sorry but thanks toThank you to consider only this email, the previous had a bad copy / paste.<---

<<<< sv_setpvn(out_buffer, compressed_buffer, samples_count); >>>>>


I have an application which run with Inline C with 120 Windows threads.

THe application run well with 120 threads but when i increase the number of thread to 200,

->>>> i have an windows crash applet APPCRASH error code c000005.

I have comment the sv_setpvn function and the crash didnt appeared.

Is there a limitation with the number of thread OR my code is not good ?

For information samples_count is ALWAYS equal to 160.

OS context
------------
Windows 2008 server

Perl context
--------------
perl -v

This is perl 5, version 14, subversion 2 (v5.14.2) built for MSWin32-x64-multi-thread

Thanks

Laurent H.

void alaw_compress_buffer_optimized(char *linear, int samples_count, SV * out_buffer)
    {
     int i;
     unsigned short index;
     short sample;
     short * samples_vals=(int) linear;

     unsigned char compressed_buffer[samples_count];

     for (i=0;i<samples_count;i=i+1)
        {
         sample=samples_vals[i];
         index=(samples_vals[i] + 32767);
         compressed_buffer[i]=l2aTable[index];
        }

     sv_setpvn(out_buffer, compressed_buffer, samples_count);
    }

___________________________________________________________
L'actrice néerlandaise Sylvia Kristel, alias "Emmanuelle", est décédée. Plus d'infos sur Voila.fr http://people.voila.fr/people/actu-stars/plus-de-people/sylvia-
kristel-alias-emmanuelle-est-decedee-people_4136507.html
___________________________________________________________
L'actrice néerlandaise Sylvia Kristel, alias "Emmanuelle", est décédée. Plus d'infos sur Voila.fr http://people.voila.fr/people/actu-stars/plus-de-people/sylvia-kristel-alias-emmanuelle-est-decedee-people_4136507.html
___________________________________________________________
L'actrice néerlandaise Sylvia Kristel, alias "Emmanuelle", est décédée. Plus d'infos sur Voila.fr http://people.voila.fr/people/actu-stars/plus-de-people/sylvia-kristel-alias-emmanuelle-est-decedee-people_4136507.html
Sisyphus
2012-10-19 06:53:56 UTC
Permalink
----- Original Message -----
From: "lh" <laurent.habib-***@public.gmane.org>
To: <inline-***@public.gmane.org>
Sent: Friday, October 19, 2012 6:28 AM
Subject: perl crash with Inline / APPCRASH // WINDOWS ### GOOD MAIL ###


Hello,

--->I' sorry but thanks toThank you to consider only this email, the
previous had a bad copy / paste.<---

<<<< sv_setpvn(out_buffer, compressed_buffer, samples_count); >>>>>


I have an application which run with Inline C with 120 Windows threads.

THe application run well with 120 threads but when i increase the number of
thread to 200,

->>>> i have an windows crash applet APPCRASH error code c000005.

I have comment the sv_setpvn function and the crash didnt appeared.

Is there a limitation with the number of thread OR my code is not good ?

For information samples_count is ALWAYS equal to 160.

OS context
------------
Windows 2008 server

Perl context
--------------
perl -v

This is perl 5, version 14, subversion 2 (v5.14.2) built for
MSWin32-x64-multi-thread

Thanks

Laurent H.

void alaw_compress_buffer_optimized(char *linear, int samples_count, SV *
out_buffer)
{
int i;
unsigned short index;
short sample;
short * samples_vals=(int) linear;

unsigned char compressed_buffer[samples_count];

for (i=0;i<samples_count;i=i+1)
{
sample=samples_vals[i];
index=(samples_vals[i] + 32767);
compressed_buffer[i]=l2aTable[index];
}

sv_setpvn(out_buffer, compressed_buffer, samples_count);
}

=============================================
=============================================

Given that samples_count is an *argument* to the sub, I'm not sure that it's
a good idea to declare:

unsigned char compressed_buffer[samples_count];

Anyone ?

I would be inclined to declare:
unsigned char * compressed_buffer;

and then allocate the memory dynamically.

Here's a rewrite (untested):

###################################
void alaw_compress_buffer_optimized(char *linear, int samples_count, SV *
out_buffer)
{
int i;
unsigned short index;
short sample;
short * samples_vals=(int) linear;
unsigned char *compressed_buffer;

Newxz(compressed_buffer, samples_count, unsigned char);
if(compressed_buffer == NULL) croak("Failed to allocate memory");

for (i=0;i<samples_count;i=i+1)
{
sample=samples_vals[i];
index=(samples_vals[i] + 32767);
compressed_buffer[i]=l2aTable[index];
}

sv_setpvn(out_buffer, compressed_buffer, samples_count);

Safefree(compressed_buffer); /* Free memory */
}
###################################

If it turns out that threading is involved in the problem, you'll probably
get best help from perlmonks
( http://www.perlmonks.org/index.pl?node=Seekers%20of%20Perl%20Wisdom )
where there are one or two very knowledgeable people on Windowx threads
issues. (Not me - I run Windows, but I'm a hopeless klutz where threading is
involved.)

If you could provide a full (but as short as possible) working demo of the
problem, your chances of getting the problem sorted out (both here and at
perlmonks) would be greatly improved.

I don't see any problem with the following code:

###################################
use warnings;
use Inline C => Config =>
BUILD_NOISY => 1;

use Inline C => <<'EOC';


void foo(int samples_count, SV * out_buffer) {
int i;
unsigned char * x;

Newx(x, samples_count, unsigned char);
if(x==NULL)croak("Failed to allocate memory");

for(i = 0; i < samples_count; i++) x[i] = 65 + (i % 10);

sv_setpvn(out_buffer, x, samples_count);

Safefree(x);
}

EOC

my $x;

foo(160, $x);

print length($x),"\n$x\n";
###################################

Cheers,
Rob

Loading...