trafficserver-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Manas Agarwal <manasagarwa...@gmail.com>
Subject Re: Question on TSMalloc
Date Fri, 25 Jan 2013 06:21:51 GMT
I too faced similar issue.
I replaced string with string*.  I think the problem is TSMalloc doesn't
create and initialize the object as it is based on malloc.


On Fri, Jan 25, 2013 at 10:49 AM, James Peach <jpeach@apache.org> wrote:

> On 24/01/2013, at 3:14 PM, Brian Geffon <briang@apache.org> wrote:
>
> > Try just using a placement new.
> >
> > pData = new ((TransformationData *)
> TSmalloc(sizeof(TransformationData))) TransformationData();
>
> and don't forget to call the destructor before calling TSfree:
>         pData->~TransformationData();
>         TSfree(pData);
>
> >
> > Brian
> >
> > On Thu, Jan 24, 2013 at 2:32 PM, Owens, Steve <Steve.Owens@disney.com>
> wrote:
> >
> > I ran into a bit of an issue today related to TSMalloc
> >
> > Suppose I have a plugin which defines a plugin data structure such as:
> >
> > typedef struct {
> >         int state;
> >         TSVIO output_vio;
> >         TSIOBuffer output_buffer;
> >         TSIOBufferReader output_reader;
> >         std::string foo;
> >     } TransformationData;
> >
> >
> > And I have some plugin code which does this:
> >
> > void allocTransformationData(){
> >       TransformationData *pData;
> >
> >       pData = (TransformationData *)
> TSmalloc(sizeof(TransformationData));
> >       pData->state = STATE_START;
> >       pData->output_buffer = NULL;
> >       pData->output_vio = NULL;
> >       pData->output_reader = NULL;
> >
> >       pData->foo.assign("bar");
> >
> >       return pData;
> > }
> >
> > The line  pData->foo.assign("bar");
> >
> >
> > Will result in a segmentation fault.
> >
> > Is there a best practice idiom for using std::string items in custom
> continuation data?  For example should I be using
> >
> > typedef struct {
> >         int state;
> >         TSVIO output_vio;
> >         TSIOBuffer output_buffer;
> >         TSIOBufferReader output_reader;
> >         std::string *foo;
> >     } TransformationData;
> >
> > And
> >
> >
> > Void allocTransformationData(){
> >       TransformationData *pData;
> >
> >       pData = (TransformationData *)
> TSmalloc(sizeof(TransformationData));
> >       pData->state = STATE_START;
> >       pData->output_buffer = NULL;
> >       pData->output_vio = NULL;
> >       pData->output_reader = NULL;
> >
> >
> >       pData->foo = new std::string;
> >         pData->foo.assign("bar");
> >
> >       return pData;
> > }
> >
> > Or should I use:
> >
> > Void allocTransformationData(){
> >       TransformationData *pData;
> >
> >       pData = (TransformationData *)
> TSmalloc(sizeof(TransformationData));
> >       pData->state = STATE_START;
> >       pData->output_buffer = NULL;
> >       pData->output_vio = NULL;
> >       pData->output_reader = NULL;
> >
> >
> >       pData->foo = (std::string*) Tsmalloc(sizeof(std::string));
> >         pData->foo.assign("bar");
> >
> >       return pData;
> > }
> >
> >
> >
> >
> >
> >
>
>

Mime
View raw message