1 | /* |
2 | This file is part of Mtproto-proxy Library. |
3 | |
4 | Mtproto-proxy Library is free software: you can redistribute it and/or modify |
5 | it under the terms of the GNU Lesser General Public License as published by |
6 | the Free Software Foundation, either version 2 of the License, or |
7 | (at your option) any later version. |
8 | |
9 | Mtproto-proxy Library is distributed in the hope that it will be useful, |
10 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
11 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
12 | GNU Lesser General Public License for more details. |
13 | |
14 | You should have received a copy of the GNU Lesser General Public License |
15 | along with Mtproto-proxy Library. If not, see <http://www.gnu.org/licenses/>. |
16 | |
17 | Copyright 2012-2013 Vkontakte Ltd |
18 | 2012-2013 Anton Maydell |
19 | |
20 | Copyright 2014-2017 Telegram Messenger Inc |
21 | 2014-2017 Anton Maydell |
22 | */ |
23 | |
24 | #pragma once |
25 | |
26 | #include <string.h> |
27 | #include <sys/types.h> |
28 | #include <stdio.h> |
29 | |
30 | #define AM_GET_MEMORY_USAGE_SELF 1 |
31 | #define AM_GET_MEMORY_USAGE_OVERALL 2 |
32 | |
33 | #define SB_PRINT_I64(x) sb_printf (&sb, "%s\t%lld\n", #x, x) |
34 | #define SB_PRINT_I32(x) sb_printf (&sb, "%s\t%d\n", #x, x) |
35 | #define SB_PRINT_QUERIES(x) sb_print_queries (&sb, #x, x) |
36 | #define SB_PRINT_DOUBLE(x) sb_printf (&sb, "%s\t%.6lf\n", #x, x) |
37 | #define SB_PRINT_TIME(x) sb_printf (&sb, "%s\t%.6lfs\n", #x, x) |
38 | #define SB_PRINT_PERCENT(x) sb_printf (&sb, "%s\t%.3lf%%\n", #x, x) |
39 | |
40 | #define SBP_PRINT_I32(x) sb_printf (sb, "%s\t%d\n", #x, x) |
41 | #define SBP_PRINT_I64(x) sb_printf (sb, "%s\t%lld\n", #x, x) |
42 | #define SBP_PRINT_QUERIES(x) sb_print_queries (sb, #x, x) |
43 | #define SBP_PRINT_DOUBLE(x) sb_printf (sb, "%s\t%.6lf\n", #x, x) |
44 | #define SBP_PRINT_TIME(x) sb_printf (sb, "%s\t%.6lfs\n", #x, x) |
45 | #define SBP_PRINT_PERCENT(x) sb_printf (sb, "%s\t%.3lf%%\n", #x, x) |
46 | #define SBP_PRINT_DATE(x) sbp_print_date (sb, #x, x) |
47 | |
48 | #define SBM_PRINT_I32(x) sb_printf (sb, "%s%s\t%d\n", MODULE_STAT_PREFIX_NAME ?: "", #x, x) |
49 | #define SBM_PRINT_I64(x) sb_printf (sb, "%s%s\t%lld\n", MODULE_STAT_PREFIX_NAME ?: "", #x, x) |
50 | #define SBM_PRINT_DOUBLE(x) sb_printf (sb, "%s%s\t%.6lf\n", MODULE_STAT_PREFIX_NAME ?: "", #x, x) |
51 | #define SBM_PRINT_TIME(x) sb_printf (sb, "%s%s\t%.6lfs\n", MODULE_STAT_PREFIX_NAME ?: "", #x, x) |
52 | #define SBM_PRINT_PERCENT(x) sb_printf (sb, "%s%s\t%.3lf%%\n", MODULE_STAT_PREFIX_NAME ?: "", #x, x) |
53 | |
54 | static inline double safe_div (double x, double y) { return y > 0 ? x/y : 0; } |
55 | |
56 | typedef struct { |
57 | long long vm_size; |
58 | long long ; |
59 | long long vm_data; |
60 | long long mem_free; |
61 | long long swap_total; |
62 | long long swap_free; |
63 | long long swap_used; |
64 | long long mem_cached; |
65 | } am_memory_stat_t; |
66 | |
67 | int am_get_memory_usage (pid_t pid, long long *a, int m); |
68 | int am_get_memory_stats (am_memory_stat_t *S, int flags); |
69 | |
70 | typedef struct stats_buffer { |
71 | char *buff; |
72 | int pos; |
73 | int size; |
74 | int flags; |
75 | } stats_buffer_t; |
76 | |
77 | void sb_init (stats_buffer_t *sb, char *buff, int size); |
78 | void sb_alloc (stats_buffer_t *sb, int size); |
79 | void sb_release (stats_buffer_t *sb); |
80 | |
81 | void sb_prepare (stats_buffer_t *sb); |
82 | void sb_printf (stats_buffer_t *sb, const char *format, ...) __attribute__ ((format (printf, 2, 3))); |
83 | void sb_memory (stats_buffer_t *sb, int flags); |
84 | void sb_print_queries (stats_buffer_t *sb, const char *const desc, long long q); |
85 | void sbp_print_date (stats_buffer_t *sb, const char *key, time_t unix_time); |
86 | |
87 | typedef void (*stat_fun_t) (stats_buffer_t *sb); |
88 | int sb_register_stat_fun (stat_fun_t fun); |
89 | |
90 | int sb_sum_i (void **base, int len, int offset); |
91 | long long sb_sum_ll (void **base, int len, int offset); |
92 | double sb_sum_f (void **base, int len, int offset); |
93 | |
94 | #define SB_SUM_I(name) \ |
95 | sb_sum_i ((void **)MODULE_STAT_ARR, max_job_thread_id + 1, offsetof (MODULE_STAT_TYPE, name)) |
96 | |
97 | #define SB_SUM_LL(name) \ |
98 | sb_sum_ll ((void **)MODULE_STAT_ARR, max_job_thread_id + 1, offsetof (MODULE_STAT_TYPE, name)) |
99 | |
100 | #define SB_SUM_F(name) \ |
101 | sb_sum_f ((void **)MODULE_STAT_ARR, max_job_thread_id + 1, offsetof (MODULE_STAT_TYPE, name)) |
102 | |
103 | #define SB_SUM_ONE_I(name) sb_printf (sb, "%s%s\t%d\n", MODULE_STAT_PREFIX_NAME ?: "", #name, SB_SUM_I(name)) |
104 | #define SB_SUM_ONE_LL(name) sb_printf (sb, "%s%s\t%lld\n", MODULE_STAT_PREFIX_NAME ?: "", #name, SB_SUM_LL(name)) |
105 | #define SB_SUM_ONE_F(name) sb_printf (sb, "%s%s\t%lf\n", MODULE_STAT_PREFIX_NAME ?: "", #name, SB_SUM_F(name)) |
106 | |