Przeglądaj źródła

优化修改代码

niujiuru 1 miesiąc temu
rodzic
commit
7467b1ec28
1 zmienionych plików z 16 dodań i 5 usunięć
  1. 16 5
      swapi/swsignal.c

+ 16 - 5
swapi/swsignal.c

@@ -6,9 +6,7 @@
  * HISTORY:
  * 1, [2010-12-17] created by NiuJiuRu
  * 2, [2025-11-24] 优化修改"sw_signal_wait()"函数, 避免依赖系统时间, 导致的
- *                 超时误差或跳变,具体修改如下: 
- *                 - 将 "gettimeofday()"  替换成 "clock_gettime()"
- *                 - 将 "sem_timedwait()" 替换成 "sem_clockwait()"
+ *                 超时误差或跳变问题
  ***********************************************************************/
 #include "swapi.h"
 #include "swmem.h"
@@ -52,8 +50,9 @@ wait_p1:
 	}
 	else
 	{
+#if (__GLIBC__ > 2) || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 30)
 		struct timespec ts, now;
-		clock_gettime(CLOCK_MONOTONIC/*单调时钟, 不受系统时间影响*/, &now); // "CLOCK_REALTIME"依赖系统时间
+		clock_gettime(CLOCK_MONOTONIC/*单调时钟, 不受系统时间影响*/, &now);
 		ts.tv_sec = now.tv_sec + timeout/1000;
 		ts.tv_nsec = now.tv_nsec + (timeout%1000)*1000*1000;
 		if(ts.tv_nsec >= (1000*1000*1000))
@@ -63,9 +62,21 @@ wait_p1:
 		}
 wait_p2:
 		ret = sem_clockwait(sem, CLOCK_MONOTONIC, &ts); // 非POSIX标准, GNU扩展, 需定义:"_GNU_SOURCE"支持
-		                                                // , 同时glic库版本需大于等于2.28
+		                                                // , 同时glic库版本需大于等于2.30
 		if(ret < 0 && errno == EINTR) goto wait_p2;
 		else return ret;
+#else
+		struct timespec start, now; struct timespec ts = { 0, 1000*1000 };
+		clock_gettime(CLOCK_MONOTONIC, &start);
+		while((ret = sem_trywait(sem)) < 0 && errno == EAGAIN)
+		{
+		  clock_gettime(CLOCK_MONOTONIC, &now);
+		  long elapsed = (now.tv_sec - start.tv_sec)*1000 + (now.tv_nsec-start.tv_nsec)/(1000*1000);
+		  if(elapsed >= timeout) { errno = ETIMEDOUT; return -1; }
+			nanosleep(&ts, NULL);
+		}
+		return ret;
+#endif
 	}
 }