Questing about the use of libmm

Troels Olesen to at movis.dk
Mon Feb 8 13:51:48 UTC 2016


Hi Aleksander.

i only checked the memory usage of the application with pmap, and 
gnome-system-monitor. It seems like the memery use start around 900kb, 
and then jumps up to 47-120 mb memory usage.

I have researched this memory bug a little more, and it fits quite well 
with a bug in glib < 2.46.2.
http://stackoverflow.com/questions/29823097/glib-memory-leak-when-creating-gdbusproxy

It looks like the leak is in the function "g_bus_get_sync", its not 
exactly a leak, but a problem with glib's custom memory handler.

I am using Ubuntu 15.10, and it looks like it has not been patched yet. 
Ubuntu is running glib-2.46.1-1.

But thanks for the inline comments.
I still have one question left, about the MM structure.

When i have the MMObject* it seems like i can unref the MMManager* and 
Gdbus connection, and still get data from the MMObject*.

Is this the correct way to handle this, or do i need to keep the gdbus 
connection open, or does the MMObject* automatically handle that as long 
as it is referenced.

Said with other words, is it ok to unref the MMManager* and gdbus 
connection, after i get the MMObject* ?


Den 08-02-2016 kl. 12:57 skrev Aleksander Morgado:
> Hey,
>
> See some inline comments.
>
>
> On Mon, Feb 8, 2016 at 11:35 AM, Troels Olesen <to at movis.dk> wrote:
>> Here is an example code of my problem with MMManager* memory leak.
>>
>> ---------------
>> #include <iostream>
>> #include <stdio.h>
>> #include <string.h>
>> #include <unistd.h>
>> #include <glib.h>
>>
>> // HACK: 'class' is a reserved keyword in C++
>> #ifdef __cplusplus
>> extern "C" {
>> # define class modemClass
>> #endif
>>
>> #include <libmm-glib.h>
>>
>> #if __cplusplus
>> # undef class
>> } //Extern C
>> #endif
>>
>> using namespace std;
>>
>> void GetModemState()
>> {
>>      GError *error = NULL;
>>
>>      // Get Gdbus Connection
>>      GDBusConnection *connection = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL,
>> &error);
>>
>>      if(!connection)
>>      {
>>          g_warning("GetModemState : Failed to get gdbus connection");
>>          g_error_free(error);
> return;
>
>>      }
>>
>>      // Get MMModemManager
>>      MMManager *manager = mm_manager_new_sync(connection,
>> G_DBUS_OBJECT_MANAGER_CLIENT_FLAGS_DO_NOT_AUTO_START, NULL, &error);
>>
>>      if(!manager)
>>      {
>>          g_warning("GetModemState : Failed to get MMManager");
>>          g_error_free(error);
> g_object_unref(connection);
> return;
>
>>      }
>>
>>      // Get list of Modems.
>>      GList *modem_list =
>> g_dbus_object_manager_get_objects(G_DBUS_OBJECT_MANAGER(manager));
>
> if (!modem_list)
> {
>      g_warning("No modems detected");
>      g_object_unref(manager);
>      g_object_unref(connection);
>      return;
> }
>
>>      // Select first modem. and set it as MMObject.
>>      MMObject* object = MM_OBJECT(modem_list->data);
>>
>>      // Get MMModem. (peek)
>>      MMModem *modem = mm_object_peek_modem(object);
>>
>>      // Get MMModemState
>>      MMModemState modem_state = mm_modem_get_state(modem);
>>
>>      cout << "Modem state is : " << modem_state << endl;
>>
>>      // Free glist modems.
>>      g_list_free_full(modem_list, (GDestroyNotify)g_object_unref);
>>
>>      // Clear pointer referances.
>>      g_object_unref(manager);
>>      g_object_unref(connection);
>> }
>>
>>
>> int main()
>> {
>>
>>      gboolean run = true;
>>      int count = 0;
>>      while(run)
>>      {
>>          GetModemState();
>>
>>          cout << "count : " << count << endl;
>>          if(count > 100000)
>>              run = false;
>>
>>          count++;
>>          //sleep(1);
>>      }
>>
>>      return 0;
>> }
>> -------------
>>
>> When this code is run, it leaks about 0,6kb memery pr. loop.
>>
> How are you measuring the memory leaks?
>
> I get 0 definitely lost leaks in my valgrind report with your tester.
> Also, which GLib/GIO version are you using?
>



More information about the ModemManager-devel mailing list