Provided by: manpages-es_1.55-10_all bug

NOMBRE

       futex - llamada al sistema para bloqueos rapidos en espacio de usuario

SINOPSIS

       #include <linux/futex.h>

       #include <sys/time.h>

       int  sys_futex  (void  *futex,  int  op, int val, const struct timespec
       *timeout);

DESCRIPCI'ON

       La llamada al sistema sys_futex proporciona un metodo que permite a  un
       programa  esperar  hasta que cambie el valor de una direccion dada y un
       metodo para despertar a cualquier proceso que  este  esperando  en  una
       direccion  particular  (aunque  las  direcciones para una misma zona de
       memoria en procesos separados pueden no  ser  iguales,  el  nucleo  las
       proyecta   internamente   para  que  la  misma  memoria  proyectada  en
       direcciones distintas concuerde para  diferentes  llamadas  sys_futex).
       Tipicamente  se usa para implementar el caso de contienda de un bloqueo
       en memoria compartida, como se describe en futex(4).

       Cuando una operacion futex(4)  termina  con  contienda  en  espacio  de
       usuario,  es necesario hacer una llamada al nucleo para que arbitre. El
       arbitraje  puede  significar  o  bloquear  al  proceso   invocador   o,
       contrariamente, despertar a un proceso bloqueado.

       Se  espera  que los procesos que llamen a esta funcion se adhieran a la
       semantica que se expone en  futex(4).  Ya  que  esta  semantica  supone
       escribir  instrucciones  en  ensamblador no (trans)portables, esto a su
       vez probablemente significa que la mayoria de  los  usuarios  seran  de
       hecho   autores  de  bibliotecas  y  no  desarrolladores  genericos  de
       aplicaciones.

       Es necesario que el argumento futex apunte a  un  entero  alineado  que
       almacene  el  contador.  La  operacion  a ejecutar se pasa a traves del
       parametro op junto con un valor val.

       Actualmente se definen tres operaciones:

       FUTEX_WAIT
              Esta operacion  verifica  atomicamente  si  la  direccion  futex
              contiene  todavia el valor dado y bloquea al proceso a la espera
              de FUTEX_WAKE en esta direccion futex. Si el  argumento  timeout
              no  es  NULL,  su  contenido  describe  la duracion maxima de la
              espera, que es  infinita  en  otro  caso.  Para  futex(4),  esta
              llamada  se  ejecuta  si al decrementar el contador se obtuvo un
              valor negativo (indicando contencion) y se bloqueara  hasta  que
              otro proceso libere el futex y ejecute la operacion FUTEX_WAKE.

       FUTEX_WAKE
              Esta  operacion  despierta, como mucho, val procesos que esperan
              en esta direccion futex (es decir, dentro de FUTEX_WAIT).   Para
              futex(4),  esta llamada se ejecuta si al incrementar el contador
              se vio que habia procesos esperando una vez que al futex  se  le
              ha asignado el valor 1 (indicando que esta disponible).

       FUTEX_FD
              Para  soportar  despertares asincronos, esta operacion asocia un
              descriptor de fichero con un futex. Si otro proceso  ejecuta  un
              FUTEX_WAKE,  el  proceso recibira el numero de senal que se paso
              en val. El  proceso  invocador  debe  cerrar  el  descriptor  de
              fichero devuelto despues de su uso.

              Para  evitar condiciones de carrera, el invocador debe comprobar
              si se ha incrementado el futex despues de que FUTEX_FD regrese.

VALOR DEVUELTO

       Dependiendo de la operacion que se haya ejecutado,  el  valor  devuelto
       puede tener significados diferentes.

       FUTEX_WAIT
              Devuelve  0  si  el  proceso  fue  despertado  por  una  llamada
              FUTEX_WAKE. En el  caso  de  que  haya  expirado  el  plazo,  se
              devuelve  ETIMEDOUT. Si el futex no era igual al valor esperado,
              la operacion devuelve EWOULDBLOCK. Las senales (u  otros  falsos
              despertares) hacen que FUTEX_WAIT devuelva EINTR.

       FUTEX_WAKE
              Devuelve el numero de procesos despertados.

       FUTEX_FD
              Devuelve el nuevo descriptor de fichero asociado al futex.

OBSERVACIONES

       Insistimos, los futexes, en su forma mas basica, no estan pensados como
       abstraccion sencilla para los usuarios finales. Es de esperar  que  los
       implementadores  sean  buenos  conocedores  de  ensamblador y que hayan
       leido los fuentes de la biblioteca de futex en espacio de  usuario  que
       se indica mas abajo.

AUTORES

       Los  futexes  fueron disenados e implementados por Hubertus Franke (IBM
       Thomas J. Watson Research Center), Matthew Kirkwood, Ingo  Molnar  (Red
       Hat)  y  Rusty  Russell  (IBM Linux Technology Center). Esta pagina fue
       escrita por Bert Hubert.

VERSIONES

       El soporte inicial para futex se anadio a la  version  2.5.7  de  Linux
       pero  con una semantica distinta a la descrita mas arriba. La semantica
       actual se encuentra disponible desde la version 2.5.40 de Linux.

V'EASE TAMBI'EN

       futex(4), `Fuss, Futexes and Furwocks: Fast Userlevel Locking in Linux'
       (actas  del  Ottawa  Linux  Symposium  2002),  biblioteca de ejemplo de
       futex,                                                  futex-*.tar.bz2
       <URL:ftp://ftp.nl.kernel.org:/pub/linux/kernel/people/rusty/>.

                               31 diciembre 2002                      FUTEX(2)