[PATCH 4/5] Remove dixRegisterPrivateOffset; hard-code devPrivates offsets instead
Jamey Sharp
jamey at minilop.net
Thu Apr 29 12:24:50 PDT 2010
From: Keith Packard <keithp at keithp.com>
For predefined resource types, the offset of the devPrivates field was
already kept in a constant table. The only non-predefined type needing
this treatment was dbeDrawableResType, which is just a magic alias for
RT_PIXMAP.
This patch special-cases looking up RC_DRAWABLE offsets and uses the
table directly for everything else.
Signed-off-by: Keith Packard <keithp at keithp.com>
Reviewed-by: Jamey Sharp <jamey at minilop.net>
---
dbe/dbe.c | 4 ---
dix/privates.c | 53 +++++++++++++--------------------------------------
dix/resource.c | 2 -
include/privates.h | 18 +++-------------
4 files changed, 18 insertions(+), 59 deletions(-)
diff --git a/dbe/dbe.c b/dbe/dbe.c
index 825d2e0..73142df 100644
--- a/dbe/dbe.c
+++ b/dbe/dbe.c
@@ -1583,10 +1583,6 @@ DbeExtensionInit(void)
if (!dbeWindowPrivResType)
return;
- if (!dixRegisterPrivateOffset(dbeDrawableResType,
- offsetof(PixmapRec, devPrivates)))
- return;
-
for (i = 0; i < screenInfo.numScreens; i++)
{
/* For each screen, set up DBE screen privates and init DIX and DDX
diff --git a/dix/privates.c b/dix/privates.c
index e3e7274..76e79ed 100644
--- a/dix/privates.c
+++ b/dix/privates.c
@@ -246,7 +246,7 @@ dixRegisterPrivateDeleteFunc(const DevPrivateKey key,
}
/* Table of devPrivates offsets */
-static const int offsetDefaults[] = {
+static const int offsets[] = {
-1, /* RT_NONE */
offsetof(WindowRec, devPrivates), /* RT_WINDOW */
offsetof(PixmapRec, devPrivates), /* RT_PIXMAP */
@@ -258,40 +258,25 @@ static const int offsetDefaults[] = {
-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
- */
-int
-dixRegisterPrivateOffset(RESTYPE type, int offset)
-{
- type = type & TypeMask;
-
- /* resize offsets table if necessary */
- while (type >= offsetsSize) {
- unsigned i = offsetsSize * 2 * sizeof(int);
- offsets = (int *)xrealloc(offsets, i);
- if (!offsets) {
- offsetsSize = 0;
- return FALSE;
- }
- for (i=offsetsSize; i < 2*offsetsSize; i++)
- offsets[i] = -1;
- offsetsSize *= 2;
- }
-
- offsets[type] = offset;
- return TRUE;
-}
+#define NUM_OFFSETS (sizeof (offsets) / sizeof (offsets[0]))
int
dixLookupPrivateOffset(RESTYPE type)
{
+ /*
+ * Special kludge for DBE which registers a new resource type that
+ * points at pixmaps (thanks, DBE)
+ */
+ if (type & RC_DRAWABLE) {
+ if (type == RT_WINDOW)
+ return offsets[RT_WINDOW & TypeMask];
+ else
+ return offsets[RT_PIXMAP & TypeMask];
+ }
type = type & TypeMask;
- assert(type < offsetsSize);
+
+ assert(type < NUM_OFFSETS);
return offsets[type];
}
@@ -308,15 +293,5 @@ dixResetPrivates(void)
DeleteCallbackList(&items[i].deletefuncs);
}
nextPriv = 1;
-
- /* reset offsets */
- if (offsets)
- xfree(offsets);
- offsetsSize = sizeof(offsetDefaults);
- offsets = xalloc(offsetsSize);
- offsetsSize /= sizeof(int);
- if (!offsets)
- return FALSE;
- memcpy(offsets, offsetDefaults, sizeof(offsetDefaults));
return TRUE;
}
diff --git a/dix/resource.c b/dix/resource.c
index 91d0cfb..3c9a37c 100644
--- a/dix/resource.c
+++ b/dix/resource.c
@@ -208,8 +208,6 @@ CreateNewResourceType(DeleteType deleteFunc, char *name)
(next + 1) * sizeof(DeleteType));
if (!funcs)
return 0;
- if (!dixRegisterPrivateOffset(next, -1))
- return 0;
lastResourceType = next;
DeleteFuncs = funcs;
diff --git a/include/privates.h b/include/privates.h
index 3c5c321..f8a6fbf 100644
--- a/include/privates.h
+++ b/include/privates.h
@@ -84,26 +84,16 @@ extern _X_EXPORT int
dixResetPrivates(void);
/*
- * These next two functions are necessary because the position of
- * the devPrivates field varies by structure and calling code might
- * only know the resource type, not the structure definition.
- */
-
-/*
* Looks up the offset where the devPrivates field is located.
- * Returns -1 if no offset has been registered for the resource type.
+ * Returns -1 if the specified resource has no dev privates.
+ * The position of the devPrivates field varies by structure
+ * and calling code might only know the resource type, not the
+ * structure definition.
*/
extern _X_EXPORT int
dixLookupPrivateOffset(RESTYPE type);
/*
- * Specifies the offset where the devPrivates field is located.
- * A negative value indicates no devPrivates field is available.
- */
-extern _X_EXPORT int
-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
*/
--
1.7.0
More information about the xorg-devel
mailing list