Fwd: ustring memory leak



Oups. I replied only to michi7x7.

So here is the result if I use Glib Thread

---------- Forwarded message ----------
From: Fabian Jacquet <fabian jacquet gmail com>
Date: Thu, Apr 1, 2010 at 12:33
Subject: Re: ustring memory leak
To: michi7x7 <mailing-lists michi7x7 de>


Right.


Here is the std::cout
Leak of 118784/1000 or 118
Leak of 102400/1000 or 102

Leak of 0/1000 or 0
Leak of 0/1000 or 0
Leak of 0/1000 or 0
Leak of 0/1000 or 0

I supose that the Glib-Thread de-allocate something.
We don't want to use Glib-Thread everywhere because we have a lot of code already in use.
Is it possible to call a method which will de-allocate Glib thread objects at the end of our "Windows threads"?

On Thu, Apr 1, 2010 at 11:36, michi7x7 <mailing-lists michi7x7 de> wrote:
What happens if you use Glib-Threads instead of the Windows-API?

Glib::Thread* const thread = Glib::Thread::create(sigc::ptr_fun(&thrd), true);
thread->join();


Hello,

I have a memory leak using ustring under windows.
I reproduced it with this code:

#include "Windows.h"

#include <glibmm/ustring.h>
#include <glibmm.h>
#include <iostream>
#include <Psapi.h>

DWORD WINAPI thrd(LPVOID param)
{
    Glib::ustring u = "test";
    int i;
    if(u=="test")
        i = 0;

    return 0;
}

size_t GetMemory()
{
    PROCESS_MEMORY_COUNTERS c;
    if(GetProcessMemoryInfo(GetCurrentProcess(), &c, sizeof(c)))
    {
        return c.WorkingSetSize;
    }
    else
    {
        return 0;
    }
}

int _tmain(int argc, _TCHAR* argv[])
{
    if(!Glib::thread_supported())
        Glib::thread_init();

    int i = 0;
    size_t lastMem = GetMemory();
    int group = 1000;
    do{
        HANDLE h = CreateThread(NULL, NULL, thrd, NULL, NULL, NULL);
        WaitForSingleObject(h, INFINITE);
        CloseHandle(h);

        if(i++ > group)
        {
            Sleep(500);
            size_t currentMemory = GetMemory();
            if(currentMemory > 0)
            {
                size_t diff = currentMemory - lastMem;
                std::cout << "Leak of " << diff << "/" << group << " or " << diff/group << std::endl;
                i = 0;
                lastMem = currentMemory;
            }
            else
            {
                std::cout << "No memory info" << std::endl;
            }
        }
    }while(1);

    return 0;
}

Here is the std::cout

Leak of 2494464/1000 or 2494
Leak of 2420736/1000 or 2420
Leak of 2375680/1000 or 2375
Leak of 2379776/1000 or 2379
Leak of 2375680/1000 or 2375
Leak of 2379776/1000 or 2379
Leak of 2379776/1000 or 2379
...

So here we have a leak of about 2379 bytes for each thread.


Here is the std::out if I remove following code
    if(!Glib::thread_supported())
        Glib::thread_init();

Leak of 348160/1000 or 348
Leak of 106496/1000 or 106
Leak of 0/1000 or 0
Leak of 0/1000 or 0
Leak of 0/1000 or 0
Leak of 0/1000 or 0
Leak of 0/1000 or 0
...


We use Glib::thread_init() because we had some crashes on multi thread with ustring. It was not a problem of variable protection, the crash happened when some threads used different ustring. Typically, if we parse different XML with libxml in different thread, we had crash on an ustring compare. The Glib::thread_init() resolved the crash.

If you want a sample of the crash problem, I can send it to you. Maybe we don't have to use Glib::thread_init().


Thank you very much if somebody can help.

Best regards.



_______________________________________________
gtkmm-list mailing list
gtkmm-list gnome org
http://mail.gnome.org/mailman/listinfo/gtkmm-list





[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]