From c45f6762080ef00b41d9f73441a9f0e605253008 Mon Sep 17 00:00:00 2001 From: Eamon Walsh Date: Wed, 7 Mar 2007 11:22:42 -0500 Subject: [PATCH] devPrivates rework: hook up new mechanism in backwards-compatibility mode on existing structures that support devPrivates. --- dix/devices.c | 11 ++++++-- dix/main.c | 32 ++++++++++++++++-------- dix/privates.c | 62 +++++++++++++++++++++++++++------------------- include/privates.h | 10 ++++++++ 4 files changed, 76 insertions(+), 39 deletions(-) diff --git a/dix/devices.c b/dix/devices.c index 9f4218414..2e04403c5 100644 --- a/dix/devices.c +++ b/dix/devices.c @@ -124,8 +124,15 @@ AddInputDevice(DeviceProc deviceProc, Bool autoStart) #ifdef XKB dev->xkb_interest = NULL; #endif - dev->nPrivates = 0; - dev->devPrivates = NULL; + /* must pre-allocate one private for the new devPrivates support */ + dev->nPrivates = 1; + dev->devPrivates = (DevUnion *)xalloc(sizeof(DevUnion)); + if (!dev->devPrivates) { + xfree(dev); + return NULL; + } + dev->devPrivates[0].ptr = NULL; + dev->unwrapProc = NULL; dev->coreEvents = TRUE; dev->inited = FALSE; diff --git a/dix/main.c b/dix/main.c index c40dfddb2..852cbcb62 100644 --- a/dix/main.c +++ b/dix/main.c @@ -715,18 +715,28 @@ AddScreen( xfree(pScreen); return -1; } + + /* must pre-allocate one private for the new devPrivates support */ + pScreen->WindowPrivateLen = 1; + pScreen->WindowPrivateSizes = (unsigned *)xalloc(sizeof(unsigned)); + pScreen->totalWindowSize = PadToLong(sizeof(WindowRec)) + sizeof(DevUnion); + pScreen->GCPrivateLen = 1; + pScreen->GCPrivateSizes = (unsigned *)xalloc(sizeof(unsigned)); + pScreen->totalGCSize = PadToLong(sizeof(GC)) + sizeof(DevUnion); + pScreen->PixmapPrivateLen = 1; + pScreen->PixmapPrivateSizes = (unsigned *)xalloc(sizeof(unsigned)); + pScreen->totalPixmapSize = BitmapBytePad(8 * (sizeof(PixmapRec) + + sizeof(DevUnion))); + if (pScreen->WindowPrivateSizes && pScreen->GCPrivateSizes && + pScreen->PixmapPrivateSizes) + *pScreen->WindowPrivateSizes = *pScreen->GCPrivateSizes = + *pScreen->PixmapPrivateSizes = 0; + else { + xfree(pScreen); + return -1; + } + pScreen->myNum = i; - pScreen->WindowPrivateLen = 0; - pScreen->WindowPrivateSizes = (unsigned *)NULL; - pScreen->totalWindowSize = - ((sizeof(WindowRec) + sizeof(long) - 1) / sizeof(long)) * sizeof(long); - pScreen->GCPrivateLen = 0; - pScreen->GCPrivateSizes = (unsigned *)NULL; - pScreen->totalGCSize = - ((sizeof(GC) + sizeof(long) - 1) / sizeof(long)) * sizeof(long); - pScreen->PixmapPrivateLen = 0; - pScreen->PixmapPrivateSizes = (unsigned *)NULL; - pScreen->totalPixmapSize = BitmapBytePad(sizeof(PixmapRec)*8); pScreen->ClipNotify = 0; /* for R4 ddx compatibility */ pScreen->CreateScreenResources = 0; diff --git a/dix/privates.c b/dix/privates.c index 48ba675bf..57da0fa91 100644 --- a/dix/privates.c +++ b/dix/privates.c @@ -279,8 +279,8 @@ dixLookupPrivateOffset(RESTYPE type) /* * Called from the main loop to reset the subsystem. */ -static void ResetExtensionPrivates(void); -static void ResetClientPrivates(void); +static int ResetExtensionPrivates(void); +static int ResetClientPrivates(void); static void ResetScreenPrivates(void); static void ResetWindowPrivates(void); static void ResetGCPrivates(void); @@ -307,8 +307,8 @@ dixResetPrivates(void) return FALSE; /* reset legacy devPrivates support */ - ResetExtensionPrivates(); - ResetClientPrivates(); + if (!ResetExtensionPrivates() || !ResetClientPrivates()) + return FALSE; ResetScreenPrivates(); ResetWindowPrivates(); ResetGCPrivates(); @@ -317,10 +317,14 @@ dixResetPrivates(void) ResetDevicePrivateIndex(); /* register basic resource offsets */ - if (!dixRegisterPrivateOffset(RT_WINDOW, offsetof(WindowRec,devPrivates))) - return FALSE; - - return TRUE; + 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)); } /* @@ -343,15 +347,18 @@ int extensionPrivateLen; unsigned *extensionPrivateSizes; unsigned totalExtensionSize; -static void +static int ResetExtensionPrivates() { - extensionPrivateCount = 0; - extensionPrivateLen = 0; + extensionPrivateCount = 1; + extensionPrivateLen = 1; xfree(extensionPrivateSizes); - extensionPrivateSizes = (unsigned *)NULL; - totalExtensionSize = - ((sizeof(ExtensionEntry) + sizeof(long) - 1) / sizeof(long)) * sizeof(long); + extensionPrivateSizes = (unsigned *)xalloc(sizeof(unsigned)); + if (!extensionPrivateSizes) + return FALSE; + *extensionPrivateSizes = 0; + totalExtensionSize = PadToLong(sizeof(ExtensionEntry)) + sizeof(DevUnion); + return TRUE; } _X_EXPORT int @@ -400,15 +407,18 @@ int clientPrivateLen; unsigned *clientPrivateSizes; unsigned totalClientSize; -static void +static int ResetClientPrivates() { - clientPrivateCount = 0; - clientPrivateLen = 0; + clientPrivateCount = 1; + clientPrivateLen = 1; xfree(clientPrivateSizes); - clientPrivateSizes = (unsigned *)NULL; - totalClientSize = - ((sizeof(ClientRec) + sizeof(long) - 1) / sizeof(long)) * sizeof(long); + clientPrivateSizes = (unsigned *)xalloc(sizeof(unsigned)); + if (!clientPrivateSizes) + return FALSE; + *clientPrivateSizes = 0; + totalClientSize = PadToLong(sizeof(ClientRec)) + sizeof(DevUnion); + return TRUE; } _X_EXPORT int @@ -457,7 +467,7 @@ int screenPrivateCount; static void ResetScreenPrivates() { - screenPrivateCount = 0; + screenPrivateCount = 1; } /* this can be called after some screens have been created, @@ -499,7 +509,7 @@ static int windowPrivateCount; static void ResetWindowPrivates() { - windowPrivateCount = 0; + windowPrivateCount = 1; } _X_EXPORT int @@ -549,7 +559,7 @@ static int gcPrivateCount; static void ResetGCPrivates() { - gcPrivateCount = 0; + gcPrivateCount = 1; } _X_EXPORT int @@ -598,7 +608,7 @@ static int pixmapPrivateCount; static void ResetPixmapPrivates() { - pixmapPrivateCount = 0; + pixmapPrivateCount = 1; } _X_EXPORT int @@ -649,7 +659,7 @@ int colormapPrivateCount; static void ResetColormapPrivates() { - colormapPrivateCount = 0; + colormapPrivateCount = 1; } @@ -734,5 +744,5 @@ AllocateDevicePrivate(DeviceIntPtr device, int index) static void ResetDevicePrivateIndex(void) { - devicePrivateIndex = 0; + devicePrivateIndex = 1; } diff --git a/include/privates.h b/include/privates.h index 898fdd9c9..9c95350fa 100644 --- a/include/privates.h +++ b/include/privates.h @@ -30,6 +30,13 @@ typedef struct _Private { struct _Private *next; } PrivateRec; +/* + * Backwards compatibility macro. Use to get the proper PrivateRec + * reference from any of the structure types that supported the old + * devPrivates mechanism. + */ +#define DEVPRIV_PTR(foo) ((PrivateRec **)(&(foo)->devPrivates[0].ptr)) + /* * Request pre-allocated private space for your driver/module. * A non-null pScreen argument restricts to objects on a given screen. @@ -156,4 +163,7 @@ dixLookupPrivateOffset(RESTYPE type); extern int dixRegisterPrivateOffset(RESTYPE type, unsigned offset); +/* Used by the legacy support, don't rely on this being here */ +#define PadToLong(w) ((((w) + sizeof(long)-1) / sizeof(long)) * sizeof(long)) + #endif /* PRIVATES_H */