s3:smbprofile: count all SMB1 and SMB2 requests as 'request_count'
[amitay/samba.git] / source3 / include / smbprofile.h
1 #ifndef _PROFILE_H_
2 #define _PROFILE_H_
3 /*
4    Unix SMB/CIFS implementation.
5    store smbd profiling information in shared memory
6    Copyright (C) Andrew Tridgell 1999
7    Copyright (C) James Peach 2006
8
9    This program is free software; you can redistribute it and/or modify
10    it under the terms of the GNU General Public License as published by
11    the Free Software Foundation; either version 3 of the License, or
12    (at your option) any later version.
13
14    This program is distributed in the hope that it will be useful,
15    but WITHOUT ANY WARRANTY; without even the implied warranty of
16    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17    GNU General Public License for more details.
18
19    You should have received a copy of the GNU General Public License
20    along with this program.  If not, see <http://www.gnu.org/licenses/>.
21
22 */
23
24 #ifdef WITH_PROFILE
25
26 #define SMBPROFILE_STATS_ALL_SECTIONS \
27         SMBPROFILE_STATS_START \
28         \
29         SMBPROFILE_STATS_SECTION_START("SMBD loop") \
30         SMBPROFILE_STATS_COUNT(request) \
31         SMBPROFILE_STATS_COUNT(uid_changes) \
32         SMBPROFILE_STATS_BASIC(smbd_idle) \
33         SMBPROFILE_STATS_SECTION_END \
34         \
35         SMBPROFILE_STATS_SECTION_START("System Calls") \
36         SMBPROFILE_STATS_BASIC(syscall_opendir) \
37         SMBPROFILE_STATS_BASIC(syscall_fdopendir) \
38         SMBPROFILE_STATS_BASIC(syscall_readdir) \
39         SMBPROFILE_STATS_BASIC(syscall_seekdir) \
40         SMBPROFILE_STATS_BASIC(syscall_telldir) \
41         SMBPROFILE_STATS_BASIC(syscall_rewinddir) \
42         SMBPROFILE_STATS_BASIC(syscall_mkdir) \
43         SMBPROFILE_STATS_BASIC(syscall_rmdir) \
44         SMBPROFILE_STATS_BASIC(syscall_closedir) \
45         SMBPROFILE_STATS_BASIC(syscall_open) \
46         SMBPROFILE_STATS_BASIC(syscall_createfile) \
47         SMBPROFILE_STATS_BASIC(syscall_close) \
48         SMBPROFILE_STATS_BYTES(syscall_read) \
49         SMBPROFILE_STATS_BYTES(syscall_pread) \
50         SMBPROFILE_STATS_BYTES(syscall_write) \
51         SMBPROFILE_STATS_BYTES(syscall_pwrite) \
52         SMBPROFILE_STATS_BASIC(syscall_lseek) \
53         SMBPROFILE_STATS_BYTES(syscall_sendfile) \
54         SMBPROFILE_STATS_BYTES(syscall_recvfile) \
55         SMBPROFILE_STATS_BASIC(syscall_rename) \
56         SMBPROFILE_STATS_BASIC(syscall_rename_at) \
57         SMBPROFILE_STATS_BASIC(syscall_fsync) \
58         SMBPROFILE_STATS_BASIC(syscall_stat) \
59         SMBPROFILE_STATS_BASIC(syscall_fstat) \
60         SMBPROFILE_STATS_BASIC(syscall_lstat) \
61         SMBPROFILE_STATS_BASIC(syscall_get_alloc_size) \
62         SMBPROFILE_STATS_BASIC(syscall_unlink) \
63         SMBPROFILE_STATS_BASIC(syscall_chmod) \
64         SMBPROFILE_STATS_BASIC(syscall_fchmod) \
65         SMBPROFILE_STATS_BASIC(syscall_chown) \
66         SMBPROFILE_STATS_BASIC(syscall_fchown) \
67         SMBPROFILE_STATS_BASIC(syscall_lchown) \
68         SMBPROFILE_STATS_BASIC(syscall_chdir) \
69         SMBPROFILE_STATS_BASIC(syscall_getwd) \
70         SMBPROFILE_STATS_BASIC(syscall_ntimes) \
71         SMBPROFILE_STATS_BASIC(syscall_ftruncate) \
72         SMBPROFILE_STATS_BASIC(syscall_fallocate) \
73         SMBPROFILE_STATS_BASIC(syscall_fcntl_lock) \
74         SMBPROFILE_STATS_BASIC(syscall_kernel_flock) \
75         SMBPROFILE_STATS_BASIC(syscall_linux_setlease) \
76         SMBPROFILE_STATS_BASIC(syscall_fcntl_getlock) \
77         SMBPROFILE_STATS_BASIC(syscall_readlink) \
78         SMBPROFILE_STATS_BASIC(syscall_symlink) \
79         SMBPROFILE_STATS_BASIC(syscall_link) \
80         SMBPROFILE_STATS_BASIC(syscall_mknod) \
81         SMBPROFILE_STATS_BASIC(syscall_realpath) \
82         SMBPROFILE_STATS_BASIC(syscall_get_quota) \
83         SMBPROFILE_STATS_BASIC(syscall_set_quota) \
84         SMBPROFILE_STATS_BASIC(syscall_get_sd) \
85         SMBPROFILE_STATS_BASIC(syscall_set_sd) \
86         SMBPROFILE_STATS_BASIC(syscall_brl_lock) \
87         SMBPROFILE_STATS_BASIC(syscall_brl_unlock) \
88         SMBPROFILE_STATS_BASIC(syscall_brl_cancel) \
89         SMBPROFILE_STATS_SECTION_END \
90         \
91         SMBPROFILE_STATS_SECTION_START("ACL Calls") \
92         SMBPROFILE_STATS_BASIC(get_nt_acl) \
93         SMBPROFILE_STATS_BASIC(fget_nt_acl) \
94         SMBPROFILE_STATS_BASIC(fset_nt_acl) \
95         SMBPROFILE_STATS_BASIC(chmod_acl) \
96         SMBPROFILE_STATS_BASIC(fchmod_acl) \
97         SMBPROFILE_STATS_SECTION_END \
98         \
99         SMBPROFILE_STATS_SECTION_START("Stat Cache") \
100         SMBPROFILE_STATS_COUNT(statcache_lookups) \
101         SMBPROFILE_STATS_COUNT(statcache_misses) \
102         SMBPROFILE_STATS_COUNT(statcache_hits) \
103         SMBPROFILE_STATS_SECTION_END \
104         \
105         SMBPROFILE_STATS_SECTION_START("Write Cache") \
106         SMBPROFILE_STATS_COUNT(writecache_allocations) \
107         SMBPROFILE_STATS_COUNT(writecache_deallocations) \
108         SMBPROFILE_STATS_COUNT(writecache_cached_reads) \
109         SMBPROFILE_STATS_COUNT(writecache_total_writes) \
110         SMBPROFILE_STATS_COUNT(writecache_init_writes) \
111         SMBPROFILE_STATS_COUNT(writecache_abutted_writes) \
112         SMBPROFILE_STATS_COUNT(writecache_non_oplock_writes) \
113         SMBPROFILE_STATS_COUNT(writecache_direct_writes) \
114         SMBPROFILE_STATS_COUNT(writecache_cached_writes) \
115         SMBPROFILE_STATS_COUNT(writecache_perfect_writes) \
116         SMBPROFILE_STATS_COUNT(writecache_flush_reason_seek) \
117         SMBPROFILE_STATS_COUNT(writecache_flush_reason_read) \
118         SMBPROFILE_STATS_COUNT(writecache_flush_reason_readraw) \
119         SMBPROFILE_STATS_COUNT(writecache_flush_reason_write) \
120         SMBPROFILE_STATS_COUNT(writecache_flush_reason_oplock) \
121         SMBPROFILE_STATS_COUNT(writecache_flush_reason_close) \
122         SMBPROFILE_STATS_COUNT(writecache_flush_reason_sync) \
123         SMBPROFILE_STATS_COUNT(writecache_flush_reason_sizechange) \
124         SMBPROFILE_STATS_SECTION_END \
125         \
126         SMBPROFILE_STATS_SECTION_START("SMB Calls") \
127         SMBPROFILE_STATS_BASIC(SMBmkdir) \
128         SMBPROFILE_STATS_BASIC(SMBrmdir) \
129         SMBPROFILE_STATS_BASIC(SMBopen) \
130         SMBPROFILE_STATS_BASIC(SMBcreate) \
131         SMBPROFILE_STATS_BASIC(SMBclose) \
132         SMBPROFILE_STATS_BASIC(SMBflush) \
133         SMBPROFILE_STATS_BASIC(SMBunlink) \
134         SMBPROFILE_STATS_BASIC(SMBmv) \
135         SMBPROFILE_STATS_BASIC(SMBgetatr) \
136         SMBPROFILE_STATS_BASIC(SMBsetatr) \
137         SMBPROFILE_STATS_BASIC(SMBread) \
138         SMBPROFILE_STATS_BASIC(SMBwrite) \
139         SMBPROFILE_STATS_BASIC(SMBlock) \
140         SMBPROFILE_STATS_BASIC(SMBunlock) \
141         SMBPROFILE_STATS_BASIC(SMBctemp) \
142         SMBPROFILE_STATS_BASIC(SMBmknew) \
143         SMBPROFILE_STATS_BASIC(SMBcheckpath) \
144         SMBPROFILE_STATS_BASIC(SMBexit) \
145         SMBPROFILE_STATS_BASIC(SMBlseek) \
146         SMBPROFILE_STATS_BASIC(SMBlockread) \
147         SMBPROFILE_STATS_BASIC(SMBwriteunlock) \
148         SMBPROFILE_STATS_BASIC(SMBreadbraw) \
149         SMBPROFILE_STATS_BASIC(SMBreadBmpx) \
150         SMBPROFILE_STATS_BASIC(SMBreadBs) \
151         SMBPROFILE_STATS_BASIC(SMBwritebraw) \
152         SMBPROFILE_STATS_BASIC(SMBwriteBmpx) \
153         SMBPROFILE_STATS_BASIC(SMBwriteBs) \
154         SMBPROFILE_STATS_BASIC(SMBwritec) \
155         SMBPROFILE_STATS_BASIC(SMBsetattrE) \
156         SMBPROFILE_STATS_BASIC(SMBgetattrE) \
157         SMBPROFILE_STATS_BASIC(SMBlockingX) \
158         SMBPROFILE_STATS_BASIC(SMBtrans) \
159         SMBPROFILE_STATS_BASIC(SMBtranss) \
160         SMBPROFILE_STATS_BASIC(SMBioctl) \
161         SMBPROFILE_STATS_BASIC(SMBioctls) \
162         SMBPROFILE_STATS_BASIC(SMBcopy) \
163         SMBPROFILE_STATS_BASIC(SMBmove) \
164         SMBPROFILE_STATS_BASIC(SMBecho) \
165         SMBPROFILE_STATS_BASIC(SMBwriteclose) \
166         SMBPROFILE_STATS_BASIC(SMBopenX) \
167         SMBPROFILE_STATS_BASIC(SMBreadX) \
168         SMBPROFILE_STATS_BASIC(SMBwriteX) \
169         SMBPROFILE_STATS_BASIC(SMBtrans2) \
170         SMBPROFILE_STATS_BASIC(SMBtranss2) \
171         SMBPROFILE_STATS_BASIC(SMBfindclose) \
172         SMBPROFILE_STATS_BASIC(SMBfindnclose) \
173         SMBPROFILE_STATS_BASIC(SMBtcon) \
174         SMBPROFILE_STATS_BASIC(SMBtdis) \
175         SMBPROFILE_STATS_BASIC(SMBnegprot) \
176         SMBPROFILE_STATS_BASIC(SMBsesssetupX) \
177         SMBPROFILE_STATS_BASIC(SMBulogoffX) \
178         SMBPROFILE_STATS_BASIC(SMBtconX) \
179         SMBPROFILE_STATS_BASIC(SMBdskattr) \
180         SMBPROFILE_STATS_BASIC(SMBsearch) \
181         SMBPROFILE_STATS_BASIC(SMBffirst) \
182         SMBPROFILE_STATS_BASIC(SMBfunique) \
183         SMBPROFILE_STATS_BASIC(SMBfclose) \
184         SMBPROFILE_STATS_BASIC(SMBnttrans) \
185         SMBPROFILE_STATS_BASIC(SMBnttranss) \
186         SMBPROFILE_STATS_BASIC(SMBntcreateX) \
187         SMBPROFILE_STATS_BASIC(SMBntcancel) \
188         SMBPROFILE_STATS_BASIC(SMBntrename) \
189         SMBPROFILE_STATS_BASIC(SMBsplopen) \
190         SMBPROFILE_STATS_BASIC(SMBsplwr) \
191         SMBPROFILE_STATS_BASIC(SMBsplclose) \
192         SMBPROFILE_STATS_BASIC(SMBsplretq) \
193         SMBPROFILE_STATS_BASIC(SMBsends) \
194         SMBPROFILE_STATS_BASIC(SMBsendb) \
195         SMBPROFILE_STATS_BASIC(SMBfwdname) \
196         SMBPROFILE_STATS_BASIC(SMBcancelf) \
197         SMBPROFILE_STATS_BASIC(SMBgetmac) \
198         SMBPROFILE_STATS_BASIC(SMBsendstrt) \
199         SMBPROFILE_STATS_BASIC(SMBsendend) \
200         SMBPROFILE_STATS_BASIC(SMBsendtxt) \
201         SMBPROFILE_STATS_BASIC(SMBinvalid) \
202         SMBPROFILE_STATS_SECTION_END \
203         \
204         SMBPROFILE_STATS_SECTION_START("Trans2 Calls") \
205         SMBPROFILE_STATS_BASIC(Trans2_open) \
206         SMBPROFILE_STATS_BASIC(Trans2_findfirst) \
207         SMBPROFILE_STATS_BASIC(Trans2_findnext) \
208         SMBPROFILE_STATS_BASIC(Trans2_qfsinfo) \
209         SMBPROFILE_STATS_BASIC(Trans2_setfsinfo) \
210         SMBPROFILE_STATS_BASIC(Trans2_qpathinfo) \
211         SMBPROFILE_STATS_BASIC(Trans2_setpathinfo) \
212         SMBPROFILE_STATS_BASIC(Trans2_qfileinfo) \
213         SMBPROFILE_STATS_BASIC(Trans2_setfileinfo) \
214         SMBPROFILE_STATS_BASIC(Trans2_fsctl) \
215         SMBPROFILE_STATS_BASIC(Trans2_ioctl) \
216         SMBPROFILE_STATS_BASIC(Trans2_findnotifyfirst) \
217         SMBPROFILE_STATS_BASIC(Trans2_findnotifynext) \
218         SMBPROFILE_STATS_BASIC(Trans2_mkdir) \
219         SMBPROFILE_STATS_BASIC(Trans2_session_setup) \
220         SMBPROFILE_STATS_BASIC(Trans2_get_dfs_referral) \
221         SMBPROFILE_STATS_BASIC(Trans2_report_dfs_inconsistancy) \
222         SMBPROFILE_STATS_SECTION_END \
223         \
224         SMBPROFILE_STATS_SECTION_START("NT Transact Calls") \
225         SMBPROFILE_STATS_BASIC(NT_transact_create) \
226         SMBPROFILE_STATS_BASIC(NT_transact_ioctl) \
227         SMBPROFILE_STATS_BASIC(NT_transact_set_security_desc) \
228         SMBPROFILE_STATS_BASIC(NT_transact_notify_change) \
229         SMBPROFILE_STATS_BASIC(NT_transact_rename) \
230         SMBPROFILE_STATS_BASIC(NT_transact_query_security_desc) \
231         SMBPROFILE_STATS_BASIC(NT_transact_get_user_quota) \
232         SMBPROFILE_STATS_BASIC(NT_transact_set_user_quota) \
233         SMBPROFILE_STATS_SECTION_END \
234         \
235         SMBPROFILE_STATS_SECTION_START("SMB2 Calls") \
236         SMBPROFILE_STATS_IOBYTES(smb2_negprot) \
237         SMBPROFILE_STATS_IOBYTES(smb2_sesssetup) \
238         SMBPROFILE_STATS_IOBYTES(smb2_logoff) \
239         SMBPROFILE_STATS_IOBYTES(smb2_tcon) \
240         SMBPROFILE_STATS_IOBYTES(smb2_tdis) \
241         SMBPROFILE_STATS_IOBYTES(smb2_create) \
242         SMBPROFILE_STATS_IOBYTES(smb2_close) \
243         SMBPROFILE_STATS_IOBYTES(smb2_flush) \
244         SMBPROFILE_STATS_IOBYTES(smb2_read) \
245         SMBPROFILE_STATS_IOBYTES(smb2_write) \
246         SMBPROFILE_STATS_IOBYTES(smb2_lock) \
247         SMBPROFILE_STATS_IOBYTES(smb2_ioctl) \
248         SMBPROFILE_STATS_IOBYTES(smb2_cancel) \
249         SMBPROFILE_STATS_IOBYTES(smb2_keepalive) \
250         SMBPROFILE_STATS_IOBYTES(smb2_find) \
251         SMBPROFILE_STATS_IOBYTES(smb2_notify) \
252         SMBPROFILE_STATS_IOBYTES(smb2_getinfo) \
253         SMBPROFILE_STATS_IOBYTES(smb2_setinfo) \
254         SMBPROFILE_STATS_IOBYTES(smb2_break) \
255         SMBPROFILE_STATS_SECTION_END \
256         \
257         SMBPROFILE_STATS_END
258
259 /* this file defines the profile structure in the profile shared
260    memory area */
261
262 /* time values in the following structure are in microseconds */
263
264 struct smbprofile_stats_count {
265         uint64_t count;         /* number of events */
266 };
267
268 struct smbprofile_stats_time {
269         uint64_t time;          /* microseconds */
270 };
271
272 struct smbprofile_stats_time_async {
273         uint64_t start;
274         struct smbprofile_stats_time *stats;
275 };
276
277 struct smbprofile_stats_basic {
278         uint64_t count;         /* number of events */
279         uint64_t time;          /* microseconds */
280 };
281
282 struct smbprofile_stats_basic_async {
283         uint64_t start;
284         struct smbprofile_stats_basic *stats;
285 };
286
287 struct smbprofile_stats_bytes {
288         uint64_t count;         /* number of events */
289         uint64_t time;          /* microseconds */
290         uint64_t idle;          /* idle time compared to 'time' microseconds */
291         uint64_t bytes;         /* bytes */
292 };
293
294 struct smbprofile_stats_bytes_async {
295         uint64_t start;
296         uint64_t idle_start;
297         uint64_t idle_time;
298         struct smbprofile_stats_bytes *stats;
299 };
300
301 struct smbprofile_stats_iobytes {
302         uint64_t count;         /* number of events */
303         uint64_t time;          /* microseconds */
304         uint64_t idle;          /* idle time compared to 'time' microseconds */
305         uint64_t inbytes;       /* bytes read */
306         uint64_t outbytes;      /* bytes written */
307 };
308
309 struct smbprofile_stats_iobytes_async {
310         uint64_t start;
311         uint64_t idle_start;
312         uint64_t idle_time;
313         struct smbprofile_stats_iobytes *stats;
314 };
315
316 struct profile_stats {
317 #define SMBPROFILE_STATS_START
318 #define SMBPROFILE_STATS_SECTION_START(name)
319 #define SMBPROFILE_STATS_COUNT(name) \
320         struct smbprofile_stats_count name##_stats;
321 #define SMBPROFILE_STATS_TIME(name) \
322         struct smbprofile_stats_time name##_stats;
323 #define SMBPROFILE_STATS_BASIC(name) \
324         struct smbprofile_stats_basic name##_stats;
325 #define SMBPROFILE_STATS_BYTES(name) \
326         struct smbprofile_stats_bytes name##_stats;
327 #define SMBPROFILE_STATS_IOBYTES(name) \
328         struct smbprofile_stats_iobytes name##_stats;
329 #define SMBPROFILE_STATS_SECTION_END
330 #define SMBPROFILE_STATS_END
331         SMBPROFILE_STATS_ALL_SECTIONS
332 #undef SMBPROFILE_STATS_START
333 #undef SMBPROFILE_STATS_SECTION_START
334 #undef SMBPROFILE_STATS_COUNT
335 #undef SMBPROFILE_STATS_TIME
336 #undef SMBPROFILE_STATS_BASIC
337 #undef SMBPROFILE_STATS_BYTES
338 #undef SMBPROFILE_STATS_IOBYTES
339 #undef SMBPROFILE_STATS_SECTION_END
340 #undef SMBPROFILE_STATS_END
341 };
342
343 #define _SMBPROFILE_COUNT_INCREMENT(_stats, _area, _v) do { \
344         if (do_profile_flag) { \
345                 (_area)->_stats.count += (_v); \
346         } \
347 } while(0)
348 #define SMBPROFILE_COUNT_INCREMENT(_name, _area, _v) \
349         _SMBPROFILE_COUNT_INCREMENT(_name##_stats, _area, _v)
350
351 #define SMBPROFILE_TIME_ASYNC_STATE(_async_name) \
352         struct smbprofile_stats_time_async _async_name;
353 #define _SMBPROFILE_TIME_ASYNC_START(_stats, _area, _async) do { \
354         (_async) = (struct smbprofile_stats_time_async) {}; \
355         if (smbprofile_state.config.do_times) { \
356                 (_async).stats = &((_area)->_stats), \
357                 (_async).start = profile_timestamp(); \
358         } \
359 } while(0)
360 #define SMBPROFILE_TIME_ASYNC_START(_name, _area, _async) \
361         _SMBPROFILE_TIME_ASYNC_START(_name##_stats, _area, _async)
362 #define SMBPROFILE_TIME_ASYNC_END(_async) do { \
363         if ((_async).start != 0) { \
364                 (_async).stats->time += profile_timestamp() - (_async).start; \
365                 (_async) = (struct smbprofile_stats_basic_async) {}; \
366         } \
367 } while(0)
368
369 #define SMBPROFILE_BASIC_ASYNC_STATE(_async_name) \
370         struct smbprofile_stats_basic_async _async_name;
371 #define _SMBPROFILE_BASIC_ASYNC_START(_stats, _area, _async) do { \
372         (_async) = (struct smbprofile_stats_basic_async) {}; \
373         if (do_profile_flag) { \
374                 if (do_profile_times) { \
375                         (_async).start = profile_timestamp(); \
376                         (_async).stats = &((_area)->_stats); \
377                 } \
378                 (_area)->_stats.count += 1; \
379         } \
380 } while(0)
381 #define SMBPROFILE_BASIC_ASYNC_START(_name, _area, _async) \
382         _SMBPROFILE_BASIC_ASYNC_START(_name##_stats, _area, _async)
383 #define SMBPROFILE_BASIC_ASYNC_END(_async) do { \
384         if ((_async).start != 0) { \
385                 (_async).stats->time += profile_timestamp() - (_async).start; \
386                 (_async) = (struct smbprofile_stats_basic_async) {}; \
387         } \
388 } while(0)
389
390 #define _SMBPROFILE_TIMER_ASYNC_START(_stats, _area, _async) do { \
391         (_async).stats = &((_area)->_stats); \
392         if (do_profile_times) { \
393                 (_async).start = profile_timestamp(); \
394         } \
395 } while(0)
396 #define _SMBPROFILE_TIMER_ASYNC_SET_IDLE(_async) do { \
397         if ((_async).start != 0) { \
398                 if ((_async).idle_start == 0) { \
399                         (_async).idle_start = profile_timestamp(); \
400                 } \
401         } \
402 } while(0)
403 #define _SMBPROFILE_TIMER_ASYNC_SET_BUSY(_async) do { \
404         if ((_async).idle_start != 0) { \
405                 (_async).idle_time += \
406                         profile_timestamp() - (_async).idle_start; \
407                 (_async).idle_start = 0; \
408         } \
409 } while(0)
410 #define _SMBPROFILE_TIMER_ASYNC_END(_async) do { \
411         if ((_async).start != 0) { \
412                 _SMBPROFILE_TIMER_ASYNC_SET_BUSY(_async); \
413                 (_async).stats->time += profile_timestamp() - (_async).start; \
414                 (_async).stats->idle += (_async).idle_time; \
415         } \
416 } while(0)
417
418 #define SMBPROFILE_BYTES_ASYNC_STATE(_async_name) \
419         struct smbprofile_stats_bytes_async _async_name;
420 #define _SMBPROFILE_BYTES_ASYNC_START(_stats, _area, _async, _bytes) do { \
421         (_async) = (struct smbprofile_stats_bytes_async) {}; \
422         if (do_profile_flag) { \
423                 _SMBPROFILE_TIMER_ASYNC_START(_stats, _area, _async); \
424                 (_area)->_stats.count += 1; \
425                 (_area)->_stats.bytes += (_bytes); \
426         } \
427 } while(0)
428 #define SMBPROFILE_BYTES_ASYNC_START(_name, _area, _async, _bytes) \
429         _SMBPROFILE_BYTES_ASYNC_START(_name##_stats, _area, _async, _bytes)
430 #define SMBPROFILE_BYTES_ASYNC_SET_IDLE(_async) \
431         _SMBPROFILE_TIMER_ASYNC_SET_IDLE(_async)
432 #define SMBPROFILE_BYTES_ASYNC_SET_BUSY(_async) \
433         _SMBPROFILE_TIMER_ASYNC_SET_BUSY(_async)
434 #define SMBPROFILE_BYTES_ASYNC_END(_async) do { \
435         if ((_async).stats != NULL) { \
436                 _SMBPROFILE_TIMER_ASYNC_END(_async); \
437                 (_async) = (struct smbprofile_stats_bytes_async) {}; \
438         } \
439 } while(0)
440
441 #define SMBPROFILE_IOBYTES_ASYNC_STATE(_async_name) \
442         struct smbprofile_stats_iobytes_async _async_name;
443 #define _SMBPROFILE_IOBYTES_ASYNC_START(_stats, _area, _async, _inbytes) do { \
444         (_async) = (struct smbprofile_stats_iobytes_async) {}; \
445         if (do_profile_flag) { \
446                 _SMBPROFILE_TIMER_ASYNC_START(_stats, _area, _async); \
447                 (_area)->_stats.count += 1; \
448                 (_area)->_stats.inbytes += (_inbytes); \
449         } \
450 } while(0)
451 #define SMBPROFILE_IOBYTES_ASYNC_START(_name, _area, _async, _inbytes) \
452         _SMBPROFILE_IOBYTES_ASYNC_START(_name##_stats, _area, _async, _inbytes)
453 #define SMBPROFILE_IOBYTES_ASYNC_SET_IDLE(_async) \
454         _SMBPROFILE_TIMER_ASYNC_SET_IDLE(_async)
455 #define SMBPROFILE_IOBYTES_ASYNC_SET_BUSY(_async) \
456         _SMBPROFILE_TIMER_ASYNC_SET_BUSY(_async)
457 #define SMBPROFILE_IOBYTES_ASYNC_END(_async, _outbytes) do { \
458         if ((_async).stats != NULL) { \
459                 (_async).stats->outbytes += (_outbytes); \
460                 _SMBPROFILE_TIMER_ASYNC_END(_async); \
461                 (_async) = (struct smbprofile_stats_iobytes_async) {}; \
462         } \
463 } while(0)
464
465 extern struct profile_stats *profile_p;
466 extern bool do_profile_flag;
467 extern bool do_profile_times;
468
469 static inline uint64_t profile_timestamp(void)
470 {
471         struct timespec ts;
472
473         /* we might prefer to use the _COARSE clock variant of CLOCK_MONOTONIC
474            that one is faster but cached and "just" tick-wise precise */
475         clock_gettime_mono(&ts);
476         return (ts.tv_sec * 1000000) + (ts.tv_nsec / 1000); /* usec */
477 }
478
479 #define DO_PROFILE_INC(x) \
480         _SMBPROFILE_COUNT_INCREMENT(x##_stats, profile_p, 1); \
481
482 #define START_PROFILE_STAMP(x, _stamp) do { \
483         struct smbprofile_stats_basic_async __profasync_##x = {}; \
484         _SMBPROFILE_BASIC_ASYNC_START(x##_stats, profile_p, __profasync_##x); \
485         _stamp = __profasync_##x.start; \
486 } while(0)
487
488 #define START_PROFILE(x) \
489         struct smbprofile_stats_basic_async __profasync_##x = {}; \
490         _SMBPROFILE_BASIC_ASYNC_START(x##_stats, profile_p, __profasync_##x);
491
492 #define START_PROFILE_BYTES(x,n) \
493         struct smbprofile_stats_bytes_async __profasync_##x = {}; \
494         _SMBPROFILE_BYTES_ASYNC_START(x##_stats, profile_p, __profasync_##x, n);
495
496 #define END_PROFILE_STAMP(x, _stamp) do { \
497         struct smbprofile_stats_basic_async __profasync_##x = {}; \
498         if (do_profile_flag && do_profile_times) { \
499                 __profasync_##x = (struct smbprofile_stats_basic_async) { \
500                         .start = (_stamp), \
501                         .stats = &(profile_p->x##_stats), \
502                 }; \
503         } \
504         SMBPROFILE_BASIC_ASYNC_END(__profasync_##x); \
505 } while(0)
506
507 #define END_PROFILE(x) \
508         SMBPROFILE_BASIC_ASYNC_END(__profasync_##x)
509
510 #define END_PROFILE_BYTES(x) \
511         SMBPROFILE_BYTES_ASYNC_END(__profasync_##x)
512
513 #else /* WITH_PROFILE */
514
515 #define SMBPROFILE_COUNT_INCREMENT(_name, _area, _v)
516
517 #define SMBPROFILE_TIME_ASYNC_STATE(_async_name)
518 #define SMBPROFILE_TIME_ASYNC_START(_name, _area, _async)
519 #define SMBPROFILE_TIME_ASYNC_END(_async)
520
521 #define SMBPROFILE_BASIC_ASYNC_STATE(_async_name)
522 #define SMBPROFILE_BASIC_ASYNC_START(_name, _area, _async)
523 #define SMBPROFILE_BASIC_ASYNC_END(_async)
524
525 #define SMBPROFILE_BYTES_ASYNC_STATE(_async_name)
526 #define SMBPROFILE_BYTES_ASYNC_START(_name, _area, _async, _inbytes)
527 #define SMBPROFILE_BYTES_ASYNC_SET_IDLE(_async)
528 #define SMBPROFILE_BYTES_ASYNC_SET_BUSY(_async)
529 #define SMBPROFILE_BYTES_ASYNC_END(_async)
530
531 #define SMBPROFILE_IOBYTES_ASYNC_STATE(_async_name)
532 #define SMBPROFILE_IOBYTES_ASYNC_START(_name, _area, _async, _inbytes)
533 #define SMBPROFILE_IOBYTES_ASYNC_SET_IDLE(_async)
534 #define SMBPROFILE_IOBYTES_ASYNC_SET_BUSY(_async)
535 #define SMBPROFILE_IOBYTES_ASYNC_END(_async, _outbytes)
536
537 #define DO_PROFILE_INC(x)
538 #define START_PROFILE_STAMP(x, _stamp)
539 #define START_PROFILE(x)
540 #define START_PROFILE_BYTES(x,n)
541 #define END_PROFILE_STAMP(x, _stamp)
542 #define END_PROFILE(x)
543 #define END_PROFILE_BYTES(x)
544
545 #endif /* WITH_PROFILE */
546
547 /* The following definitions come from profile/profile.c  */
548
549 void set_profile_level(int level, struct server_id src);
550
551 struct messaging_context;
552 bool profile_setup(struct messaging_context *msg_ctx, bool rdonly);
553
554 #endif