#ifndef PROFILING_MODE
// delay until it is our time to run
while((sunow = timems()) < sunext)
- usleep((useconds_t)(sunext - sunow));
+ usecsleep(sunext - sunow);
// find the next time we need to run
while(timems() > sunext)
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/mman.h>
-
+#include <time.h>
#include "log.h"
#include "common.h"
return now.tv_sec * 1000000ULL + now.tv_usec;
}
+int usecsleep(unsigned long long usec) {
+
+#ifdef NETDATA_WITH_NANOSLEEP
+ // we expect microseconds (1.000.000 per second)
+ // but timespec is nanoseconds (1.000.000.000 per second)
+ struct timespec req = { .tv_sec = usec / 1000000, .tv_nsec = (usec % 1000000) * 1000 }, rem;
+
+ while(nanosleep(&req, &rem) == -1) {
+ error("nanosleep() failed for %llu microseconds.", usec);
+
+ if(likely(errno == EINTR)) {
+ req.tv_sec = rem.tv_sec;
+ req.tv_nsec = rem.tv_nsec;
+ }
+ else {
+ error("Cannot nanosleep() for %llu microseconds.", usec);
+ break;
+ }
+ }
+
+ return 0;
+#else
+ int ret = usleep(usec);
+ if(unlikely(ret == -1 && errno == EINVAL)) {
+ // on certain systems, usec has to be up to 999999
+ if(usec > 999999) {
+ int counter = usec / 999999;
+ while(counter--)
+ usleep(999999);
+
+ usleep(usec % 999999);
+ }
+ else {
+ error("Cannot usleep() for %llu microseconds.", usec);
+ return ret;
+ }
+ }
+
+ if(ret != 0)
+ error("usleep() failed for %llu microseconds.", usec);
+
+ return ret;
+#endif
+}
+
unsigned char netdata_map_chart_names[256] = {
[0] = '\0', //
[1] = '_', //
extern pid_t gettid(void);
extern unsigned long long timems(void);
+extern int usecsleep(unsigned long long usec);
extern char *fgets_trim_len(char *buf, size_t buf_size, FILE *fp, size_t *len);
// delay until it is our time to run
while((sunow = timems()) < sunext)
- usleep((useconds_t)(sunext - sunow));
+ usecsleep(sunext - sunow);
// find the next time we need to run
while(timems() > sunext)
// calculate the proper last_collected_time, using usec_since_last_update
unsigned long long ut = st->last_collected_time.tv_sec * 1000000ULL + st->last_collected_time.tv_usec + st->usec_since_last_update;
st->last_collected_time.tv_sec = (time_t) (ut / 1000000ULL);
- st->last_collected_time.tv_usec = (useconds_t) (ut % 1000000ULL);
+ st->last_collected_time.tv_usec = (suseconds_t) (ut % 1000000ULL);
}
// if this set has not been updated in the past
// set a fake last_updated, in the past using usec_since_last_update
unsigned long long ut = st->last_collected_time.tv_sec * 1000000ULL + st->last_collected_time.tv_usec - st->usec_since_last_update;
st->last_updated.tv_sec = (time_t) (ut / 1000000ULL);
- st->last_updated.tv_usec = (useconds_t) (ut % 1000000ULL);
+ st->last_updated.tv_usec = (suseconds_t) (ut % 1000000ULL);
// the first entry should not be stored
store_this_entry = 0;
unsigned long long ut = st->last_collected_time.tv_sec * 1000000ULL + st->last_collected_time.tv_usec - st->usec_since_last_update;
st->last_updated.tv_sec = (time_t) (ut / 1000000ULL);
- st->last_updated.tv_usec = (useconds_t) (ut % 1000000ULL);
+ st->last_updated.tv_usec = (suseconds_t) (ut % 1000000ULL);
// the first entry should not be stored
store_this_entry = 0;
// delay until it is our time to run
while((sunow = timems()) < sunext)
- usleep((useconds_t)(sunext - sunow));
+ usecsleep(sunext - sunow);
// find the next time we need to run
while(timems() > sunext)