View | Details | Raw Unified | Return to bug 472046
Collapse All | Expand All

(-)a/Xext/sync.c (-86 / +94 lines)
Lines 97-103 static SyncCounter **SysCounterList = NULL; Link Here
97
#define XSyncCAAllTrigger \
97
#define XSyncCAAllTrigger \
98
    (XSyncCACounter | XSyncCAValueType | XSyncCAValue | XSyncCATestType)
98
    (XSyncCACounter | XSyncCAValueType | XSyncCAValue | XSyncCATestType)
99
99
100
static void SyncComputeBracketValues(SyncCounter *, Bool);
100
static void SyncComputeBracketValues(SyncCounter *);
101
101
102
static void SyncInitServerTime(void);
102
static void SyncInitServerTime(void);
103
103
Lines 170-176 SyncDeleteTriggerFromCounter(SyncTrigger *pTrigger) Link Here
170
    }
170
    }
171
171
172
    if (IsSystemCounter(pTrigger->pCounter))
172
    if (IsSystemCounter(pTrigger->pCounter))
173
	SyncComputeBracketValues(pTrigger->pCounter, /*startOver*/ TRUE);
173
	SyncComputeBracketValues(pTrigger->pCounter);
174
}
174
}
175
175
176
176
Lines 197-203 SyncAddTriggerToCounter(SyncTrigger *pTrigger) Link Here
197
    pTrigger->pCounter->pTriglist = pCur;
197
    pTrigger->pCounter->pTriglist = pCur;
198
198
199
    if (IsSystemCounter(pTrigger->pCounter))
199
    if (IsSystemCounter(pTrigger->pCounter))
200
	SyncComputeBracketValues(pTrigger->pCounter, /*startOver*/ TRUE);
200
	SyncComputeBracketValues(pTrigger->pCounter);
201
201
202
    return Success;
202
    return Success;
203
}
203
}
Lines 354-360 SyncInitTrigger(ClientPtr client, SyncTrigger *pTrigger, XSyncCounter counter, Link Here
354
    }
354
    }
355
    else if (IsSystemCounter(pCounter))
355
    else if (IsSystemCounter(pCounter))
356
    {
356
    {
357
	SyncComputeBracketValues(pCounter, /*startOver*/ TRUE);
357
	SyncComputeBracketValues(pCounter);
358
    }
358
    }
359
359
360
    return Success;
360
    return Success;
Lines 643-655 SyncChangeCounter(SyncCounter *pCounter, CARD64 newval) Link Here
643
    for (ptl = pCounter->pTriglist; ptl; ptl = pnext)
643
    for (ptl = pCounter->pTriglist; ptl; ptl = pnext)
644
    {
644
    {
645
	pnext = ptl->next;
645
	pnext = ptl->next;
646
	if ((*ptl->pTrigger->CheckTrigger)(ptl->pTrigger, oldval))
646
	if ((*ptl->pTrigger->CheckTrigger)(ptl->pTrigger, oldval)) {
647
	    (*ptl->pTrigger->TriggerFired)(ptl->pTrigger);
647
	    (*ptl->pTrigger->TriggerFired)(ptl->pTrigger);
648
	}
648
    }
649
    }
649
650
650
    if (IsSystemCounter(pCounter))
651
    if (IsSystemCounter(pCounter))
651
    {
652
    {
652
	SyncComputeBracketValues(pCounter, /* startOver */ FALSE);
653
	SyncComputeBracketValues(pCounter);
653
    }
654
    }
