dm: rtc: Try to handle the localtime() race
At present the sandbox timer uses localtime() which can jump around twice a year when daylight-saving time changes. It would be tricky to make use of gmtime() since we still need to present the time in local time, as seems to be required by U-Boot's RTC interface. The problem can only happen once, so use a loop to detect it and try again. This should be sufficient to detect either a change in the 'second' value, or a daylight-saving change. We can assume that the latter also incorporates a 'second' change, so there is no need to loop more than twice. Signed-off-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
parent
fc7ceae0d5
commit
21ddac140e
@ -252,6 +252,7 @@ static int dm_test_rtc_reset(struct unit_test_state *uts)
|
|||||||
struct rtc_time now;
|
struct rtc_time now;
|
||||||
struct udevice *dev, *emul;
|
struct udevice *dev, *emul;
|
||||||
long old_base_time, base_time;
|
long old_base_time, base_time;
|
||||||
|
int i;
|
||||||
|
|
||||||
ut_assertok(uclass_get_device(UCLASS_RTC, 0, &dev));
|
ut_assertok(uclass_get_device(UCLASS_RTC, 0, &dev));
|
||||||
ut_assertok(dm_rtc_get(dev, &now));
|
ut_assertok(dm_rtc_get(dev, &now));
|
||||||
@ -259,19 +260,24 @@ static int dm_test_rtc_reset(struct unit_test_state *uts)
|
|||||||
ut_assertok(i2c_emul_find(dev, &emul));
|
ut_assertok(i2c_emul_find(dev, &emul));
|
||||||
ut_assertnonnull(emul);
|
ut_assertnonnull(emul);
|
||||||
|
|
||||||
old_base_time = sandbox_i2c_rtc_get_set_base_time(emul, 0);
|
i = 0;
|
||||||
|
do {
|
||||||
|
old_base_time = sandbox_i2c_rtc_get_set_base_time(emul, 0);
|
||||||
|
|
||||||
ut_asserteq(0, sandbox_i2c_rtc_get_set_base_time(emul, -1));
|
ut_asserteq(0, sandbox_i2c_rtc_get_set_base_time(emul, -1));
|
||||||
|
|
||||||
/*
|
ut_assertok(dm_rtc_reset(dev));
|
||||||
* Resetting the RTC should put the base time back to normal. Allow for
|
base_time = sandbox_i2c_rtc_get_set_base_time(emul, -1);
|
||||||
* a one-second adjustment in case the time flips over while this
|
|
||||||
* test process is pre-empted, since reset_time() in i2c_rtc_emul.c
|
/*
|
||||||
* reads the time from the OS.
|
* Resetting the RTC should put the base time back to normal.
|
||||||
*/
|
* Allow for a one-timeadjustment in case the time flips over
|
||||||
ut_assertok(dm_rtc_reset(dev));
|
* while this test process is pre-empted (either by a second
|
||||||
base_time = sandbox_i2c_rtc_get_set_base_time(emul, -1);
|
* or a daylight-saving change), since reset_time() in
|
||||||
ut_assert(base_time - old_base_time <= 1);
|
* i2c_rtc_emul.c reads the time from the OS.
|
||||||
|
*/
|
||||||
|
} while (++i < 2 && base_time != old_base_time);
|
||||||
|
ut_asserteq(old_base_time, base_time);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user