Liqueo de Memoria que no logro encontrar Hola, estuve trabajando en un plugin para un proyecto que estoy desarrollando, este trabaja con la libreria dbus-glib, soy nuevo usando esta libreria y luego de romperme la cabeza vastante logre lo que necesitaba, posiblemente este mal implementada y me gustaria saberlo.
Mi programa funciona bien, excepto por un detalle, se va comiendo la memoria de a poco, 4Kb unas 10 veces por segundo, y el liqueo de memoria no lo encuentro, si alguien me puede dar una mano lo agradeceria enormemente
El problema esta aca adentro (de la funcion que adjunto), eso es llamado no mas de 10 veces por segundo, la primera vez todo va bien, pero en la segunda ya empieza da tragar memoria,
quisas me esta faltando liberar algo.
Código:
bool leetodo(bateria &Bateria,gboolean lnombres,gboolean lcarga, gboolean lestado){
GError *el_error = NULL;
gboolean result;
DBusGProxy *proxy = NULL;
proxy = get_dbus_proxy("org.freedesktop.Hal", Bateria.udi.c_str(), "org.freedesktop.Hal.Device");
if(lnombres){
char *nombre, *tipo, *tecnologia;
result = dbus_g_proxy_call(proxy, "GetProperty", &el_error,
G_TYPE_STRING, "info.product", G_TYPE_INVALID,
G_TYPE_STRING, &nombre, G_TYPE_INVALID);
if(error_happened(result, el_error)) Bateria.nombre = "N/A";
else{
Bateria.nombre = nombre;
g_free(nombre);
}
el_error = NULL;
result = dbus_g_proxy_call(proxy, "GetPropertyString", &el_error,
G_TYPE_STRING, "battery.type",G_TYPE_INVALID,
G_TYPE_STRING, &tipo, G_TYPE_INVALID);
if(error_happened(result, el_error)) Bateria.tipo = "N/A";
else{
Bateria.tipo = tipo;
g_free(tipo);
}
el_error = NULL;
result = dbus_g_proxy_call(proxy, "GetProperty", &el_error,
G_TYPE_STRING, "battery.reporting.technology", G_TYPE_INVALID,
G_TYPE_STRING, &tecnologia, G_TYPE_INVALID);
if(error_happened(result, el_error)) Bateria.tecnologia = "N/A";
else{
Bateria.tecnologia = tecnologia;
g_free(tecnologia);
}
}
if(lcarga){
gint ultima, ahora;
Bateria.carga = 0;
el_error = NULL;
result = dbus_g_proxy_call(proxy, "GetProperty", &el_error,
G_TYPE_STRING, "battery.charge_level.last_full", G_TYPE_INVALID, G_TYPE_INT, &ultima, G_TYPE_INVALID);
if(!error_happened(result, el_error)){
el_error = NULL;
result = dbus_g_proxy_call(proxy, "GetProperty", &el_error,
G_TYPE_STRING, "battery.charge_level.current",G_TYPE_INVALID,
G_TYPE_INT, &ahora, G_TYPE_INVALID);
if(!error_happened(result, el_error)){
if(ultima < 1) ultima = 1;
Bateria.carga = (ahora*100 / ultima*100) /100;
}
}
}
if(lestado){
gboolean presente, recargable, cargando, descargando;
el_error = NULL;
result = dbus_g_proxy_call(proxy, "GetProperty", &el_error,
G_TYPE_STRING, "battery.present",G_TYPE_INVALID,
G_TYPE_BOOLEAN, &presente,G_TYPE_INVALID);
if(!error_happened(result, el_error)){
if(!presente) Bateria.estado = "Missing";
else{
el_error = NULL;
result = dbus_g_proxy_call(proxy, "GetProperty", &el_error,
G_TYPE_STRING, "battery.is_rechargeable",G_TYPE_INVALID,
G_TYPE_BOOLEAN, &recargable,G_TYPE_INVALID);
if(!error_happened(result, el_error)){
if(!recargable) Bateria.estado = "Ready";
else{
el_error = NULL;
result = dbus_g_proxy_call(proxy, "GetProperty", &el_error,
G_TYPE_STRING, "battery.rechargeable.is_charging",G_TYPE_INVALID,
G_TYPE_BOOLEAN, &cargando,G_TYPE_INVALID);
if(!error_happened(result, el_error)){
if(cargando) Bateria.estado = "Charging";
else{
el_error = NULL;
result = dbus_g_proxy_call(proxy, "GetProperty", &el_error,
G_TYPE_STRING, "battery.rechargeable.is_discharging",G_TYPE_INVALID,
G_TYPE_BOOLEAN, &descargando, G_TYPE_INVALID);
if(!error_happened(result, el_error)){
if(descargando) Bateria.estado = "Working";
else Bateria.estado = "Ready";
}
}
}
}
}
}
}
}
if (proxy != NULL) g_object_unref(proxy);
return true;
}
si necesitan otra funcion la pondre pero creo que el error esta alli
Muchas gracias. |