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