[Ace-users] [ace-users] [usage question] ACE_Log_Msg / ACE_Log_Record - no allocator

Steve Huston shuston at riverace.com
Tue Nov 27 15:32:50 CST 2007


Hi Bogdan,

> First I'd like to thank you for your prompt reply!
> Second, I'd like to apologize for not using the the PRF (I 
> thought it is 
> not necessary as it was a usage question). Please find it at 
> the end of my e-mail.

Thanks!

> I know now that each thread has its own ACE_Log_Msg instance kept in

> TSS. Thanks for pointing this out!
> 
> But, inside the method:
> > ssize_t
> > ACE_Log_Msg::log (const ACE_TCHAR *format_str,
> >                   ACE_Log_Priority log_priority,
> >                   va_list argp)
> an ACE_Log_Record is instantiated on the stack for which the 
> constructor 
> used allocates 'another' 4 KB of data. The ACE_Log_Msg 
> internal buffer 
> is afterwards copied ( ACE_OS::strcpy) in the internal buffer of 
> ACE_Log_Record.

Right... The ACE_Log_Record here used to have it's data as a member
array, and so was allocated off the stack. This was changed, from what
I can see, at:

Tue Mar 28 21:30:01 UTC 2006  jiang,shanshan
<shanshan.jiang at vanderbilt.edu>

        * ace/Log_Msg.{h,cpp}
        * ace/Log_Record.{cpp,h,inl}:
          Updated these files to solve the stack overflow problem in
ACE_Log_Msg
          and ACE_Log_Record. Moves buffers that can be large in stack
in malloced
          memory.
          Thanks to qwerty <qwerty0987654321 at mail dot ru> for
motivating and
          suggesting the fix to this problem.

> I made a simple test program, ran 'gdb' on it and found that 
> each time 
> this function is invoked, the ACE_Log_Record's constructor 
> gets called 
> and its underlying data is allocated at a different address 
> (to try to 
> rule out some overloaded 'operator new' I couldn't identify).
> 
> Please tell me if there is something I missed. Thank you!

Nope, you got it right, but the above work to remove the MAXLOGMSGLEN
size restriction could have been done much better to avoid the
every-time alloc/free. I believe this can be done in a much more
efficient manner. One possible idea is to replace the msg_ array in
ACE_Log_Msg with a ACE_Log_Record, but I haven't traced all the
possibilities out to see if this is a good solution. If you can work
out the details of this, that would be great. If you don't have
time/energy to do this, please record this info in Bugzilla or
consider partnering with someone who can analyze the situation and
develop a good fix for it.

Thanks very much for raising this and analyzing the source of the
excessive memory allocations.

Best regards,
-Steve

--
Steve Huston, Riverace Corporation
Want to take ACE training on YOUR schedule?
See http://www.riverace.com/training.htm

> >   
> >> On my understanding each time you log something using ACE_Log_Msg

> >> another ACE_Log_Record is created which in turn creates 
> its underlying 
> >> data (4 KB) on the heap. This can happen very often and may have
a 
> >> negative impact on the overall performance of the application.
> >>     
> >
> > No, that's incorrect.  the 4 KB of data is allocated using
> > thread-specific storage (see the discuss in the POSA2 book at
> > www.cs.wustl.edu/~schmidt/POSA/POSA2/), so the 4 KB is 
> allocated only
> > once for each thread.
> >
> >   
> >> Is there a way to control the allocation of ACE_Log_Record 
> data without 
> >> overloading the global new operator?
> >>     
> >
> > No, but this shouldn't be necessary, as per the discussion above.
> >
> > Thanks,
> >
> > Doug
> >   
> 
> _______________________________________________
> ace-users mailing list
> ace-users at mail.cse.wustl.edu
> http://mail.cse.wustl.edu/mailman/listinfo/ace-users
> 




More information about the Ace-users mailing list