version 1.6, 2015/02/16 06:26:24 |
version 1.7, 2015/07/17 08:14:48 |
|
|
* |
* |
*/ |
*/ |
|
|
#include <sys/time.h> |
|
#include <sys/types.h> |
#include <sys/types.h> |
|
|
#include <err.h> |
#include <err.h> |
|
|
#include "utils.h" |
#include "utils.h" |
|
|
#define MAXFDS 100 |
#define MAXFDS 100 |
#define TIMER_USEC 10000 |
#define TIMER_MSEC 5 |
|
|
void timo_update(unsigned int); |
void timo_update(unsigned int); |
void timo_init(void); |
void timo_init(void); |
void timo_done(void); |
void timo_done(void); |
void file_sigalrm(int); |
|
|
|
struct timespec file_ts; |
struct timespec file_ts; |
struct file *file_list; |
struct file *file_list; |
|
|
file_utime += sleepts.tv_nsec - file_ts.tv_nsec; |
file_utime += sleepts.tv_nsec - file_ts.tv_nsec; |
#endif |
#endif |
if (!immed) { |
if (!immed) { |
res = poll(pfds, nfds, -1); |
res = poll(pfds, nfds, TIMER_MSEC); |
if (res < 0 && errno != EINTR) |
if (res < 0 && errno != EINTR) |
err(1, "poll"); |
err(1, "poll"); |
#ifdef DEBUG |
#ifdef DEBUG |
|
|
return 1; |
return 1; |
} |
} |
|
|
/* |
|
* handler for SIGALRM, invoked periodically |
|
*/ |
|
void |
void |
file_sigalrm(int i) |
|
{ |
|
/* nothing to do, we only want poll() to return EINTR */ |
|
} |
|
|
|
|
|
void |
|
filelist_init(void) |
filelist_init(void) |
{ |
{ |
static struct sigaction sa; |
|
struct itimerval it; |
|
sigset_t set; |
sigset_t set; |
|
|
sigemptyset(&set); |
sigemptyset(&set); |
|
|
perror("clock_gettime"); |
perror("clock_gettime"); |
exit(1); |
exit(1); |
} |
} |
sa.sa_flags = SA_RESTART; |
|
sa.sa_handler = file_sigalrm; |
|
sigfillset(&sa.sa_mask); |
|
if (sigaction(SIGALRM, &sa, NULL) < 0) { |
|
perror("sigaction"); |
|
exit(1); |
|
} |
|
it.it_interval.tv_sec = 0; |
|
it.it_interval.tv_usec = TIMER_USEC; |
|
it.it_value.tv_sec = 0; |
|
it.it_value.tv_usec = TIMER_USEC; |
|
if (setitimer(ITIMER_REAL, &it, NULL) < 0) { |
|
perror("setitimer"); |
|
exit(1); |
|
} |
|
log_sync = 0; |
log_sync = 0; |
timo_init(); |
timo_init(); |
} |
} |
|
|
void |
void |
filelist_done(void) |
filelist_done(void) |
{ |
{ |
struct itimerval it; |
|
#ifdef DEBUG |
#ifdef DEBUG |
struct file *f; |
struct file *f; |
|
|
|
|
log_sync = 1; |
log_sync = 1; |
log_flush(); |
log_flush(); |
#endif |
#endif |
timerclear(&it.it_value); |
|
timerclear(&it.it_interval); |
|
if (setitimer(ITIMER_REAL, &it, NULL) < 0) { |
|
perror("setitimer"); |
|
exit(1); |
|
} |
|
timo_done(); |
timo_done(); |
} |
} |