654
}
655
}
655
656
Lines 916-922 SyncDestroySystemCounter(pointer pSysCounter) Link Here
916
}
917
}
917
918
918
static void
919
static void
919
SyncComputeBracketValues(SyncCounter *pCounter, Bool startOver)
920
SyncComputeBracketValues(SyncCounter *pCounter)
920
{
921
{
921
    SyncTriggerList *pCur;
922
    SyncTriggerList *pCur;
922
    SyncTrigger *pTrigger;
923
    SyncTrigger *pTrigger;
Lines 933-992 SyncComputeBracketValues(SyncCounter *pCounter, Bool startOver) Link Here
933
    if (ct == XSyncCounterNeverChanges)
934
    if (ct == XSyncCounterNeverChanges)
934
	return;
935
	return;
935
936
936
    if (startOver)
937
    XSyncMaxValue(&psci->bracket_greater);
937
    {
938
    XSyncMinValue(&psci->bracket_less);
938
	XSyncMaxValue(&psci->bracket_greater);
939
939
	XSyncMinValue(&psci->bracket_less);
940
    }
941
940
942
    for (pCur = pCounter->pTriglist; pCur; pCur = pCur->next)
941
    for (pCur = pCounter->pTriglist; pCur; pCur = pCur->next)
943
    {
942
    {
944
	pTrigger = pCur->pTrigger;
943
	pTrigger = pCur->pTrigger;
945
	
944
946
        if (pTrigger->test_type == XSyncPositiveComparison &&
945
        if ( ( (pTrigger->test_type == XSyncPositiveComparison)
947
	    ct != XSyncCounterNeverIncreases)
946
	       && ( XSyncValueGreaterOrEqual(pCounter->value, pTrigger->test_value)
948
	{
947
		    || (ct != XSyncCounterNeverIncreases
949
	    if (XSyncValueLessThan(pCounter->value, pTrigger->test_value) &&
948
			&& XSyncValueLessThan(pCounter->value, pTrigger->test_value))
950
		XSyncValueLessThan(pTrigger->test_value,
949
		    )
951
				   psci->bracket_greater))
950
	       )
952
	    {
951
	     || ((pTrigger->test_type == XSyncPositiveTransition)
953
		psci->bracket_greater = pTrigger->test_value;
952
		 && ( ( ct != XSyncCounterNeverDecreases
954
		pnewgtval = &psci->bracket_greater;
953
			&& XSyncValueGreaterOrEqual(pCounter->value, pTrigger->test_value))
955
	    }
954
		      || ( ct != XSyncCounterNeverIncreases
956
	}
955
			  && XSyncValueLessThan(pCounter->value, pTrigger->test_value))
957
	else if (pTrigger->test_type == XSyncNegativeComparison &&
956
		      )
958
		 ct != XSyncCounterNeverDecreases)
959
	{
960
	    if (XSyncValueGreaterThan(pCounter->value, pTrigger->test_value) &&
961
		XSyncValueGreaterThan(pTrigger->test_value,
962
				      psci->bracket_less))
963
	    {
964
		psci->bracket_less = pTrigger->test_value;
965
		pnewltval = &psci->bracket_less;
966
	    }
967
	}
968
	else if ( (pTrigger->test_type == XSyncPositiveTransition &&
969
		   ct != XSyncCounterNeverIncreases)
970
		 ||
971
		 (pTrigger->test_type == XSyncNegativeTransition &&
972
		  ct != XSyncCounterNeverDecreases)
973
		 )
957
		 )
974
	{
958
	     ) {
975
	    if (XSyncValueLessThan(pCounter->value, pTrigger->test_value))
959
	      if (XSyncValueLessThan(pTrigger->test_value,
976
	    {
960
				     psci->bracket_greater)) {
977
		if (XSyncValueLessThan(pTrigger->test_value,
961
		  psci->bracket_greater = pTrigger->test_value;
978
				       psci->bracket_greater))
962
		  pnewgtval = &psci->bracket_greater;
979
		{
980
		    psci->bracket_greater = pTrigger->test_value;
981
		    pnewgtval = &psci->bracket_greater;
982
		}
983
		else
984
		if (XSyncValueGreaterThan(pTrigger->test_value,
985
					  psci->bracket_less))
986
		{
987
		    psci->bracket_less = pTrigger->test_value;
988
		    pnewltval = &psci->bracket_less;
989
		}
963
		}
964
	} else if ( ( (pTrigger->test_type == XSyncNegativeComparison)
965
		      && ( XSyncValueLessOrEqual(pCounter->value, pTrigger->test_value)
966
			   || (ct != XSyncCounterNeverDecreases
967
			       && XSyncValueGreaterThan(pCounter->value, pTrigger->test_value))
968
			   )
969
		      )
970
		    || ((pTrigger->test_type == XSyncNegativeTransition)
971
			&& ( ( ct != XSyncCounterNeverDecreases
972
			       && XSyncValueGreaterOrEqual(pCounter->value, pTrigger->test_value))
973
			     || ( ct != XSyncCounterNeverIncreases
974
				  && XSyncValueLessThan(pCounter->value, pTrigger->test_value))
975
			    )
976
			)
977
		    ) {
978
	    if (XSyncValueGreaterThan(pTrigger->test_value,
979
				      psci->bracket_less)) {
980
		psci->bracket_less = pTrigger->test_value;
981
		pnewltval = &psci->bracket_less;
990
	    }
982
	    }
991
	}
983
	}
992
    } /* end for each trigger */
984
    } /* end for each trigger */
Lines 2291-2301 IdleTimeQueryValue (pointer pCounter, CARD64 *pValue_return) Link Here
2291
}
2283
}
2292
2284
2293
static void
2285
static void
2294
IdleTimeBlockHandler(pointer env, struct timeval **wt, pointer LastSelectMask)
2286
IdleTimeBlockHandler (pointer env,
2295
{
2287
                      struct timeval **wt,
2296
    XSyncValue idle, old_idle;
2288
                      pointer LastSelectMask)
2297
    SyncTriggerList *list = IdleTimeCounter->pTriglist;
2289
{
2298
    SyncTrigger *trig;
2290
  XSyncValue idle, old_idle;
2291
  SyncTriggerList *list = IdleTimeCounter->pTriglist;
2292
  SyncTrigger *trig;
2293
  unsigned long timeout = -1;
2294
  XSyncValue value;
2295
  Bool overflow;
2296
 
2299
2297
2300
    if (!pIdleTimeValueLess && !pIdleTimeValueGreater)
2298
    if (!pIdleTimeValueLess && !pIdleTimeValueGreater)
2301
	return;
2299
	return;
Lines 2313-2358 IdleTimeBlockHandler(pointer env, struct timeval **wt, pointer LastSelectMask) Link Here
2313
	 * want level or edge trigger.  Check the trigger list against the
2311
	 * want level or edge trigger.  Check the trigger list against the
2314
	 * current idle time, and if any succeed, bomb out of select()
2312
	 * current idle time, and if any succeed, bomb out of select()
2315
	 * immediately so we can reschedule.
2313
	 * immediately so we can reschedule.
2314
	 * NOTE: we need to check trigger because the idle timer can go
2315
	 * both ways (XSyncCounterUnrestricted) so that we need to set
2316
	 * pIdleTimeValueLess in ComputeBracketValues() in the edge
2317
	 * triggered case even if the idle timer is already less.
2316
	 */
2318
	 */
2317
2319
        for (list = IdleTimeCounter->pTriglist; list; list = list->next) {
2318
	for (list = IdleTimeCounter->pTriglist; list; list = list->next) {
2319
	    trig = list->pTrigger;
2320
	    trig = list->pTrigger;
2320
	    if (trig->CheckTrigger(trig, old_idle)) {
2321
	    if (trig->CheckTrigger(trig, old_idle)) {
2321
		AdjustWaitForDelay(wt, 0);
2322
	        AdjustWaitForDelay(wt, 0);
2322
		break;
2323
		IdleTimeCounter->value = old_idle; /* pop */
2324
		return;
2323
	    }
2325
	    }
2324
	}
2326
	}
2325
    }
2327
    }
