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