Annotation of 43BSDReno/contrib/isode-beta/others/X/server/WaitFor.c, revision 1.1

1.1     ! root        1: /***********************************************************
        !             2: Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts,
        !             3: and the Massachusetts Institute of Technology, Cambridge, Massachusetts.
        !             4: 
        !             5:                         All Rights Reserved
        !             6: 
        !             7: Permission to use, copy, modify, and distribute this software and its 
        !             8: documentation for any purpose and without fee is hereby granted, 
        !             9: provided that the above copyright notice appear in all copies and that
        !            10: both that copyright notice and this permission notice appear in 
        !            11: supporting documentation, and that the names of Digital or MIT not be
        !            12: used in advertising or publicity pertaining to distribution of the
        !            13: software without specific, written prior permission.  
        !            14: 
        !            15: DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
        !            16: ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
        !            17: DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
        !            18: ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
        !            19: WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
        !            20: ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
        !            21: SOFTWARE.
        !            22: 
        !            23: ******************************************************************/
        !            24: 
        !            25: /*****************************************************************
        !            26:  * OS Depedent input routines:
        !            27:  *
        !            28:  *  WaitForSomething,  GetEvent
        !            29:  *
        !            30:  *****************************************************************/
        !            31: 
        !            32: #include "Xos.h"                       /* for strings, fcntl, time */
        !            33: 
        !            34: #include <errno.h>
        !            35: #include <stdio.h>
        !            36: #include "X.h"
        !            37: #include "misc.h"
        !            38: 
        !            39: #include <sys/param.h>
        !            40: #include <signal.h>
        !            41: #include "osdep.h"
        !            42: #include "dixstruct.h"
        !            43: 
        !            44: 
        !            45: extern long AllSockets[];
        !            46: extern long AllClients[];
        !            47: extern long LastSelectMask[];
        !            48: extern long WellKnownConnections;
        !            49: extern long EnabledDevices;
        !            50: extern long ClientsWithInput[];
        !            51: extern long ClientsWriteBlocked[];
        !            52: extern long OutputPending[];
        !            53: 
        !            54: extern long ScreenSaverTime;               /* milliseconds */
        !            55: extern long ScreenSaverInterval;               /* milliseconds */
        !            56: extern ClientPtr ConnectionTranslation[];
        !            57: 
        !            58: extern Bool clientsDoomed;
        !            59: extern Bool NewOutputPending;
        !            60: extern Bool AnyClientsWriteBlocked;
        !            61: 
        !            62: extern void CheckConnections();
        !            63: extern void EstablishNewConnections();
        !            64: 
        !            65: extern int errno;
        !            66: 
        !            67: int isItTimeToYield = 1;
        !            68: 
        !            69: #ifdef MULTI_X_HACK
        !            70: extern int XMulti;
        !            71: extern int sigwindow_handler();
        !            72: #endif MULTI_X_HACK
        !            73: 
        !            74: #ifdef XTESTEXT1
        !            75: /*
        !            76:  * defined in xtestext1dd.c
        !            77:  */
        !            78: extern int playback_on;
        !            79: #endif /* XTESTEXT1 */
        !            80: 
        !            81: /*****************
        !            82:  * WaitForSomething:
        !            83:  *     Make the server suspend until there is
        !            84:  *     1. data from clients or
        !            85:  *     2. input events available or
        !            86:  *     3. ddx notices something of interest (graphics
        !            87:  *        queue ready, etc.) or
        !            88:  *     4. clients that have buffered replies/events are ready
        !            89:  *
        !            90:  *     If the time between INPUT events is
        !            91:  *     greater than ScreenSaverTime, the display is turned off (or
        !            92:  *     saved, depending on the hardware).  So, WaitForSomething()
        !            93:  *     has to handle this also (that's why the select() has a timeout.
        !            94:  *     For more info on ClientsWithInput, see ReadRequestFromClient().
        !            95:  *     pClientsReady is a mask, the bits set are 
        !            96:  *     indices into the o.s. depedent table of available clients.
        !            97:  *     (In this case, there is no table -- the index is the socket
        !            98:  *     file descriptor.)  
        !            99:  *****************/
        !           100: 
        !           101: #ifdef ISOCONN
        !           102: /*
        !           103:  * cannot use select in TSAP stuff, so...see TNetAccept
        !           104:  * (which calls xselect, which calls select...)
        !           105:  */
        !           106: 
        !           107: #include <isode/tsap.h>
        !           108: #endif /* ISOCONN */
        !           109: 
        !           110: static long timeTilFrob = 0;           /* while screen saving */
        !           111: 
        !           112: #if (mskcnt>4)
        !           113: /*
        !           114:  * This is a macro if mskcnt <= 4
        !           115:  */
        !           116: ANYSET(src)
        !           117:     long       *src;
        !           118: {
        !           119:     int i;
        !           120: 
        !           121:     for (i=0; i<mskcnt; i++)
        !           122:        if (src[ i ])
        !           123:            return (TRUE);
        !           124:     return (FALSE);
        !           125: }
        !           126: #endif
        !           127: 
        !           128: WaitForSomething(pClientsReady, nready, pNewClients, nnew)
        !           129:     ClientPtr *pClientsReady;
        !           130:     int *nready;
        !           131:     ClientPtr *pNewClients;
        !           132:     int *nnew;
        !           133: {
        !           134:     int i;
        !           135:     struct timeval waittime, *wt;
        !           136:     long timeout;
        !           137:     long clientsReadable[mskcnt];
        !           138:     long clientsWritable[mskcnt];
        !           139:     long curclient;
        !           140:     int selecterr;
        !           141: #ifdef ISOCONN
        !           142:     int vecp;
        !           143:     char *vec[4];
        !           144:     struct TSAPdisconnect tds;
        !           145:     struct TSAPdisconnect *td = &tds;
        !           146: #endif /* ISOCONN */
        !           147: 
        !           148: #ifdef hpux
        !           149:        long    ready_inputs;  /* to tell HIL drivers about input */
        !           150: #endif hpux
        !           151: 
        !           152:     *nready = 0;
        !           153:     *nnew = 0;
        !           154:     CLEARBITS(clientsReadable);
        !           155:     if (! (ANYSET(ClientsWithInput)))
        !           156:     {
        !           157:        /* We need a while loop here to handle 
        !           158:           crashed connections and the screen saver timeout */
        !           159:        while (1)
        !           160:         {
        !           161:             if (ScreenSaverTime)
        !           162:            {
        !           163:                 timeout = ScreenSaverTime - TimeSinceLastInputEvent();
        !           164:                if (timeout <= 0) /* may be forced by AutoResetServer() */
        !           165:                {
        !           166:                    long timeSinceSave;
        !           167: 
        !           168:                    if (clientsDoomed)
        !           169:                    {
        !           170:                        *nnew = *nready = 0;
        !           171:                        break;
        !           172:                    }
        !           173: 
        !           174:                    timeSinceSave = -timeout;
        !           175:                    if ((timeSinceSave >= timeTilFrob) && (timeTilFrob >= 0))
        !           176:                     {
        !           177:                        SaveScreens(SCREEN_SAVER_ON, ScreenSaverActive);
        !           178:                        if (ScreenSaverInterval)
        !           179:                            /* round up to the next ScreenSaverInterval */
        !           180:                            timeTilFrob = ScreenSaverInterval *
        !           181:                                    ((timeSinceSave + ScreenSaverInterval) /
        !           182:                                            ScreenSaverInterval);
        !           183:                        else
        !           184:                            timeTilFrob = -1;
        !           185:                    }
        !           186:                    timeout = timeTilFrob - timeSinceSave;
        !           187:                }
        !           188:                else
        !           189:                {
        !           190:                    if (timeout > ScreenSaverTime)
        !           191:                        timeout = ScreenSaverTime;
        !           192:                    timeTilFrob = 0;
        !           193:                }
        !           194:                if (timeTilFrob >= 0)
        !           195:                {
        !           196:                    waittime.tv_sec = timeout / MILLI_PER_SECOND;
        !           197:                    waittime.tv_usec = (timeout % MILLI_PER_SECOND) *
        !           198:                                            (1000000 / MILLI_PER_SECOND);
        !           199:                    wt = &waittime;
        !           200:                }
        !           201:                else
        !           202:                {
        !           203:                    wt = NULL;
        !           204:                }
        !           205:            }
        !           206:             else
        !           207:                 wt = NULL;
        !           208: #ifdef MULTI_X_HACK
        !           209:            if (XMulti) {
        !           210:                ipc_block_handler();
        !           211:                signal(SIGWINDOW,sigwindow_handler);
        !           212:            }
        !           213: #endif MULTI_X_HACK
        !           214:            COPYBITS(AllSockets, LastSelectMask);
        !           215:            BlockHandler(&wt, LastSelectMask);
        !           216:            if (NewOutputPending)
        !           217:                FlushAllOutput();
        !           218: #ifdef XTESTEXT1
        !           219:            /* XXX how does this interact with new write block handling? */
        !           220:            if (playback_on) {
        !           221:                wt = &waittime;
        !           222:                XTestComputeWaitTime (&waittime);
        !           223:            }
        !           224: #endif /* XTESTEXT1 */
        !           225: 
        !           226: #ifndef ISOCONN
        !           227:            if (AnyClientsWriteBlocked)
        !           228:            {
        !           229:                COPYBITS(ClientsWriteBlocked, clientsWritable);
        !           230:                i = select (MAXSOCKS, LastSelectMask, clientsWritable,
        !           231:                            (int *) NULL, wt);
        !           232:            }
        !           233:            else
        !           234:            {
        !           235:                i = select (MAXSOCKS, LastSelectMask,
        !           236:                            (int *) NULL, (int *) NULL, wt);
        !           237:            }
        !           238:            selecterr = errno;
        !           239: #else /* IS ISOCONN */
        !           240:            if (AnyClientsWriteBlocked)
        !           241:            {
        !           242:                int secs = wt->tv_sec;
        !           243:                if (secs == 0 && wt->tv_usec != 0)
        !           244:                        secs = 1;
        !           245:                COPYBITS(ClientsWriteBlocked, clientsWritable);
        !           246:                i = TNetAccept(&vecp, vec, MAXSOCKS, LastSelectMask,
        !           247:                        clientsWritable, (int *)NULL, wt->tv_sec, td);
        !           248:            }
        !           249:            else
        !           250:            {
        !           251:                int secs = wt->tv_sec;
        !           252:                if (secs == 0 && wt->tv_usec != 0)
        !           253:                        secs = 1;
        !           254:                i = TNetAccept(&vecp, vec, MAXSOCKS, LastSelectMask,
        !           255:                        (int *)NULL, (int *)NULL, secs, td);
        !           256:            }
        !           257: /* map errors */
        !           258:            if (i < 0) {
        !           259:                if (!DR_FATAL(td->td_reason))
        !           260:                    errno = EWOULDBLOCK;
        !           261:            }
        !           262:            selecterr = errno;
        !           263: #endif /* ISOCONN */
        !           264:            WakeupHandler(i, LastSelectMask);
        !           265: #ifdef XTESTEXT1
        !           266:            if (playback_on) {
        !           267:                i = XTestProcessInputAction (i, &waittime);
        !           268:            }
        !           269: #endif /* XTESTEXT1 */
        !           270:            if (i <= 0) /* An error or timeout occurred */
        !           271:             {
        !           272: #ifdef ISODEBUG
        !           273:                if (isodexbug)
        !           274:                        fprintf(stderr, "WF: TO or ERR %d\n", i);
        !           275: #endif
        !           276:                CLEARBITS(clientsWritable);
        !           277:                if (i < 0) 
        !           278:                    if (selecterr == EBADF)    /* Some client disconnected */
        !           279:                    {
        !           280:                        CheckConnections ();
        !           281:                        if (! ANYSET (AllClients))
        !           282:                            return;
        !           283:                    }
        !           284:                    else if (selecterr != EINTR)
        !           285:                        ErrorF("WaitForSomething(): select: errno=%d\n",
        !           286:                            selecterr);
        !           287:            }
        !           288:            else
        !           289:            {
        !           290:                if (AnyClientsWriteBlocked && ANYSET (clientsWritable))
        !           291:                {
        !           292: #ifdef ISODEBUG
        !           293:                        if (isodexbug)
        !           294:                            fprintf(stderr, "WF: write\n");
        !           295: #endif
        !           296:                    NewOutputPending = TRUE;
        !           297:                    ORBITS(OutputPending, clientsWritable, OutputPending);
        !           298:                    UNSETBITS(ClientsWriteBlocked, clientsWritable);
        !           299:                    if (! ANYSET(ClientsWriteBlocked))
        !           300:                        AnyClientsWriteBlocked = FALSE;
        !           301:                }
        !           302:  
        !           303: #ifdef hpux
        !           304:                ready_inputs = (LastSelectMask[0] & EnabledDevices);
        !           305: 
        !           306:                if (ready_inputs > 0)  store_inputs (ready_inputs);
        !           307:                        /* call the HIL driver to gather inputs.        */
        !           308: #endif hpux
        !           309: 
        !           310:                MASKANDSETBITS(clientsReadable, LastSelectMask, AllClients); 
        !           311: #ifdef ISOCONN
        !           312: /*
        !           313:  * ISODE version says new connections pending accept if vecp > 0 !!
        !           314:  */
        !           315:                if (vecp > 0) {
        !           316: #ifdef ISODEBUG
        !           317:                    if (isodexbug)
        !           318:                            fprintf(stderr, "WF: CX pending\n");
        !           319: #endif
        !           320:                    EstablishNewConnections(pNewClients, nnew, vecp, vec);
        !           321:                }
        !           322: #else /* ISOCONN */
        !           323:                if (LastSelectMask[0] & WellKnownConnections) 
        !           324:                    EstablishNewConnections(pNewClients, nnew);
        !           325: #endif /* ISOCONN */
        !           326:                if (*nnew || (LastSelectMask[0] & EnabledDevices) 
        !           327:                    || (ANYSET (clientsReadable)))
        !           328:                            break;
        !           329:            }
        !           330:        }
        !           331:     }
        !           332:     else
        !           333:     {
        !           334:        COPYBITS(ClientsWithInput, clientsReadable);
        !           335:     }
        !           336: 
        !           337:     if (ANYSET(clientsReadable))
        !           338:     {
        !           339: #ifdef ISODEBUG
        !           340:        if (isodexbug)
        !           341:                fprintf(stderr, "WF: readable\n");
        !           342: #endif
        !           343:        for (i=0; i<mskcnt; i++)
        !           344:        {
        !           345:            while (clientsReadable[i])
        !           346:            {
        !           347:                curclient = ffs (clientsReadable[i]) - 1;
        !           348:                pClientsReady[(*nready)++] = 
        !           349:                        ConnectionTranslation[curclient + (32 * i)];
        !           350:                clientsReadable[i] &= ~(1 << curclient);
        !           351:            }
        !           352:        }       
        !           353:     }
        !           354: }
        !           355: 
        !           356: 
        !           357: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.