Re: [PATCH xserver 6/7 v2] sync: Convert from "CARD64" to int64_t.

2017-08-24 Thread Alexander E. Patrakov
2017-08-23 22:06 GMT+05:00 Eric Anholt :

> diff --git a/include/misc.h b/include/misc.h
> index 38af70ff9e89..0feeaebc7c1a 100644
> --- a/include/misc.h
> +++ b/include/misc.h
> @@ -324,6 +324,31 @@ bswap_32(uint32_t x)
>  ((x & 0x00FF) << 24));
>  }
>
> +static inline Bool
> +checked_int64_add(int64_t *out, int64_t a, int64_t b)
> +{
> +int64_t result = a + b;
> +/* signed addition overflows if operands have the same sign, and
> + * the sign of the result doesn't match the sign of the inputs.
> + */
> +Bool overflow = (a < 0) == (b < 0) && (a < 0) != (result < 0);
> +
> +*out = result;
> +
> +return overflow;
> +}
> +
> +static inline Bool
> +checked_int64_subtract(int64_t *out, int64_t a, int64_t b)
> +{
> +int64_t result = a - b;
> +Bool overflow = (a < 0) != (b < 0) && (a < 0) != (result < 0);
> +
> +*out = result;
> +
> +return overflow;
> +}
> +

NAK.

C compilers are allowed to assume that signed arithmetical operations
never overflow. I.e. to optimize your overflow check, because it never
triggers if there is no overflow.
https://www.airs.com/blog/archives/120

Please either make sure that all code that includes this header is
compiled with -fno-strict-overflow, or rewrite the check in a way that
does not check the result but only the operands and things like
INT64_MAX.

-- 
Alexander E. Patrakov
___
xorg-devel@lists.x.org: X.Org development
Archives: http://lists.x.org/archives/xorg-devel
Info: https://lists.x.org/mailman/listinfo/xorg-devel

[PATCH xserver 6/7 v2] sync: Convert from "CARD64" to int64_t.

2017-08-23 Thread Eric Anholt
The extension was using the name CARD64 to represent 64-bit values,
with a #define from CARD64 to XSyncValue, a struct with a pair of
32-bit values representing a signed 64-bit value.  This interfered
with protocol headers using CARD64 to try to actually store a
uint64_t.  Now that stdint.h exists, let's just use that here,
instead.

v2: Fix alarm delta changes.

Signed-off-by: Eric Anholt 
---
 Xext/sync.c | 302 +++-
 Xext/syncsrv.h  |  23 ++--
 include/misc.h  |  25 
 miext/sync/misync.c |   5 +-
 miext/sync/misyncstr.h  |  11 +-
 present/present_fence.c |   2 +-
 6 files changed, 186 insertions(+), 182 deletions(-)

diff --git a/Xext/sync.c b/Xext/sync.c
index a8db0ec22371..822c205a7a24 100644
--- a/Xext/sync.c
+++ b/Xext/sync.c
@@ -237,7 +237,7 @@ SyncAddTriggerToSyncObject(SyncTrigger * pTrigger)
  */
 
 static Bool
-SyncCheckTriggerPositiveComparison(SyncTrigger * pTrigger, CARD64 oldval)
+SyncCheckTriggerPositiveComparison(SyncTrigger * pTrigger, int64_t oldval)
 {
 SyncCounter *pCounter;
 
@@ -248,12 +248,11 @@ SyncCheckTriggerPositiveComparison(SyncTrigger * 
pTrigger, CARD64 oldval)
 
 pCounter = (SyncCounter *) pTrigger->pSync;
 
-return (pCounter == NULL ||
-XSyncValueGreaterOrEqual(pCounter->value, pTrigger->test_value));
+return pCounter == NULL || pCounter->value >= pTrigger->test_value;
 }
 
 static Bool
-SyncCheckTriggerNegativeComparison(SyncTrigger * pTrigger, CARD64 oldval)
+SyncCheckTriggerNegativeComparison(SyncTrigger * pTrigger, int64_t oldval)
 {
 SyncCounter *pCounter;
 
@@ -264,12 +263,11 @@ SyncCheckTriggerNegativeComparison(SyncTrigger * 
pTrigger, CARD64 oldval)
 
 pCounter = (SyncCounter *) pTrigger->pSync;
 
-return (pCounter == NULL ||
-XSyncValueLessOrEqual(pCounter->value, pTrigger->test_value));
+return pCounter == NULL || pCounter->value <= pTrigger->test_value;
 }
 
 static Bool
-SyncCheckTriggerPositiveTransition(SyncTrigger * pTrigger, CARD64 oldval)
+SyncCheckTriggerPositiveTransition(SyncTrigger * pTrigger, int64_t oldval)
 {
 SyncCounter *pCounter;
 
@@ -281,12 +279,12 @@ SyncCheckTriggerPositiveTransition(SyncTrigger * 
pTrigger, CARD64 oldval)
 pCounter = (SyncCounter *) pTrigger->pSync;
 
 return (pCounter == NULL ||
-(XSyncValueLessThan(oldval, pTrigger->test_value) &&
- XSyncValueGreaterOrEqual(pCounter->value, pTrigger->test_value)));
+(oldval < pTrigger->test_value &&
+ pCounter->value >= pTrigger->test_value));
 }
 
 static Bool
