diff options
| author | Andrey Kleshchev <andreykproductengine@lindenlab.com> | 2023-02-03 22:59:50 +0200 |
|---|---|---|
| committer | Andrey Kleshchev <andreykproductengine@lindenlab.com> | 2023-02-03 22:59:50 +0200 |
| commit | 2f4902967ad44c7ca670da11ee05daf8c43a895c (patch) | |
| tree | 33774283dfda5f7f594d64ba3800e3f21947f25e /indra/llcommon/lltimer.cpp | |
| parent | c5fcf3066f4a5c75635c774422ff1db59b8624f7 (diff) | |
| parent | f3cd329b585ef55a66f2a824f010d1a54d67d8d2 (diff) | |
Merge branch 'xcode-14.1' into andreyk/SL-19134
# Conflicts:
# indra/llcommon/llsdserialize.cpp
# indra/llcommon/llsdserialize.h
Diffstat (limited to 'indra/llcommon/lltimer.cpp')
| -rw-r--r-- | indra/llcommon/lltimer.cpp | 11 |
1 files changed, 8 insertions, 3 deletions
diff --git a/indra/llcommon/lltimer.cpp b/indra/llcommon/lltimer.cpp index aaa6df325c..58bedacf43 100644 --- a/indra/llcommon/lltimer.cpp +++ b/indra/llcommon/lltimer.cpp @@ -121,9 +121,14 @@ U32 micro_sleep(U64 us, U32 max_yields) U64 start = get_clock_count(); // This is kernel dependent. Currently, our kernel generates software clock // interrupts at 250 Hz (every 4,000 microseconds). - const U64 KERNEL_SLEEP_INTERVAL_US = 4000; - - S32 num_sleep_intervals = (us - (KERNEL_SLEEP_INTERVAL_US >> 1)) / KERNEL_SLEEP_INTERVAL_US; + const S64 KERNEL_SLEEP_INTERVAL_US = 4000; + + // Use signed arithmetic to discover whether a sleep is even necessary. If + // either 'us' or KERNEL_SLEEP_INTERVAL_US is unsigned, the compiler + // promotes the difference to unsigned. If 'us' is less than half + // KERNEL_SLEEP_INTERVAL_US, the unsigned difference will be hugely + // positive, resulting in a crazy long wait. + auto num_sleep_intervals = (S64(us) - (KERNEL_SLEEP_INTERVAL_US >> 1)) / KERNEL_SLEEP_INTERVAL_US; if (num_sleep_intervals > 0) { U64 sleep_time = (num_sleep_intervals * KERNEL_SLEEP_INTERVAL_US) - (KERNEL_SLEEP_INTERVAL_US >> 1); |
