dix: Small refactor to resource deletion

Reviewed-by: Matt Turner <mattst88@gmail.com>
Signed-off-by: Adam Jackson <ajax@redhat.com>
This commit is contained in:
Adam Jackson 2011-03-24 16:51:54 -04:00
parent 3e0b311aba
commit f1c2c01ac9

View File

@ -562,6 +562,17 @@ RebuildTable(int client)
clientTable[client].resources = resources; clientTable[client].resources = resources;
} }
static void
doFreeResource(ResourcePtr res, Bool skip)
{
CallResourceStateCallback(ResourceStateFreeing, res);
if (!skip)
resourceTypes[res->type & TypeMask].deleteFunc(res->value, res->id);
free(res);
}
void void
FreeResource(XID id, RESTYPE skipDeleteFuncType) FreeResource(XID id, RESTYPE skipDeleteFuncType)
{ {
@ -590,11 +601,8 @@ FreeResource(XID id, RESTYPE skipDeleteFuncType)
*prev = res->next; *prev = res->next;
elements = --*eltptr; elements = --*eltptr;
CallResourceStateCallback(ResourceStateFreeing, res); doFreeResource(res, rtype == skipDeleteFuncType);
if (rtype != skipDeleteFuncType)
(*resourceTypes[rtype & TypeMask].deleteFunc)(res->value, res->id);
free(res);
if (*eltptr != elements) if (*eltptr != elements)
prev = head; /* prev may no longer be valid */ prev = head; /* prev may no longer be valid */
} }
@ -604,7 +612,6 @@ FreeResource(XID id, RESTYPE skipDeleteFuncType)
} }
} }
void void
FreeResourceByType(XID id, RESTYPE type, Bool skipFree) FreeResourceByType(XID id, RESTYPE type, Bool skipFree)
{ {
@ -627,11 +634,8 @@ FreeResourceByType(XID id, RESTYPE type, Bool skipFree)
*prev = res->next; *prev = res->next;
clientTable[cid].elements--; clientTable[cid].elements--;
CallResourceStateCallback(ResourceStateFreeing, res); doFreeResource(res, skipFree);
if (!skipFree)
(*resourceTypes[type & TypeMask].deleteFunc)(res->value, res->id);
free(res);
break; break;
} }
else else
@ -793,12 +797,10 @@ FreeClientNeverRetainResources(ClientPtr client)
#endif #endif
*prev = this->next; *prev = this->next;
clientTable[client->index].elements--; clientTable[client->index].elements--;
CallResourceStateCallback(ResourceStateFreeing, this);
elements = *eltptr; elements = *eltptr;
(*resourceTypes[rtype & TypeMask].deleteFunc)(this->value, this->id);
free(this); doFreeResource(this, FALSE);
if (*eltptr != elements) if (*eltptr != elements)
prev = &resources[j]; /* prev may no longer be valid */ prev = &resources[j]; /* prev may no longer be valid */
} }
@ -841,7 +843,6 @@ FreeClientResources(ClientPtr client)
for (this = *head; this; this = *head) for (this = *head; this; this = *head)
{ {
RESTYPE rtype = this->type;
#ifdef XSERVER_DTRACE #ifdef XSERVER_DTRACE
XSERVER_RESOURCE_FREE(this->id, this->type, XSERVER_RESOURCE_FREE(this->id, this->type,
this->value, TypeNameString(this->type)); this->value, TypeNameString(this->type));
@ -849,10 +850,7 @@ FreeClientResources(ClientPtr client)
*head = this->next; *head = this->next;
clientTable[client->index].elements--; clientTable[client->index].elements--;
CallResourceStateCallback(ResourceStateFreeing, this); doFreeResource(this, FALSE);
(*resourceTypes[rtype & TypeMask].deleteFunc)(this->value, this->id);
free(this);
} }
} }
free(clientTable[client->index].resources); free(clientTable[client->index].resources);