2013-04-04 Koichiro KIKUCHI <koichiro@rworks.jp>
* windows_service.cc, pandora_windows_service.cc, windows_service.h: Set iteration base ticks after sleeping startup_delay to exclude time taken by startup_delay from sleep time subtraction. git-svn-id: https://svn.code.sf.net/p/pandora/code/trunk@7928 c3f86ba8-e40f-0410-aaad-9ba5e7f4b01f
This commit is contained in:
parent
7b5e63b850
commit
a1b1afde7e
|
@ -1,3 +1,10 @@
|
||||||
|
2013-04-04 Koichiro KIKUCHI <koichiro@rworks.jp>
|
||||||
|
|
||||||
|
* windows_service.cc,
|
||||||
|
pandora_windows_service.cc,
|
||||||
|
windows_service.h: Set iteration base ticks after sleeping startup_delay
|
||||||
|
to exclude time taken by startup_delay from sleep time subtraction.
|
||||||
|
|
||||||
2013-04-03 Koichiro KIKUCHI <koichiro@rworks.jp>
|
2013-04-03 Koichiro KIKUCHI <koichiro@rworks.jp>
|
||||||
|
|
||||||
* windows_service.cc: Fixed typo of my previous commit.
|
* windows_service.cc: Fixed typo of my previous commit.
|
||||||
|
|
|
@ -1629,8 +1629,6 @@ void
|
||||||
Pandora_Windows_Service::pandora_run_broker (string config) {
|
Pandora_Windows_Service::pandora_run_broker (string config) {
|
||||||
Pandora_Agent_Conf *conf = NULL;
|
Pandora_Agent_Conf *conf = NULL;
|
||||||
string server_addr;
|
string server_addr;
|
||||||
int startup_delay = 0;
|
|
||||||
static unsigned char delayed = 0;
|
|
||||||
unsigned char data_flag = 0;
|
unsigned char data_flag = 0;
|
||||||
unsigned char intensive_match;
|
unsigned char intensive_match;
|
||||||
|
|
||||||
|
@ -1725,7 +1723,7 @@ Pandora_Windows_Service::pandora_run () {
|
||||||
string server_addr, conf_file, *all_conf;
|
string server_addr, conf_file, *all_conf;
|
||||||
int startup_delay = 0;
|
int startup_delay = 0;
|
||||||
int i, num;
|
int i, num;
|
||||||
static unsigned char delayed = 0;
|
static bool startup = true;
|
||||||
unsigned char data_flag = 0;
|
unsigned char data_flag = 0;
|
||||||
unsigned char intensive_match;
|
unsigned char intensive_match;
|
||||||
|
|
||||||
|
@ -1733,13 +1731,17 @@ Pandora_Windows_Service::pandora_run () {
|
||||||
|
|
||||||
conf = this->getConf ();
|
conf = this->getConf ();
|
||||||
|
|
||||||
|
/* process only once at startup */
|
||||||
|
if (startup) {
|
||||||
|
startup = false;
|
||||||
/* Sleep if a startup delay was specified */
|
/* Sleep if a startup delay was specified */
|
||||||
startup_delay = atoi (conf->getValue ("startup_delay").c_str ()) * 1000;
|
startup_delay = atoi (conf->getValue ("startup_delay").c_str ()) * 1000;
|
||||||
if (startup_delay > 0 && delayed == 0) {
|
if (startup_delay > 0) {
|
||||||
delayed = 1;
|
|
||||||
pandoraLog ("Delaying startup %d miliseconds", startup_delay);
|
pandoraLog ("Delaying startup %d miliseconds", startup_delay);
|
||||||
Sleep (startup_delay);
|
Sleep (startup_delay);
|
||||||
}
|
}
|
||||||
|
setIterationBaseTicks(GetTickCount());
|
||||||
|
}
|
||||||
|
|
||||||
/* Set the run time */
|
/* Set the run time */
|
||||||
this->run_time = time (NULL);
|
this->run_time = time (NULL);
|
||||||
|
|
|
@ -112,10 +112,11 @@ Windows_Service::setInitFunction (void (Windows_Service::*f) ()) {
|
||||||
void
|
void
|
||||||
Windows_Service::execRunFunction () {
|
Windows_Service::execRunFunction () {
|
||||||
int sleep_time_remain;
|
int sleep_time_remain;
|
||||||
DWORD tickbase, ticknow;
|
DWORD ticknow;
|
||||||
|
|
||||||
if (run_function != NULL) {
|
if (run_function != NULL) {
|
||||||
tickbase = GetTickCount();
|
// init here
|
||||||
|
setIterationBaseTicks(GetTickCount());
|
||||||
|
|
||||||
do {
|
do {
|
||||||
(this->*run_function) ();
|
(this->*run_function) ();
|
||||||
|
@ -127,14 +128,14 @@ Windows_Service::execRunFunction () {
|
||||||
|
|
||||||
// Subtract time taken by run_funtion() from sleep_time
|
// Subtract time taken by run_funtion() from sleep_time
|
||||||
// to *start* each iteration with the same interval
|
// to *start* each iteration with the same interval
|
||||||
sleep_time_remain = sleep_time - (ticknow - tickbase);
|
sleep_time_remain = sleep_time - (ticknow - iter_base_ticks);
|
||||||
|
|
||||||
if (0 <= sleep_time_remain && sleep_time_remain <= sleep_time) {
|
if (0 <= sleep_time_remain && sleep_time_remain <= sleep_time) {
|
||||||
tickbase += sleep_time;
|
setIterationBaseTicks(iter_base_ticks + sleep_time);
|
||||||
} else {
|
} else {
|
||||||
// run_function() took more than "sleep_time", or something goes wrong.
|
// run_function() took more than "sleep_time", or something goes wrong.
|
||||||
sleep_time_remain = 0; // don't sleep
|
sleep_time_remain = 0; // don't sleep
|
||||||
tickbase = ticknow; // use current ticks as base ticks
|
setIterationBaseTicks(ticknow); // use current ticks as base ticks
|
||||||
}
|
}
|
||||||
} while (WaitForSingleObject (stop_event, sleep_time_remain) != WAIT_OBJECT_0);
|
} while (WaitForSingleObject (stop_event, sleep_time_remain) != WAIT_OBJECT_0);
|
||||||
}
|
}
|
||||||
|
@ -175,6 +176,19 @@ Windows_Service::setSleepTime (unsigned int s) {
|
||||||
current_service->sleep_time = sleep_time;
|
current_service->sleep_time = sleep_time;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the base tick count.
|
||||||
|
*
|
||||||
|
* This ticks used to start each iteration with the same
|
||||||
|
* interval (this->sleep_time)
|
||||||
|
* @param ticks base tick count..
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
Windows_Service::setIterationBaseTicks(DWORD ticks) {
|
||||||
|
iter_base_ticks = ticks;
|
||||||
|
current_service->iter_base_ticks = ticks;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Install the service in the Windows services system.
|
* Install the service in the Windows services system.
|
||||||
*
|
*
|
||||||
|
|
|
@ -42,6 +42,7 @@ protected:
|
||||||
private:
|
private:
|
||||||
HANDLE stop_event;
|
HANDLE stop_event;
|
||||||
int sleep_time;
|
int sleep_time;
|
||||||
|
DWORD iter_base_ticks;
|
||||||
SC_HANDLE sc_service;
|
SC_HANDLE sc_service;
|
||||||
|
|
||||||
void (Windows_Service::*run_function) ();
|
void (Windows_Service::*run_function) ();
|
||||||
|
@ -62,6 +63,7 @@ public:
|
||||||
void setInitFunction (void (Windows_Service::*f) ());
|
void setInitFunction (void (Windows_Service::*f) ());
|
||||||
LPSTR getServiceName ();
|
LPSTR getServiceName ();
|
||||||
void setSleepTime (unsigned int s);
|
void setSleepTime (unsigned int s);
|
||||||
|
void setIterationBaseTicks(DWORD ticks);
|
||||||
|
|
||||||
void execRunFunction ();
|
void execRunFunction ();
|
||||||
void execInitFunction ();
|
void execInitFunction ();
|
||||||
|
|
Loading…
Reference in New Issue