@@ -193,7 +193,8 @@ NotificationInstance::NotificationInstance(const string& name,
193
193
m_zombie(false )
194
194
{
195
195
// Set initial state for notification delivery
196
- m_lastSent = 0 ;
196
+ m_lastSentTv.tv_sec = 0 ;
197
+ m_lastSentTv.tv_usec = 0 ;
197
198
m_state = NotificationInstance::StateCleared;
198
199
}
199
200
@@ -772,8 +773,12 @@ bool NotificationInstance::handleState(bool evalRet)
772
773
bool ret = false ;
773
774
NOTIFICATION_TYPE nType = this ->getType ();
774
775
775
- time_t now = time (NULL );
776
- time_t diffTime = now - m_lastSent;
776
+ // Get now with seconds and microseconds
777
+ struct timeval now_tv, diffTimeTv;
778
+ gettimeofday (&now_tv, NULL );
779
+
780
+ // Calculate time diff
781
+ timersub (&now_tv, &m_lastSentTv, &diffTimeTv);
777
782
778
783
switch (nType.type )
779
784
{
@@ -789,7 +794,7 @@ bool NotificationInstance::handleState(bool evalRet)
789
794
else
790
795
{
791
796
// Try sending "triggered" when evaluation is true
792
- ret = evalRet && (diffTime >= nType.retriggerTime );
797
+ ret = evalRet && timercmp (&diffTimeTv, & nType.retriggerTimeTv , >= );
793
798
// Here state change depends on sending value
794
799
setTriggered = ret;
795
800
}
@@ -799,7 +804,7 @@ bool NotificationInstance::handleState(bool evalRet)
799
804
// Set state depends on evalRet
800
805
setTriggered = evalRet;
801
806
// Try sending "triggered" when evaluation is true
802
- ret = evalRet && diffTime >= nType.retriggerTime ;
807
+ ret = evalRet && timercmp (&diffTimeTv, & nType.retriggerTimeTv , >=) ;
803
808
break ;
804
809
805
810
default :
@@ -820,10 +825,10 @@ bool NotificationInstance::handleState(bool evalRet)
820
825
if (ret)
821
826
{
822
827
// Update last sent time
823
- m_lastSent = now ;
828
+ m_lastSentTv = now_tv ;
824
829
char dateStr[80 ];
825
830
struct tm tm;
826
- time_t tim = now + nType.retriggerTime ;
831
+ time_t tim = now_tv. tv_sec + nType.retriggerTimeTv . tv_usec ;
827
832
asctime_r (localtime_r (&tim, &tm), dateStr);
828
833
Logger::getLogger ()->info (" Notification %s will not be sent again until after %s" , m_name.c_str (), dateStr);
829
834
}
@@ -994,7 +999,7 @@ bool NotificationManager::APIcreateEmptyInstance(const string& name)
994
999
" \" type\" : \" boolean\" , \" default\" : \" false\" }, "
995
1000
" \" retrigger_time\" : {\" description\" : \" Retrigger time in seconds for sending a new notification.\" , "
996
1001
" \" displayName\" : \" Retrigger Time\" , \" order\" : \" 6\" , "
997
- " \" type\" : \" integer \" , \" default\" : \" " + to_string (DEFAULT_RETRIGGER_TIME) + " \" } }" ;
1002
+ " \" type\" : \" float \" , \" default\" : \" " + to_string (DEFAULT_RETRIGGER_TIME) + " \" , \" minimum \" : \" 0.0 \" } }" ;
998
1003
999
1004
DefaultConfigCategory notificationConfig (name, payload);
1000
1005
notificationConfig.setDescription (" Notification " + name);
@@ -1003,7 +1008,7 @@ bool NotificationManager::APIcreateEmptyInstance(const string& name)
1003
1008
if (m_managerClient->addCategory (notificationConfig, false ))
1004
1009
{
1005
1010
NOTIFICATION_TYPE type;
1006
- type.retriggerTime = DEFAULT_RETRIGGER_TIME;
1011
+ type.retriggerTimeTv . tv_usec = DEFAULT_RETRIGGER_TIME;
1007
1012
type.type = E_NOTIFICATION_TYPE::OneShot;
1008
1013
// Create the empty Notification instance
1009
1014
this ->addInstance (name,
@@ -1906,6 +1911,8 @@ bool NotificationManager::getConfigurationItems(const ConfigCategory& config,
1906
1911
string& customText)
1907
1912
{
1908
1913
long retriggerTime = DEFAULT_RETRIGGER_TIME;
1914
+ struct timeval retriggerTimeTv;
1915
+ retriggerTimeTv.tv_sec = DEFAULT_RETRIGGER_TIME;
1909
1916
string notificationName = config.getName ();
1910
1917
// The rule plugin to use
1911
1918
rulePluginName = config.getValue (" rule" );
@@ -1919,13 +1926,17 @@ bool NotificationManager::getConfigurationItems(const ConfigCategory& config,
1919
1926
if (config.itemExists (" retrigger_time" ) &&
1920
1927
!config.getValue (" retrigger_time" ).empty ())
1921
1928
{
1922
- long new_value = atol (config.getValue (" retrigger_time" ).c_str ());
1923
- if (new_value)
1929
+ double new_value = atof (config.getValue (" retrigger_time" ).c_str ());
1930
+ if (new_value >= 0 )
1924
1931
{
1925
- retriggerTime = new_value;
1932
+ retriggerTimeTv.tv_sec = (int )new_value;
1933
+ double intPart;
1934
+ double fractPart;
1935
+ fractPart = modf (new_value, &intPart);
1936
+ retriggerTimeTv.tv_usec = 1000000 * fractPart;
1926
1937
}
1927
1938
}
1928
- nType.retriggerTime = retriggerTime ;
1939
+ nType.retriggerTimeTv = retriggerTimeTv ;
1929
1940
1930
1941
// Get notification type
1931
1942
string notification_type;
0 commit comments