Groonga 3.0.9 Source Code Document
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
ngx_google_perftools_module.c
Go to the documentation of this file.
1 
2 /*
3  * Copyright (C) Igor Sysoev
4  * Copyright (C) Nginx, Inc.
5  */
6 
7 
8 #include <ngx_config.h>
9 #include <ngx_core.h>
10 
11 /*
12  * declare Profiler interface here because
13  * <google/profiler.h> is C++ header file
14  */
15 
16 int ProfilerStart(u_char* fname);
17 void ProfilerStop(void);
18 void ProfilerRegisterThread(void);
19 
20 
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);
23 
24 
25 typedef struct {
28 
29 
30 static ngx_command_t ngx_google_perftools_commands[] = {
31 
32  { ngx_string("google_perftools_profiles"),
35  0,
36  offsetof(ngx_google_perftools_conf_t, profiles),
37  NULL },
38 
40 };
41 
42 
43 static ngx_core_module_t ngx_google_perftools_module_ctx = {
44  ngx_string("google_perftools"),
45  ngx_google_perftools_create_conf,
46  NULL
47 };
48 
49 
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 */
63 };
64 
65 
66 static void *
67 ngx_google_perftools_create_conf(ngx_cycle_t *cycle)
68 {
70 
71  gptcf = ngx_pcalloc(cycle->pool, sizeof(ngx_google_perftools_conf_t));
72  if (gptcf == NULL) {
73  return NULL;
74  }
75 
76  /*
77  * set by ngx_pcalloc()
78  *
79  * gptcf->profiles = { 0, NULL };
80  */
81 
82  return gptcf;
83 }
84 
85 
86 static ngx_int_t
87 ngx_google_perftools_worker(ngx_cycle_t *cycle)
88 {
89  u_char *profile;
91 
92  gptcf = (ngx_google_perftools_conf_t *)
93  ngx_get_conf(cycle->conf_ctx, ngx_google_perftools_module);
94 
95  if (gptcf->profiles.len == 0) {
96  return NGX_OK;
97  }
98 
99  profile = ngx_alloc(gptcf->profiles.len + NGX_INT_T_LEN + 2, cycle->log);
100  if (profile == NULL) {
101  return NGX_OK;
102  }
103 
104  if (getenv("CPUPROFILE")) {
105  /* disable inherited Profiler enabled in master process */
106  ProfilerStop();
107  }
108 
109  ngx_sprintf(profile, "%V.%d%Z", &gptcf->profiles, ngx_pid);
110 
111  if (ProfilerStart(profile)) {
112  /* start ITIMER_PROF timer */
114 
115  } else {
117  "ProfilerStart(%s) failed", profile);
118  }
119 
120  ngx_free(profile);
121 
122  return NGX_OK;
123 }
124 
125 
126 /* ProfilerStop() is called on Profiler destruction */