Página principal | Jerarquía de la clase | Lista alfabética | Lista de componentes | Lista de archivos | Miembros de las clases | Archivos de los miembros | Páginas relacionadas

_unix_io.C

Ir a la documentación de este archivo.
00001 //===========================================================================
00002 //= _unix_io.h                                           Septiembre de 1999 =
00003 //=-------------------------------------------------------------------------=
00004 //= Definiciones de operaciones de entrada/salida para entornos UNIX        =
00005 //=-------------------------------------------------------------------------=
00006 //= ADVERTENCIA: ESTE SOFTWARE NO ESTA CONCEBIDO NI DISENNADO PARA EL USO   =
00007 //= EN EQUIPO DE CONTROL EN LINEA EN ENTORNOS PELIGROSOS QUE REQUIERAN UN   =
00008 //= DESEMPENNO LIBRE DE FALLAS, COMO LA OPERACION DE PLANTAS NUCLEARES,     = 
00009 //= SISTEMAS DE NAVEGACION O COMUNICACION EN AVIONES, TRAFICO AEREO,        =
00010 //= EQUIPO MEDICO DEL CUAL DEPENDAN VIDAS HUMANAS O SISTEMAS DE ARMAMENTO,  =
00011 //= EN LOS CUALES UNA FALLA EN EL SOFTWARE PUEDA IMPLICAR DIRECTAMENTE LA   =
00012 //= MUERTE, DANNOS PERSONALES O DANNOS FISICOS Y/O AMBIENTALES GRAVES       =
00013 //= ("ACTIVIDADES DE ALGO RIESGO").                                         =
00014 //=-------------------------------------------------------------------------=
00015 //= Autor original: Oscar J. Chavarro G.  A.K.A. JEDILINK. Copyright (c),   =
00016 //= 1997 - 2003, oscarchavarro@hotmail.com                                  =
00017 //= AQUYNZA es software libre, y se rige bajo los terminos de la licencia   =
00018 //= LGPL de GNU (http://www.gnu.org). Para mayor informacion respecto a la  =
00019 //= licencia de uso, consulte el archivo ./doc/LICENCIA en la distribucion. =
00020 //===========================================================================
00021 
00022 #include "jed_defs.h"
00023 #include "toolkits/media/_unix_io.h"
00024 #include <stdio.h>
00025 #include <string.h>
00026 
00027 #if PLATAFORMA == SUN
00028 extern "C" void (*sigset(int, void(*)(int)))(int);
00029 #endif
00030 
00031 //===========================================================================
00032 //= Plantilla para el sistema de entrada/salida asincronica                 =
00033 //===========================================================================
00034 
00035 #if (PLATAFORMA != i386_LINUX_GCC) && (PLATAFORMA != ALPHA) && (PLATAFORMA != SUN) && (PLATAFORMA != SGI) && (PLATAFORMA != SPARC64_LINUX_GCC) && (PLATAFORMA != POWERPC_AIX_VACPP)
00036 #include <stdlib.h>
00037 
00038 void
00039 registrar_entrada(int fd, void (*f)(void *, int), void *User_data)
00040 {
00041     fprintf(stderr, "ERROR: registrar_entrada -> No disponible en esta plataforma.\n");
00042     fflush(stderr);
00043     exit(-10);
00044 }
00045 #endif
00046 
00047 #if (PLATAFORMA == i386_LINUX_GCC) || (PLATAFORMA == ALPHA) || (PLATAFORMA == SUN) || (PLATAFORMA == SGI) || (PLATAFORMA == SPARC64_LINUX_GCC) || (PLATAFORMA \
00048 == POWERPC_AIX_VACPP)
00049 
00050 
00051 //- Variables del sistema de entrada/salida asincronica ---------------------
00052 static _ASYN_IO_SPEC IO_devices[MAX_IO_DEVICES];
00053 static int NUM_io_devices = 0;
00054 static fd_set DESCRIPTORES_de_entrada;
00055 static int MAX_fd = 0;
00056 
00057 //- Funciones del sistema de entrada/salida asincronica ---------------------
00058 
00059 void
00060 IO_callback(int /*status*/)
00071 {
00072     //printf("<ASYNC_CALL>");  fflush(stdout);
00073 
00074     struct timeval intervalo;
00075     int i;
00076 
00077     //- Determine los archivos donde hay datos disponibles ------------------
00078     intervalo.tv_sec = 5;    // 5.000 segundos de timeout
00079     intervalo.tv_usec = 000;
00080     FD_ZERO(&DESCRIPTORES_de_entrada);
00081     for ( i = 0; i < NUM_io_devices; i++ ) {
00082         FD_SET(IO_devices[i].fd, &DESCRIPTORES_de_entrada);
00083     }
00084     /*    num_entradas =*/
00085         select(MAX_fd + 1, &DESCRIPTORES_de_entrada, NULL, NULL, &intervalo);
00086 
00087     //- Llame los callback correspondientes ---------------------------------
00088     for ( i = 0; i < NUM_io_devices; i++ ) {
00089         if ( FD_ISSET(IO_devices[i].fd, &DESCRIPTORES_de_entrada) ) {
00090             IO_devices[i].f(IO_devices[i].User_data, ACC_LEER);
00091         }
00092     }
00093 }
00094 
00095 void
00096 instalar_sistema_asincronico(void)
00105 {
00106     static BOOLEAN ya_me_instale = FALSE;
00107 
00108     if ( ya_me_instale ) return;
00109     //printf("<ASYNC_INIT>");  fflush(stdout);
00110 
00111 //= ATENCION: El metodo de sigaction ha sido desactualizado =================
00112 #ifdef NONONO
00113     //- Instale IO_callback como respuesta a SIGIO --------------------------
00114     struct sigaction saio;
00115 
00116     saio.sa_handler = IO_callback;
00117     //saio.sa_mask = 0;
00118     //saio.sa_flags = 0;
00119   #if PLATAFORMA == i386_LINUX_GCC || PLATAFORMA == SPARC64_LINUX_GCC
00120     saio.sa_restorer = NULL;
00121   #endif
00122     sigaction(SIGIO, &saio, NULL);
00123 #endif
00124 
00125 //===========================================================================
00126 #ifdef UNIX_ENABLED 
00127     signal(SIGIO, IO_callback);
00128   #if PLATAFORMA != i386_LINUX_GCC && PLATAFORMA != SPARC64_LINUX_GCC
00129     sigset(SIGIO, IO_callback);
00130   #endif
00131 #endif
00132 
00133 //===========================================================================
00134     ya_me_instale = TRUE;
00135 
00136 }
00137 
00138 void
00139 registrar_entrada(int fd, void (*f)(void *, int), void *User_data)
00150 {
00151     if ( NUM_io_devices >= MAX_IO_DEVICES ) {
00152         fprintf(stderr, "<ASYNC_IO> Warning: se ha alcanzado el maximo de "
00153             "dispositivos de entrada/salida!\n");
00154         fflush(stderr);
00155         return;
00156     }
00157 
00158     // Permitale al proceso recivir SIGIO
00159     // OJO: Probar si fcntl funciona en Solaris 2.5.x, ya funciona en
00160     //      Solaris 7
00161     if ( fcntl(fd, F_SETOWN, getpid()) < 0 ) {
00162         fprintf(stderr, "ERROR en registrar_entrada/F_SETOWN\n");
00163         fflush(stderr);
00164         exit(0);
00165     }
00166     // Haga a fd asincronico
00167     if ( fcntl(fd, F_SETFL, FASYNC) < 0 ) { 
00168         fprintf(stderr, "ERROR en registrar_entrada/F_SETFL\n");
00169         fflush(stderr);
00170         exit(0);
00171     }
00172 
00173     // Ingrese una entrada a la estructura de control
00174     IO_devices[NUM_io_devices].fd = fd;
00175     IO_devices[NUM_io_devices].f = f;
00176     IO_devices[NUM_io_devices].User_data = User_data;
00177     NUM_io_devices++;
00178 
00179     if ( fd > MAX_fd ) MAX_fd = fd;
00180 
00181     //printf("<ASYNC_REGISTER>");  fflush(stdout);
00182 }
00183 
00184 #endif // Chequeo de plataforma
00185 
00186 //===========================================================================
00187 //= EOF                                                                     =
00188 //===========================================================================
00189 

Este archivo HTML ha sido generado automáticamente a partir del código fuente AQUYNZA. NO LO EDITE. Para mayor información contacte al autor.