xref: /OK3568_Linux_fs/external/xserver/include/dixstruct.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /***********************************************************
2*4882a593Smuzhiyun Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
3*4882a593Smuzhiyun 
4*4882a593Smuzhiyun                         All Rights Reserved
5*4882a593Smuzhiyun 
6*4882a593Smuzhiyun Permission to use, copy, modify, and distribute this software and its
7*4882a593Smuzhiyun documentation for any purpose and without fee is hereby granted,
8*4882a593Smuzhiyun provided that the above copyright notice appear in all copies and that
9*4882a593Smuzhiyun both that copyright notice and this permission notice appear in
10*4882a593Smuzhiyun supporting documentation, and that the name of Digital not be
11*4882a593Smuzhiyun used in advertising or publicity pertaining to distribution of the
12*4882a593Smuzhiyun software without specific, written prior permission.
13*4882a593Smuzhiyun 
14*4882a593Smuzhiyun DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
15*4882a593Smuzhiyun ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
16*4882a593Smuzhiyun DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
17*4882a593Smuzhiyun ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
18*4882a593Smuzhiyun WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
19*4882a593Smuzhiyun ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
20*4882a593Smuzhiyun SOFTWARE.
21*4882a593Smuzhiyun 
22*4882a593Smuzhiyun ******************************************************************/
23*4882a593Smuzhiyun 
24*4882a593Smuzhiyun #ifndef DIXSTRUCT_H
25*4882a593Smuzhiyun #define DIXSTRUCT_H
26*4882a593Smuzhiyun 
27*4882a593Smuzhiyun #include "client.h"
28*4882a593Smuzhiyun #include "dix.h"
29*4882a593Smuzhiyun #include "resource.h"
30*4882a593Smuzhiyun #include "cursor.h"
31*4882a593Smuzhiyun #include "gc.h"
32*4882a593Smuzhiyun #include "pixmap.h"
33*4882a593Smuzhiyun #include "privates.h"
34*4882a593Smuzhiyun #include <X11/Xmd.h>
35*4882a593Smuzhiyun 
36*4882a593Smuzhiyun /*
37*4882a593Smuzhiyun  * 	direct-mapped hash table, used by resource manager to store
38*4882a593Smuzhiyun  *      translation from client ids to server addresses.
39*4882a593Smuzhiyun  */
40*4882a593Smuzhiyun 
41*4882a593Smuzhiyun extern _X_EXPORT CallbackListPtr ClientStateCallback;
42*4882a593Smuzhiyun 
43*4882a593Smuzhiyun typedef struct {
44*4882a593Smuzhiyun     ClientPtr client;
45*4882a593Smuzhiyun     xConnSetupPrefix *prefix;
46*4882a593Smuzhiyun     xConnSetup *setup;
47*4882a593Smuzhiyun } NewClientInfoRec;
48*4882a593Smuzhiyun 
49*4882a593Smuzhiyun typedef void (*ReplySwapPtr) (ClientPtr /* pClient */ ,
50*4882a593Smuzhiyun                               int /* size */ ,
51*4882a593Smuzhiyun                               void * /* pbuf */ );
52*4882a593Smuzhiyun 
53*4882a593Smuzhiyun extern _X_EXPORT void
54*4882a593Smuzhiyun ReplyNotSwappd(ClientPtr /* pClient */ ,
55*4882a593Smuzhiyun                int /* size */ ,
56*4882a593Smuzhiyun                void * /* pbuf */ ) _X_NORETURN;
57*4882a593Smuzhiyun 
58*4882a593Smuzhiyun typedef enum { ClientStateInitial,
59*4882a593Smuzhiyun     ClientStateRunning,
60*4882a593Smuzhiyun     ClientStateRetained,
61*4882a593Smuzhiyun     ClientStateGone
62*4882a593Smuzhiyun } ClientState;
63*4882a593Smuzhiyun 
64*4882a593Smuzhiyun typedef struct _saveSet {
65*4882a593Smuzhiyun     struct _Window *windowPtr;
66*4882a593Smuzhiyun     Bool toRoot;
67*4882a593Smuzhiyun     Bool map;
68*4882a593Smuzhiyun } SaveSetElt;
69*4882a593Smuzhiyun #define SaveSetWindow(ss)   ((ss).windowPtr)
70*4882a593Smuzhiyun #define SaveSetToRoot(ss)   ((ss).toRoot)
71*4882a593Smuzhiyun #define SaveSetShouldMap(ss)	    ((ss).map)
72*4882a593Smuzhiyun #define SaveSetAssignWindow(ss,w)   ((ss).windowPtr = (w))
73*4882a593Smuzhiyun #define SaveSetAssignToRoot(ss,tr)  ((ss).toRoot = (tr))
74*4882a593Smuzhiyun #define SaveSetAssignMap(ss,m)      ((ss).map = (m))
75*4882a593Smuzhiyun 
76*4882a593Smuzhiyun typedef struct _Client {
77*4882a593Smuzhiyun     void *requestBuffer;
78*4882a593Smuzhiyun     void *osPrivate;             /* for OS layer, including scheduler */
79*4882a593Smuzhiyun     struct xorg_list ready;      /* List of clients ready to run */
80*4882a593Smuzhiyun     struct xorg_list output_pending; /* List of clients with output queued */
81*4882a593Smuzhiyun     Mask clientAsMask;
82*4882a593Smuzhiyun     short index;
83*4882a593Smuzhiyun     unsigned char majorOp, minorOp;
84*4882a593Smuzhiyun     unsigned int swapped:1;
85*4882a593Smuzhiyun     unsigned int local:1;
86*4882a593Smuzhiyun     unsigned int big_requests:1; /* supports large requests */
87*4882a593Smuzhiyun     unsigned int clientGone:1;
88*4882a593Smuzhiyun     unsigned int closeDownMode:2;
89*4882a593Smuzhiyun     unsigned int clientState:2;
90*4882a593Smuzhiyun     signed char smart_priority;
91*4882a593Smuzhiyun     short noClientException;      /* this client died or needs to be killed */
92*4882a593Smuzhiyun     int priority;
93*4882a593Smuzhiyun     ReplySwapPtr pSwapReplyFunc;
94*4882a593Smuzhiyun     XID errorValue;
95*4882a593Smuzhiyun     int sequence;
96*4882a593Smuzhiyun     int ignoreCount;            /* count for Attend/IgnoreClient */
97*4882a593Smuzhiyun     int numSaved;
98*4882a593Smuzhiyun     SaveSetElt *saveSet;
99*4882a593Smuzhiyun     int (**requestVector) (ClientPtr /* pClient */ );
100*4882a593Smuzhiyun     CARD32 req_len;             /* length of current request */
101*4882a593Smuzhiyun     unsigned int replyBytesRemaining;
102*4882a593Smuzhiyun     PrivateRec *devPrivates;
103*4882a593Smuzhiyun     unsigned short mapNotifyMask;
104*4882a593Smuzhiyun     unsigned short newKeyboardNotifyMask;
105*4882a593Smuzhiyun     unsigned char xkbClientFlags;
106*4882a593Smuzhiyun     KeyCode minKC, maxKC;
107*4882a593Smuzhiyun 
108*4882a593Smuzhiyun     int smart_start_tick;
109*4882a593Smuzhiyun     int smart_stop_tick;
110*4882a593Smuzhiyun 
111*4882a593Smuzhiyun     DeviceIntPtr clientPtr;
112*4882a593Smuzhiyun     ClientIdPtr clientIds;
113*4882a593Smuzhiyun     int req_fds;
114*4882a593Smuzhiyun } ClientRec;
115*4882a593Smuzhiyun 
116*4882a593Smuzhiyun static inline void
SetReqFds(ClientPtr client,int req_fds)117*4882a593Smuzhiyun SetReqFds(ClientPtr client, int req_fds) {
118*4882a593Smuzhiyun     if (client->req_fds != 0 && req_fds != client->req_fds)
119*4882a593Smuzhiyun         LogMessage(X_ERROR, "Mismatching number of request fds %d != %d\n", req_fds, client->req_fds);
120*4882a593Smuzhiyun     client->req_fds = req_fds;
121*4882a593Smuzhiyun }
122*4882a593Smuzhiyun 
123*4882a593Smuzhiyun /*
124*4882a593Smuzhiyun  * Scheduling interface
125*4882a593Smuzhiyun  */
126*4882a593Smuzhiyun extern long SmartScheduleTime;
127*4882a593Smuzhiyun extern long SmartScheduleInterval;
128*4882a593Smuzhiyun extern long SmartScheduleSlice;
129*4882a593Smuzhiyun extern long SmartScheduleMaxSlice;
130*4882a593Smuzhiyun #ifdef HAVE_SETITIMER
131*4882a593Smuzhiyun extern Bool SmartScheduleSignalEnable;
132*4882a593Smuzhiyun #else
133*4882a593Smuzhiyun #define SmartScheduleSignalEnable FALSE
134*4882a593Smuzhiyun #endif
135*4882a593Smuzhiyun extern void SmartScheduleStartTimer(void);
136*4882a593Smuzhiyun extern void SmartScheduleStopTimer(void);
137*4882a593Smuzhiyun 
138*4882a593Smuzhiyun /* Client has requests queued or data on the network */
139*4882a593Smuzhiyun void mark_client_ready(ClientPtr client);
140*4882a593Smuzhiyun 
141*4882a593Smuzhiyun /*
142*4882a593Smuzhiyun  * Client has requests queued or data on the network, but awaits a
143*4882a593Smuzhiyun  * server grab release
144*4882a593Smuzhiyun  */
145*4882a593Smuzhiyun void mark_client_saved_ready(ClientPtr client);
146*4882a593Smuzhiyun 
147*4882a593Smuzhiyun /* Client has no requests queued and no data on network */
148*4882a593Smuzhiyun void mark_client_not_ready(ClientPtr client);
149*4882a593Smuzhiyun 
client_is_ready(ClientPtr client)150*4882a593Smuzhiyun static inline Bool client_is_ready(ClientPtr client)
151*4882a593Smuzhiyun {
152*4882a593Smuzhiyun     return !xorg_list_is_empty(&client->ready);
153*4882a593Smuzhiyun }
154*4882a593Smuzhiyun 
155*4882a593Smuzhiyun Bool
156*4882a593Smuzhiyun clients_are_ready(void);
157*4882a593Smuzhiyun 
158*4882a593Smuzhiyun extern struct xorg_list output_pending_clients;
159*4882a593Smuzhiyun 
160*4882a593Smuzhiyun static inline void
output_pending_mark(ClientPtr client)161*4882a593Smuzhiyun output_pending_mark(ClientPtr client)
162*4882a593Smuzhiyun {
163*4882a593Smuzhiyun     if (!client->clientGone && xorg_list_is_empty(&client->output_pending))
164*4882a593Smuzhiyun         xorg_list_append(&client->output_pending, &output_pending_clients);
165*4882a593Smuzhiyun }
166*4882a593Smuzhiyun 
167*4882a593Smuzhiyun static inline void
output_pending_clear(ClientPtr client)168*4882a593Smuzhiyun output_pending_clear(ClientPtr client)
169*4882a593Smuzhiyun {
170*4882a593Smuzhiyun     xorg_list_del(&client->output_pending);
171*4882a593Smuzhiyun }
172*4882a593Smuzhiyun 
any_output_pending(void)173*4882a593Smuzhiyun static inline Bool any_output_pending(void) {
174*4882a593Smuzhiyun     return !xorg_list_is_empty(&output_pending_clients);
175*4882a593Smuzhiyun }
176*4882a593Smuzhiyun 
177*4882a593Smuzhiyun #define SMART_MAX_PRIORITY  (20)
178*4882a593Smuzhiyun #define SMART_MIN_PRIORITY  (-20)
179*4882a593Smuzhiyun 
180*4882a593Smuzhiyun extern void SmartScheduleInit(void);
181*4882a593Smuzhiyun 
182*4882a593Smuzhiyun /* This prototype is used pervasively in Xext, dix */
183*4882a593Smuzhiyun #define DISPATCH_PROC(func) int func(ClientPtr /* client */)
184*4882a593Smuzhiyun 
185*4882a593Smuzhiyun typedef struct _WorkQueue {
186*4882a593Smuzhiyun     struct _WorkQueue *next;
187*4882a593Smuzhiyun     Bool (*function) (ClientPtr /* pClient */ ,
188*4882a593Smuzhiyun                       void *    /* closure */
189*4882a593Smuzhiyun         );
190*4882a593Smuzhiyun     ClientPtr client;
191*4882a593Smuzhiyun     void *closure;
192*4882a593Smuzhiyun } WorkQueueRec;
193*4882a593Smuzhiyun 
194*4882a593Smuzhiyun extern _X_EXPORT TimeStamp currentTime;
195*4882a593Smuzhiyun 
196*4882a593Smuzhiyun extern _X_EXPORT int
197*4882a593Smuzhiyun CompareTimeStamps(TimeStamp /*a */ ,
198*4882a593Smuzhiyun                   TimeStamp /*b */ );
199*4882a593Smuzhiyun 
200*4882a593Smuzhiyun extern _X_EXPORT TimeStamp
201*4882a593Smuzhiyun ClientTimeToServerTime(CARD32 /*c */ );
202*4882a593Smuzhiyun 
203*4882a593Smuzhiyun typedef struct _CallbackRec {
204*4882a593Smuzhiyun     CallbackProcPtr proc;
205*4882a593Smuzhiyun     void *data;
206*4882a593Smuzhiyun     Bool deleted;
207*4882a593Smuzhiyun     struct _CallbackRec *next;
208*4882a593Smuzhiyun } CallbackRec, *CallbackPtr;
209*4882a593Smuzhiyun 
210*4882a593Smuzhiyun typedef struct _CallbackList {
211*4882a593Smuzhiyun     int inCallback;
212*4882a593Smuzhiyun     Bool deleted;
213*4882a593Smuzhiyun     int numDeleted;
214*4882a593Smuzhiyun     CallbackPtr list;
215*4882a593Smuzhiyun } CallbackListRec;
216*4882a593Smuzhiyun 
217*4882a593Smuzhiyun /* proc vectors */
218*4882a593Smuzhiyun 
219*4882a593Smuzhiyun extern int (*InitialVector[3]) (ClientPtr /*client */ );
220*4882a593Smuzhiyun 
221*4882a593Smuzhiyun extern _X_EXPORT int (*ProcVector[256]) (ClientPtr /*client */ );
222*4882a593Smuzhiyun 
223*4882a593Smuzhiyun extern _X_EXPORT int (*SwappedProcVector[256]) (ClientPtr /*client */ );
224*4882a593Smuzhiyun 
225*4882a593Smuzhiyun extern ReplySwapPtr ReplySwapVector[256];
226*4882a593Smuzhiyun 
227*4882a593Smuzhiyun extern _X_EXPORT int
228*4882a593Smuzhiyun ProcBadRequest(ClientPtr /*client */ );
229*4882a593Smuzhiyun 
230*4882a593Smuzhiyun #endif                          /* DIXSTRUCT_H */
231