diff options
author | Eamon Walsh <ewalsh@tycho.nsa.gov> | 2008-06-13 16:39:40 -0400 |
---|---|---|
committer | Eamon Walsh <ewalsh@moss-charon.epoch.ncsc.mil> | 2008-06-13 16:43:56 -0400 |
commit | 2d7ba09dc4b5eff5dba8d7867f285111574b1737 (patch) | |
tree | 7e0704eaf68ad6e1eb3bdc7d184bd08316542f50 /dix/privates.c | |
parent | 9e0e558f263a132babf8c91d31230831653f19c1 (diff) |
Make devPrivates lookup functions ABI instead of static inlines.
This is required to preserve compatibility across changes to the
internal representation of the privates list.
Diffstat (limited to 'dix/privates.c')
-rw-r--r-- | dix/privates.c | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/dix/privates.c b/dix/privates.c index 47a0e1a29..efb320463 100644 --- a/dix/privates.c +++ b/dix/privates.c @@ -39,6 +39,12 @@ from The Open Group. #include "colormapst.h" #include "inputstr.h" +struct _Private { + DevPrivateKey key; + pointer value; + struct _Private *next; +}; + typedef struct _PrivateDesc { DevPrivateKey key; unsigned size; @@ -117,6 +123,65 @@ dixAllocatePrivate(PrivateRec **privates, const DevPrivateKey key) } /* + * Look up a private pointer. + */ +_X_EXPORT pointer +dixLookupPrivate(PrivateRec **privates, const DevPrivateKey key) +{ + PrivateRec *rec = *privates; + pointer *ptr; + + while (rec) { + if (rec->key == key) + return rec->value; + rec = rec->next; + } + + ptr = dixAllocatePrivate(privates, key); + return ptr ? *ptr : NULL; +} + +/* + * Look up the address of a private pointer. + */ +_X_EXPORT pointer * +dixLookupPrivateAddr(PrivateRec **privates, const DevPrivateKey key) +{ + PrivateRec *rec = *privates; + + while (rec) { + if (rec->key == key) + return &rec->value; + rec = rec->next; + } + + return dixAllocatePrivate(privates, key); +} + +/* + * Set a private pointer. + */ +_X_EXPORT int +dixSetPrivate(PrivateRec **privates, const DevPrivateKey key, pointer val) +{ + PrivateRec *rec; + + top: + rec = *privates; + while (rec) { + if (rec->key == key) { + rec->value = val; + return TRUE; + } + rec = rec->next; + } + + if (!dixAllocatePrivate(privates, key)) + return FALSE; + goto top; +} + +/* * Called to free privates at object deletion time. */ _X_EXPORT void |