Skip to content

Commit 8912462

Browse files
committed
Merge branch 'bugfix/adjtime_return_outdelta_before_new_delta_set' into 'master'
newlib: Fix adjtime, returns the amount of time remaining from any previous adjustment Closes IDFGH-3192 and IDFGH-3187 See merge request espressif/esp-idf!9105
2 parents f84ddd9 + a861a75 commit 8912462

File tree

2 files changed

+29
-24
lines changed

2 files changed

+29
-24
lines changed

components/newlib/test/test_time.c

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -81,25 +81,27 @@ TEST_CASE("test adjtime function", "[newlib]")
8181
tv_delta.tv_sec = 0;
8282
tv_delta.tv_usec = -900000;
8383
TEST_ASSERT_EQUAL(adjtime(&tv_delta, &tv_outdelta), 0);
84-
TEST_ASSERT_TRUE(tv_outdelta.tv_usec <= 0);
85-
86-
tv_delta.tv_sec = 0;
87-
tv_delta.tv_usec = 900000;
88-
TEST_ASSERT_EQUAL(adjtime(&tv_delta, &tv_outdelta), 0);
89-
TEST_ASSERT_TRUE(tv_outdelta.tv_usec >= 0);
84+
TEST_ASSERT_EQUAL(tv_outdelta.tv_sec, 0);
85+
TEST_ASSERT_EQUAL(tv_outdelta.tv_usec, 0);
86+
TEST_ASSERT_EQUAL(adjtime(NULL, &tv_outdelta), 0);
87+
TEST_ASSERT_LESS_THAN(-800000, tv_outdelta.tv_usec);
9088

9189
tv_delta.tv_sec = -4;
9290
tv_delta.tv_usec = -900000;
93-
TEST_ASSERT_EQUAL(adjtime(&tv_delta, &tv_outdelta), 0);
91+
TEST_ASSERT_EQUAL(adjtime(&tv_delta, NULL), 0);
92+
TEST_ASSERT_EQUAL(adjtime(NULL, &tv_outdelta), 0);
9493
TEST_ASSERT_EQUAL(tv_outdelta.tv_sec, -4);
95-
TEST_ASSERT_TRUE(tv_outdelta.tv_usec <= 0);
94+
TEST_ASSERT_LESS_THAN(-800000, tv_outdelta.tv_usec);
9695

9796
// after settimeofday() adjtime() is stopped
9897
tv_delta.tv_sec = 15;
9998
tv_delta.tv_usec = 900000;
10099
TEST_ASSERT_EQUAL(adjtime(&tv_delta, &tv_outdelta), 0);
100+
TEST_ASSERT_EQUAL(tv_outdelta.tv_sec, -4);
101+
TEST_ASSERT_LESS_THAN(-800000, tv_outdelta.tv_usec);
102+
TEST_ASSERT_EQUAL(adjtime(NULL, &tv_outdelta), 0);
101103
TEST_ASSERT_EQUAL(tv_outdelta.tv_sec, 15);
102-
TEST_ASSERT_TRUE(tv_outdelta.tv_usec >= 0);
104+
TEST_ASSERT_GREATER_OR_EQUAL(800000, tv_outdelta.tv_usec);
103105

104106
TEST_ASSERT_EQUAL(gettimeofday(&tv_time, NULL), 0);
105107
TEST_ASSERT_EQUAL(settimeofday(&tv_time, NULL), 0);
@@ -112,21 +114,24 @@ TEST_CASE("test adjtime function", "[newlib]")
112114
tv_delta.tv_sec = 15;
113115
tv_delta.tv_usec = 900000;
114116
TEST_ASSERT_EQUAL(adjtime(&tv_delta, &tv_outdelta), 0);
117+
TEST_ASSERT_EQUAL(tv_outdelta.tv_sec, 0);
118+
TEST_ASSERT_EQUAL(tv_outdelta.tv_usec, 0);
119+
TEST_ASSERT_EQUAL(adjtime(NULL, &tv_outdelta), 0);
115120
TEST_ASSERT_EQUAL(tv_outdelta.tv_sec, 15);
116-
TEST_ASSERT_TRUE(tv_outdelta.tv_usec >= 0);
121+
TEST_ASSERT_GREATER_OR_EQUAL(800000, tv_outdelta.tv_usec);
117122

118123
TEST_ASSERT_EQUAL(gettimeofday(&tv_time, NULL), 0);
119124

120125
TEST_ASSERT_EQUAL(adjtime(NULL, &tv_outdelta), 0);
121126
TEST_ASSERT_EQUAL(tv_outdelta.tv_sec, 15);
122-
TEST_ASSERT_TRUE(tv_outdelta.tv_usec >= 0);
127+
TEST_ASSERT_GREATER_OR_EQUAL(800000, tv_outdelta.tv_usec);
123128

124129
tv_delta.tv_sec = 1;
125130
tv_delta.tv_usec = 0;
126131
TEST_ASSERT_EQUAL(adjtime(&tv_delta, NULL), 0);
127132
vTaskDelay(1000 / portTICK_PERIOD_MS);
128133
TEST_ASSERT_EQUAL(adjtime(NULL, &tv_outdelta), 0);
129-
TEST_ASSERT_TRUE(tv_outdelta.tv_sec == 0);
134+
TEST_ASSERT_EQUAL(tv_outdelta.tv_sec, 0);
130135
// the correction will be equal to (1_000_000us >> 6) = 15_625 us.
131136
TEST_ASSERT_TRUE(1000000L - tv_outdelta.tv_usec >= 15600);
132137
TEST_ASSERT_TRUE(1000000L - tv_outdelta.tv_usec <= 15650);

components/newlib/time.c

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,18 @@ static void adjtime_corr_stop (void)
193193
int adjtime(const struct timeval *delta, struct timeval *outdelta)
194194
{
195195
#if defined( WITH_FRC ) || defined( WITH_RTC )
196+
if(outdelta != NULL){
197+
_lock_acquire(&s_adjust_time_lock);
198+
adjust_boot_time();
199+
if (adjtime_start != 0) {
200+
outdelta->tv_sec = adjtime_total_correction / 1000000L;
201+
outdelta->tv_usec = adjtime_total_correction % 1000000L;
202+
} else {
203+
outdelta->tv_sec = 0;
204+
outdelta->tv_usec = 0;
205+
}
206+
_lock_release(&s_adjust_time_lock);
207+
}
196208
if(delta != NULL){
197209
int64_t sec = delta->tv_sec;
198210
int64_t usec = delta->tv_usec;
@@ -211,18 +223,6 @@ int adjtime(const struct timeval *delta, struct timeval *outdelta)
211223
adjtime_total_correction = sec * 1000000L + usec;
212224
_lock_release(&s_adjust_time_lock);
213225
}
214-
if(outdelta != NULL){
215-
_lock_acquire(&s_adjust_time_lock);
216-
adjust_boot_time();
217-
if (adjtime_start != 0) {
218-
outdelta->tv_sec = adjtime_total_correction / 1000000L;
219-
outdelta->tv_usec = adjtime_total_correction % 1000000L;
220-
} else {
221-
outdelta->tv_sec = 0;
222-
outdelta->tv_usec = 0;
223-
}
224-
_lock_release(&s_adjust_time_lock);
225-
}
226226
return 0;
227227
#else
228228
return -1;

0 commit comments

Comments
 (0)