-SyncCheckTriggerNegativeTransition(SyncTrigger * pTrigger, CARD64 oldval)
+SyncCheckTriggerNegativeTransition(SyncTrigger * pTrigger, int64_t oldval)
 {
 SyncCounter *pCounter;
 
@@ -298,12 +296,12 @@ SyncCheckTriggerNegativeTransition(SyncTrigger * 
pTrigger, CARD64 oldval)
 pCounter = (SyncCounter *) pTrigger->pSync;
 
 return (pCounter == NULL ||
-(XSyncValueGreaterThan(oldval, pTrigger->test_value) &&
- XSyncValueLessOrEqual(pCounter->value, pTrigger->test_value)));
+(oldval > pTrigger->test_value &&
+ pCounter->value <= pTrigger->test_value));
 }
 
 static Bool
-SyncCheckTriggerFence(SyncTrigger * pTrigger, CARD64 unused)
+SyncCheckTriggerFence(SyncTrigger * pTrigger, int64_t unused)
 {
 SyncFence *pFence = (SyncFence *) pTrigger->pSync;
 
@@ -389,16 +387,15 @@ SyncInitTrigger(ClientPtr client, SyncTrigger * pTrigger, 
XID syncObject,
 if (pTrigger->value_type == XSyncAbsolute)
 pTrigger->test_value = pTrigger->wait_value;
 else {  /* relative */
-
 Bool overflow;
 
 if (pCounter == NULL)
 return BadMatch;
 
-XSyncValueAdd(&pTrigger->test_value, pCounter->value,
-  pTrigger->wait_value, &overflow);
+overflow = checked_int64_add(&pTrigger->test_value,
+ pCounter->value, 
pTrigger->wait_value);
 if (overflow) {
-client->errorValue = XSyncValueHigh32(pTrigger->wait_value);
+client->errorValue = pTrigger->wait_value >> 32;
 return BadValue;
 }
 }
@@ -441,15 +438,15 @@ SyncSendAlarmNotifyEvents(SyncAlarm * pAlarm)
 .type = SyncEventBase + XSyncAlarmNotify,
 .kind = XSyncAlarmNotify,
 .alarm = pAlarm->alarm_id,
-.alarm_value_hi = XSyncValueHigh32(pTrigger->test_value),
-.alarm_value_lo = XSyncValueLow32(pTrigger->test_value),
+.alarm_value_hi = pTrigger->test_value >> 32,
+.alarm_value_lo = pTrigger->test_value,
 .time = currentTime.milliseconds,
 .state = pAlarm->state
 };
 
 if (pTrigger->pSync && SYNC_COUNTER == pTrigger->pSync->type) {
-ane.counter_value_hi = XSyncValueHigh32(pCounter->value);
-ane.counter_value_lo = XSyncValueLow3

Re: [PATCH xserver 6/7 v2] sync: Convert from "CARD64" to int64_t.

2017-08-04 Thread Keith Packard
Eric Anholt  writes:

> The extension was using the name CARD64 to represent 64-bit values,
> with a #define from CARD64 to XSyncValue, a struct with a pair of
> 32-bit values representing a signed 64-bit value.  This interfered
> with protocol headers using CARD64 to try to actually store a
> uint64_t.  Now that stdint.h exists, let's just use that here,
> instead.
>
> v2: Fix alarm delta changes.

5.5/7 and 6 of 7 are

Reviewed-by: Keith Packard 

-- 
-keith


signature.asc
Description: PGP signature
___
xorg-devel@lists.x.org: X.Org development
Archives: http://lists.x.org/archives/xorg-devel
Info: https://lists.x.org/mailman/listinfo/xorg-devel

[PATCH xserver 6/7 v2] sync: Convert from "CARD64" to int64_t.

2017-08-04 Thread Eric Anholt
The extension was using the name CARD64 to represent 64-bit values,
with a #define from CARD64 to XSyncValue, a struct with a pair of
32-bit values representing a signed 64-bit value.  This interfered
with protocol headers using CARD64 to try to actually store a
uint64_t.  Now that stdint.h exists, let's just use that here,
instead.

v2: Fix alarm delta changes.

Signed-off-by: Eric Anholt 
---
 Xext/sync.c | 302 +++-
 Xext/syncsrv.h  |  23 ++--
 include/misc.h  |  25 
 miext/sync/misync.c |   5 +-
 miext/sync/misyncstr.h  |  11 +-
 present/present_fence.c |   2 +-
 6 files changed, 186 insertions(+), 182 deletions(-)

diff --git a/Xext/sync.c b/Xext/sync.c
index a8db0ec22371..822c205a7a24 100644
--- a/Xext/sync.c
+++ b/Xext/sync.c
@@ -237,7 +237,7 @@ SyncAddTriggerToSyncObject(SyncTrigger * pTrigger)
  */
 
 static Bool
-SyncCheckTriggerPositiveComparison(SyncTrigger * pTrigger, CARD64 oldval)
+SyncCheckTriggerPositiveComparison(SyncTrigger * pTrigger, int64_t oldval)
 {
 SyncCounter *pCounter;
 
@@ -248,12 +248,11 @@ SyncCheckTriggerPositiveComparison(SyncTrigger * 
pTrigger, CARD64 oldval)
 
 pCounter = (SyncCounter *) pTrigger->pSync;
 
-return (pCounter == NULL ||
-XSyncValueGreaterOrEqual(pCounter->value, pTrigger->test_value));
+return pCounter == NULL || pCounter->value >= pTrigger->test_value;
 }
 
 static Bool
-SyncCheckTriggerNegativeComparison(SyncTrigger * pTrigger, CARD64 oldval)
+SyncCheckTriggerNegativeComparison(SyncTrigger * pTrigger, int64_t oldval)
 {
 SyncCounter *pCounter;
 
@@ -264,12 +263,11 @@ SyncCheckTriggerNegativeComparison(SyncTrigger * 
pTrigger, CARD64 oldval)
 
 pCounter = (SyncCounter *) pTrigger->pSync;
 
-return (pCounter == NULL ||
-XSyncValueLessOrEqual(pCounter->value, pTrigger->test_value));
+return pCounter == NULL || pCounter->value <= pTrigger->test_value;
 }
 
 static Bool
-SyncCheckTriggerPositiveTransition(SyncTrigger * pTrigger, CARD64 oldval)
+SyncCheckTriggerPositiveTransition(SyncTrigger * pTrigger, int64_t oldval)
 {
 SyncCounter *pCounter;
 
@@ -281,12 +279,12 @@ SyncCheckTriggerPositiveTransition(SyncTrigger * 
pTrigger, CARD64 oldval)
 pCounter = (SyncCounter *) pTrigger->pSync;
 
 return (pCounter == NULL ||
-(XSyncValueLessThan(oldval, pTrigger->test_value) &&
- XSyncValueGreaterOrEqual(pCounter->value, pTrigger->test_value)));
+(oldval < pTrigger->test_value &&
+ pCounter->value >= pTrigger->test_value));
 }
 
 static Bool
-SyncCheckTriggerNegativeTransition(SyncTrigger * pTrigger, CARD64 oldval)
+SyncCheckTriggerNegativeTransition(SyncTrigger * pTrigger, int64_t oldval)
 {
 SyncCounter *pCounter;
 
@@ -298,12 +296,12 @@ SyncCheckTriggerNegativeTransition(SyncTrigger * 
pTrigger, CARD64 oldval)
 pCounter = (SyncCounter *) pTrigger->pSync;
 
 return (pCounter == NULL ||
-(XSyncValueGreaterThan(oldval, pTrigger->test_value) &&
- XSyncValueLessOrEqual(pCounter->value, pTrigger->test_value)));
+(oldval > pTrigger->test_value &&
+ pCounter->value <= pTrigger->test_value));
 }
 
 static Bool
