summaryrefslogtreecommitdiffstats
path: root/src/common.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/common.c')
-rw-r--r--src/common.c122
1 files changed, 74 insertions, 48 deletions
diff --git a/src/common.c b/src/common.c
index e1925ff5..42f3d8d1 100644
--- a/src/common.c
+++ b/src/common.c
@@ -1,5 +1,13 @@
#include "common.h"
+#ifdef __APPLE__
+#define INHERIT_NONE 0
+#endif /* __APPLE__ */
+#if defined(__FreeBSD__) || defined(__APPLE__)
+# define O_NOATIME 0
+# define MADV_DONTFORK INHERIT_NONE
+#endif /* __FreeBSD__ || __APPLE__*/
+
char *global_host_prefix = "";
int enable_ksm = 1;
@@ -192,27 +200,22 @@ void freez(void *ptr) {
free(ptr);
}
-// ----------------------------------------------------------------------------
-// time functions
-
-inline unsigned long long timeval_usec(struct timeval *tv) {
- return tv->tv_sec * 1000000ULL + tv->tv_usec;
-}
+void json_escape_string(char *dst, const char *src, size_t size) {
+ const char *t;
+ char *d = dst, *e = &dst[size - 1];
-// time(NULL) in nanoseconds
-inline unsigned long long time_usec(void) {
- struct timeval now;
- gettimeofday(&now, NULL);
- return timeval_usec(&now);
-}
+ for(t = src; *t && d < e ;t++) {
+ if(unlikely(*t == '\\' || *t == '"')) {
+ if(unlikely(d + 1 >= e)) break;
+ *d++ = '\\';
+ }
+ *d++ = *t;
+ }
-inline unsigned long long usec_dt(struct timeval *now, struct timeval *old) {
- unsigned long long tv1 = timeval_usec(now);
- unsigned long long tv2 = timeval_usec(old);
- return (tv1 > tv2) ? (tv1 - tv2) : (tv2 - tv1);
+ *d = '\0';
}
-int sleep_usec(unsigned long long usec) {
+int sleep_usec(usec_t usec) {
#ifndef NETDATA_WITH_USLEEP
// we expect microseconds (1.000.000 per second)
@@ -224,7 +227,7 @@ int sleep_usec(unsigned long long usec) {
while (nanosleep(&req, &rem) == -1) {
if (likely(errno == EINTR)) {
- info("nanosleep() interrupted (while sleeping for %llu microseconds).", usec);
+ debug(D_SYSTEM, "nanosleep() interrupted (while sleeping for %llu microseconds).", usec);
req.tv_sec = rem.tv_sec;
req.tv_nsec = rem.tv_nsec;
} else {
@@ -804,7 +807,7 @@ uint32_t simple_hash(const char *name)
}
*/
-
+/*
// http://isthe.com/chongo/tech/comp/fnv/#FNV-1a
uint32_t simple_hash(const char *name) {
unsigned char *s = (unsigned char *) name;
@@ -839,6 +842,7 @@ uint32_t simple_uhash(const char *name) {
}
return hval;
}
+*/
/*
// http://eternallyconfuzzled.com/tuts/algorithms/jsw_tut_hashing.aspx
@@ -864,11 +868,9 @@ uint32_t simple_hash(const char *name) {
*/
void strreverse(char *begin, char *end) {
- char aux;
-
while (end > begin) {
// clearer code.
- aux = *end;
+ char aux = *end;
*end-- = *begin;
*begin++ = aux;
}
@@ -905,11 +907,10 @@ void *mymmap(const char *filename, size_t size, int flags, int ksm) {
#ifdef MADV_MERGEABLE
static int log_madvise_2 = 1, log_madvise_3 = 1;
#endif
- int fd;
void *mem = NULL;
errno = 0;
- fd = open(filename, O_RDWR | O_CREAT | O_NOATIME, 0664);
+ int fd = open(filename, O_RDWR | O_CREAT | O_NOATIME, 0664);
if (fd != -1) {
if (lseek(fd, size, SEEK_SET) == (off_t) size) {
if (write(fd, "", 1) == 1) {
@@ -1028,7 +1029,15 @@ int fd_is_valid(int fd) {
}
pid_t gettid(void) {
+#ifdef __FreeBSD__
+ return (pid_t)pthread_getthreadid_np();
+#elif defined(__APPLE__)
+ uint64_t curthreadid;
+ pthread_threadid_np(NULL, &curthreadid);
+ return (pid_t)curthreadid;
+#else
return (pid_t)syscall(SYS_gettid);
+#endif /* __FreeBSD__, __APPLE__*/
}
char *fgets_trim_len(char *buf, size_t buf_size, FILE *fp, size_t *len) {
@@ -1090,14 +1099,24 @@ int snprintfz(char *dst, size_t n, const char *fmt, ...) {
int processors = 1;
long get_system_cpus(void) {
- procfile *ff = NULL;
-
processors = 1;
+ #ifdef __APPLE__
+ int32_t tmp_processors;
+
+ if (unlikely(GETSYSCTL("hw.logicalcpu", tmp_processors))) {
+ error("Assuming system has %d processors.", processors);
+ } else {
+ processors = tmp_processors;
+ }
+
+ return processors;
+ #else
+
char filename[FILENAME_MAX + 1];
snprintfz(filename, FILENAME_MAX, "%s/proc/stat", global_host_prefix);
- ff = procfile_open(filename, NULL, PROCFILE_FLAG_DEFAULT);
+ procfile *ff = procfile_open(filename, NULL, PROCFILE_FLAG_DEFAULT);
if(!ff) {
error("Cannot open file '%s'. Assuming system has %d processors.", filename, processors);
return processors;
@@ -1121,17 +1140,24 @@ long get_system_cpus(void) {
procfile_close(ff);
- info("System has %d processors.", processors);
+ debug(D_SYSTEM, "System has %d processors.", processors);
return processors;
+
+ #endif /* __APPLE__ */
}
pid_t pid_max = 32768;
pid_t get_system_pid_max(void) {
- procfile *ff = NULL;
+ #ifdef __APPLE__
+ // As we currently do not know a solution to query pid_max from the os
+ // we use the number defined in bsd/sys/proc_internal.h in XNU sources
+ pid_max = 99999;
+ return pid_max;
+ #else
char filename[FILENAME_MAX + 1];
snprintfz(filename, FILENAME_MAX, "%s/proc/sys/kernel/pid_max", global_host_prefix);
- ff = procfile_open(filename, NULL, PROCFILE_FLAG_DEFAULT);
+ procfile *ff = procfile_open(filename, NULL, PROCFILE_FLAG_DEFAULT);
if(!ff) {
error("Cannot open file '%s'. Assuming system supports %d pids.", filename, pid_max);
return pid_max;
@@ -1143,7 +1169,7 @@ pid_t get_system_pid_max(void) {
return pid_max;
}
- pid_max = (pid_t)atoi(procfile_lineword(ff, 0, 0));
+ pid_max = (pid_t)str2i(procfile_lineword(ff, 0, 0));
if(!pid_max) {
procfile_close(ff);
pid_max = 32768;
@@ -1152,8 +1178,10 @@ pid_t get_system_pid_max(void) {
}
procfile_close(ff);
- info("System supports %d pids.", pid_max);
+ debug(D_SYSTEM, "System supports %d pids.", pid_max);
return pid_max;
+
+ #endif /* __APPLE__ */
}
unsigned int hz;
@@ -1161,25 +1189,23 @@ void get_system_HZ(void) {
long ticks;
if ((ticks = sysconf(_SC_CLK_TCK)) == -1) {
- perror("sysconf");
+ error("Cannot get system clock ticks");
}
hz = (unsigned int) ticks;
}
-int read_single_number_file(const char *filename, unsigned long long *result) {
- char buffer[1024 + 1];
-
- int fd = open(filename, O_RDONLY, 0666);
- if(unlikely(fd == -1)) return 1;
-
- ssize_t r = read(fd, buffer, 1024);
- if(unlikely(r == -1)) {
- close(fd);
- return 2;
- }
-
- close(fd);
- *result = strtoull(buffer, NULL, 0);
- return 0;
+/*
+// poor man cycle counting
+static unsigned long tsc;
+void begin_tsc(void) {
+ unsigned long a, d;
+ asm volatile ("cpuid\nrdtsc" : "=a" (a), "=d" (d) : "0" (0) : "ebx", "ecx");
+ tsc = ((unsigned long)d << 32) | (unsigned long)a;
}
+unsigned long end_tsc(void) {
+ unsigned long a, d;
+ asm volatile ("rdtscp" : "=a" (a), "=d" (d) : : "ecx");
+ return (((unsigned long)d << 32) | (unsigned long)a) - tsc;
+}
+*/