Pārlūkot izejas kodu

Merge pull request #41763 from madmiraal/fix-linux-time

Make OS_Unix time calls thread safe.
Fabio Alessandrelli 5 gadi atpakaļ
vecāks
revīzija
2163e81fea
1 mainītis faili ar 18 papildinājumiem un 17 dzēšanām
  1. 18 17
      drivers/unix/os_unix.cpp

+ 18 - 17
drivers/unix/os_unix.cpp

@@ -171,52 +171,53 @@ double OS_Unix::get_unix_time() const {
 
 
 OS::Date OS_Unix::get_date(bool utc) const {
 OS::Date OS_Unix::get_date(bool utc) const {
 	time_t t = time(nullptr);
 	time_t t = time(nullptr);
-	struct tm *lt;
+	struct tm lt;
 	if (utc) {
 	if (utc) {
-		lt = gmtime(&t);
+		gmtime_r(&t, &lt);
 	} else {
 	} else {
-		lt = localtime(&t);
+		localtime_r(&t, &lt);
 	}
 	}
 	Date ret;
 	Date ret;
-	ret.year = 1900 + lt->tm_year;
+	ret.year = 1900 + lt.tm_year;
 	// Index starting at 1 to match OS_Unix::get_date
 	// Index starting at 1 to match OS_Unix::get_date
 	//   and Windows SYSTEMTIME and tm_mon follows the typical structure
 	//   and Windows SYSTEMTIME and tm_mon follows the typical structure
 	//   of 0-11, noted here: http://www.cplusplus.com/reference/ctime/tm/
 	//   of 0-11, noted here: http://www.cplusplus.com/reference/ctime/tm/
-	ret.month = (Month)(lt->tm_mon + 1);
-	ret.day = lt->tm_mday;
-	ret.weekday = (Weekday)lt->tm_wday;
-	ret.dst = lt->tm_isdst;
+	ret.month = (Month)(lt.tm_mon + 1);
+	ret.day = lt.tm_mday;
+	ret.weekday = (Weekday)lt.tm_wday;
+	ret.dst = lt.tm_isdst;
 
 
 	return ret;
 	return ret;
 }
 }
 
 
 OS::Time OS_Unix::get_time(bool utc) const {
 OS::Time OS_Unix::get_time(bool utc) const {
 	time_t t = time(nullptr);
 	time_t t = time(nullptr);
-	struct tm *lt;
+	struct tm lt;
 	if (utc) {
 	if (utc) {
-		lt = gmtime(&t);
+		gmtime_r(&t, &lt);
 	} else {
 	} else {
-		lt = localtime(&t);
+		localtime_r(&t, &lt);
 	}
 	}
 	Time ret;
 	Time ret;
-	ret.hour = lt->tm_hour;
-	ret.min = lt->tm_min;
-	ret.sec = lt->tm_sec;
+	ret.hour = lt.tm_hour;
+	ret.min = lt.tm_min;
+	ret.sec = lt.tm_sec;
 	get_time_zone_info();
 	get_time_zone_info();
 	return ret;
 	return ret;
 }
 }
 
 
 OS::TimeZoneInfo OS_Unix::get_time_zone_info() const {
 OS::TimeZoneInfo OS_Unix::get_time_zone_info() const {
 	time_t t = time(nullptr);
 	time_t t = time(nullptr);
-	struct tm *lt = localtime(&t);
+	struct tm lt;
+	localtime_r(&t, &lt);
 	char name[16];
 	char name[16];
-	strftime(name, 16, "%Z", lt);
+	strftime(name, 16, "%Z", &lt);
 	name[15] = 0;
 	name[15] = 0;
 	TimeZoneInfo ret;
 	TimeZoneInfo ret;
 	ret.name = name;
 	ret.name = name;
 
 
 	char bias_buf[16];
 	char bias_buf[16];
-	strftime(bias_buf, 16, "%z", lt);
+	strftime(bias_buf, 16, "%z", &lt);
 	int bias;
 	int bias;
 	bias_buf[15] = 0;
 	bias_buf[15] = 0;
 	sscanf(bias_buf, "%d", &bias);
 	sscanf(bias_buf, "%d", &bias);