[Jderobot] Uso correcto de usleep y sleep en componentes

Roberto Calvo rocapal en gsyc.urjc.es
Lun Dic 30 11:16:01 CET 2013


Hola,

Durante un tiempo nos ha venido mordiendo un bug bastante problemático
sobre el uso de las funciones usleep y sleep para dormir los
componentes.

Normalmente se hace el usleep del componente así:

usleep (this->cycle - (IceUtil::Time::now().toMicroSeconds() - last.toMicroSeconds()));

Toda la operación de dentro, rara vez y de muy de tarde en tarde puede
ser negativa si el componente se lleva más tiempo que el ciclo
configurado. La función usleep espera un unsigned int, por lo que la
conversión implícita hace que un entero (-1) se convierta en un entero
sin signo (4294967295). Eso son microsegundos, pasado a horas rondan la
hora y media, teniendo en cuenta que el resultado fue un -1.

Rara vez se suele dar este comportamiento si ejecutáis 5min el
componente, pero si lo dejáis mucho tiempo ejecutando o se ejecuta en
equipos menos pontentes (MK802) aparece finalmente y veréis bloqueado
vuestro componente.

La solución pasa por comprobar el valor antes de hacer el usleep

int delay = IceUtil::Time::now().toMicroSeconds() - lastIT.toMicroSeconds();

if (delay <1 || delay > cycle)
    delay = 1;

usleep(delay);


El bug #145 detalle este problema y tenéis la solución en el primer
comentario. Por favor, echar un ojo a vuestros componentes y actualizar
si es necesario el código uniéndolo con el bug #145.

Un saludo!

[1] http://redmine.jderobot.org/issues/145

-- 
Roberto Calvo Palomino        | Robotics Lab (GSyC) 
R&D Android Mobile Engineer   | Universidad Rey Juan Carlos

Twitter: @rocapal 
Linkedin: http://www.linkedin.com/in/rocapal



More information about the Jde-developers mailing list