[PATCH xserver (v4) 03/10] Make Await SyncTrigger functions generic
James Jones
jajones at nvidia.com
Tue Dec 7 21:14:29 PST 2010
On Tuesday 07 December 2010 19:53:10 Peter Hutterer wrote:
> On Mon, Dec 06, 2010 at 02:53:17PM -0800, James Jones wrote:
> > Update all the functions dealing with Await
> > sync triggers handle generic sync objects
> > instead of just counters. This will
> > facilitate code sharing between the counter
> > sync waits and the fence sync waits.
> >
> > Signed-off-by: James Jones <jajones at nvidia.com>
> > ---
> >
> > Xext/sync.c | 308
> > ++++++++++++++++++++++++++++++++++++-------------------- Xext/syncsrv.h
> > | 2 +-
> > 2 files changed, 198 insertions(+), 112 deletions(-)
> >
> > diff --git a/Xext/sync.c b/Xext/sync.c
> > index d5187dd..1a2d55d 100644
> > --- a/Xext/sync.c
> > +++ b/Xext/sync.c
> > @@ -107,18 +107,19 @@ static void SyncInitIdleTime(void);
> >
> > * delete and add triggers on this list.
> > */
> >
> > static void
> >
> > -SyncDeleteTriggerFromCounter(SyncTrigger *pTrigger)
> > +SyncDeleteTriggerFromSyncObject(SyncTrigger *pTrigger)
> >
> > {
> >
> > SyncTriggerList *pCur;
> > SyncTriggerList *pPrev;
> >
> > + SyncCounter *pCounter;
> >
> > - /* pCounter needs to be stored in pTrigger before calling here. */
> > + /* pSync needs to be stored in pTrigger before calling here. */
> >
> > - if (!pTrigger->pCounter)
> > + if (!pTrigger->pSync)
> >
> > return;
> >
> > pPrev = NULL;
> >
> > - pCur = pTrigger->pCounter->sync.pTriglist;
> > + pCur = pTrigger->pSync->pTriglist;
> >
> > while (pCur)
> > {
> >
> > @@ -127,7 +128,7 @@ SyncDeleteTriggerFromCounter(SyncTrigger *pTrigger)
> >
> > if (pPrev)
> >
> > pPrev->next = pCur->next;
> >
> > else
> >
> > - pTrigger->pCounter->sync.pTriglist = pCur->next;
> > + pTrigger->pSync->pTriglist = pCur->next;
> >
> > free(pCur);
> > break;
> >
> > @@ -137,21 +138,27 @@ SyncDeleteTriggerFromCounter(SyncTrigger *pTrigger)
> >
> > pCur = pCur->next;
> >
> > }
> >
> > - if (IsSystemCounter(pTrigger->pCounter))
> > - SyncComputeBracketValues(pTrigger->pCounter);
> > + if (SYNC_COUNTER == pTrigger->pSync->type)
> > + {
> > + pCounter = (SyncCounter *)pTrigger->pSync;
> > +
> > + if (IsSystemCounter(pCounter))
> > + SyncComputeBracketValues(pCounter);
> > + }
> >
> > }
> >
> >
> > static int
> >
> > -SyncAddTriggerToCounter(SyncTrigger *pTrigger)
> > +SyncAddTriggerToSyncObject(SyncTrigger *pTrigger)
> >
> > {
> >
> > SyncTriggerList *pCur;
> >
> > + SyncCounter *pCounter;
> >
> > - if (!pTrigger->pCounter)
> > + if (!pTrigger->pSync)
> >
> > return Success;
> >
> > /* don't do anything if it's already there */
> >
> > - for (pCur = pTrigger->pCounter->sync.pTriglist; pCur; pCur =
> > pCur->next) + for (pCur = pTrigger->pSync->pTriglist; pCur; pCur =
> > pCur->next)
> >
> > {
> >
> > if (pCur->pTrigger == pTrigger)
> >
> > return Success;
> >
> > @@ -161,11 +168,16 @@ SyncAddTriggerToCounter(SyncTrigger *pTrigger)
> >
> > return BadAlloc;
> >
> > pCur->pTrigger = pTrigger;
> >
> > - pCur->next = pTrigger->pCounter->sync.pTriglist;
> > - pTrigger->pCounter->sync.pTriglist = pCur;
> > + pCur->next = pTrigger->pSync->pTriglist;
> > + pTrigger->pSync->pTriglist = pCur;
> >
> > - if (IsSystemCounter(pTrigger->pCounter))
> > - SyncComputeBracketValues(pTrigger->pCounter);
> > + if (SYNC_COUNTER == pTrigger->pSync->type)
> > + {
> > + pCounter = (SyncCounter *)pTrigger->pSync;
> > +
> > + if (IsSystemCounter(pCounter))
> > + SyncComputeBracketValues(pCounter);
> > + }
> >
> > return Success;
> >
> > }
> >
> > @@ -188,69 +200,91 @@ SyncAddTriggerToCounter(SyncTrigger *pTrigger)
> >
> > static Bool
> > SyncCheckTriggerPositiveComparison(SyncTrigger *pTrigger, CARD64 oldval)
> > {
> >
> > - return (pTrigger->pCounter == NULL ||
> > - XSyncValueGreaterOrEqual(pTrigger->pCounter->value,
> > - pTrigger->test_value));
> > + SyncCounter *pCounter;
> > +
> > + assert(!pTrigger->pSync || (SYNC_COUNTER == pTrigger->pSync->type));
> > + pCounter = (SyncCounter *)pTrigger->pSync;
> > +
> > + return (pCounter == NULL ||
> > + XSyncValueGreaterOrEqual(pCounter->value, pTrigger-
>test_value));
> >
> > }
> >
> > static Bool
> > SyncCheckTriggerNegativeComparison(SyncTrigger *pTrigger, CARD64
> > oldval) {
> >
> > - return (pTrigger->pCounter == NULL ||
> > - XSyncValueLessOrEqual(pTrigger->pCounter->value,
> > - pTrigger->test_value));
> > + SyncCounter *pCounter;
> > +
> > + assert(!pTrigger->pSync || (SYNC_COUNTER == pTrigger->pSync->type));
> > + pCounter = (SyncCounter *)pTrigger->pSync;
> > +
> > + return (pCounter == NULL ||
> > + XSyncValueLessOrEqual(pCounter->value, pTrigger->test_value));
> >
> > }
> >
> > static Bool
> > SyncCheckTriggerPositiveTransition(SyncTrigger *pTrigger, CARD64 oldval)
> > {
> >
> > - return (pTrigger->pCounter == NULL ||
> > + SyncCounter *pCounter;
> > +
> > + assert(!pTrigger->pSync || (SYNC_COUNTER == pTrigger->pSync->type));
> > + pCounter = (SyncCounter *)pTrigger->pSync;
> > +
> > + return (pCounter == NULL ||
> >
> > (XSyncValueLessThan(oldval, pTrigger->test_value) &&
> >
> > - XSyncValueGreaterOrEqual(pTrigger->pCounter->value,
> > - pTrigger->test_value)));
> > + XSyncValueGreaterOrEqual(pCounter->value, pTrigger-
>test_value)));
> >
> > }
> >
> > static Bool
> > SyncCheckTriggerNegativeTransition(SyncTrigger *pTrigger, CARD64 oldval)
> > {
> >
> > - return (pTrigger->pCounter == NULL ||
> > + SyncCounter *pCounter;
> > +
> > + assert(!pTrigger->pSync || (SYNC_COUNTER == pTrigger->pSync->type));
> > + pCounter = (SyncCounter *)pTrigger->pSync;
> > +
> > + return (pCounter == NULL ||
> >
> > (XSyncValueGreaterThan(oldval, pTrigger->test_value) &&
> >
> > - XSyncValueLessOrEqual(pTrigger->pCounter->value,
> > - pTrigger->test_value)));
> > + XSyncValueLessOrEqual(pCounter->value, pTrigger->test_value)));
> >
> > }
> >
> > static int
> >
> > -SyncInitTrigger(ClientPtr client, SyncTrigger *pTrigger, XSyncCounter
> > counter, - Mask changes)
> > +SyncInitTrigger(ClientPtr client, SyncTrigger *pTrigger, XID syncObject,
> > + RESTYPE resType, Mask changes)
> >
> > {
> >
> > - SyncCounter *pCounter = pTrigger->pCounter;
> > + SyncObject *pSync = pTrigger->pSync;
> > + SyncCounter *pCounter = NULL;
> >
> > int rc;
> >
> > - Bool newcounter = FALSE;
> > + Bool newSyncObject = FALSE;
> >
> > if (changes & XSyncCACounter)
> > {
> >
> > - if (counter == None)
> > - pCounter = NULL;
> > - else if (Success != (rc = dixLookupResourceByType ((pointer
> > *)&pCounter, - counter, RTCounter, client,
DixReadAccess)))
> > + if (syncObject == None)
> > + pSync = NULL;
> > + else if (Success != (rc = dixLookupResourceByType ((pointer
*)&pSync,
> > + syncObject, resType, client, DixReadAccess)))
> >
> > {
> >
> > - client->errorValue = counter;
> > + client->errorValue = syncObject;
> >
> > return rc;
> >
> > }
> >
> > - if (pCounter != pTrigger->pCounter)
> > + if (pSync != pTrigger->pSync)
> >
> > { /* new counter for trigger */
> >
> > - SyncDeleteTriggerFromCounter(pTrigger);
> > - pTrigger->pCounter = pCounter;
> > - newcounter = TRUE;
> > + SyncDeleteTriggerFromSyncObject(pTrigger);
> > + pTrigger->pSync = pSync;
> > + newSyncObject = TRUE;
> >
> > }
> >
> > }
> >
> > /* if system counter, ask it what the current value is */
> >
> > - if (IsSystemCounter(pCounter))
> > + if (SYNC_COUNTER == pSync->type)
>
> I get a NULL-pointer dereference here. There's a path where pSync can be
> NULL:
> if (changes & XSyncCACounter)
> if (syncObject == None)
> pSync = NULL;
> ..
> if (SYNC_COUNTER == pSync->type) /* boom */
>
> This is triggered on startup each time, I guess by gdm trying to do
> something with the sync triggers since I can see the gdm cursor for about a
> second or two before the crash.
>
> Either way, this code path looks like it's missing something.
Right, Keith ran into the same and committed a fix right away I believe. Very
sorry about the breakage, but the latest bits should work.
Thanks,
-James
> Cheers,
> Peter
More information about the xorg-devel
mailing list