XSync.c revision 05a4e9a7
1caade7ccSmrg/*
2caade7ccSmrg
3caade7ccSmrgCopyright 1991, 1993, 1998  The Open Group
4caade7ccSmrg
5caade7ccSmrgPermission to use, copy, modify, distribute, and sell this software and its
6caade7ccSmrgdocumentation for any purpose is hereby granted without fee, provided that
7caade7ccSmrgthe above copyright notice appear in all copies and that both that
8caade7ccSmrgcopyright notice and this permission notice appear in supporting
9caade7ccSmrgdocumentation.
10caade7ccSmrg
11caade7ccSmrgThe above copyright notice and this permission notice shall be included
12caade7ccSmrgin all copies or substantial portions of the Software.
13caade7ccSmrg
14caade7ccSmrgTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
15caade7ccSmrgOR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16caade7ccSmrgMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
17caade7ccSmrgIN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR
18caade7ccSmrgOTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19caade7ccSmrgARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20caade7ccSmrgOTHER DEALINGS IN THE SOFTWARE.
21caade7ccSmrg
22caade7ccSmrgExcept as contained in this notice, the name of The Open Group shall
23caade7ccSmrgnot be used in advertising or otherwise to promote the sale, use or
24caade7ccSmrgother dealings in this Software without prior written authorization
25caade7ccSmrgfrom The Open Group.
26caade7ccSmrg
27caade7ccSmrg*/
28caade7ccSmrg
29caade7ccSmrg/***********************************************************
30caade7ccSmrgCopyright 1991,1993 by Digital Equipment Corporation, Maynard, Massachusetts,
31caade7ccSmrgand Olivetti Research Limited, Cambridge, England.
32caade7ccSmrg
33caade7ccSmrg                        All Rights Reserved
34caade7ccSmrg
35caade7ccSmrgPermission to use, copy, modify, and distribute this software and its
36caade7ccSmrgdocumentation for any purpose and without fee is hereby granted,
37caade7ccSmrgprovided that the above copyright notice appear in all copies and that
38caade7ccSmrgboth that copyright notice and this permission notice appear in
39caade7ccSmrgsupporting documentation, and that the names of Digital or Olivetti
40caade7ccSmrgnot be used in advertising or publicity pertaining to distribution of the
41caade7ccSmrgsoftware without specific, written prior permission.
42caade7ccSmrg
43caade7ccSmrgDIGITAL AND OLIVETTI DISCLAIM ALL WARRANTIES WITH REGARD TO THIS
44caade7ccSmrgSOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
45caade7ccSmrgFITNESS, IN NO EVENT SHALL THEY BE LIABLE FOR ANY SPECIAL, INDIRECT OR
46caade7ccSmrgCONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
47caade7ccSmrgUSE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
48caade7ccSmrgOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
49caade7ccSmrgPERFORMANCE OF THIS SOFTWARE.
50caade7ccSmrg
51caade7ccSmrg******************************************************************/
52caade7ccSmrg
53caade7ccSmrg#ifdef HAVE_CONFIG_H
54caade7ccSmrg#include <config.h>
55caade7ccSmrg#endif
56caade7ccSmrg#include <stdio.h>
57caade7ccSmrg#include <X11/Xlibint.h>
58caade7ccSmrg#include <X11/extensions/Xext.h>
59caade7ccSmrg#include <X11/extensions/extutil.h>
60485f0483Smrg#include <X11/extensions/sync.h>
61485f0483Smrg#include <X11/extensions/syncproto.h>
62caade7ccSmrg
63caade7ccSmrgstatic XExtensionInfo _sync_info_data;
64caade7ccSmrgstatic XExtensionInfo *sync_info = &_sync_info_data;
65caade7ccSmrgstatic char    *sync_extension_name = SYNC_NAME;
66caade7ccSmrg
67caade7ccSmrg#define SyncCheckExtension(dpy,i,val) \
68caade7ccSmrg		XextCheckExtension(dpy, i, sync_extension_name, val)
69caade7ccSmrg#define SyncSimpleCheckExtension(dpy,i) \
70caade7ccSmrg		XextSimpleCheckExtension(dpy, i, sync_extension_name)
71caade7ccSmrg
72caade7ccSmrgstatic int      close_display(Display *dpy, XExtCodes *codes);
73caade7ccSmrgstatic Bool wire_to_event(Display *dpy, XEvent *event, xEvent *wire);
74caade7ccSmrgstatic Status event_to_wire(Display *dpy, XEvent *event, xEvent *wire);
75caade7ccSmrgstatic char    *error_string(Display *dpy, int code, XExtCodes *codes,
76caade7ccSmrg			     char *buf, int n);
77caade7ccSmrg
78caade7ccSmrgstatic XExtensionHooks sync_extension_hooks = {
79caade7ccSmrg    NULL,			/* create_gc */
80caade7ccSmrg    NULL,			/* copy_gc */
81caade7ccSmrg    NULL,			/* flush_gc */
82caade7ccSmrg    NULL,			/* free_gc */
83caade7ccSmrg    NULL,			/* create_font */
84caade7ccSmrg    NULL,			/* free_font */
85caade7ccSmrg    close_display,		/* close_display */
86caade7ccSmrg    wire_to_event,		/* wire_to_event */
87caade7ccSmrg    event_to_wire,		/* event_to_wire */
88caade7ccSmrg    NULL,			/* error */
89caade7ccSmrg    error_string,		/* error_string */
90caade7ccSmrg};
91caade7ccSmrg
92caade7ccSmrgstatic char    *sync_error_list[] = {
93caade7ccSmrg    "BadCounter",
94caade7ccSmrg    "BadAlarm",
95a5602400Smrg    "BadFence",
96caade7ccSmrg};
97caade7ccSmrg
98a5602400Smrgtypedef struct _SyncVersionInfoRec {
99a5602400Smrg    short major;
100a5602400Smrg    short minor;
101a5602400Smrg    int num_errors;
102a5602400Smrg} SyncVersionInfo;
103a5602400Smrg
104a5602400Smrgstatic /* const */ SyncVersionInfo supported_versions[] = {
105a5602400Smrg    { 3 /* major */, 0 /* minor */, 2 /* num_errors */ },
106a5602400Smrg    { 3 /* major */, 1 /* minor */, 3 /* num_errors */ },
107a5602400Smrg};
108a5602400Smrg
109a5602400Smrg#define NUM_VERSIONS (sizeof(supported_versions)/sizeof(supported_versions[0]))
11005a4e9a7Smrg#define GET_VERSION(info) ((const SyncVersionInfo*)(info)->data)
11105a4e9a7Smrg#define IS_VERSION_SUPPORTED(info) (!!(info))
112a5602400Smrg
113caade7ccSmrgstatic
114a5602400Smrgconst SyncVersionInfo* GetVersionInfo(Display *dpy)
115a5602400Smrg{
116a5602400Smrg    xSyncInitializeReply rep;
117a5602400Smrg    xSyncInitializeReq *req;
118a5602400Smrg    XExtCodes codes;
119a5602400Smrg    int i;
120a5602400Smrg
121a5602400Smrg    if (!XQueryExtension(dpy, sync_extension_name,
122a5602400Smrg                         &codes.major_opcode,
123a5602400Smrg                         &codes.first_event,
124a5602400Smrg                         &codes.first_error))
125a5602400Smrg        return NULL;
126a5602400Smrg
127a5602400Smrg    LockDisplay(dpy);
128a5602400Smrg    GetReq(SyncInitialize, req);
129a5602400Smrg    req->reqType = codes.major_opcode;
130a5602400Smrg    req->syncReqType = X_SyncInitialize;
131a5602400Smrg    req->majorVersion = SYNC_MAJOR_VERSION;
132a5602400Smrg    req->minorVersion = SYNC_MINOR_VERSION;
133a5602400Smrg    if (!_XReply(dpy, (xReply *) & rep, 0, xTrue))
134a5602400Smrg    {
135a5602400Smrg	UnlockDisplay(dpy);
136a5602400Smrg	SyncHandle();
137a5602400Smrg	return NULL;
138a5602400Smrg    }
139a5602400Smrg    UnlockDisplay(dpy);
140a5602400Smrg    SyncHandle();
141a5602400Smrg
142a5602400Smrg    for (i = 0; i < NUM_VERSIONS; i++) {
143a5602400Smrg	if (supported_versions[i].major == rep.majorVersion &&
144a5602400Smrg	    supported_versions[i].minor == rep.minorVersion) {
145a5602400Smrg	    return &supported_versions[i];
146a5602400Smrg	}
147a5602400Smrg    }
148a5602400Smrg
149a5602400Smrg    return NULL;
150a5602400Smrg}
151caade7ccSmrg
152caade7ccSmrgstatic
153a5602400SmrgXExtDisplayInfo *find_display_create_optional(Display *dpy, Bool create)
154a5602400Smrg{
155a5602400Smrg    XExtDisplayInfo *dpyinfo;
156a5602400Smrg
157a5602400Smrg    if (!sync_info) {
158a5602400Smrg        if (!(sync_info = XextCreateExtension())) return NULL;
159a5602400Smrg    }
160a5602400Smrg
161a5602400Smrg    if (!(dpyinfo = XextFindDisplay (sync_info, dpy)) && create) {
162a5602400Smrg        dpyinfo = XextAddDisplay(sync_info, dpy,
163a5602400Smrg                                 sync_extension_name,
164a5602400Smrg                                 &sync_extension_hooks,
165a5602400Smrg                                 XSyncNumberEvents,
166a5602400Smrg                                 (XPointer)GetVersionInfo(dpy));
167a5602400Smrg    }
168a5602400Smrg
169a5602400Smrg    return dpyinfo;
170a5602400Smrg}
171caade7ccSmrg
172caade7ccSmrgstatic
173a5602400SmrgXExtDisplayInfo *find_display (Display *dpy)
174a5602400Smrg{
175a5602400Smrg    return find_display_create_optional(dpy, True);
176a5602400Smrg}
177caade7ccSmrg
178a5602400Smrgstatic
179a5602400SmrgXEXT_GENERATE_CLOSE_DISPLAY(close_display, sync_info)
180a5602400Smrg
181a5602400Smrgstatic
182a5602400Smrgchar *error_string(Display *dpy, int code, XExtCodes *codes, char *buf, int n)
183a5602400Smrg{
184a5602400Smrg    XExtDisplayInfo *info = find_display_create_optional(dpy, False);
185a5602400Smrg    int nerr = IS_VERSION_SUPPORTED(info) ? GET_VERSION(info)->num_errors : 0;
186a5602400Smrg
187a5602400Smrg    code -= codes->first_error;
188a5602400Smrg    if (code >= 0 && code < nerr) {
189a5602400Smrg	char tmp[256];
190a5602400Smrg	sprintf (tmp, "%s.%d", sync_extension_name, code);
191a5602400Smrg	XGetErrorDatabaseText (dpy, "XProtoError", tmp, sync_error_list[code], buf, n);
192a5602400Smrg	return buf;
193a5602400Smrg    }
194a5602400Smrg    return (char *)0;
195a5602400Smrg}
196caade7ccSmrg
197caade7ccSmrgstatic Bool
198caade7ccSmrgwire_to_event(Display *dpy, XEvent *event, xEvent *wire)
199caade7ccSmrg{
200caade7ccSmrg    XExtDisplayInfo *info = find_display(dpy);
201caade7ccSmrg    XSyncCounterNotifyEvent *aevent;
202caade7ccSmrg    xSyncCounterNotifyEvent *awire;
203caade7ccSmrg    XSyncAlarmNotifyEvent *anl;
204caade7ccSmrg    xSyncAlarmNotifyEvent *ane;
205caade7ccSmrg
206caade7ccSmrg    SyncCheckExtension(dpy, info, False);
207caade7ccSmrg
208caade7ccSmrg    switch ((wire->u.u.type & 0x7F) - info->codes->first_event)
209caade7ccSmrg    {
210caade7ccSmrg      case XSyncCounterNotify:
211caade7ccSmrg	awire = (xSyncCounterNotifyEvent *) wire;
212caade7ccSmrg	aevent = (XSyncCounterNotifyEvent *) event;
213caade7ccSmrg	aevent->type = awire->type & 0x7F;
214caade7ccSmrg	aevent->serial = _XSetLastRequestRead(dpy,
215caade7ccSmrg					      (xGenericReply *) wire);
216caade7ccSmrg	aevent->send_event = (awire->type & 0x80) != 0;
217caade7ccSmrg	aevent->display = dpy;
218caade7ccSmrg	aevent->counter = awire->counter;
219caade7ccSmrg	XSyncIntsToValue(&aevent->wait_value, awire->wait_value_lo,
220caade7ccSmrg				    awire->wait_value_hi);
221caade7ccSmrg	XSyncIntsToValue(&aevent->counter_value,
222caade7ccSmrg				    awire->counter_value_lo,
223caade7ccSmrg				    awire->counter_value_hi);
224caade7ccSmrg	aevent->time = awire->time;
225caade7ccSmrg	aevent->count = awire->count;
226caade7ccSmrg	aevent->destroyed = awire->destroyed;
227caade7ccSmrg	return True;
228caade7ccSmrg
229caade7ccSmrg      case XSyncAlarmNotify:
230caade7ccSmrg	ane = (xSyncAlarmNotifyEvent *) wire;	/* ENCODING EVENT PTR */
231caade7ccSmrg	anl = (XSyncAlarmNotifyEvent *) event;	/* LIBRARY EVENT PTR */
232caade7ccSmrg	anl->type = ane->type & 0x7F;
233caade7ccSmrg	anl->serial = _XSetLastRequestRead(dpy,
234caade7ccSmrg					   (xGenericReply *) wire);
235caade7ccSmrg	anl->send_event = (ane->type & 0x80) != 0;
236caade7ccSmrg	anl->display = dpy;
237caade7ccSmrg	anl->alarm = ane->alarm;
238caade7ccSmrg	XSyncIntsToValue(&anl->counter_value,
239caade7ccSmrg				    ane->counter_value_lo,
240caade7ccSmrg				    ane->counter_value_hi);
241caade7ccSmrg	XSyncIntsToValue(&anl->alarm_value,
242caade7ccSmrg				    ane->alarm_value_lo,
243caade7ccSmrg				    ane->alarm_value_hi);
244caade7ccSmrg	anl->state = (XSyncAlarmState)ane->state;
245caade7ccSmrg	anl->time = ane->time;
246caade7ccSmrg	return True;
247caade7ccSmrg    }
248caade7ccSmrg
249caade7ccSmrg    return False;
250caade7ccSmrg}
251caade7ccSmrg
252caade7ccSmrgstatic Status
253caade7ccSmrgevent_to_wire(Display *dpy, XEvent *event, xEvent *wire)
254caade7ccSmrg{
255caade7ccSmrg    XExtDisplayInfo *info = find_display(dpy);
256caade7ccSmrg    XSyncCounterNotifyEvent *aevent;
257caade7ccSmrg    xSyncCounterNotifyEvent *awire;
258caade7ccSmrg    XSyncAlarmNotifyEvent *anl;
259caade7ccSmrg    xSyncAlarmNotifyEvent *ane;
260caade7ccSmrg
261caade7ccSmrg    SyncCheckExtension(dpy, info, False);
262caade7ccSmrg
263caade7ccSmrg    switch ((event->type & 0x7F) - info->codes->first_event)
264caade7ccSmrg    {
265caade7ccSmrg      case XSyncCounterNotify:
266caade7ccSmrg	awire = (xSyncCounterNotifyEvent *) wire;
267caade7ccSmrg	aevent = (XSyncCounterNotifyEvent *) event;
268caade7ccSmrg	awire->type = aevent->type | (aevent->send_event ? 0x80 : 0);
269caade7ccSmrg	awire->sequenceNumber = aevent->serial & 0xFFFF;
270caade7ccSmrg	awire->counter = aevent->counter;
271caade7ccSmrg	awire->wait_value_lo = XSyncValueLow32(aevent->wait_value);
272caade7ccSmrg	awire->wait_value_hi = XSyncValueHigh32(aevent->wait_value);
273caade7ccSmrg	awire->counter_value_lo = XSyncValueLow32(aevent->counter_value);
274caade7ccSmrg	awire->counter_value_hi = XSyncValueHigh32(aevent->counter_value);
275caade7ccSmrg	awire->time = aevent->time;
276caade7ccSmrg	awire->count = aevent->count;
277caade7ccSmrg	awire->destroyed = aevent->destroyed;
278caade7ccSmrg	return True;
279caade7ccSmrg
280caade7ccSmrg      case XSyncAlarmNotify:
281caade7ccSmrg	ane = (xSyncAlarmNotifyEvent *) wire;	/* ENCODING EVENT PTR */
282caade7ccSmrg	anl = (XSyncAlarmNotifyEvent *) event;	/* LIBRARY EVENT PTR */
283caade7ccSmrg	ane->type = anl->type | (anl->send_event ? 0x80 : 0);
284caade7ccSmrg	ane->sequenceNumber = anl->serial & 0xFFFF;
285caade7ccSmrg	ane->alarm = anl->alarm;
286caade7ccSmrg	ane->counter_value_lo = XSyncValueLow32(anl->counter_value);
287caade7ccSmrg	ane->counter_value_hi = XSyncValueHigh32(anl->counter_value);
288caade7ccSmrg	ane->alarm_value_lo = XSyncValueLow32(anl->alarm_value);
289caade7ccSmrg	ane->alarm_value_hi = XSyncValueHigh32(anl->alarm_value);
290caade7ccSmrg	ane->state = anl->state;
291caade7ccSmrg	ane->time = anl->time;
292caade7ccSmrg	return True;
293caade7ccSmrg    }
294caade7ccSmrg    return False;
295caade7ccSmrg}
296caade7ccSmrg
297caade7ccSmrgStatus
298caade7ccSmrgXSyncQueryExtension(
299caade7ccSmrg    Display *dpy,
300caade7ccSmrg    int *event_base_return, int *error_base_return)
301caade7ccSmrg{
302caade7ccSmrg    XExtDisplayInfo *info = find_display(dpy);
303caade7ccSmrg
304caade7ccSmrg    if (XextHasExtension(info))
305caade7ccSmrg    {
306caade7ccSmrg	*event_base_return = info->codes->first_event;
307caade7ccSmrg	*error_base_return = info->codes->first_error;
308caade7ccSmrg	return True;
309caade7ccSmrg    }
310caade7ccSmrg    else
311caade7ccSmrg	return False;
312caade7ccSmrg}
313caade7ccSmrg
314caade7ccSmrgStatus
315caade7ccSmrgXSyncInitialize(
316caade7ccSmrg    Display *dpy,
317caade7ccSmrg    int *major_version_return, int *minor_version_return)
318caade7ccSmrg{
319caade7ccSmrg    XExtDisplayInfo *info = find_display(dpy);
320caade7ccSmrg
321caade7ccSmrg    SyncCheckExtension(dpy, info, False);
322caade7ccSmrg
323a5602400Smrg    if (IS_VERSION_SUPPORTED(info)) {
324a5602400Smrg	*major_version_return = GET_VERSION(info)->major;
325a5602400Smrg	*minor_version_return = GET_VERSION(info)->minor;
326a5602400Smrg
327a5602400Smrg	return True;
328a5602400Smrg    } else {
329caade7ccSmrg	return False;
330caade7ccSmrg    }
331caade7ccSmrg}
332caade7ccSmrg
333caade7ccSmrgXSyncSystemCounter *
334caade7ccSmrgXSyncListSystemCounters(Display *dpy, int *n_counters_return)
335caade7ccSmrg{
336caade7ccSmrg    XExtDisplayInfo *info = find_display(dpy);
337caade7ccSmrg    xSyncListSystemCountersReply rep;
338caade7ccSmrg    xSyncListSystemCountersReq *req;
339caade7ccSmrg    XSyncSystemCounter *list = NULL;
340caade7ccSmrg
341caade7ccSmrg    SyncCheckExtension(dpy, info, NULL);
342caade7ccSmrg
343caade7ccSmrg    LockDisplay(dpy);
344caade7ccSmrg    GetReq(SyncListSystemCounters, req);
345caade7ccSmrg    req->reqType = info->codes->major_opcode;
346caade7ccSmrg    req->syncReqType = X_SyncListSystemCounters;
347caade7ccSmrg    if (!_XReply(dpy, (xReply *) & rep, 0, xFalse))
348caade7ccSmrg	goto bail;
349caade7ccSmrg
350caade7ccSmrg    *n_counters_return = rep.nCounters;
351caade7ccSmrg    if (rep.nCounters > 0)
352caade7ccSmrg    {
353caade7ccSmrg	xSyncSystemCounter *pWireSysCounter, *pNextWireSysCounter;
354caade7ccSmrg	XSyncCounter counter;
355caade7ccSmrg	int replylen;
356caade7ccSmrg	int i;
357caade7ccSmrg
358485f0483Smrg	list = Xmalloc(rep.nCounters * sizeof(XSyncSystemCounter));
359caade7ccSmrg	replylen = rep.length << 2;
360485f0483Smrg	pWireSysCounter = Xmalloc ((unsigned) replylen + sizeof(XSyncCounter));
361485f0483Smrg        /* +1 to leave room for last counter read-ahead */
362caade7ccSmrg
363caade7ccSmrg	if ((!list) || (!pWireSysCounter))
364caade7ccSmrg	{
365caade7ccSmrg	    if (list) Xfree((char *) list);
366caade7ccSmrg	    if (pWireSysCounter)   Xfree((char *) pWireSysCounter);
367caade7ccSmrg	    _XEatData(dpy, (unsigned long) replylen);
368caade7ccSmrg	    list = NULL;
369caade7ccSmrg	    goto bail;
370caade7ccSmrg	}
371caade7ccSmrg
372caade7ccSmrg	_XReadPad(dpy, (char *)pWireSysCounter, replylen);
373caade7ccSmrg
374caade7ccSmrg	counter = pWireSysCounter->counter;
375caade7ccSmrg	for (i = 0; i < rep.nCounters; i++)
376caade7ccSmrg	{
377caade7ccSmrg	    list[i].counter = counter;
378caade7ccSmrg	    XSyncIntsToValue(&list[i].resolution,
379caade7ccSmrg					pWireSysCounter->resolution_lo,
380caade7ccSmrg					pWireSysCounter->resolution_hi);
381caade7ccSmrg
382caade7ccSmrg	    /* we may be about to clobber the counter field of the
383caade7ccSmrg	     * next syscounter because we have to add a null terminator
384caade7ccSmrg	     * to the counter name string.  So we save the next counter
385caade7ccSmrg	     * here.
386caade7ccSmrg	     */
387caade7ccSmrg	    pNextWireSysCounter = (xSyncSystemCounter *)
388caade7ccSmrg		(((char *)pWireSysCounter) + ((SIZEOF(xSyncSystemCounter) +
389caade7ccSmrg				     pWireSysCounter->name_length + 3) & ~3));
390caade7ccSmrg	    counter = pNextWireSysCounter->counter;
391caade7ccSmrg
392caade7ccSmrg	    list[i].name = ((char *)pWireSysCounter) +
393caade7ccSmrg						SIZEOF(xSyncSystemCounter);
394caade7ccSmrg	    /* null-terminate the string */
395caade7ccSmrg	    *(list[i].name + pWireSysCounter->name_length) = '\0';
396caade7ccSmrg	    pWireSysCounter = pNextWireSysCounter;
397caade7ccSmrg	}
398caade7ccSmrg    }
399caade7ccSmrg
400caade7ccSmrgbail:
401caade7ccSmrg    UnlockDisplay(dpy);
402caade7ccSmrg    SyncHandle();
403caade7ccSmrg    return list;
404caade7ccSmrg}
405caade7ccSmrg
406caade7ccSmrgvoid
407caade7ccSmrgXSyncFreeSystemCounterList(XSyncSystemCounter *list)
408caade7ccSmrg{
409caade7ccSmrg    if (list)
410caade7ccSmrg    {
411caade7ccSmrg	Xfree( ((char *)list[0].name) - SIZEOF(xSyncSystemCounter));
412caade7ccSmrg	Xfree(list);
413caade7ccSmrg    }
414caade7ccSmrg}
415caade7ccSmrg
416caade7ccSmrg
417caade7ccSmrgXSyncCounter
418caade7ccSmrgXSyncCreateCounter(Display *dpy, XSyncValue initial_value)
419caade7ccSmrg{
420caade7ccSmrg    XExtDisplayInfo *info = find_display(dpy);
421caade7ccSmrg    xSyncCreateCounterReq *req;
422caade7ccSmrg
423caade7ccSmrg    SyncCheckExtension(dpy, info, None);
424caade7ccSmrg
425caade7ccSmrg    LockDisplay(dpy);
426caade7ccSmrg    GetReq(SyncCreateCounter, req);
427caade7ccSmrg    req->reqType = info->codes->major_opcode;
428caade7ccSmrg    req->syncReqType = X_SyncCreateCounter;
429caade7ccSmrg
430caade7ccSmrg    req->cid = XAllocID(dpy);
431caade7ccSmrg    req->initial_value_lo = XSyncValueLow32(initial_value);
432caade7ccSmrg    req->initial_value_hi = XSyncValueHigh32(initial_value);
433caade7ccSmrg
434caade7ccSmrg    UnlockDisplay(dpy);
435caade7ccSmrg    SyncHandle();
436caade7ccSmrg    return req->cid;
437caade7ccSmrg}
438caade7ccSmrg
439caade7ccSmrgStatus
440caade7ccSmrgXSyncSetCounter(Display *dpy, XSyncCounter counter, XSyncValue value)
441caade7ccSmrg{
442caade7ccSmrg    XExtDisplayInfo *info = find_display(dpy);
443caade7ccSmrg    xSyncSetCounterReq *req;
444caade7ccSmrg
445caade7ccSmrg    SyncCheckExtension(dpy, info, False);
446caade7ccSmrg
447caade7ccSmrg    LockDisplay(dpy);
448caade7ccSmrg    GetReq(SyncSetCounter, req);
449caade7ccSmrg    req->reqType = info->codes->major_opcode;
450caade7ccSmrg    req->syncReqType = X_SyncSetCounter;
451caade7ccSmrg    req->cid = counter;
452caade7ccSmrg    req->value_lo = XSyncValueLow32(value);
453caade7ccSmrg    req->value_hi = XSyncValueHigh32(value);
454caade7ccSmrg    UnlockDisplay(dpy);
455caade7ccSmrg    SyncHandle();
456caade7ccSmrg    return True;
457caade7ccSmrg}
458caade7ccSmrg
459caade7ccSmrgStatus
460caade7ccSmrgXSyncChangeCounter(Display *dpy, XSyncCounter counter, XSyncValue value)
461caade7ccSmrg{
462caade7ccSmrg    XExtDisplayInfo *info = find_display(dpy);
463caade7ccSmrg    xSyncChangeCounterReq *req;
464caade7ccSmrg
465caade7ccSmrg    SyncCheckExtension(dpy, info, False);
466caade7ccSmrg
467caade7ccSmrg    LockDisplay(dpy);
468caade7ccSmrg    GetReq(SyncChangeCounter, req);
469caade7ccSmrg    req->reqType = info->codes->major_opcode;
470caade7ccSmrg    req->syncReqType = X_SyncChangeCounter;
471caade7ccSmrg    req->cid = counter;
472caade7ccSmrg    req->value_lo = XSyncValueLow32(value);
473caade7ccSmrg    req->value_hi = XSyncValueHigh32(value);
474caade7ccSmrg    UnlockDisplay(dpy);
475caade7ccSmrg    SyncHandle();
476caade7ccSmrg    return True;
477caade7ccSmrg}
478caade7ccSmrg
479caade7ccSmrgStatus
480caade7ccSmrgXSyncDestroyCounter(Display *dpy, XSyncCounter counter)
481caade7ccSmrg{
482caade7ccSmrg    XExtDisplayInfo *info = find_display(dpy);
483caade7ccSmrg    xSyncDestroyCounterReq *req;
484caade7ccSmrg
485caade7ccSmrg    SyncCheckExtension(dpy, info, False);
486caade7ccSmrg
487caade7ccSmrg    LockDisplay(dpy);
488caade7ccSmrg    GetReq(SyncDestroyCounter, req);
489caade7ccSmrg    req->reqType = info->codes->major_opcode;
490caade7ccSmrg    req->syncReqType = X_SyncDestroyCounter;
491caade7ccSmrg    req->counter = counter;
492caade7ccSmrg    UnlockDisplay(dpy);
493caade7ccSmrg    SyncHandle();
494caade7ccSmrg
495caade7ccSmrg    return True;
496caade7ccSmrg}
497caade7ccSmrg
498caade7ccSmrgStatus
499caade7ccSmrgXSyncQueryCounter(Display *dpy, XSyncCounter counter, XSyncValue *value_return)
500caade7ccSmrg{
501caade7ccSmrg    XExtDisplayInfo *info = find_display(dpy);
502caade7ccSmrg    xSyncQueryCounterReply rep;
503caade7ccSmrg    xSyncQueryCounterReq *req;
504caade7ccSmrg
505caade7ccSmrg    SyncCheckExtension(dpy, info, False);
506caade7ccSmrg
507caade7ccSmrg    LockDisplay(dpy);
508caade7ccSmrg    GetReq(SyncQueryCounter, req);
509caade7ccSmrg    req->reqType = info->codes->major_opcode;
510caade7ccSmrg    req->syncReqType = X_SyncQueryCounter;
511caade7ccSmrg    req->counter = counter;
512caade7ccSmrg    if (!_XReply(dpy, (xReply *) & rep, 0, xTrue))
513caade7ccSmrg    {
514caade7ccSmrg	UnlockDisplay(dpy);
515caade7ccSmrg	SyncHandle();
516caade7ccSmrg	return False;
517caade7ccSmrg    }
518caade7ccSmrg    XSyncIntsToValue(value_return, rep.value_lo, rep.value_hi);
519caade7ccSmrg    UnlockDisplay(dpy);
520caade7ccSmrg    SyncHandle();
521caade7ccSmrg
522caade7ccSmrg    return True;
523caade7ccSmrg}
524caade7ccSmrg
525caade7ccSmrg
526caade7ccSmrgStatus
527caade7ccSmrgXSyncAwait(Display *dpy, XSyncWaitCondition *wait_list, int n_conditions)
528caade7ccSmrg{
529caade7ccSmrg    XExtDisplayInfo *info = find_display(dpy);
530caade7ccSmrg    XSyncWaitCondition *wait_item = wait_list;
531caade7ccSmrg    xSyncAwaitReq  *req;
532caade7ccSmrg    unsigned int    len;
533caade7ccSmrg
534caade7ccSmrg    SyncCheckExtension(dpy, info, False);
535caade7ccSmrg
536caade7ccSmrg    LockDisplay(dpy);
537caade7ccSmrg    GetReq(SyncAwait, req);
538caade7ccSmrg    req->reqType = info->codes->major_opcode;
539caade7ccSmrg    req->syncReqType = X_SyncAwait;
540caade7ccSmrg    len = (n_conditions * SIZEOF(xSyncWaitCondition)) >> 2;
541caade7ccSmrg    SetReqLen(req, len, len /* XXX */ );
542caade7ccSmrg
543caade7ccSmrg    while (n_conditions--)
544caade7ccSmrg    {
545caade7ccSmrg	xSyncWaitCondition  wc;
546caade7ccSmrg	wc.counter = wait_item->trigger.counter;
547caade7ccSmrg	wc.value_type = wait_item->trigger.value_type;
548caade7ccSmrg	wc.wait_value_lo = XSyncValueLow32(wait_item->trigger.wait_value);
549caade7ccSmrg	wc.wait_value_hi = XSyncValueHigh32(wait_item->trigger.wait_value);
550caade7ccSmrg	wc.test_type = wait_item->trigger.test_type;
551caade7ccSmrg	wc.event_threshold_lo = XSyncValueLow32(wait_item->event_threshold);
552caade7ccSmrg	wc.event_threshold_hi = XSyncValueHigh32(wait_item->event_threshold);
553caade7ccSmrg	Data(dpy, (char *)&wc, SIZEOF(xSyncWaitCondition));
554caade7ccSmrg	wait_item++;		/* get next trigger */
555caade7ccSmrg    }
556caade7ccSmrg
557caade7ccSmrg    UnlockDisplay(dpy);
558caade7ccSmrg    SyncHandle();
559caade7ccSmrg    return True;
560caade7ccSmrg}
561caade7ccSmrg
562caade7ccSmrgstatic void
563caade7ccSmrg_XProcessAlarmAttributes(Display *dpy, xSyncChangeAlarmReq *req,
564caade7ccSmrg			 unsigned long valuemask,
565caade7ccSmrg			 XSyncAlarmAttributes *attributes)
566caade7ccSmrg{
567caade7ccSmrg
568caade7ccSmrg    unsigned long  values[32];
569caade7ccSmrg    unsigned long *value = values;
570caade7ccSmrg    unsigned int    nvalues;
571caade7ccSmrg
572caade7ccSmrg    if (valuemask & XSyncCACounter)
573caade7ccSmrg	*value++ = attributes->trigger.counter;
574caade7ccSmrg
575caade7ccSmrg    if (valuemask & XSyncCAValueType)
576caade7ccSmrg	*value++ = attributes->trigger.value_type;
577caade7ccSmrg
578caade7ccSmrg    if (valuemask & XSyncCAValue)
579caade7ccSmrg    {
580caade7ccSmrg	*value++ = XSyncValueHigh32(attributes->trigger.wait_value);
581caade7ccSmrg	*value++ = XSyncValueLow32(attributes->trigger.wait_value);
582caade7ccSmrg    }
583caade7ccSmrg
584caade7ccSmrg    if (valuemask & XSyncCATestType)
585caade7ccSmrg	*value++ = attributes->trigger.test_type;
586caade7ccSmrg
587caade7ccSmrg    if (valuemask & XSyncCADelta)
588caade7ccSmrg    {
589caade7ccSmrg	*value++ = XSyncValueHigh32(attributes->delta);
590caade7ccSmrg	*value++ = XSyncValueLow32(attributes->delta);
591caade7ccSmrg    }
592caade7ccSmrg
593caade7ccSmrg    if (valuemask & XSyncCAEvents)
594caade7ccSmrg	*value++ = attributes->events;
595caade7ccSmrg
596caade7ccSmrg    /* N.B. the 'state' field cannot be set or changed */
597caade7ccSmrg    req->length += (nvalues = value - values);
598caade7ccSmrg    nvalues <<= 2;		/* watch out for macros... */
599caade7ccSmrg
600caade7ccSmrg    Data32(dpy, (long *) values, (long) nvalues);
601caade7ccSmrg}
602caade7ccSmrg
603caade7ccSmrgXSyncAlarm
604caade7ccSmrgXSyncCreateAlarm(
605caade7ccSmrg    Display *dpy,
606caade7ccSmrg    unsigned long values_mask,
607caade7ccSmrg    XSyncAlarmAttributes *values)
608caade7ccSmrg{
609caade7ccSmrg    XExtDisplayInfo *info = find_display(dpy);
610caade7ccSmrg    xSyncCreateAlarmReq *req;
611caade7ccSmrg    XSyncAlarm      aid;
612caade7ccSmrg
613caade7ccSmrg    SyncCheckExtension(dpy, info, False);
614caade7ccSmrg
615caade7ccSmrg    LockDisplay(dpy);
616caade7ccSmrg    GetReq(SyncCreateAlarm, req);
617caade7ccSmrg    req->reqType = info->codes->major_opcode;
618caade7ccSmrg    req->syncReqType = X_SyncCreateAlarm;
619caade7ccSmrg    req->id = aid = XAllocID(dpy);
620caade7ccSmrg    values_mask &= XSyncCACounter | XSyncCAValueType | XSyncCAValue
621caade7ccSmrg			| XSyncCATestType | XSyncCADelta | XSyncCAEvents;
622caade7ccSmrg    if ((req->valueMask = values_mask))
623caade7ccSmrg	_XProcessAlarmAttributes(dpy, (xSyncChangeAlarmReq *) req,
624caade7ccSmrg				 values_mask, values);
625caade7ccSmrg    UnlockDisplay(dpy);
626caade7ccSmrg    SyncHandle();
627caade7ccSmrg    return aid;
628caade7ccSmrg}
629caade7ccSmrg
630caade7ccSmrgStatus
631caade7ccSmrgXSyncDestroyAlarm(Display *dpy, XSyncAlarm alarm)
632caade7ccSmrg{
633caade7ccSmrg    XExtDisplayInfo *info = find_display(dpy);
634caade7ccSmrg    xSyncDestroyAlarmReq *req;
635caade7ccSmrg
636caade7ccSmrg    SyncCheckExtension(dpy, info, False);
637caade7ccSmrg
638caade7ccSmrg    LockDisplay(dpy);
639caade7ccSmrg    GetReq(SyncDestroyAlarm, req);
640caade7ccSmrg    req->reqType = info->codes->major_opcode;
641caade7ccSmrg    req->syncReqType = X_SyncDestroyAlarm;
642caade7ccSmrg    req->alarm = alarm;
643caade7ccSmrg    UnlockDisplay(dpy);
644caade7ccSmrg    SyncHandle();
645caade7ccSmrg    return True;
646caade7ccSmrg}
647caade7ccSmrg
648caade7ccSmrgStatus
649caade7ccSmrgXSyncQueryAlarm(
650caade7ccSmrg    Display *dpy,
651caade7ccSmrg    XSyncAlarm alarm,
652caade7ccSmrg    XSyncAlarmAttributes *values_return)
653caade7ccSmrg{
654caade7ccSmrg    XExtDisplayInfo *info = find_display(dpy);
655caade7ccSmrg    xSyncQueryAlarmReq *req;
656caade7ccSmrg    xSyncQueryAlarmReply rep;
657caade7ccSmrg
658caade7ccSmrg    SyncCheckExtension(dpy, info, False);
659caade7ccSmrg
660caade7ccSmrg    LockDisplay(dpy);
661caade7ccSmrg    GetReq(SyncQueryAlarm, req);
662caade7ccSmrg    req->reqType = info->codes->major_opcode;
663caade7ccSmrg    req->syncReqType = X_SyncQueryAlarm;
664caade7ccSmrg    req->alarm = alarm;
665caade7ccSmrg
666caade7ccSmrg    if (!(_XReply(dpy, (xReply *) & rep,
667caade7ccSmrg    ((SIZEOF(xSyncQueryAlarmReply) - SIZEOF(xGenericReply)) >> 2), xFalse)))
668caade7ccSmrg    {
669caade7ccSmrg	UnlockDisplay(dpy);
670caade7ccSmrg	SyncHandle();
671caade7ccSmrg	return False;
672caade7ccSmrg    }
673caade7ccSmrg
674caade7ccSmrg    values_return->trigger.counter = rep.counter;
675caade7ccSmrg    values_return->trigger.value_type = (XSyncValueType)rep.value_type;
676caade7ccSmrg    XSyncIntsToValue(&values_return->trigger.wait_value,
677caade7ccSmrg				rep.wait_value_lo, rep.wait_value_hi);
678caade7ccSmrg    values_return->trigger.test_type = (XSyncTestType)rep.test_type;
679caade7ccSmrg    XSyncIntsToValue(&values_return->delta, rep.delta_lo,
680caade7ccSmrg				rep.delta_hi);
681caade7ccSmrg    values_return->events = rep.events;
682caade7ccSmrg    values_return->state = (XSyncAlarmState)rep.state;
683caade7ccSmrg    UnlockDisplay(dpy);
684caade7ccSmrg    SyncHandle();
685caade7ccSmrg    return True;
686caade7ccSmrg}
687caade7ccSmrg
688caade7ccSmrgStatus
689caade7ccSmrgXSyncChangeAlarm(
690caade7ccSmrg    Display *dpy,
691caade7ccSmrg    XSyncAlarm alarm,
692caade7ccSmrg    unsigned long values_mask,
693caade7ccSmrg    XSyncAlarmAttributes *values)
694caade7ccSmrg{
695caade7ccSmrg    XExtDisplayInfo *info = find_display(dpy);
696caade7ccSmrg    xSyncChangeAlarmReq *req;
697caade7ccSmrg
698caade7ccSmrg    SyncCheckExtension(dpy, info, False);
699caade7ccSmrg
700caade7ccSmrg    LockDisplay(dpy);
701caade7ccSmrg    GetReq(SyncChangeAlarm, req);
702caade7ccSmrg    req->reqType = info->codes->major_opcode;
703caade7ccSmrg    req->syncReqType = X_SyncChangeAlarm;
704caade7ccSmrg    req->alarm = alarm;
705caade7ccSmrg    values_mask &= XSyncCACounter | XSyncCAValueType | XSyncCAValue
706caade7ccSmrg		 | XSyncCATestType | XSyncCADelta | XSyncCAEvents;
707caade7ccSmrg    if ((req->valueMask = values_mask))
708caade7ccSmrg	_XProcessAlarmAttributes(dpy, req, values_mask, values);
709caade7ccSmrg    UnlockDisplay(dpy);
710caade7ccSmrg    SyncHandle();
711caade7ccSmrg    return True;
712caade7ccSmrg}
713caade7ccSmrg
714caade7ccSmrgStatus
715caade7ccSmrgXSyncSetPriority(
716caade7ccSmrg    Display *dpy,
717caade7ccSmrg    XID client_resource_id,
718caade7ccSmrg    int priority)
719caade7ccSmrg{
720caade7ccSmrg    XExtDisplayInfo *info = find_display(dpy);
721caade7ccSmrg    xSyncSetPriorityReq *req;
722caade7ccSmrg
723caade7ccSmrg    SyncCheckExtension(dpy, info, False);
724caade7ccSmrg
725caade7ccSmrg    LockDisplay(dpy);
726caade7ccSmrg    GetReq(SyncSetPriority, req);
727caade7ccSmrg    req->reqType = info->codes->major_opcode;
728caade7ccSmrg    req->syncReqType = X_SyncSetPriority;
729caade7ccSmrg    req->id = client_resource_id;
730caade7ccSmrg    req->priority = priority;
731caade7ccSmrg    UnlockDisplay(dpy);
732caade7ccSmrg    SyncHandle();
733caade7ccSmrg    return True;
734caade7ccSmrg}
735caade7ccSmrg
736caade7ccSmrgStatus
737caade7ccSmrgXSyncGetPriority(Display *dpy, XID client_resource_id, int *return_priority)
738caade7ccSmrg{
739caade7ccSmrg    XExtDisplayInfo *info = find_display(dpy);
740caade7ccSmrg    xSyncGetPriorityReply rep;
741caade7ccSmrg    xSyncGetPriorityReq *req;
742caade7ccSmrg
743caade7ccSmrg    SyncCheckExtension(dpy, info, False);
744caade7ccSmrg
745caade7ccSmrg    LockDisplay(dpy);
746caade7ccSmrg    GetReq(SyncGetPriority, req);
747caade7ccSmrg    req->reqType = info->codes->major_opcode;
748caade7ccSmrg    req->syncReqType = X_SyncGetPriority;
749caade7ccSmrg    req->id = client_resource_id;
750caade7ccSmrg
751caade7ccSmrg    if (!_XReply(dpy, (xReply *) & rep, 0, xFalse))
752caade7ccSmrg    {
753caade7ccSmrg	UnlockDisplay(dpy);
754caade7ccSmrg	SyncHandle();
755caade7ccSmrg	return False;
756caade7ccSmrg    }
757caade7ccSmrg    if (return_priority)
758caade7ccSmrg	*return_priority = rep.priority;
759caade7ccSmrg
760caade7ccSmrg    UnlockDisplay(dpy);
761caade7ccSmrg    SyncHandle();
762caade7ccSmrg    return True;
763caade7ccSmrg}
764caade7ccSmrg
765a5602400SmrgXSyncFence
766a5602400SmrgXSyncCreateFence(Display *dpy, Drawable d, Bool initially_triggered)
767a5602400Smrg{
768a5602400Smrg    XExtDisplayInfo *info = find_display(dpy);
769a5602400Smrg    xSyncCreateFenceReq *req;
770a5602400Smrg    XSyncFence id;
771a5602400Smrg
772a5602400Smrg    SyncCheckExtension(dpy, info, None);
773a5602400Smrg
774a5602400Smrg    LockDisplay(dpy);
775a5602400Smrg    GetReq(SyncCreateFence, req);
776a5602400Smrg    req->reqType = info->codes->major_opcode;
777a5602400Smrg    req->syncReqType = X_SyncCreateFence;
778a5602400Smrg
779a5602400Smrg    req->d = d;
780a5602400Smrg    id = req->fid = XAllocID(dpy);
781a5602400Smrg    req->initially_triggered = initially_triggered;
782a5602400Smrg
783a5602400Smrg    UnlockDisplay(dpy);
784a5602400Smrg    SyncHandle();
785a5602400Smrg    return id;
786a5602400Smrg}
787a5602400Smrg
788a5602400SmrgBool
789a5602400SmrgXSyncTriggerFence(Display *dpy, XSyncFence fence)
790a5602400Smrg{
791a5602400Smrg    XExtDisplayInfo *info = find_display(dpy);
792a5602400Smrg    xSyncTriggerFenceReq *req;
793a5602400Smrg
794a5602400Smrg    SyncCheckExtension(dpy, info, None);
795a5602400Smrg
796a5602400Smrg    LockDisplay(dpy);
797a5602400Smrg    GetReq(SyncTriggerFence, req);
798a5602400Smrg    req->reqType = info->codes->major_opcode;
799a5602400Smrg    req->syncReqType = X_SyncTriggerFence;
800a5602400Smrg
801a5602400Smrg    req->fid = fence;
802a5602400Smrg
803a5602400Smrg    UnlockDisplay(dpy);
804a5602400Smrg    SyncHandle();
805a5602400Smrg    return True;
806a5602400Smrg}
807a5602400Smrg
808a5602400SmrgBool
809a5602400SmrgXSyncResetFence(Display *dpy, XSyncFence fence)
810a5602400Smrg{
811a5602400Smrg    XExtDisplayInfo *info = find_display(dpy);
812a5602400Smrg    xSyncResetFenceReq *req;
813a5602400Smrg
814a5602400Smrg    SyncCheckExtension(dpy, info, None);
815a5602400Smrg
816a5602400Smrg    LockDisplay(dpy);
817a5602400Smrg    GetReq(SyncResetFence, req);
818a5602400Smrg    req->reqType = info->codes->major_opcode;
819a5602400Smrg    req->syncReqType = X_SyncResetFence;
820a5602400Smrg
821a5602400Smrg    req->fid = fence;
822a5602400Smrg
823a5602400Smrg    UnlockDisplay(dpy);
824a5602400Smrg    SyncHandle();
825a5602400Smrg    return True;
826a5602400Smrg}
827a5602400Smrg
828a5602400SmrgBool
829a5602400SmrgXSyncDestroyFence(Display *dpy, XSyncFence fence)
830a5602400Smrg{
831a5602400Smrg    XExtDisplayInfo *info = find_display(dpy);
832a5602400Smrg    xSyncDestroyFenceReq *req;
833a5602400Smrg
834a5602400Smrg    SyncCheckExtension(dpy, info, None);
835a5602400Smrg
836a5602400Smrg    LockDisplay(dpy);
837a5602400Smrg    GetReq(SyncDestroyFence, req);
838a5602400Smrg    req->reqType = info->codes->major_opcode;
839a5602400Smrg    req->syncReqType = X_SyncDestroyFence;
840a5602400Smrg
841a5602400Smrg    req->fid = fence;
842a5602400Smrg
843a5602400Smrg    UnlockDisplay(dpy);
844a5602400Smrg    SyncHandle();
845a5602400Smrg    return True;
846a5602400Smrg}
847a5602400Smrg
848a5602400SmrgBool
849a5602400SmrgXSyncQueryFence(Display *dpy, XSyncFence fence, Bool *triggered)
850a5602400Smrg{
851a5602400Smrg    XExtDisplayInfo *info = find_display(dpy);
852a5602400Smrg    xSyncQueryFenceReply rep;
853a5602400Smrg    xSyncQueryFenceReq *req;
854a5602400Smrg
855a5602400Smrg    SyncCheckExtension(dpy, info, None);
856a5602400Smrg
857a5602400Smrg    LockDisplay(dpy);
858a5602400Smrg    GetReq(SyncQueryFence, req);
859a5602400Smrg    req->reqType = info->codes->major_opcode;
860a5602400Smrg    req->syncReqType = X_SyncQueryFence;
861a5602400Smrg    req->fid = fence;
862a5602400Smrg
863a5602400Smrg    if (!_XReply(dpy, (xReply *) & rep, 0, xFalse))
864a5602400Smrg    {
865a5602400Smrg	UnlockDisplay(dpy);
866a5602400Smrg	SyncHandle();
867a5602400Smrg	return False;
868a5602400Smrg    }
869a5602400Smrg    if (triggered)
870a5602400Smrg	*triggered = rep.triggered;
871a5602400Smrg
872a5602400Smrg    UnlockDisplay(dpy);
873a5602400Smrg    SyncHandle();
874a5602400Smrg    return True;
875a5602400Smrg}
876a5602400Smrg
877a5602400SmrgBool
878a5602400SmrgXSyncAwaitFence(Display *dpy, const XSyncFence *fence_list, int n_fences)
879a5602400Smrg{
880a5602400Smrg    XExtDisplayInfo *info = find_display(dpy);
881a5602400Smrg    xSyncAwaitFenceReq  *req;
882a5602400Smrg
883a5602400Smrg    SyncCheckExtension(dpy, info, False);
884a5602400Smrg
885a5602400Smrg    LockDisplay(dpy);
886a5602400Smrg    GetReq(SyncAwaitFence, req);
887a5602400Smrg    req->reqType = info->codes->major_opcode;
888a5602400Smrg    req->syncReqType = X_SyncAwaitFence;
889a5602400Smrg    SetReqLen(req, n_fences, n_fences);
890a5602400Smrg
891a5602400Smrg    Data32(dpy, (char *)fence_list, sizeof(CARD32) * n_fences);
892a5602400Smrg
893a5602400Smrg    UnlockDisplay(dpy);
894a5602400Smrg    SyncHandle();
895a5602400Smrg    return True;
896a5602400Smrg}
897a5602400Smrg
898caade7ccSmrg/*
899caade7ccSmrg *  Functions corresponding to the macros for manipulating 64-bit values
900caade7ccSmrg */
901caade7ccSmrg
902caade7ccSmrgvoid
903caade7ccSmrgXSyncIntToValue(XSyncValue *pv, int i)
904caade7ccSmrg{
905caade7ccSmrg    _XSyncIntToValue(pv,i);
906caade7ccSmrg}
907caade7ccSmrg
908caade7ccSmrgvoid
909caade7ccSmrgXSyncIntsToValue(XSyncValue *pv, unsigned int l, int h)
910caade7ccSmrg{
911caade7ccSmrg    _XSyncIntsToValue(pv, l, h);
912caade7ccSmrg}
913caade7ccSmrg
914caade7ccSmrgBool
915caade7ccSmrgXSyncValueGreaterThan(XSyncValue a, XSyncValue b)
916caade7ccSmrg{
917caade7ccSmrg    return _XSyncValueGreaterThan(a, b);
918caade7ccSmrg}
919caade7ccSmrg
920caade7ccSmrgBool
921caade7ccSmrgXSyncValueLessThan(XSyncValue a, XSyncValue b)
922caade7ccSmrg{
923caade7ccSmrg    return _XSyncValueLessThan(a, b);
924caade7ccSmrg}
925caade7ccSmrg
926caade7ccSmrgBool
927caade7ccSmrgXSyncValueGreaterOrEqual(XSyncValue a, XSyncValue b)
928caade7ccSmrg{
929caade7ccSmrg    return _XSyncValueGreaterOrEqual(a, b);
930caade7ccSmrg}
931caade7ccSmrg
932caade7ccSmrgBool
933caade7ccSmrgXSyncValueLessOrEqual(XSyncValue a, XSyncValue b)
934caade7ccSmrg{
935caade7ccSmrg    return _XSyncValueLessOrEqual(a, b);
936caade7ccSmrg}
937caade7ccSmrg
938caade7ccSmrgBool
939caade7ccSmrgXSyncValueEqual(XSyncValue a, XSyncValue b)
940caade7ccSmrg{
941caade7ccSmrg    return _XSyncValueEqual(a, b);
942caade7ccSmrg}
943caade7ccSmrg
944caade7ccSmrgBool
945caade7ccSmrgXSyncValueIsNegative(XSyncValue v)
946caade7ccSmrg{
947caade7ccSmrg    return _XSyncValueIsNegative(v);
948caade7ccSmrg}
949caade7ccSmrg
950caade7ccSmrgBool
951caade7ccSmrgXSyncValueIsZero(XSyncValue a)
952caade7ccSmrg{
953caade7ccSmrg    return _XSyncValueIsZero(a);
954caade7ccSmrg}
955caade7ccSmrg
956caade7ccSmrgBool
957caade7ccSmrgXSyncValueIsPositive(XSyncValue v)
958caade7ccSmrg{
959caade7ccSmrg    return _XSyncValueIsPositive(v);
960caade7ccSmrg}
961caade7ccSmrg
962caade7ccSmrgunsigned int
963caade7ccSmrgXSyncValueLow32(XSyncValue v)
964caade7ccSmrg{
965caade7ccSmrg    return _XSyncValueLow32(v);
966caade7ccSmrg}
967caade7ccSmrg
968caade7ccSmrgint
969caade7ccSmrgXSyncValueHigh32(XSyncValue v)
970caade7ccSmrg{
971caade7ccSmrg    return _XSyncValueHigh32(v);
972caade7ccSmrg}
973caade7ccSmrg
974caade7ccSmrgvoid
975caade7ccSmrgXSyncValueAdd(XSyncValue *presult, XSyncValue a, XSyncValue b, Bool *poverflow)
976caade7ccSmrg{
977caade7ccSmrg    _XSyncValueAdd(presult, a, b, poverflow);
978caade7ccSmrg}
979caade7ccSmrg
980caade7ccSmrgvoid
981caade7ccSmrgXSyncValueSubtract(
982caade7ccSmrg    XSyncValue *presult,
983caade7ccSmrg    XSyncValue a, XSyncValue b,
984caade7ccSmrg    Bool *poverflow)
985caade7ccSmrg{
986caade7ccSmrg    _XSyncValueSubtract(presult, a, b, poverflow);
987caade7ccSmrg}
988caade7ccSmrg
989caade7ccSmrgvoid
990caade7ccSmrgXSyncMaxValue(XSyncValue *pv)
991caade7ccSmrg{
992caade7ccSmrg    _XSyncMaxValue(pv);
993caade7ccSmrg}
994caade7ccSmrg
995caade7ccSmrgvoid
996caade7ccSmrgXSyncMinValue(XSyncValue *pv)
997caade7ccSmrg{
998caade7ccSmrg    _XSyncMinValue(pv);
999caade7ccSmrg}
1000