[PATCH 1/1] kern_tc.c: th_generation starts with 1 after overflow for single-core

Gabriel Moyano gabriel.moyano at dlr.de
Fri May 27 07:57:37 UTC 2022


---
 cpukit/score/src/kern_tc.c | 23 ++++++++++-------------
 1 file changed, 10 insertions(+), 13 deletions(-)

diff --git a/cpukit/score/src/kern_tc.c b/cpukit/score/src/kern_tc.c
index 89ece1fbde..3256b646ef 100644
--- a/cpukit/score/src/kern_tc.c
+++ b/cpukit/score/src/kern_tc.c
@@ -1659,9 +1659,9 @@ _Timecounter_Windup(struct bintime *new_boottimebin,
 	struct timecounter *tc;
 	struct timehands *th, *tho;
 	uint32_t delta, ncount;
-#if defined(RTEMS_SMP)
+#ifdef __rtems__
 	u_int ogen;
-#endif
+#endif /* __rtems__ */
 	int i;
 	time_t t;
 #ifdef __rtems__
@@ -1686,6 +1686,7 @@ _Timecounter_Windup(struct bintime *new_boottimebin,
 	memcpy(th, tho, offsetof(struct timehands, th_generation));
 #else
 	th = tho;
+	ogen = th->th_generation;
 #endif
 	if (new_boottimebin != NULL)
 		th->th_boottime = *new_boottimebin;
@@ -1783,7 +1784,7 @@ _Timecounter_Windup(struct bintime *new_boottimebin,
 #endif
 	}
 
-#if defined(RTEMS_SMP)
+#ifdef __rtems__
 	/*
 	 * Now that the struct timehands is again consistent, set the new
 	 * generation number, making sure to not make it zero.
@@ -1791,9 +1792,7 @@ _Timecounter_Windup(struct bintime *new_boottimebin,
 	if (++ogen == 0)
 		ogen = 1;
 	atomic_store_rel_int(&th->th_generation, ogen);
-#else
-	atomic_store_rel_int(&th->th_generation, th->th_generation + 1);
-#endif
+#endif /* __rtems__ */
 
 	/* Go live with the new struct timehands. */
 #ifdef FFCLOCK
@@ -2323,13 +2322,13 @@ _Timecounter_Tick_simple(uint32_t delta, uint32_t offset,
 {
 	struct bintime bt;
 	struct timehands *th;
-#if defined(RTEMS_SMP)
+#ifdef __rtems__
 	u_int ogen;
-#endif
+#endif /* __rtems__ */
 
 	th = timehands;
-#if defined(RTEMS_SMP)
 	ogen = th->th_generation;
+#if defined(RTEMS_SMP)
 	th->th_generation = 0;
 	atomic_thread_fence_rel();
 #endif
@@ -2344,7 +2343,7 @@ _Timecounter_Tick_simple(uint32_t delta, uint32_t offset,
 	bintime2timeval(&bt, &th->th_microtime);
 	bintime2timespec(&bt, &th->th_nanotime);
 
-#if defined(RTEMS_SMP)
+#ifdef __rtems__
 	/*
 	 * Now that the struct timehands is again consistent, set the new
 	 * generation number, making sure to not make it zero.
@@ -2352,9 +2351,7 @@ _Timecounter_Tick_simple(uint32_t delta, uint32_t offset,
 	if (++ogen == 0)
 		ogen = 1;
 	atomic_store_rel_int(&th->th_generation, ogen);
-#else
-	atomic_store_rel_int(&th->th_generation, th->th_generation + 1);
-#endif
+#endif /* __rtems__ */
 
 	/* Go live with the new struct timehands. */
 	time_second = th->th_microtime.tv_sec;
-- 
2.25.1



More information about the devel mailing list