Tag Archives: programming

Qué hace alguien que usa software propietario en éste caso?

Hoy estaba programando una aplicación en Python usando Twisted. Tenía un bug que me llevó un rato encontrar porque estaba en la librería, no en mi aplicación. Era un simple error en una función de una clase, la cuál rescribí en una clase derivada, cortando y pegando. Fue simple de resolver, porque tenía el código ahí. Y si no lo tenía? Por eso pregunto que hace un tipo que labura con una librería cerrada en éstos casos. Para encontrar el problema, edité el código del módulo de Python, le puse un par de prints y al rato ya sabía que pasaba. Si hubiera sido cerrada, seguramente estaría todavía vueltas…

Por cierto, ya reporté el bug: http://twistedmatrix.com/trac/ticket/6212

Post to Twitter

Tail calls, GCC y Linux.

Estaba mirando un post en Lwn.net que hablaba de Tail Calls y un problema con Linux, así que me puse a investigar el tema. Ésto requiere un poco de conocimiento de la ABI de Unix, que en todo caso lo resumiré en otro post, si es posible.

Tail call es una llamada a una función, que se realiza al final de la función invocante, la cual suele ser optimizada en tiempo y espacio usando el stack frame de esta. Algo asi como:

int calc(int a){
   .
   .
   .

return func(a);

}

Reservar el stack frame para func() desperdicia tiempo y espacio. Aprovechando que el de calc() ya no va a ser utilizado. GCC lo deja a disposición de func().

Esta optimización es problemática en Linux, principalmente en system calls, por lo que es evitada con un hack que básicamente mete código nulo entre el fin de la función y el tail call:

asmlinkage long sys_open(const char __user *filename, int flags, int mode)
{
        long ret;

        if (force_o_largefile())
                flags |= O_LARGEFILE;

        ret = do_sys_open(AT_FDCWD, filename, flags, mode);
        /* avoid REGPARM breakage on x86: */
        prevent_tail_call(ret);
        return ret;
}

Los system calls tienen la etiqueta asmlinkage que indica que al GCC que esa función tiene todos sus argumentos en el stack.

Post to Twitter