2326
    else if (pIdleTimeValueGreater)
2328
    if (pIdleTimeValueGreater)
2327
    {
2329
    {
2328
	/*
2330
      /*
2329
	 * There's a threshold in the positive direction.  If we've been
2331
       * There's a threshold in the positive direction.
2330
	 * idle less than it, schedule a wakeup for sometime in the future.
2332
       * If we've been idle more than it, and someone wants to know about
2331
	 * If we've been idle more than it, and someone wants to know about
2333
       * that level-triggered, schedule an immediate wakeup.
2332
	 * that level-triggered, schedule an immediate wakeup.
2334
       * NOTE: we need to check trigger because the idle timer can go
2333
	 */
2335
       * both ways (XSyncCounterUnrestricted) so that we need to set
2334
	unsigned long timeout = -1;
2336
       * pIdleTimeValueGreater in ComputeBracketValues() in the edge
2335
2337
       * triggered case even if the idle timer is already greater.
2336
	if (XSyncValueLessThan (idle, *pIdleTimeValueGreater)) {
2338
       */
2337
	    XSyncValue value;
2338
	    Bool overflow;
2339
2339
2340
	    XSyncValueSubtract (&value, *pIdleTimeValueGreater,
2340
	if (XSyncValueGreaterOrEqual (idle, *pIdleTimeValueGreater)) {
2341
	                        idle, &overflow);
2342
	    timeout = min(timeout, XSyncValueLow32 (value));
2343
	} else {
2344
	    for (list = IdleTimeCounter->pTriglist; list; list = list->next) {
2341
	    for (list = IdleTimeCounter->pTriglist; list; list = list->next) {
2345
		trig = list->pTrigger;
2342
	        trig = list->pTrigger;
2346
		if (trig->CheckTrigger(trig, old_idle)) {
2343
		if (trig->CheckTrigger(trig, old_idle)) {
2347
		    timeout = min(timeout, 0);
2344
		    AdjustWaitForDelay (wt, 0);
2348
		    break;
2345
		    IdleTimeCounter->value = old_idle; /* pop */
2346
		    return;
2349
		}
2347
		}
2350
	    }
2348
	    }
2351
	}
2349
	}
2352
2353
	AdjustWaitForDelay (wt, timeout);
2354
    }
2350
    }
2355
2351
2352
    /*
2353
     * If we don't have to wake up immediately we schedule a wakeup for the
2354
     * next time a trigger expires.
2355
     */
2356
    for (list = IdleTimeCounter->pTriglist; list; list = list->next) {
2357
        trig = list->pTrigger;
2358
	if (XSyncValueLessThan (idle, trig->test_value)) {
2359
	    XSyncValueSubtract (&value, trig->test_value,
2360
				idle, &overflow);
2361
	    timeout = min(timeout,XSyncValueLow32 (value));
2362
	}
2363
    }
2364
    AdjustWaitForDelay (wt, timeout);
2356
    IdleTimeCounter->value = old_idle; /* pop */
2365
    IdleTimeCounter->value = old_idle; /* pop */
2357
}
2366
}
2358
2367
2359
- 

Return to bug 472046