Annotation of multiplexer/dispatch.c, revision 1.1

1.1     ! oskar       1: /*
        !             2:  * ISO 13818 stream multiplexer
        !             3:  * Copyright (C) 2001 Convergence Integrated Media GmbH Berlin
        !             4:  * Author: Oskar Schirmer (oskar@convergence.de)
        !             5:  */
        !             6: 
        !             7: /*
        !             8:  * Module:  Dispatch
        !             9:  * Purpose: Main dispatching loop.
        !            10:  *
        !            11:  * The first two buffer stages (raw file data and input stream data)
        !            12:  * are filled gready, the following two stages (from input stream to
        !            13:  * output data buffer, and further to stdout) are timing controlled.
        !            14:  */
        !            15: 
        !            16: #include "global.h"
        !            17: #include "error.h"
        !            18: #include "splice.h"
        !            19: #include "input.h"
        !            20: #include "output.h"
        !            21: #include "command.h"
        !            22: #include "dispatch.h"
        !            23: 
        !            24: boolean fatal_error;
        !            25: boolean force_quit;
        !            26: boolean busy_work;
        !            27: 
        !            28: boolean dispatch_init (void)
        !            29: {
        !            30:   fatal_error = FALSE;
        !            31:   force_quit = FALSE;
        !            32:   busy_work = FALSE;
        !            33:   return (TRUE);
        !            34: }
        !            35: 
        !            36: void dispatch (void)
        !            37: {
        !            38:   boolean bi, bo, bs;
        !            39:   stream_descr *st;
        !            40:   int tmo;
        !            41:   unsigned int nfds, onfds, infds;
        !            42:   struct pollfd ufds [MAX_POLLFD];
        !            43:   warn (LDEB,"Dispatch",EDIS,0,0,0);
        !            44:   bs = FALSE;
        !            45:   st = input_available ();
        !            46:   nfds = 0;
        !            47:   command_expected (&nfds, &ufds[0]);
        !            48:   onfds = nfds;
        !            49:   bo = output_available (&nfds, &ufds[onfds], &tmo);
        !            50:   while ((bo
        !            51:        || bs
        !            52:        || (st != NULL)
        !            53:        || input_expected ()
        !            54:        || ((tmo >= 0) && (tmo <= MAX_MSEC_OUTDELAY))
        !            55:        || busy_work)
        !            56:       && (!fatal_error)
        !            57:       && (!force_quit)) {
        !            58:     infds = nfds;
        !            59:     bi = input_acceptable (&nfds, &ufds[infds], &tmo, output_acceptable ());
        !            60:     if (bs) {
        !            61:       tmo = 0;
        !            62:     }
        !            63:     warn (LDEB,"Poll",EDIS,0,1,tmo);
        !            64: #ifdef DEBUG_TIMEPOLL
        !            65:     ltp->tmo = tmo;
        !            66: #endif
        !            67:     if (!timed_io) {
        !            68:       if (tmo > 0) {
        !            69:         global_delta += tmo;
        !            70:         tmo = 0;
        !            71:         warn (LDEB,"Global Delta",EDIS,0,3,global_delta);
        !            72: #ifdef DEBUG_TIMEPOLL
        !            73:         ltp->flags |= LTP_FLAG_DELTASHIFT;
        !            74: #endif
        !            75:       }
        !            76:     }
        !            77: #ifdef DEBUG_TIMEPOLL
        !            78:     if (ltp->usec != 0) {
        !            79:       struct timeval tv;
        !            80:       gettimeofday (&tv,NULL);
        !            81:       ltp->usec -= tv.tv_usec;
        !            82:     }
        !            83:     ltp->nfdso = infds - onfds;
        !            84:     ltp->nfdsi = nfds - infds;
        !            85:     ltp->flags |=
        !            86:       (bo ? LTP_FLAG_OUTPUT : 0) |
        !            87:       (bi ? LTP_FLAG_INPUT : 0) |
        !            88:       (bs ? LTP_FLAG_SPLIT : 0) |
        !            89:       (st != NULL ? LTP_FLAG_PROCESS : 0);
        !            90:     ltp->sr = deb_inraw_free (0);
        !            91:     ltp->si = deb_instr_free (1);
        !            92:     ltp->so = output_free ();
        !            93:     ltp->nfdsrevent =
        !            94: #endif
        !            95:     poll (&ufds[0], nfds, tmo);
        !            96: #ifdef DEBUG_TIMEPOLL
        !            97:     if (logtpc < (max_timepoll-1)) {
        !            98:       struct timeval tv;
        !            99:       logtpc += 1;
        !           100:       ltp++;
        !           101:       gettimeofday (&tv,NULL);
        !           102:       ltp->usec = tv.tv_usec;
        !           103:     }
        !           104: #endif
        !           105:     warn (LDEB,"Poll done",EDIS,0,2,nfds);
        !           106:     if ((0 < onfds)
        !           107:      && (ufds[0].revents & (POLLIN | POLLHUP | POLLERR))) {
        !           108:       command_process (ufds[0].revents & POLLIN);
        !           109:     }
        !           110:     if (bo
        !           111:      && (ufds[onfds].revents & (POLLOUT | POLLHUP | POLLERR))) {
        !           112:       output_something (ufds[onfds].revents & POLLOUT);
        !           113:     }
        !           114:     if (bi) {
        !           115:       while (infds < nfds) {
        !           116:         if (ufds[infds].revents & (POLLIN | POLLHUP | POLLERR)) {
        !           117:           input_something (input_filehandle (ufds[infds].fd),
        !           118:               ufds[infds].revents & POLLIN);
        !           119:           bi = FALSE;
        !           120:           bs = TRUE;
        !           121:         }
        !           122:         infds += 1;
        !           123:       }
        !           124:       if (!bi) {
        !           125:         if (st == NULL) {
        !           126:           st = input_available ();
        !           127:         }
        !           128:       }
        !           129:     }
        !           130:     if (bs) {
        !           131:       bs = split_something ();
        !           132:     }
        !           133:     if ((st != NULL) && output_acceptable ()) {
        !           134:       st = process_something (st);
        !           135:       bs = TRUE;
        !           136:     }
        !           137:     if (st == NULL) {
        !           138:       st = input_available ();
        !           139:     }
        !           140:     nfds = 0;
        !           141:     command_expected (&nfds, &ufds[0]);
        !           142:     onfds = nfds;
        !           143:     bo = output_available (&nfds, &ufds[onfds], &tmo);
        !           144:   }
        !           145:   process_finish ();
        !           146:   while ((output_available (&nfds, &ufds[0], &tmo)
        !           147:        || (tmo >= 0))
        !           148:       && (!fatal_error)) {
        !           149:     output_something (TRUE);
        !           150:   }
        !           151: #ifdef DEBUG_TIMEPOLL
        !           152:   {
        !           153:     int i, u, s;
        !           154:     i = 0;
        !           155:     s = 0;
        !           156:     fprintf (stderr,"lines: %8d\n",(int)logtpc);
        !           157:     while (i < logtpc) {
        !           158:       u = (logtp[i].usec > 0 ? 1000000 : 0) - logtp[i].usec;
        !           159:       s += u;
        !           160:       fprintf (stderr,
        !           161:         "%08d %10d.%06d:%8d (%6d) %c%5d %d %d/%d %c%c%c%c %d (F:%6d,S:%6d,O:%6d)\n",
        !           162:         i,
        !           163:         (int)logtp[i].tv.tv_sec,
        !           164:         (int)logtp[i].tv.tv_usec,
        !           165:         logtp[i].msec_now,
        !           166:         u,
        !           167:         logtp[i].flags & LTP_FLAG_DELTASHIFT ? 'D' : ' ',
        !           168:         logtp[i].tmo,
        !           169:         logtp[i].cnt_msecnow,
        !           170:         logtp[i].nfdsi,
        !           171:         logtp[i].nfdso,
        !           172:         logtp[i].flags & LTP_FLAG_INPUT ? 'I' : ' ',
        !           173:         logtp[i].flags & LTP_FLAG_SPLIT ? 'S' : ' ',
        !           174:         logtp[i].flags & LTP_FLAG_PROCESS ? 'P' : ' ',
        !           175:         logtp[i].flags & LTP_FLAG_OUTPUT ? 'O' : ' ',
        !           176:         logtp[i].nfdsrevent,
        !           177:         logtp[i].sr,
        !           178:         logtp[i].si,
        !           179:         logtp[i].so
        !           180:         );
        !           181:       i += 1;
        !           182:     }
        !           183:     fprintf (stderr,"%43d\n",s);
        !           184:   }
        !           185: #endif
        !           186: }
        !           187: 

LinuxTV legacy CVS <linuxtv.org/cvs>