Here we go.

On 2009/5/15 18:56, Kenton Varda wrote:
> Ugh, I missed that one because I was doing my testing on Linux and 
> that is in Windows-only code.
>
> Ideally I'd prefer if each GoogleOnce object registered a shutdown 
> function for itself.  But I suppose that could create a deadlock 
> because the shutdown function registry is once-initialized.  So, sure, 
> use destructors.  Do you want to send me a patch since you're set up 
> to test it?
>
> On Fri, May 15, 2009 at 5:41 PM, Oleg Smolsky <o...@smolsky.net 
> <mailto:o...@smolsky.net>> wrote:
>
>     ...sent the message too quickly.
>
>     So, the fix is trivial, yet it comes down to the same very
>     discussion as the original issue. In this case it's cleaning up
>     after the cleaners :) It's a global pointer that is initialized
>     when global constructors (a.k.a. static initializers) run. The
>     pointer to the heap block is never lost, but it is never
>     deallocated either. The fix is trivial - all that is needed is the
>     destructor. This, of course, assumes that the main thread would
>     exit only after all additional workers are dead.
>
>     Oleg.
>
>
>     On 2009/5/15 17:28, Oleg Smolsky wrote:
>
>         Actually, I got lucky - the culprit was not in headers. It's
>         this line in once.cc:
>
>            if (internal_ == NULL) internal_ = new GoogleOnceInternal;
>
>         The log is as follows:
>
>         Detected memory leaks!
>         Dumping objects ->
>         ..\src\google\protobuf\stubs\once.cc(65) : {1438} client block
>         at 0x00B92620, subtype 0, 24 bytes long.
>          Data: <h - > 68 A6 2D 00 FF FF FF FF 00 00 00 00 00 00 00 00
>         ..\src\google\protobuf\stubs\once.cc(65) : {1437} client block
>         at 0x00B925C8, subtype 0, 24 bytes long.
>          Data: <0 - > 30 A6 2D 00 FF FF FF FF 00 00 00 00 00 00 00 00
>         ..\src\google\protobuf\stubs\once.cc(65) : {946} client block
>         at 0x00246AB0, subtype 0, 24 bytes long.
>          Data: <  - > A0 A1 2D 00 FF FF FF FF 00 00 00 00 00 00 00 00
>         ..\src\google\protobuf\stubs\once.cc(65) : {945} client block
>         at 0x00249CD0, subtype 0, 24 bytes long.
>          Data: <h - > 68 A1 2D 00 FF FF FF FF 00 00 00 00 00 00 00 00
>         ..\src\google\protobuf\stubs\once.cc(65) : {934} client block
>         at 0x00249840, subtype 0, 24 bytes long.
>          Data: <0 - > 30 A1 2D 00 FF FF FF FF 00 00 00 00 00 00 00 00
>         ..\src\google\protobuf\stubs\once.cc(65) : {812} client block
>         at 0x002469B0, subtype 0, 24 bytes long.
>          Data: <x - > 78 9D 2D 00 FF FF FF FF 00 00 00 00 00 00 00 00
>         ..\src\google\protobuf\stubs\once.cc(73) : {685} client block
>         at 0x00B91FB0, subtype 0, 24 bytes long.
>          Data: <  - > D0 9C 2D 00 FF FF FF FF 00 00 00 00 00 00 00 00
>         ..\src\google\protobuf\stubs\once.cc(73) : {667} client block
>         at 0x00B91608, subtype 0, 24 bytes long.
>          Data: <` - > 60 9C 2D 00 FF FF FF FF 00 00 00 00 00 00 00 00
>         ..\src\google\protobuf\stubs\once.cc(65) : {666} client block
>         at 0x00B915B0, subtype 0, 24 bytes long.
>          Data: <( - > 28 9C 2D 00 FF FF FF FF 00 00 00 00 00 00 00 00
>         ..\src\google\protobuf\stubs\once.cc(65) : {663} client block
>         at 0x00B913D8, subtype 0, 24 bytes long.
>          Data: <Pu- > 50 75 2D 00 FF FF FF FF 00 00 00 00 00 00 00 00
>         ..\src\google\protobuf\stubs\once.cc(65) : {148} client block
>         at 0x00245820, subtype 0, 24 bytes long.
>          Data: <pt- > 70 74 2D 00 FF FF FF FF 00 00 00 00 00 00 00 00
>         ..\src\google\protobuf\stubs\once.cc(65) : {147} client block
>         at 0x002457C8, subtype 0, 24 bytes long.
>          Data: <8t- > 38 74 2D 00 FF FF FF FF 00 00 00 00 00 00 00 00
>         ..\src\google\protobuf\stubs\once.cc(65) : {136} client block
>         at 0x00245290, subtype 0, 24 bytes long.
>          Data: < t- > 00 74 2D 00 FF FF FF FF 00 00 00 00 00 00 00 00
>         ..\src\google\protobuf\stubs\once.cc(65) : {135} client block
>         at 0x00245238, subtype 0, 24 bytes long.
>          Data: < s- > C8 73 2D 00 FF FF FF FF 00 00 00 00 00 00 00 00
>         Object dump complete.
>
>
>


--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Protocol Buffers" group.
To post to this group, send email to protobuf@googlegroups.com
To unsubscribe from this group, send email to 
protobuf+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/protobuf?hl=en
-~----------~----~----~----~------~----~------~--~---

diff -aru protobuf-2.1.0/src/google/protobuf/stubs/once.cc protobuf-2.1.0 - 
Copy/src/google/protobuf/stubs/once.cc
--- protobuf-2.1.0/src/google/protobuf/stubs/once.cc    2009-05-13 
13:36:36.000000000 -0700
+++ protobuf-2.1.0 - Copy/src/google/protobuf/stubs/once.cc     2009-05-15 
19:18:09.405418300 -0700
@@ -56,6 +56,12 @@
   CRITICAL_SECTION critical_section;
 };
 
+GoogleOnceType::~GoogleOnceType()
+{
+       delete internal_;
+       internal_ = NULL;
+}
+
 GoogleOnceType::GoogleOnceType() {
   // internal_ may be non-NULL if Init() was already called.
   if (internal_ == NULL) internal_ = new GoogleOnceInternal;
diff -aru protobuf-2.1.0/src/google/protobuf/stubs/once.h protobuf-2.1.0 - 
Copy/src/google/protobuf/stubs/once.h
--- protobuf-2.1.0/src/google/protobuf/stubs/once.h     2009-05-13 
13:36:36.000000000 -0700
+++ protobuf-2.1.0 - Copy/src/google/protobuf/stubs/once.h      2009-05-15 
19:18:13.938418300 -0700
@@ -87,6 +87,7 @@
 
 struct LIBPROTOBUF_EXPORT GoogleOnceType {
   GoogleOnceType();
+  ~GoogleOnceType();
   void Init(void (*init_func)());
 
   volatile bool initialized_;
Only in protobuf-2.1.0/vsprojects: Release
Only in protobuf-2.1.0/vsprojects: _UpgradeReport_Files

Reply via email to