Ver Mensaje Individual
  #1 (permalink)  
Antiguo 24/01/2009, 18:30
Avatar de MeduZaPaT
MeduZaPaT
 
Fecha de Ingreso: enero-2009
Ubicación: USA
Mensajes: 106
Antigüedad: 15 años, 9 meses
Puntos: 3
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.