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