]> arthur.barton.de Git - netdata.git/blob - src/common.c
global statistics now also report max API response time; global statistics implemente...
[netdata.git] / src / common.c
1 #include "common.h"
2
3 char *global_host_prefix = "";
4 int enable_ksm = 1;
5
6 volatile sig_atomic_t netdata_exit = 0;
7
8 // ----------------------------------------------------------------------------
9 // memory allocation functions that handle failures
10
11 // although netdata does not use memory allocations too often (netdata tries to
12 // maintain its memory footprint stable during runtime, i.e. all buffers are
13 // allocated during initialization and are adapted to current use throughout
14 // its lifetime), these can be used to override the default system allocation
15 // routines.
16
17 char *strdupz(const char *s) {
18     char *t = strdup(s);
19     if(unlikely(!t)) fatal("Cannot strdup() string '%s'", s);
20     return t;
21 }
22
23 void *mallocz(size_t size) {
24     void *p = malloc(size);
25     if(unlikely(!p)) fatal("Cannot allocate %zu bytes of memory.", size);
26     return p;
27 }
28
29 void *callocz(size_t nmemb, size_t size) {
30     void *p = calloc(nmemb, size);
31     if(unlikely(!p)) fatal("Cannot allocate %zu bytes of memory.", nmemb * size);
32     return p;
33 }
34
35 void *reallocz(void *ptr, size_t size) {
36     void *p = realloc(ptr, size);
37     if(unlikely(!p)) fatal("Cannot re-allocate memory to %zu bytes.", size);
38     return p;
39 }
40
41 void freez(void *ptr) {
42     free(ptr);
43 }
44
45 // ----------------------------------------------------------------------------
46 // time functions
47
48 inline unsigned long long timeval_usec(struct timeval *tv) {
49         return tv->tv_sec * 1000000ULL + tv->tv_usec;
50 }
51
52 // time(NULL) in nanoseconds
53 inline unsigned long long time_usec(void) {
54         struct timeval now;
55         gettimeofday(&now, NULL);
56         return timeval_usec(&now);
57 }
58
59 inline unsigned long long usec_dt(struct timeval *now, struct timeval *old) {
60         unsigned long long tv1 = timeval_usec(now);
61         unsigned long long tv2 = timeval_usec(old);
62         return (tv1 > tv2)?(tv1 - tv2):(tv2 - tv1);
63 }
64
65 int sleep_usec(unsigned long long usec) {
66
67 #ifndef NETDATA_WITH_USLEEP
68         // we expect microseconds (1.000.000 per second)
69         // but timespec is nanoseconds (1.000.000.000 per second)
70         struct timespec rem, req = {
71             .tv_sec = (time_t)(usec / 1000000),
72             .tv_nsec = (suseconds_t)((usec % 1000000) * 1000)
73     };
74
75         while(nanosleep(&req, &rem) == -1) {
76                 if(likely(errno == EINTR)) {
77                         info("nanosleep() interrupted (while sleeping for %llu microseconds).", usec);
78                         req.tv_sec = rem.tv_sec;
79                         req.tv_nsec = rem.tv_nsec;
80                 }
81                 else {
82                         error("Cannot nanosleep() for %llu microseconds.", usec);
83                         break;
84                 }
85         }
86
87         return 0;
88 #else
89         int ret = usleep(usec);
90         if(unlikely(ret == -1 && errno == EINVAL)) {
91                 // on certain systems, usec has to be up to 999999
92                 if(usec > 999999) {
93                         int counter = usec / 999999;
94                         while(counter--)
95                                 usleep(999999);
96
97                         usleep(usec % 999999);
98                 }
99                 else {
100                         error("Cannot usleep() for %llu microseconds.", usec);
101                         return ret;
102                 }
103         }
104
105         if(ret != 0)
106                 error("usleep() failed for %llu microseconds.", usec);
107
108         return ret;
109 #endif
110 }
111
112 unsigned char netdata_map_chart_names[256] = {
113                 [0] = '\0', //
114                 [1] = '_', //
115                 [2] = '_', //
116                 [3] = '_', //
117                 [4] = '_', //
118                 [5] = '_', //
119                 [6] = '_', //
120                 [7] = '_', //
121                 [8] = '_', //
122                 [9] = '_', //
123                 [10] = '_', //
124                 [11] = '_', //
125                 [12] = '_', //
126                 [13] = '_', //
127                 [14] = '_', //
128                 [15] = '_', //
129                 [16] = '_', //
130                 [17] = '_', //
131                 [18] = '_', //
132                 [19] = '_', //
133                 [20] = '_', //
134                 [21] = '_', //
135                 [22] = '_', //
136                 [23] = '_', //
137                 [24] = '_', //
138                 [25] = '_', //
139                 [26] = '_', //
140                 [27] = '_', //
141                 [28] = '_', //
142                 [29] = '_', //
143                 [30] = '_', //
144                 [31] = '_', //
145                 [32] = '_', //
146                 [33] = '_', // !
147                 [34] = '_', // "
148                 [35] = '_', // #
149                 [36] = '_', // $
150                 [37] = '_', // %
151                 [38] = '_', // &
152                 [39] = '_', // '
153                 [40] = '_', // (
154                 [41] = '_', // )
155                 [42] = '_', // *
156                 [43] = '_', // +
157                 [44] = '.', // ,
158                 [45] = '-', // -
159                 [46] = '.', // .
160                 [47] = '/', // /
161                 [48] = '0', // 0
162                 [49] = '1', // 1
163                 [50] = '2', // 2
164                 [51] = '3', // 3
165                 [52] = '4', // 4
166                 [53] = '5', // 5
167                 [54] = '6', // 6
168                 [55] = '7', // 7
169                 [56] = '8', // 8
170                 [57] = '9', // 9
171                 [58] = '_', // :
172                 [59] = '_', // ;
173                 [60] = '_', // <
174                 [61] = '_', // =
175                 [62] = '_', // >
176                 [63] = '_', // ?
177                 [64] = '_', // @
178                 [65] = 'a', // A
179                 [66] = 'b', // B
180                 [67] = 'c', // C
181                 [68] = 'd', // D
182                 [69] = 'e', // E
183                 [70] = 'f', // F
184                 [71] = 'g', // G
185                 [72] = 'h', // H
186                 [73] = 'i', // I
187                 [74] = 'j', // J
188                 [75] = 'k', // K
189                 [76] = 'l', // L
190                 [77] = 'm', // M
191                 [78] = 'n', // N
192                 [79] = 'o', // O
193                 [80] = 'p', // P
194                 [81] = 'q', // Q
195                 [82] = 'r', // R
196                 [83] = 's', // S
197                 [84] = 't', // T
198                 [85] = 'u', // U
199                 [86] = 'v', // V
200                 [87] = 'w', // W
201                 [88] = 'x', // X
202                 [89] = 'y', // Y
203                 [90] = 'z', // Z
204                 [91] = '_', // [
205                 [92] = '/', // backslash
206                 [93] = '_', // ]
207                 [94] = '_', // ^
208                 [95] = '_', // _
209                 [96] = '_', // `
210                 [97] = 'a', // a
211                 [98] = 'b', // b
212                 [99] = 'c', // c
213                 [100] = 'd', // d
214                 [101] = 'e', // e
215                 [102] = 'f', // f
216                 [103] = 'g', // g
217                 [104] = 'h', // h
218                 [105] = 'i', // i
219                 [106] = 'j', // j
220                 [107] = 'k', // k
221                 [108] = 'l', // l
222                 [109] = 'm', // m
223                 [110] = 'n', // n
224                 [111] = 'o', // o
225                 [112] = 'p', // p
226                 [113] = 'q', // q
227                 [114] = 'r', // r
228                 [115] = 's', // s
229                 [116] = 't', // t
230                 [117] = 'u', // u
231                 [118] = 'v', // v
232                 [119] = 'w', // w
233                 [120] = 'x', // x
234                 [121] = 'y', // y
235                 [122] = 'z', // z
236                 [123] = '_', // {
237                 [124] = '_', // |
238                 [125] = '_', // }
239                 [126] = '_', // ~
240                 [127] = '_', //
241                 [128] = '_', //
242                 [129] = '_', //
243                 [130] = '_', //
244                 [131] = '_', //
245                 [132] = '_', //
246                 [133] = '_', //
247                 [134] = '_', //
248                 [135] = '_', //
249                 [136] = '_', //
250                 [137] = '_', //
251                 [138] = '_', //
252                 [139] = '_', //
253                 [140] = '_', //
254                 [141] = '_', //
255                 [142] = '_', //
256                 [143] = '_', //
257                 [144] = '_', //
258                 [145] = '_', //
259                 [146] = '_', //
260                 [147] = '_', //
261                 [148] = '_', //
262                 [149] = '_', //
263                 [150] = '_', //
264                 [151] = '_', //
265                 [152] = '_', //
266                 [153] = '_', //
267                 [154] = '_', //
268                 [155] = '_', //
269                 [156] = '_', //
270                 [157] = '_', //
271                 [158] = '_', //
272                 [159] = '_', //
273                 [160] = '_', //
274                 [161] = '_', //
275                 [162] = '_', //
276                 [163] = '_', //
277                 [164] = '_', //
278                 [165] = '_', //
279                 [166] = '_', //
280                 [167] = '_', //
281                 [168] = '_', //
282                 [169] = '_', //
283                 [170] = '_', //
284                 [171] = '_', //
285                 [172] = '_', //
286                 [173] = '_', //
287                 [174] = '_', //
288                 [175] = '_', //
289                 [176] = '_', //
290                 [177] = '_', //
291                 [178] = '_', //
292                 [179] = '_', //
293                 [180] = '_', //
294                 [181] = '_', //
295                 [182] = '_', //
296                 [183] = '_', //
297                 [184] = '_', //
298                 [185] = '_', //
299                 [186] = '_', //
300                 [187] = '_', //
301                 [188] = '_', //
302                 [189] = '_', //
303                 [190] = '_', //
304                 [191] = '_', //
305                 [192] = '_', //
306                 [193] = '_', //
307                 [194] = '_', //
308                 [195] = '_', //
309                 [196] = '_', //
310                 [197] = '_', //
311                 [198] = '_', //
312                 [199] = '_', //
313                 [200] = '_', //
314                 [201] = '_', //
315                 [202] = '_', //
316                 [203] = '_', //
317                 [204] = '_', //
318                 [205] = '_', //
319                 [206] = '_', //
320                 [207] = '_', //
321                 [208] = '_', //
322                 [209] = '_', //
323                 [210] = '_', //
324                 [211] = '_', //
325                 [212] = '_', //
326                 [213] = '_', //
327                 [214] = '_', //
328                 [215] = '_', //
329                 [216] = '_', //
330                 [217] = '_', //
331                 [218] = '_', //
332                 [219] = '_', //
333                 [220] = '_', //
334                 [221] = '_', //
335                 [222] = '_', //
336                 [223] = '_', //
337                 [224] = '_', //
338                 [225] = '_', //
339                 [226] = '_', //
340                 [227] = '_', //
341                 [228] = '_', //
342                 [229] = '_', //
343                 [230] = '_', //
344                 [231] = '_', //
345                 [232] = '_', //
346                 [233] = '_', //
347                 [234] = '_', //
348                 [235] = '_', //
349                 [236] = '_', //
350                 [237] = '_', //
351                 [238] = '_', //
352                 [239] = '_', //
353                 [240] = '_', //
354                 [241] = '_', //
355                 [242] = '_', //
356                 [243] = '_', //
357                 [244] = '_', //
358                 [245] = '_', //
359                 [246] = '_', //
360                 [247] = '_', //
361                 [248] = '_', //
362                 [249] = '_', //
363                 [250] = '_', //
364                 [251] = '_', //
365                 [252] = '_', //
366                 [253] = '_', //
367                 [254] = '_', //
368                 [255] = '_'  //
369 };
370
371 // make sure the supplied string
372 // is good for a netdata chart/dimension ID/NAME
373 void netdata_fix_chart_name(char *s) {
374         while((*s = netdata_map_chart_names[(unsigned char)*s])) s++;
375 }
376
377 unsigned char netdata_map_chart_ids[256] = {
378                 [0] = '\0', //
379                 [1] = '_', //
380                 [2] = '_', //
381                 [3] = '_', //
382                 [4] = '_', //
383                 [5] = '_', //
384                 [6] = '_', //
385                 [7] = '_', //
386                 [8] = '_', //
387                 [9] = '_', //
388                 [10] = '_', //
389                 [11] = '_', //
390                 [12] = '_', //
391                 [13] = '_', //
392                 [14] = '_', //
393                 [15] = '_', //
394                 [16] = '_', //
395                 [17] = '_', //
396                 [18] = '_', //
397                 [19] = '_', //
398                 [20] = '_', //
399                 [21] = '_', //
400                 [22] = '_', //
401                 [23] = '_', //
402                 [24] = '_', //
403                 [25] = '_', //
404                 [26] = '_', //
405                 [27] = '_', //
406                 [28] = '_', //
407                 [29] = '_', //
408                 [30] = '_', //
409                 [31] = '_', //
410                 [32] = '_', //
411                 [33] = '_', // !
412                 [34] = '_', // "
413                 [35] = '_', // #
414                 [36] = '_', // $
415                 [37] = '_', // %
416                 [38] = '_', // &
417                 [39] = '_', // '
418                 [40] = '_', // (
419                 [41] = '_', // )
420                 [42] = '_', // *
421                 [43] = '_', // +
422                 [44] = '.', // ,
423                 [45] = '-', // -
424                 [46] = '.', // .
425                 [47] = '_', // /
426                 [48] = '0', // 0
427                 [49] = '1', // 1
428                 [50] = '2', // 2
429                 [51] = '3', // 3
430                 [52] = '4', // 4
431                 [53] = '5', // 5
432                 [54] = '6', // 6
433                 [55] = '7', // 7
434                 [56] = '8', // 8
435                 [57] = '9', // 9
436                 [58] = '_', // :
437                 [59] = '_', // ;
438                 [60] = '_', // <
439                 [61] = '_', // =
440                 [62] = '_', // >
441                 [63] = '_', // ?
442                 [64] = '_', // @
443                 [65] = 'a', // A
444                 [66] = 'b', // B
445                 [67] = 'c', // C
446                 [68] = 'd', // D
447                 [69] = 'e', // E
448                 [70] = 'f', // F
449                 [71] = 'g', // G
450                 [72] = 'h', // H
451                 [73] = 'i', // I
452                 [74] = 'j', // J
453                 [75] = 'k', // K
454                 [76] = 'l', // L
455                 [77] = 'm', // M
456                 [78] = 'n', // N
457                 [79] = 'o', // O
458                 [80] = 'p', // P
459                 [81] = 'q', // Q
460                 [82] = 'r', // R
461                 [83] = 's', // S
462                 [84] = 't', // T
463                 [85] = 'u', // U
464                 [86] = 'v', // V
465                 [87] = 'w', // W
466                 [88] = 'x', // X
467                 [89] = 'y', // Y
468                 [90] = 'z', // Z
469                 [91] = '_', // [
470                 [92] = '/', // backslash
471                 [93] = '_', // ]
472                 [94] = '_', // ^
473                 [95] = '_', // _
474                 [96] = '_', // `
475                 [97] = 'a', // a
476                 [98] = 'b', // b
477                 [99] = 'c', // c
478                 [100] = 'd', // d
479                 [101] = 'e', // e
480                 [102] = 'f', // f
481                 [103] = 'g', // g
482                 [104] = 'h', // h
483                 [105] = 'i', // i
484                 [106] = 'j', // j
485                 [107] = 'k', // k
486                 [108] = 'l', // l
487                 [109] = 'm', // m
488                 [110] = 'n', // n
489                 [111] = 'o', // o
490                 [112] = 'p', // p
491                 [113] = 'q', // q
492                 [114] = 'r', // r
493                 [115] = 's', // s
494                 [116] = 't', // t
495                 [117] = 'u', // u
496                 [118] = 'v', // v
497                 [119] = 'w', // w
498                 [120] = 'x', // x
499                 [121] = 'y', // y
500                 [122] = 'z', // z
501                 [123] = '_', // {
502                 [124] = '_', // |
503                 [125] = '_', // }
504                 [126] = '_', // ~
505                 [127] = '_', //
506                 [128] = '_', //
507                 [129] = '_', //
508                 [130] = '_', //
509                 [131] = '_', //
510                 [132] = '_', //
511                 [133] = '_', //
512                 [134] = '_', //
513                 [135] = '_', //
514                 [136] = '_', //
515                 [137] = '_', //
516                 [138] = '_', //
517                 [139] = '_', //
518                 [140] = '_', //
519                 [141] = '_', //
520                 [142] = '_', //
521                 [143] = '_', //
522                 [144] = '_', //
523                 [145] = '_', //
524                 [146] = '_', //
525                 [147] = '_', //
526                 [148] = '_', //
527                 [149] = '_', //
528                 [150] = '_', //
529                 [151] = '_', //
530                 [152] = '_', //
531                 [153] = '_', //
532                 [154] = '_', //
533                 [155] = '_', //
534                 [156] = '_', //
535                 [157] = '_', //
536                 [158] = '_', //
537                 [159] = '_', //
538                 [160] = '_', //
539                 [161] = '_', //
540                 [162] = '_', //
541                 [163] = '_', //
542                 [164] = '_', //
543                 [165] = '_', //
544                 [166] = '_', //
545                 [167] = '_', //
546                 [168] = '_', //
547                 [169] = '_', //
548                 [170] = '_', //
549                 [171] = '_', //
550                 [172] = '_', //
551                 [173] = '_', //
552                 [174] = '_', //
553                 [175] = '_', //
554                 [176] = '_', //
555                 [177] = '_', //
556                 [178] = '_', //
557                 [179] = '_', //
558                 [180] = '_', //
559                 [181] = '_', //
560                 [182] = '_', //
561                 [183] = '_', //
562                 [184] = '_', //
563                 [185] = '_', //
564                 [186] = '_', //
565                 [187] = '_', //
566                 [188] = '_', //
567                 [189] = '_', //
568                 [190] = '_', //
569                 [191] = '_', //
570                 [192] = '_', //
571                 [193] = '_', //
572                 [194] = '_', //
573                 [195] = '_', //
574                 [196] = '_', //
575                 [197] = '_', //
576                 [198] = '_', //
577                 [199] = '_', //
578                 [200] = '_', //
579                 [201] = '_', //
580                 [202] = '_', //
581                 [203] = '_', //
582                 [204] = '_', //
583                 [205] = '_', //
584                 [206] = '_', //
585                 [207] = '_', //
586                 [208] = '_', //
587                 [209] = '_', //
588                 [210] = '_', //
589                 [211] = '_', //
590                 [212] = '_', //
591                 [213] = '_', //
592                 [214] = '_', //
593                 [215] = '_', //
594                 [216] = '_', //
595                 [217] = '_', //
596                 [218] = '_', //
597                 [219] = '_', //
598                 [220] = '_', //
599                 [221] = '_', //
600                 [222] = '_', //
601                 [223] = '_', //
602                 [224] = '_', //
603                 [225] = '_', //
604                 [226] = '_', //
605                 [227] = '_', //
606                 [228] = '_', //
607                 [229] = '_', //
608                 [230] = '_', //
609                 [231] = '_', //
610                 [232] = '_', //
611                 [233] = '_', //
612                 [234] = '_', //
613                 [235] = '_', //
614                 [236] = '_', //
615                 [237] = '_', //
616                 [238] = '_', //
617                 [239] = '_', //
618                 [240] = '_', //
619                 [241] = '_', //
620                 [242] = '_', //
621                 [243] = '_', //
622                 [244] = '_', //
623                 [245] = '_', //
624                 [246] = '_', //
625                 [247] = '_', //
626                 [248] = '_', //
627                 [249] = '_', //
628                 [250] = '_', //
629                 [251] = '_', //
630                 [252] = '_', //
631                 [253] = '_', //
632                 [254] = '_', //
633                 [255] = '_'  //
634 };
635
636 // make sure the supplied string
637 // is good for a netdata chart/dimension ID/NAME
638 void netdata_fix_chart_id(char *s) {
639         while((*s = netdata_map_chart_ids[(unsigned char)*s])) s++;
640 }
641
642 /*
643 // http://stackoverflow.com/questions/7666509/hash-function-for-string
644 uint32_t simple_hash(const char *name)
645 {
646         const char *s = name;
647         uint32_t hash = 5381;
648         int i;
649
650         while((i = *s++)) hash = ((hash << 5) + hash) + i;
651
652         // fprintf(stderr, "HASH: %lu %s\n", hash, name);
653
654         return hash;
655 }
656 */
657
658
659 // http://isthe.com/chongo/tech/comp/fnv/#FNV-1a
660 uint32_t simple_hash(const char *name) {
661         unsigned char *s = (unsigned char *)name;
662         uint32_t hval = 0x811c9dc5;
663
664         // FNV-1a algorithm
665         while (*s) {
666                 // multiply by the 32 bit FNV magic prime mod 2^32
667                 // NOTE: No need to optimize with left shifts.
668                 //       GCC will use imul instruction anyway.
669                 //       Tested with 'gcc -O3 -S'
670                 //hval += (hval<<1) + (hval<<4) + (hval<<7) + (hval<<8) + (hval<<24);
671                 hval *= 16777619;
672
673                 // xor the bottom with the current octet
674                 hval ^= (uint32_t)*s++;
675         }
676
677         // fprintf(stderr, "HASH: %u = %s\n", hval, name);
678         return hval;
679 }
680
681 uint32_t simple_uhash(const char *name) {
682         unsigned char *s = (unsigned char *)name;
683         uint32_t hval = 0x811c9dc5, c;
684
685         // FNV-1a algorithm
686         while((c = *s++)) {
687                 if(unlikely(c >= 'A' && c <= 'Z')) c += 'a' - 'A';
688                 hval *= 16777619;
689                 hval ^= c;
690         }
691         return hval;
692 }
693
694 /*
695 // http://eternallyconfuzzled.com/tuts/algorithms/jsw_tut_hashing.aspx
696 // one at a time hash
697 uint32_t simple_hash(const char *name) {
698         unsigned char *s = (unsigned char *)name;
699         uint32_t h = 0;
700
701         while(*s) {
702                 h += *s++;
703                 h += (h << 10);
704                 h ^= (h >> 6);
705         }
706
707         h += (h << 3);
708         h ^= (h >> 11);
709         h += (h << 15);
710
711         // fprintf(stderr, "HASH: %u = %s\n", h, name);
712
713         return h;
714 }
715 */
716
717 void strreverse(char* begin, char* end)
718 {
719         char aux;
720
721         while (end > begin)
722         {
723                 // clearer code.
724                 aux = *end;
725                 *end-- = *begin;
726                 *begin++ = aux;
727         }
728 }
729
730 char *mystrsep(char **ptr, char *s)
731 {
732         char *p = "";
733         while ( p && !p[0] && *ptr ) p = strsep(ptr, s);
734         return(p);
735 }
736
737 char *trim(char *s)
738 {
739         // skip leading spaces
740         // and 'comments' as well!?
741         while(*s && isspace(*s)) s++;
742         if(!*s || *s == '#') return NULL;
743
744         // skip tailing spaces
745         // this way is way faster. Writes only one NUL char.
746         ssize_t l = strlen(s);
747   if (--l >= 0)
748         {
749                 char *p = s + l;
750                 while (p > s && isspace(*p)) p--;
751                 *++p = '\0';
752         }
753
754         if(!*s) return NULL;
755
756         return s;
757 }
758
759 void *mymmap(const char *filename, size_t size, int flags, int ksm) {
760         static int log_madvise_1 = 1;
761 #ifdef MADV_MERGEABLE
762         static int log_madvise_2 = 1, log_madvise_3 = 1;
763 #endif
764         int fd;
765         void *mem = NULL;
766
767         errno = 0;
768         fd = open(filename, O_RDWR|O_CREAT|O_NOATIME, 0664);
769         if(fd != -1) {
770                 if(lseek(fd, size, SEEK_SET) == (off_t)size) {
771                         if(write(fd, "", 1) == 1) {
772                                 if(ftruncate(fd, size))
773                                         error("Cannot truncate file '%s' to size %zu. Will use the larger file.", filename, size);
774
775 #ifdef MADV_MERGEABLE
776                                 if(flags & MAP_SHARED || !enable_ksm || !ksm) {
777 #endif
778                                         mem = mmap(NULL, size, PROT_READ|PROT_WRITE, flags, fd, 0);
779                                         if(mem != MAP_FAILED) {
780                                                 int advise = MADV_SEQUENTIAL|MADV_DONTFORK;
781                                                 if(flags & MAP_SHARED) advise |= MADV_WILLNEED;
782
783                                                 if(madvise(mem, size, advise) != 0 && log_madvise_1) {
784                                                         error("Cannot advise the kernel about the memory usage of file '%s'.", filename);
785                                                         log_madvise_1--;
786                                                 }
787                                         }
788 #ifdef MADV_MERGEABLE
789                                 }
790                                 else {
791 /*
792                                         // test - load the file into memory
793                                         mem = calloc(1, size);
794                                         if(mem) {
795                                                 if(lseek(fd, 0, SEEK_SET) == 0) {
796                                                         if(read(fd, mem, size) != (ssize_t)size)
797                                                                 error("Cannot read from file '%s'", filename);
798                                                 }
799                                                 else
800                                                         error("Cannot seek to beginning of file '%s'.", filename);
801                                         }
802 */
803                                         mem = mmap(NULL, size, PROT_READ|PROT_WRITE, flags|MAP_ANONYMOUS, -1, 0);
804                                         if(mem != MAP_FAILED) {
805                                                 if(lseek(fd, 0, SEEK_SET) == 0) {
806                                                         if(read(fd, mem, size) != (ssize_t)size)
807                                                                 error("Cannot read from file '%s'", filename);
808                                                 }
809                                                 else
810                                                         error("Cannot seek to beginning of file '%s'.", filename);
811
812                                                 // don't use MADV_SEQUENTIAL|MADV_DONTFORK, they disable MADV_MERGEABLE
813                                                 if(madvise(mem, size, MADV_SEQUENTIAL|MADV_DONTFORK) != 0 && log_madvise_2) {
814                                                         error("Cannot advise the kernel about the memory usage (MADV_SEQUENTIAL|MADV_DONTFORK) of file '%s'.", filename);
815                                                         log_madvise_2--;
816                                                 }
817
818                                                 if(madvise(mem, size, MADV_MERGEABLE) != 0 && log_madvise_3) {
819                                                         error("Cannot advise the kernel about the memory usage (MADV_MERGEABLE) of file '%s'.", filename);
820                                                         log_madvise_3--;
821                                                 }
822                                         }
823                                         else
824                                                 error("Cannot allocate PRIVATE ANONYMOUS memory for KSM for file '%s'.", filename);
825                                 }
826 #endif
827                         }
828                         else error("Cannot write to file '%s' at position %zu.", filename, size);
829                 }
830                 else error("Cannot seek file '%s' to size %zu.", filename, size);
831
832                 close(fd);
833         }
834         else error("Cannot create/open file '%s'.", filename);
835
836         return mem;
837 }
838
839 int savememory(const char *filename, void *mem, size_t size)
840 {
841         char tmpfilename[FILENAME_MAX + 1];
842
843         snprintfz(tmpfilename, FILENAME_MAX, "%s.%ld.tmp", filename, (long)getpid());
844
845         int fd = open(tmpfilename, O_RDWR|O_CREAT|O_NOATIME, 0664);
846         if(fd < 0) {
847                 error("Cannot create/open file '%s'.", filename);
848                 return -1;
849         }
850
851         if(write(fd, mem, size) != (ssize_t)size) {
852                 error("Cannot write to file '%s' %ld bytes.", filename, (long)size);
853                 close(fd);
854                 return -1;
855         }
856
857         close(fd);
858
859         if(rename(tmpfilename, filename)) {
860                 error("Cannot rename '%s' to '%s'", tmpfilename, filename);
861                 return -1;
862         }
863
864         return 0;
865 }
866
867 int fd_is_valid(int fd) {
868     return fcntl(fd, F_GETFD) != -1 || errno != EBADF;
869 }
870
871 /*
872  ***************************************************************************
873  * Get number of clock ticks per second.
874  ***************************************************************************
875  */
876 unsigned int hz;
877
878 void get_HZ(void)
879 {
880         long ticks;
881
882         if ((ticks = sysconf(_SC_CLK_TCK)) == -1) {
883                 perror("sysconf");
884         }
885
886         hz = (unsigned int) ticks;
887 }
888
889 pid_t gettid(void)
890 {
891         return syscall(SYS_gettid);
892 }
893
894 char *fgets_trim_len(char *buf, size_t buf_size, FILE *fp, size_t *len) {
895         char *s = fgets(buf, buf_size, fp);
896         if(!s) return NULL;
897
898         char *t = s;
899         if(*t != '\0') {
900                 // find the string end
901                 while (*++t != '\0');
902
903                 // trim trailing spaces/newlines/tabs
904                 while (--t > s && *t == '\n')
905                         *t = '\0';
906         }
907
908         if(len)
909                 *len = t - s + 1;
910
911         return s;
912 }
913
914 char *strncpyz(char *dst, const char *src, size_t n) {
915         char *p = dst;
916
917         while(*src && n--)
918                 *dst++ = *src++;
919
920         *dst = '\0';
921
922         return p;
923 }
924
925 int vsnprintfz(char *dst, size_t n, const char *fmt, va_list args) {
926         int size;
927
928         size = vsnprintf(dst, n, fmt, args);
929
930         if(unlikely((size_t)size > n)) {
931                 // there is bug in vsnprintf() and it returns
932                 // a number higher to len, but it does not
933                 // overflow the buffer.
934                 size = n;
935         }
936
937         dst[size] = '\0';
938         return size;
939 }
940
941 int snprintfz(char *dst, size_t n, const char *fmt, ...) {
942         va_list args;
943
944         va_start(args, fmt);
945         int ret = vsnprintfz(dst, n, fmt, args);
946         va_end(args);
947
948         return ret;
949 }