From: Maxim Mamontov Date: Wed, 9 Feb 2011 13:10:52 +0000 (+0200) Subject: Виправлено помилки виклику localtime із різних потоків X-Git-Tag: 2.407-rc3~175 X-Git-Url: https://git.stg.codes/stg.git/commitdiff_plain/8c931ef33a414e473b19e773b445f4d30a0bfe2b Виправлено помилки виклику localtime із різних потоків localtime замінено на реентерабельну версію - localtime_r, передача struct tm по константному вказівнику замінена на передачу по константному посиланню. --- diff --git a/projects/stargazer/user.cpp b/projects/stargazer/user.cpp index 38bab82c..d8368c4d 100644 --- a/projects/stargazer/user.cpp +++ b/projects/stargazer/user.cpp @@ -335,10 +335,11 @@ int USER::WriteMonthStat() { STG_LOCKER lock(&mutex, __FILE__, __LINE__); time_t tt = stgTime - 3600; -struct tm * t1 = localtime(&tt); +struct tm t1; +localtime_r(&tt, &t1); USER_STAT stat(property.GetStat()); -if (store->SaveMonthStat(stat, t1->tm_mon, t1->tm_year, login)) +if (store->SaveMonthStat(stat, t1.tm_mon, t1.tm_year, login)) { WriteServLog("Cannot write month stat for user %s.", login.c_str()); WriteServLog("%s", store->GetStrError().c_str()); @@ -1005,13 +1006,13 @@ STG_LOCKER lock(&mutex, __FILE__, __LINE__); static int daysInMonth[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; -struct tm * tms; +struct tm tms; time_t t = stgTime; -tms = localtime(&t); +localtime_r(&t, &tms); -time_t secMonth = daysInMonth[(tms->tm_mon + 11) % 12] * 24 * 3600; // Previous month +time_t secMonth = daysInMonth[(tms.tm_mon + 11) % 12] * 24 * 3600; // Previous month -if (tms->tm_year % 4 == 0 && tms->tm_mon == 1) +if (tms.tm_year % 4 == 0 && tms.tm_mon == 1) { // Leap year secMonth += 24 * 3600; @@ -1029,12 +1030,11 @@ void USER::SetPassiveTimeAsNewUser() { STG_LOCKER lock(&mutex, __FILE__, __LINE__); -time_t t; -struct tm * tm; -t = stgTime; -tm = localtime(&t); +time_t t = stgTime; +struct tm tm; +localtime_r(&t, &tm); int daysCurrMon = DaysInCurrentMonth(); -double pt = (tm->tm_mday - 1) / (double)daysCurrMon; +double pt = (tm.tm_mday - 1) / (double)daysCurrMon; passiveTime = (time_t)(pt * 24 * 3600 * daysCurrMon); } diff --git a/projects/stargazer/users.cpp b/projects/stargazer/users.cpp index e2f326e0..84a10227 100644 --- a/projects/stargazer/users.cpp +++ b/projects/stargazer/users.cpp @@ -276,12 +276,12 @@ void * USERS::Run(void * d) printfd(__FILE__, "=====================| pid: %d |===================== \n", getpid()); USERS * us = (USERS*) d; -struct tm * t; +struct tm t; time_t tt = stgTime; -t = localtime(&tt); +localtime_r(&tt, &t); -int min = t->tm_min; -int day = t->tm_mday; +int min = t.tm_min; +int day = t.tm_mday; printfd(__FILE__,"Day = %d Min = %d\n", day, min); @@ -298,23 +298,22 @@ while (us->nonstop) for_each(us->users.begin(), us->users.end(), mem_fun_ref(&USER::Run)); tt = stgTime; - t = localtime(&tt); + localtime_r(&tt, &t); - if (min != t->tm_min) + if (min != t.tm_min) { printfd(__FILE__,"Sec = %d\n", stgTime); - printfd(__FILE__,"New Minute. old = %d current = %d\n", min, t->tm_min); - min = t->tm_min; + printfd(__FILE__,"New Minute. old = %d current = %d\n", min, t.tm_min); + min = t.tm_min; us->NewMinute(t); } - t = localtime(&tt); - if (day != t->tm_mday) + if (day != t.tm_mday) { printfd(__FILE__,"Sec = %d\n", stgTime); - printfd(__FILE__,"New Day. old = %d current = %d\n", day, t->tm_mday); - day = t->tm_mday; + printfd(__FILE__,"New Day. old = %d current = %d\n", day, t.tm_mday); + day = t.tm_mday; us->NewDay(t); } @@ -350,10 +349,10 @@ us->isRunning = false; return NULL; } //----------------------------------------------------------------------------- -void USERS::NewMinute(const struct tm * t) +void USERS::NewMinute(const struct tm & t) { //Write traff, reset session traff. Fake disconnect-connect -if (t->tm_hour == 23 && t->tm_min == 59) +if (t.tm_hour == 23 && t.tm_min == 59) { printfd(__FILE__,"MidnightResetSessionStat\n"); for_each(users.begin(), users.end(), mem_fun_ref(&USER::MidnightResetSessionStat)); @@ -379,18 +378,18 @@ if (TimeToWriteDetailStat(t)) RealDelUser(); } //----------------------------------------------------------------------------- -void USERS::NewDay(const struct tm * t) +void USERS::NewDay(const struct tm & t) { -struct tm * t1; +struct tm t1; time_t tt = stgTime; -t1 = localtime(&tt); +localtime_r(&tt, &t1); int dayFee = settings->GetDayFee(); if (dayFee == 0) dayFee = DaysInCurrentMonth(); printfd(__FILE__, "DayFee = %d\n", dayFee); -printfd(__FILE__, "Today = %d DayResetTraff = %d\n", t1->tm_mday, settings->GetDayResetTraff()); +printfd(__FILE__, "Today = %d DayResetTraff = %d\n", t1.tm_mday, settings->GetDayResetTraff()); printfd(__FILE__, "DayFeeIsLastDay = %d\n", settings->GetDayFeeIsLastDay()); if (!settings->GetDayFeeIsLastDay()) @@ -407,7 +406,7 @@ if (settings->GetSpreadFee()) } else { - if (t->tm_mday == dayFee) + if (t.tm_mday == dayFee) { printfd(__FILE__, "DayFee\n"); for_each(users.begin(), users.end(), mem_fun_ref(&USER::ProcessDayFee)); @@ -421,12 +420,12 @@ if (settings->GetDayFeeIsLastDay()) } } //----------------------------------------------------------------------------- -void USERS::DayResetTraff(const struct tm * t1) +void USERS::DayResetTraff(const struct tm & t1) { int dayResetTraff = settings->GetDayResetTraff(); if (dayResetTraff == 0) dayResetTraff = DaysInCurrentMonth(); -if (t1->tm_mday == dayResetTraff) +if (t1.tm_mday == dayResetTraff) { printfd(__FILE__, "ResetTraff\n"); for_each(users.begin(), users.end(), mem_fun_ref(&USER::ProcessNewMonth)); @@ -727,26 +726,26 @@ STG_LOCKER lock(&mutex, __FILE__, __LINE__); loginIndex.erase(user->GetLogin()); } //----------------------------------------------------------------------------- -bool USERS::TimeToWriteDetailStat(const struct tm * t) +bool USERS::TimeToWriteDetailStat(const struct tm & t) { int statTime = settings->GetDetailStatWritePeriod(); switch (statTime) { case dsPeriod_1: - if (t->tm_min == 0) + if (t.tm_min == 0) return true; break; case dsPeriod_1_2: - if (t->tm_min % 30 == 0) + if (t.tm_min % 30 == 0) return true; break; case dsPeriod_1_4: - if (t->tm_min % 15 == 0) + if (t.tm_min % 15 == 0) return true; break; case dsPeriod_1_6: - if (t->tm_min % 10 == 0) + if (t.tm_min % 10 == 0) return true; break; } diff --git a/projects/stargazer/users.h b/projects/stargazer/users.h index 22065367..424958da 100644 --- a/projects/stargazer/users.h +++ b/projects/stargazer/users.h @@ -29,6 +29,7 @@ $Author: faust $ #define USERS_H #include + #include #include #include @@ -136,11 +137,11 @@ private: void DelUserFromIndexes(user_iter user); static void * Run(void *); - void NewMinute(const struct tm * t); - void NewDay(const struct tm * t); - void DayResetTraff(const struct tm * t); + void NewMinute(const struct tm & t); + void NewDay(const struct tm & t); + void DayResetTraff(const struct tm & t); - bool TimeToWriteDetailStat(const struct tm * t); + bool TimeToWriteDetailStat(const struct tm & t); list users; list usersToDelete;