00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
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
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
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
00058
00059 void
00060 IO_callback(int )
00071 {
00072
00073
00074 struct timeval intervalo;
00075 int i;
00076
00077
00078 intervalo.tv_sec = 5;
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
00085 select(MAX_fd + 1, &DESCRIPTORES_de_entrada, NULL, NULL, &intervalo);
00086
00087
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
00110
00111
00112 #ifdef NONONO
00113
00114 struct sigaction saio;
00115
00116 saio.sa_handler = IO_callback;
00117
00118
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
00159
00160
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
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
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
00182 }
00183
00184 #endif // Chequeo de plataforma
00185
00186
00187
00188
00189