3 * Copyright (C) Igor Sysoev
4 * Copyright (C) Nginx, Inc.
8 #include <ngx_config.h>
12 * declare Profiler interface here because
13 * <google/profiler.h> is C++ header file
16 int ProfilerStart(u_char
* fname
);
17 void ProfilerStop(void);
18 void ProfilerRegisterThread(void);
21 static void *ngx_google_perftools_create_conf(ngx_cycle_t
*cycle
);
22 static ngx_int_t
ngx_google_perftools_worker(ngx_cycle_t
*cycle
);
27 } ngx_google_perftools_conf_t
;
30 static ngx_command_t ngx_google_perftools_commands
[] = {
32 { ngx_string("google_perftools_profiles"),
33 NGX_MAIN_CONF
|NGX_DIRECT_CONF
|NGX_CONF_TAKE1
,
34 ngx_conf_set_str_slot
,
36 offsetof(ngx_google_perftools_conf_t
, profiles
),
43 static ngx_core_module_t ngx_google_perftools_module_ctx
= {
44 ngx_string("google_perftools"),
45 ngx_google_perftools_create_conf
,
50 ngx_module_t ngx_google_perftools_module
= {
52 &ngx_google_perftools_module_ctx
, /* module context */
53 ngx_google_perftools_commands
, /* module directives */
54 NGX_CORE_MODULE
, /* module type */
55 NULL
, /* init master */
56 NULL
, /* init module */
57 ngx_google_perftools_worker
, /* init process */
58 NULL
, /* init thread */
59 NULL
, /* exit thread */
60 NULL
, /* exit process */
61 NULL
, /* exit master */
67 ngx_google_perftools_create_conf(ngx_cycle_t
*cycle
)
69 ngx_google_perftools_conf_t
*gptcf
;
71 gptcf
= ngx_pcalloc(cycle
->pool
, sizeof(ngx_google_perftools_conf_t
));
77 * set by ngx_pcalloc()
79 * gptcf->profiles = { 0, NULL };
87 ngx_google_perftools_worker(ngx_cycle_t
*cycle
)
90 ngx_google_perftools_conf_t
*gptcf
;
92 gptcf
= (ngx_google_perftools_conf_t
*)
93 ngx_get_conf(cycle
->conf_ctx
, ngx_google_perftools_module
);
95 if (gptcf
->profiles
.len
== 0) {
99 profile
= ngx_alloc(gptcf
->profiles
.len
+ NGX_INT_T_LEN
+ 2, cycle
->log
);
100 if (profile
== NULL
) {
104 if (getenv("CPUPROFILE")) {
105 /* disable inherited Profiler enabled in master process */
109 ngx_sprintf(profile
, "%V.%d%Z", &gptcf
->profiles
, ngx_pid
);
111 if (ProfilerStart(profile
)) {
112 /* start ITIMER_PROF timer */
113 ProfilerRegisterThread();
116 ngx_log_error(NGX_LOG_CRIT
, cycle
->log
, ngx_errno
,
117 "ProfilerStart(%s) failed", profile
);
126 /* ProfilerStop() is called on Profiler destruction */