tools/systemd/tm_editor: remove TMChanges optimization
while it was correct, there was no measurable speed gain (a benchmark yielded 2.8 ms for a spec that did not find a timestamp either way) so remove it for simpler code Signed-off-by: Dominik Csapak <d.csapak@proxmox.com>
This commit is contained in:
parent
56b666458c
commit
28a0a9343c
|
@ -172,12 +172,10 @@ pub fn compute_next_event(
|
||||||
count += 1;
|
count += 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if !all_days && t.changes.contains(TMChanges::WDAY) { // match day first
|
if !all_days { // match day first
|
||||||
let day_num = t.day_num();
|
let day_num = t.day_num();
|
||||||
let day = WeekDays::from_bits(1<<day_num).unwrap();
|
let day = WeekDays::from_bits(1<<day_num).unwrap();
|
||||||
if event.days.contains(day) {
|
if !event.days.contains(day) {
|
||||||
t.changes.remove(TMChanges::WDAY);
|
|
||||||
} else {
|
|
||||||
if let Some(n) = ((day_num+1)..7)
|
if let Some(n) = ((day_num+1)..7)
|
||||||
.find(|d| event.days.contains(WeekDays::from_bits(1<<d).unwrap()))
|
.find(|d| event.days.contains(WeekDays::from_bits(1<<d).unwrap()))
|
||||||
{
|
{
|
||||||
|
@ -193,11 +191,9 @@ pub fn compute_next_event(
|
||||||
}
|
}
|
||||||
|
|
||||||
// this day
|
// this day
|
||||||
if !event.hour.is_empty() && t.changes.contains(TMChanges::HOUR) {
|
if !event.hour.is_empty() {
|
||||||
let hour = t.hour() as u32;
|
let hour = t.hour() as u32;
|
||||||
if DateTimeValue::list_contains(&event.hour, hour) {
|
if !DateTimeValue::list_contains(&event.hour, hour) {
|
||||||
t.changes.remove(TMChanges::HOUR);
|
|
||||||
} else {
|
|
||||||
if let Some(n) = DateTimeValue::find_next(&event.hour, hour) {
|
if let Some(n) = DateTimeValue::find_next(&event.hour, hour) {
|
||||||
// test next hour
|
// test next hour
|
||||||
t.set_time(n as libc::c_int, 0, 0);
|
t.set_time(n as libc::c_int, 0, 0);
|
||||||
|
@ -211,11 +207,9 @@ pub fn compute_next_event(
|
||||||
}
|
}
|
||||||
|
|
||||||
// this hour
|
// this hour
|
||||||
if !event.minute.is_empty() && t.changes.contains(TMChanges::MIN) {
|
if !event.minute.is_empty() {
|
||||||
let minute = t.min() as u32;
|
let minute = t.min() as u32;
|
||||||
if DateTimeValue::list_contains(&event.minute, minute) {
|
if !DateTimeValue::list_contains(&event.minute, minute) {
|
||||||
t.changes.remove(TMChanges::MIN);
|
|
||||||
} else {
|
|
||||||
if let Some(n) = DateTimeValue::find_next(&event.minute, minute) {
|
if let Some(n) = DateTimeValue::find_next(&event.minute, minute) {
|
||||||
// test next minute
|
// test next minute
|
||||||
t.set_min_sec(n as libc::c_int, 0);
|
t.set_min_sec(n as libc::c_int, 0);
|
||||||
|
@ -229,11 +223,9 @@ pub fn compute_next_event(
|
||||||
}
|
}
|
||||||
|
|
||||||
// this minute
|
// this minute
|
||||||
if !event.second.is_empty() && t.changes.contains(TMChanges::SEC) {
|
if !event.second.is_empty() {
|
||||||
let second = t.sec() as u32;
|
let second = t.sec() as u32;
|
||||||
if DateTimeValue::list_contains(&event.second, second) {
|
if !DateTimeValue::list_contains(&event.second, second) {
|
||||||
t.changes.remove(TMChanges::SEC);
|
|
||||||
} else {
|
|
||||||
if let Some(n) = DateTimeValue::find_next(&event.second, second) {
|
if let Some(n) = DateTimeValue::find_next(&event.second, second) {
|
||||||
// test next second
|
// test next second
|
||||||
t.set_sec(n as libc::c_int);
|
t.set_sec(n as libc::c_int);
|
||||||
|
|
|
@ -1,25 +1,10 @@
|
||||||
use anyhow::Error;
|
use anyhow::Error;
|
||||||
use bitflags::bitflags;
|
|
||||||
|
|
||||||
use proxmox::tools::time::*;
|
use proxmox::tools::time::*;
|
||||||
|
|
||||||
bitflags!{
|
|
||||||
#[derive(Default)]
|
|
||||||
pub struct TMChanges: u8 {
|
|
||||||
const SEC = 1;
|
|
||||||
const MIN = 2;
|
|
||||||
const HOUR = 4;
|
|
||||||
const MDAY = 8;
|
|
||||||
const MON = 16;
|
|
||||||
const YEAR = 32;
|
|
||||||
const WDAY = 64;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub struct TmEditor {
|
pub struct TmEditor {
|
||||||
utc: bool,
|
utc: bool,
|
||||||
t: libc::tm,
|
t: libc::tm,
|
||||||
pub changes: TMChanges,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn is_leap_year(year: libc::c_int) -> bool {
|
fn is_leap_year(year: libc::c_int) -> bool {
|
||||||
|
@ -45,7 +30,7 @@ impl TmEditor {
|
||||||
pub fn new(epoch: i64, utc: bool) -> Result<Self, Error> {
|
pub fn new(epoch: i64, utc: bool) -> Result<Self, Error> {
|
||||||
let mut t = if utc { gmtime(epoch)? } else { localtime(epoch)? };
|
let mut t = if utc { gmtime(epoch)? } else { localtime(epoch)? };
|
||||||
t.tm_year += 1900; // real years for clarity
|
t.tm_year += 1900; // real years for clarity
|
||||||
Ok(Self { utc, t, changes: TMChanges::all() })
|
Ok(Self { utc, t })
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn into_epoch(mut self) -> Result<i64, Error> {
|
pub fn into_epoch(mut self) -> Result<i64, Error> {
|
||||||
|
@ -60,11 +45,9 @@ impl TmEditor {
|
||||||
self.t.tm_hour = 0;
|
self.t.tm_hour = 0;
|
||||||
self.t.tm_min = 0;
|
self.t.tm_min = 0;
|
||||||
self.t.tm_sec = 0;
|
self.t.tm_sec = 0;
|
||||||
self.changes.insert(TMChanges::HOUR|TMChanges::MIN|TMChanges::SEC);
|
|
||||||
}
|
}
|
||||||
self.t.tm_mday += days;
|
self.t.tm_mday += days;
|
||||||
self.t.tm_wday += days;
|
self.t.tm_wday += days;
|
||||||
self.changes.insert(TMChanges::MDAY|TMChanges::WDAY);
|
|
||||||
self.wrap_time();
|
self.wrap_time();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -81,14 +64,12 @@ impl TmEditor {
|
||||||
self.t.tm_hour = hour;
|
self.t.tm_hour = hour;
|
||||||
self.t.tm_min = min;
|
self.t.tm_min = min;
|
||||||
self.t.tm_sec = sec;
|
self.t.tm_sec = sec;
|
||||||
self.changes.insert(TMChanges::HOUR|TMChanges::MIN|TMChanges::SEC);
|
|
||||||
self.wrap_time();
|
self.wrap_time();
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn set_min_sec(&mut self, min: libc::c_int, sec: libc::c_int) {
|
pub fn set_min_sec(&mut self, min: libc::c_int, sec: libc::c_int) {
|
||||||
self.t.tm_min = min;
|
self.t.tm_min = min;
|
||||||
self.t.tm_sec = sec;
|
self.t.tm_sec = sec;
|
||||||
self.changes.insert(TMChanges::MIN|TMChanges::SEC);
|
|
||||||
self.wrap_time();
|
self.wrap_time();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -98,14 +79,12 @@ impl TmEditor {
|
||||||
if self.t.tm_sec >= 60 {
|
if self.t.tm_sec >= 60 {
|
||||||
self.t.tm_min += self.t.tm_sec / 60;
|
self.t.tm_min += self.t.tm_sec / 60;
|
||||||
self.t.tm_sec %= 60;
|
self.t.tm_sec %= 60;
|
||||||
self.changes.insert(TMChanges::SEC|TMChanges::MIN);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// min: 0..59
|
// min: 0..59
|
||||||
if self.t.tm_min >= 60 {
|
if self.t.tm_min >= 60 {
|
||||||
self.t.tm_hour += self.t.tm_min / 60;
|
self.t.tm_hour += self.t.tm_min / 60;
|
||||||
self.t.tm_min %= 60;
|
self.t.tm_min %= 60;
|
||||||
self.changes.insert(TMChanges::MIN|TMChanges::HOUR);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// hour: 0..23
|
// hour: 0..23
|
||||||
|
@ -113,7 +92,6 @@ impl TmEditor {
|
||||||
self.t.tm_mday += self.t.tm_hour / 24;
|
self.t.tm_mday += self.t.tm_hour / 24;
|
||||||
self.t.tm_wday += self.t.tm_hour / 24;
|
self.t.tm_wday += self.t.tm_hour / 24;
|
||||||
self.t.tm_hour %= 24;
|
self.t.tm_hour %= 24;
|
||||||
self.changes.insert(TMChanges::HOUR|TMChanges::MDAY|TMChanges::WDAY);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Translate to 0..($days_in_mon-1)
|
// Translate to 0..($days_in_mon-1)
|
||||||
|
@ -124,7 +102,6 @@ impl TmEditor {
|
||||||
// Wrap one month
|
// Wrap one month
|
||||||
self.t.tm_mday -= days_in_mon;
|
self.t.tm_mday -= days_in_mon;
|
||||||
self.t.tm_mon += 1;
|
self.t.tm_mon += 1;
|
||||||
self.changes.insert(TMChanges::MDAY|TMChanges::WDAY|TMChanges::MON);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Translate back to 1..$days_in_mon
|
// Translate back to 1..$days_in_mon
|
||||||
|
@ -134,7 +111,6 @@ impl TmEditor {
|
||||||
if self.t.tm_mon >= 12 {
|
if self.t.tm_mon >= 12 {
|
||||||
self.t.tm_year += self.t.tm_mon / 12;
|
self.t.tm_year += self.t.tm_mon / 12;
|
||||||
self.t.tm_mon %= 12;
|
self.t.tm_mon %= 12;
|
||||||
self.changes.insert(TMChanges::MON|TMChanges::YEAR);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
self.t.tm_wday %= 7;
|
self.t.tm_wday %= 7;
|
||||||
|
@ -142,43 +118,36 @@ impl TmEditor {
|
||||||
|
|
||||||
pub fn set_sec(&mut self, v: libc::c_int) {
|
pub fn set_sec(&mut self, v: libc::c_int) {
|
||||||
self.t.tm_sec = v;
|
self.t.tm_sec = v;
|
||||||
self.changes.insert(TMChanges::SEC);
|
|
||||||
self.wrap_time();
|
self.wrap_time();
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn set_min(&mut self, v: libc::c_int) {
|
pub fn set_min(&mut self, v: libc::c_int) {
|
||||||
self.t.tm_min = v;
|
self.t.tm_min = v;
|
||||||
self.changes.insert(TMChanges::MIN);
|
|
||||||
self.wrap_time();
|
self.wrap_time();
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn set_hour(&mut self, v: libc::c_int) {
|
pub fn set_hour(&mut self, v: libc::c_int) {
|
||||||
self.t.tm_hour = v;
|
self.t.tm_hour = v;
|
||||||
self.changes.insert(TMChanges::HOUR);
|
|
||||||
self.wrap_time();
|
self.wrap_time();
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn set_mday(&mut self, v: libc::c_int) {
|
pub fn set_mday(&mut self, v: libc::c_int) {
|
||||||
self.t.tm_mday = v;
|
self.t.tm_mday = v;
|
||||||
self.changes.insert(TMChanges::MDAY);
|
|
||||||
self.wrap_time();
|
self.wrap_time();
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn set_mon(&mut self, v: libc::c_int) {
|
pub fn set_mon(&mut self, v: libc::c_int) {
|
||||||
self.t.tm_mon = v;
|
self.t.tm_mon = v;
|
||||||
self.changes.insert(TMChanges::MON);
|
|
||||||
self.wrap_time();
|
self.wrap_time();
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn set_year(&mut self, v: libc::c_int) {
|
pub fn set_year(&mut self, v: libc::c_int) {
|
||||||
self.t.tm_year = v;
|
self.t.tm_year = v;
|
||||||
self.changes.insert(TMChanges::YEAR);
|
|
||||||
self.wrap_time();
|
self.wrap_time();
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn set_wday(&mut self, v: libc::c_int) {
|
pub fn set_wday(&mut self, v: libc::c_int) {
|
||||||
self.t.tm_wday = v;
|
self.t.tm_wday = v;
|
||||||
self.changes.insert(TMChanges::WDAY);
|
|
||||||
self.wrap_time();
|
self.wrap_time();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue