xserver: Branch 'XACE-SELINUX'

Eamon Walsh ewalsh at kemper.freedesktop.org
Thu Sep 6 19:06:46 PDT 2007


 dix/privates.c     |   42 +++++++++++++++++++++++-------------------
 dix/resource.c     |    2 ++
 include/privates.h |    9 ++++++++-
 3 files changed, 33 insertions(+), 20 deletions(-)

New commits:
diff-tree 57907e0943da0c3fd3bf6c128d210b544629ce72 (from 0003ccfcdfae1b473aa024342304b84256d378b9)
Author: Eamon Walsh <ewalsh at tycho.nsa.gov>
Date:   Thu Sep 6 16:55:51 2007 -0400

    devPrivates rework: register an offset for every resource type, use
    signed values so -1 actually works correctly, and provide a macro for
    adding an offset to a pointer.

diff --git a/dix/privates.c b/dix/privates.c
index 38c5523..e04da41 100644
--- a/dix/privates.c
+++ b/dix/privates.c
@@ -35,6 +35,7 @@ from The Open Group.
 #include "resource.h"
 #include "privates.h"
 #include "gcstruct.h"
+#include "cursorstr.h"
 #include "colormapst.h"
 #include "inputstr.h"
 
@@ -174,21 +175,34 @@ dixRegisterPrivateDeleteFunc(const DevPr
 }
 
 /* Table of devPrivates offsets */
-static unsigned *offsets = NULL;
-static unsigned offsetsSize = 0;
+static const int offsetDefaults[] = {
+    -1,					/* RT_NONE */
+    offsetof(WindowRec, devPrivates),	/* RT_WINDOW */
+    offsetof(PixmapRec, devPrivates),	/* RT_PIXMAP */
+    offsetof(GC, devPrivates),		/* RT_GC */
+    -1,		    			/* RT_FONT */
+    offsetof(CursorRec, devPrivates),	/* RT_CURSOR */
+    offsetof(ColormapRec, devPrivates),	/* RT_COLORMAP */
+    -1,			  		/* RT_CMAPENTRY */
+    -1,					/* RT_OTHERCLIENT */
+    -1					/* RT_PASSIVEGRAB */
+};
+    
+static int *offsets = NULL;
+static int offsetsSize = 0;
 
 /*
  * Specify where the devPrivates field is located in a structure type
  */
 _X_EXPORT int
-dixRegisterPrivateOffset(RESTYPE type, unsigned offset)
+dixRegisterPrivateOffset(RESTYPE type, int offset)
 {
     type = type & TypeMask;
 
     /* resize offsets table if necessary */
     while (type >= offsetsSize) {
 	unsigned i = offsetsSize * 2 * sizeof(int);
-	offsets = (unsigned *)xrealloc(offsets, i);
+	offsets = (int *)xrealloc(offsets, i);
 	if (!offsets) {
 	    offsetsSize = 0;
 	    return FALSE;
@@ -214,7 +228,6 @@ int
 dixResetPrivates(void)
 {
     PrivateDescRec *next;
-    unsigned i;
 
     /* reset internal structures */
     while (items) {
@@ -224,20 +237,11 @@ dixResetPrivates(void)
     }
     if (offsets)
 	xfree(offsets);
-    offsetsSize = 16;
-    offsets = (unsigned *)xalloc(offsetsSize * sizeof(unsigned));
+    offsetsSize = sizeof(offsetDefaults);
+    offsets = (int *)xalloc(offsetsSize);
+    offsetsSize /= sizeof(int);
     if (!offsets)
 	return FALSE;
-    for (i=0; i < offsetsSize; i++)
-	offsets[i] = -1;
-
-    /* register basic resource offsets */
-    return dixRegisterPrivateOffset(RT_WINDOW,
-				    offsetof(WindowRec, devPrivates)) &&
-	dixRegisterPrivateOffset(RT_PIXMAP,
-				 offsetof(PixmapRec, devPrivates)) &&
-	dixRegisterPrivateOffset(RT_GC,
-				 offsetof(GC, devPrivates)) &&
-	dixRegisterPrivateOffset(RT_COLORMAP,
-				 offsetof(ColormapRec, devPrivates));
+    memcpy(offsets, offsetDefaults, sizeof(offsetDefaults));
+    return TRUE;
 }
diff --git a/dix/resource.c b/dix/resource.c
index a557ba4..c892cf9 100644
--- a/dix/resource.c
+++ b/dix/resource.c
@@ -225,6 +225,8 @@ CreateNewResourceType(DeleteType deleteF
 				   (next + 1) * sizeof(DeleteType));
     if (!funcs)
 	return 0;
+    if (!dixRegisterPrivateOffset(next, -1))
+	return 0;
 
 #ifdef XResExtension
     {
diff --git a/include/privates.h b/include/privates.h
index 9539a29..8d59b72 100644
--- a/include/privates.h
+++ b/include/privates.h
@@ -143,8 +143,15 @@ dixLookupPrivateOffset(RESTYPE type);
 
 /*
  * Specifies the offset where the devPrivates field is located.
+ * A negative value indicates no devPrivates field is available.
  */
 extern int
-dixRegisterPrivateOffset(RESTYPE type, unsigned offset);
+dixRegisterPrivateOffset(RESTYPE type, int offset);
+
+/*
+ * Convenience macro for adding an offset to an object pointer
+ * when making a call to one of the devPrivates functions
+ */
+#define DEVPRIV_AT(ptr, offset) ((PrivateRec **)((char *)ptr + offset))
 
 #endif /* PRIVATES_H */


More information about the xorg-commit mailing list