2007-02-23 19:19:53 +01:00
|
|
|
/***********************************************************
|
|
|
|
|
|
|
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
|
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
|
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
|
|
AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
|
|
|
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
|
|
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
|
|
|
|
|
|
******************************************************************/
|
|
|
|
|
|
|
|
#ifndef PRIVATES_H
|
|
|
|
#define PRIVATES_H 1
|
|
|
|
|
|
|
|
#include "dix.h"
|
|
|
|
#include "resource.h"
|
|
|
|
|
|
|
|
/*****************************************************************
|
|
|
|
* STUFF FOR PRIVATES
|
|
|
|
*****************************************************************/
|
|
|
|
|
2007-03-08 18:13:18 +01:00
|
|
|
typedef char devprivate_key_t;
|
2007-03-01 21:00:02 +01:00
|
|
|
|
|
|
|
typedef struct _Private {
|
|
|
|
devprivate_key_t *key;
|
|
|
|
pointer value;
|
|
|
|
struct _Private *next;
|
|
|
|
} PrivateRec;
|
|
|
|
|
2007-03-07 17:22:42 +01:00
|
|
|
/*
|
|
|
|
* 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))
|
|
|
|
|
2007-02-23 19:19:53 +01:00
|
|
|
/*
|
2007-03-01 21:00:02 +01:00
|
|
|
* Request pre-allocated private space for your driver/module.
|
2007-03-08 18:13:18 +01:00
|
|
|
* Calling this is not necessary if only a pointer by itself is needed.
|
2007-02-23 19:19:53 +01:00
|
|
|
*/
|
|
|
|
extern int
|
2007-03-08 18:13:18 +01:00
|
|
|
dixRequestPrivate(devprivate_key_t *const key, unsigned size);
|
2007-02-23 19:19:53 +01:00
|
|
|
|
|
|
|
/*
|
2007-03-01 21:00:02 +01:00
|
|
|
* Allocates a new private and attaches it to an existing object.
|
2007-02-23 19:19:53 +01:00
|
|
|
*/
|
2007-03-01 21:00:02 +01:00
|
|
|
extern pointer *
|
|
|
|
dixAllocatePrivate(PrivateRec **privates, devprivate_key_t *const key);
|
2007-02-23 19:19:53 +01:00
|
|
|
|
|
|
|
/*
|
|
|
|
* Look up a private pointer.
|
|
|
|
*/
|
2007-03-01 21:00:02 +01:00
|
|
|
static _X_INLINE pointer
|
|
|
|
dixLookupPrivate(PrivateRec **privates, devprivate_key_t *const 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.
|
|
|
|
*/
|
|
|
|
static _X_INLINE pointer *
|
|
|
|
dixLookupPrivateAddr(PrivateRec **privates, devprivate_key_t *const key)
|
|
|
|
{
|
|
|
|
PrivateRec *rec = *privates;
|
|
|
|
|
|
|
|
while (rec) {
|
|
|
|
if (rec->key == key)
|
|
|
|
return &rec->value;
|
|
|
|
rec = rec->next;
|
|
|
|
}
|
|
|
|
|
|
|
|
return dixAllocatePrivate(privates, key);
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Set a private pointer.
|
|
|
|
*/
|
|
|
|
static _X_INLINE int
|
|
|
|
dixSetPrivate(PrivateRec **privates, devprivate_key_t *const 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;
|
|
|
|
}
|
2007-02-23 19:19:53 +01:00
|
|
|
|
|
|
|
/*
|
|
|
|
* Register callbacks to be called on private allocation/freeing.
|
|
|
|
* The calldata argument to the callbacks is a PrivateCallbackPtr.
|
|
|
|
*/
|
|
|
|
typedef struct _PrivateCallback {
|
2007-03-01 21:00:02 +01:00
|
|
|
devprivate_key_t *key; /* private registration key */
|
2007-03-08 18:14:30 +01:00
|
|
|
pointer *value; /* address of private pointer */
|
2007-03-01 21:00:02 +01:00
|
|
|
} PrivateCallbackRec;
|
2007-02-23 19:19:53 +01:00
|
|
|
|
|
|
|
extern int
|
2007-03-01 21:00:02 +01:00
|
|
|
dixRegisterPrivateInitFunc(devprivate_key_t *const key,
|
2007-02-23 19:19:53 +01:00
|
|
|
CallbackProcPtr callback, pointer userdata);
|
|
|
|
|
|
|
|
extern int
|
2007-03-01 21:00:02 +01:00
|
|
|
dixRegisterPrivateDeleteFunc(devprivate_key_t *const key,
|
2007-02-23 19:19:53 +01:00
|
|
|
CallbackProcPtr callback, pointer userdata);
|
|
|
|
|
|
|
|
/*
|
2007-03-08 18:13:18 +01:00
|
|
|
* Frees private data.
|
2007-02-23 19:19:53 +01:00
|
|
|
*/
|
|
|
|
extern void
|
2007-03-01 21:00:02 +01:00
|
|
|
dixFreePrivates(PrivateRec *privates);
|
2007-02-23 19:19:53 +01:00
|
|
|
|
2007-03-01 21:00:02 +01:00
|
|
|
/*
|
|
|
|
* Resets the subsystem, called from the main loop.
|
|
|
|
*/
|
2007-02-23 19:19:53 +01:00
|
|
|
extern int
|
2007-03-01 21:00:02 +01:00
|
|
|
dixResetPrivates(void);
|
2007-02-23 19:19:53 +01:00
|
|
|
|
2007-03-01 21:00:02 +01:00
|
|
|
/*
|
|
|
|
* 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.
|
|
|
|
*/
|
2007-02-23 19:19:53 +01:00
|
|
|
|
2007-03-01 21:00:02 +01:00
|
|
|
/*
|
2007-03-08 18:13:36 +01:00
|
|
|
* Looks up the offset where the devPrivates field is located.
|
|
|
|
* Returns -1 if no offset has been registered for the resource type.
|
2007-03-01 21:00:02 +01:00
|
|
|
*/
|
2007-03-08 18:13:36 +01:00
|
|
|
extern int
|
2007-03-01 21:00:02 +01:00
|
|
|
dixLookupPrivateOffset(RESTYPE type);
|
2007-02-23 19:19:53 +01:00
|
|
|
|
2007-03-01 21:00:02 +01:00
|
|
|
/*
|
|
|
|
* Specifies the offset where the devPrivates field is located.
|
|
|
|
*/
|
|
|
|
extern int
|
|
|
|
dixRegisterPrivateOffset(RESTYPE type, unsigned offset);
|
2007-02-23 19:19:53 +01:00
|
|
|
|
2007-03-07 17:22:42 +01:00
|
|
|
/* Used by the legacy support, don't rely on this being here */
|
|
|
|
#define PadToLong(w) ((((w) + sizeof(long)-1) / sizeof(long)) * sizeof(long))
|
|
|
|
|
2007-02-23 19:19:53 +01:00
|
|
|
#endif /* PRIVATES_H */
|