-SyncCheckTriggerFence(SyncTrigger * pTrigger, CARD64 unused)
+SyncCheckTriggerFence(SyncTrigger * pTrigger, int64_t unused)
 {
 SyncFence *pFence = (SyncFence *) pTrigger->pSync;
 
@@ -389,16 +387,15 @@ SyncInitTrigger(ClientPtr client, SyncTrigger * pTrigger, 
XID syncObject,
 if (pTrigger->value_type == XSyncAbsolute)
 pTrigger->test_value = pTrigger->wait_value;
 else {  /* relative */
-
 Bool overflow;
 
 if (pCounter == NULL)
 return BadMatch;
 
-XSyncValueAdd(&pTrigger->test_value, pCounter->value,
-  pTrigger->wait_value, &overflow);
+overflow = checked_int64_add(&pTrigger->test_value,
+ pCounter->value, 
pTrigger->wait_value);
 if (overflow) {
-client->errorValue = XSyncValueHigh32(pTrigger->wait_value);
+client->errorValue = pTrigger->wait_value >> 32;
 return BadValue;
 }
 }
@@ -441,15 +438,15 @@ SyncSendAlarmNotifyEvents(SyncAlarm * pAlarm)
 .type = SyncEventBase + XSyncAlarmNotify,
 .kind = XSyncAlarmNotify,
 .alarm = pAlarm->alarm_id,
-.alarm_value_hi = XSyncValueHigh32(pTrigger->test_value),
-.alarm_value_lo = XSyncValueLow32(pTrigger->test_value),
+.alarm_value_hi = pTrigger->test_value >> 32,
+.alarm_value_lo = pTrigger->test_value,
 .time = currentTime.milliseconds,
 .state = pAlarm->state
 };
 
 if (pTrigger->pSync && SYNC_COUNTER == pTrigger->pSync->type) {
-ane.counter_value_hi = XSyncValueHigh32(pCounter->value);
-ane.counter_value_lo = XSyncValueLow3