[PATCH 3/7] dri3: Allow asynchronous implementation for dri3_open
Kristian Høgsberg
krh at bitplanet.net
Mon Mar 31 23:53:36 PDT 2014
By passing the client pointer to the dri3_open implementation, we allow
the clients to implement the open callback asynchronously. If the
client ignore count is positive after returning from dri3_open, we
assume that authentication is in progress and doesn't send the reply.
The code to send the reply is moved into a helper function, which the
implementation can call upon receiving its authenticaion reply.
Signed-off-by: Kristian Høgsberg <krh at bitplanet.net>
---
dri3/dri3.h | 6 +++++-
dri3/dri3_request.c | 38 ++++++++++++++++++++++++--------------
dri3/dri3_screen.c | 2 +-
glamor/glamor_egl.c | 3 ++-
4 files changed, 32 insertions(+), 17 deletions(-)
diff --git a/dri3/dri3.h b/dri3/dri3.h
index 7c0c330..1c04cbd 100644
--- a/dri3/dri3.h
+++ b/dri3/dri3.h
@@ -32,7 +32,8 @@
#define DRI3_SCREEN_INFO_VERSION 0
-typedef int (*dri3_open_proc)(ScreenPtr screen,
+typedef int (*dri3_open_proc)(ClientPtr client,
+ ScreenPtr screen,
RRProviderPtr provider,
int *fd);
@@ -60,6 +61,9 @@ typedef struct dri3_screen_info {
extern _X_EXPORT Bool
dri3_screen_init(ScreenPtr screen, dri3_screen_info_ptr info);
+extern _X_EXPORT int
+dri3_send_open_reply(ClientPtr client, int fd);
+
#endif
#endif /* _DRI3_H_ */
diff --git a/dri3/dri3_request.c b/dri3/dri3_request.c
index 31dce83..fe45620 100644
--- a/dri3/dri3_request.c
+++ b/dri3/dri3_request.c
@@ -55,16 +55,35 @@ proc_dri3_query_version(ClientPtr client)
return Success;
}
-static int
-proc_dri3_open(ClientPtr client)
+int
+dri3_send_open_reply(ClientPtr client, int fd)
{
- REQUEST(xDRI3OpenReq);
xDRI3OpenReply rep = {
.type = X_Reply,
.nfd = 1,
.sequenceNumber = client->sequence,
.length = 0,
};
+
+ if (client->swapped) {
+ swaps(&rep.sequenceNumber);
+ swapl(&rep.length);
+ }
+
+ if (WriteFdToClient(client, fd, TRUE) < 0) {
+ close(fd);
+ return BadAlloc;
+ }
+
+ WriteToClient(client, sizeof (rep), &rep);
+
+ return Success;
+}
+
+static int
+proc_dri3_open(ClientPtr client)
+{
+ REQUEST(xDRI3OpenReq);
RRProviderPtr provider;
DrawablePtr drawable;
ScreenPtr screen;
@@ -92,17 +111,8 @@ proc_dri3_open(ClientPtr client)
if (status != Success)
return status;
- if (client->swapped) {
- swaps(&rep.sequenceNumber);
- swapl(&rep.length);
- }
-
- if (WriteFdToClient(client, fd, TRUE) < 0) {
- close(fd);
- return BadAlloc;
- }
-
- WriteToClient(client, sizeof (rep), &rep);
+ if (client->ignoreCount == 0)
+ return dri3_send_open_reply(client, fd);
return Success;
}
diff --git a/dri3/dri3_screen.c b/dri3/dri3_screen.c
index c880296..bbf1d05 100644
--- a/dri3/dri3_screen.c
+++ b/dri3/dri3_screen.c
@@ -40,7 +40,7 @@ dri3_open(ClientPtr client, ScreenPtr screen, RRProviderPtr provider, int *fd)
if (!info || !info->open)
return BadMatch;
- rc = (*info->open) (screen, provider, fd);
+ rc = (*info->open) (client, screen, provider, fd);
if (rc != Success)
return rc;
diff --git a/glamor/glamor_egl.c b/glamor/glamor_egl.c
index 8123421..e2b6a92 100644
--- a/glamor/glamor_egl.c
+++ b/glamor/glamor_egl.c
@@ -608,7 +608,8 @@ glamor_egl_close_screen(ScreenPtr screen)
}
static int
-glamor_dri3_open(ScreenPtr screen,
+glamor_dri3_open(ClientPtr client,
+ ScreenPtr screen,
RRProviderPtr provider,
int *fdp)
{
--
1.9.0
More information about the xorg-devel
mailing list