File: ScanEvents.c

package info (click to toggle)
nas 1.9.4-3
  • links: PTS, VCS
  • area: main
  • in suites: jessie, jessie-kfreebsd
  • size: 8,124 kB
  • ctags: 27,566
  • sloc: ansic: 52,109; makefile: 31,375; sh: 8,077; perl: 1,104; yacc: 249; cpp: 216; lex: 68
file content (103 lines) | stat: -rw-r--r-- 3,659 bytes parent folder | download | duplicates (8)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
/*
 * Copyright 1993 Network Computing Devices, Inc.
 *
 * Permission to use, copy, modify, distribute, and sell this software and
 * its documentation for any purpose is hereby granted without fee, provided
 * that the above copyright notice appear in all copies and that both that
 * copyright notice and this permission notice appear in supporting
 * documentation, and that the name Network Computing Devices, Inc. not be
 * used in advertising or publicity pertaining to distribution of this 
 * software without specific, written prior permission.
 * 
 * THIS SOFTWARE IS PROVIDED 'AS-IS'.  NETWORK COMPUTING DEVICES, INC.,
 * DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING WITHOUT
 * LIMITATION ALL IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
 * PARTICULAR PURPOSE, OR NONINFRINGEMENT.  IN NO EVENT SHALL NETWORK
 * COMPUTING DEVICES, INC., BE LIABLE FOR ANY DAMAGES WHATSOEVER, INCLUDING
 * SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS OF USE, DATA,
 * OR PROFITS, EVEN IF ADVISED OF THE POSSIBILITY THEREOF, AND REGARDLESS OF
 * WHETHER IN AN ACTION IN CONTRACT, TORT OR NEGLIGENCE, ARISING OUT OF OR IN
 * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 * 
 * $NCDId: @(#)ScanEvents.c,v 1.5 1993/01/29 20:47:28 lemke Exp $
 */

/* Portions derived from */
/* $XConsortium: XChkIfEv.c,v 11.11 91/01/06 11:44:28 rws Exp $ */
/* Copyright    Massachusetts Institute of Technology    1985, 1987	*/

#include "Alibint.h"

/*
 * AuScanEvents - Walk the queue of events (refilling if necessary) looking
 * for an event that matches a caller-specified predicate.  If one is found,
 * the search stops and the event is optionally dequeued.  The mode argument
 * indicates how far the routine should keep scanning looking for a match:
 * 
 *     AuEventsQueuedAlready		Only those events in the queue are
 * 					are scaned.
 * 
 *     AuEventsQueuedAfterReading	If no match is found from the queue,
 * 					a read is attempted see if there are
 * 					any pending.
 * 
 *     AuEventsQueuedAfterFlush		If no match is found after reading,
 * 					the output buffer is flushed.
 */

AuBool AuScanEvents (
                     AuServer *aud,
                     int mode,
                     AuBool dequeue,
                     AuBool (*predicate)(
                                         AuServer *, /* server */
                                         AuEvent *, /* event */
                                         AuPointer /* arg */
                                         ), /* function to call */
                     AuPointer arg,
                     AuEvent *event		/* AuEvent to be filled in. */
                     )
{
    _AuQEvent *prev, *qelt;
    int n;			/* time through count */

    if (mode > AuEventsQueuedAfterFlush)
	return AuFalse;

    _AuLockServer();
    prev = NULL;
    for (n = AuEventsQueuedAlready; n <= mode; n++) {
	switch (n) {
	  case AuEventsQueuedAfterReading:
	    (void) _AuEventsQueued (aud, AuEventsQueuedAfterReading);
	    break;

	  case AuEventsQueuedAfterFlush:
	    _AuFlush (aud);
	    break;
	}

	for (qelt = prev ? prev->next : aud->head; qelt;
	     prev = qelt, qelt = qelt->next) {
	    if ((*predicate)(aud, &qelt->event, arg)) {	   /* found a match */
		*event = qelt->event;
		if (dequeue) {
		    if (prev) {
			if ((prev->next = qelt->next) == NULL)
			    aud->tail = prev;
		    } else {
			if ((aud->head = qelt->next) == NULL)
			    aud->tail = NULL;
		    }
		    qelt->next = aud->qfree;
		    aud->qfree = qelt;
		    aud->qlen--;
		}
		_AuUnlockServer();
		return AuTrue;
	    }
	}
    }
    _AuUnlockServer();
    return AuFalse;
}