forked from nginx/nginx
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
8da1fa9
commit 85dd8fc
Showing
7 changed files
with
211 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,33 @@ | ||
|
||
# Copyright (C) Igor Sysoev | ||
|
||
|
||
ngx_feature="Google perftools" | ||
ngx_feature_name= | ||
ngx_feature_run=no | ||
ngx_feature_incs= | ||
ngx_feature_path= | ||
ngx_feature_libs="-lprofiler" | ||
ngx_feature_test="ProfilerStop()" | ||
. auto/feature | ||
|
||
|
||
if [ $ngx_found = no ]; then | ||
|
||
# FreeBSD port | ||
|
||
ngx_feature="Google perftools in /usr/local/" | ||
|
||
if [ $NGX_RPATH = YES ]; then | ||
ngx_feature_libs="-R/usr/local/lib -L/usr/local/lib -lprofiler" | ||
else | ||
ngx_feature_libs="-L/usr/local/lib -lprofiler" | ||
fi | ||
|
||
. auto/feature | ||
fi | ||
|
||
|
||
if [ $ngx_found = yes ]; then | ||
CORE_LIBS="$CORE_LIBS $ngx_feature_libs" | ||
fi |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,127 @@ | ||
|
||
/* | ||
* Copyright (C) Igor Sysoev | ||
*/ | ||
|
||
|
||
#include <ngx_config.h> | ||
#include <ngx_core.h> | ||
|
||
/* | ||
* declare Profiler here interface because | ||
* <google/profiler.h> is C++ header file | ||
*/ | ||
|
||
int ProfilerStart(u_char* fname); | ||
void ProfilerStop(void); | ||
void ProfilerRegisterThread(void); | ||
|
||
|
||
static void *ngx_google_perftools_create_conf(ngx_cycle_t *cycle); | ||
static ngx_int_t ngx_google_perftools_worker(ngx_cycle_t *cycle); | ||
|
||
|
||
typedef struct { | ||
ngx_str_t profiles; | ||
} ngx_google_perftools_conf_t; | ||
|
||
|
||
static ngx_command_t ngx_google_perftools_commands[] = { | ||
|
||
{ ngx_string("google_perftools_profiles"), | ||
NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_TAKE1, | ||
ngx_conf_set_str_slot, | ||
0, | ||
offsetof(ngx_google_perftools_conf_t, profiles), | ||
NULL }, | ||
|
||
ngx_null_command | ||
}; | ||
|
||
|
||
static ngx_core_module_t ngx_google_perftools_module_ctx = { | ||
ngx_string("google_perftools"), | ||
ngx_google_perftools_create_conf, | ||
NULL | ||
}; | ||
|
||
|
||
ngx_module_t ngx_google_perftools_module = { | ||
NGX_MODULE_V1, | ||
&ngx_google_perftools_module_ctx, /* module context */ | ||
ngx_google_perftools_commands, /* module directives */ | ||
NGX_CORE_MODULE, /* module type */ | ||
NULL, /* init master */ | ||
NULL, /* init module */ | ||
ngx_google_perftools_worker, /* init process */ | ||
NULL, /* init thread */ | ||
NULL, /* exit thread */ | ||
NULL, /* exit process */ | ||
NULL, /* exit master */ | ||
NGX_MODULE_V1_PADDING | ||
}; | ||
|
||
|
||
static void * | ||
ngx_google_perftools_create_conf(ngx_cycle_t *cycle) | ||
{ | ||
ngx_google_perftools_conf_t *gptcf; | ||
|
||
gptcf = ngx_pcalloc(cycle->pool, sizeof(ngx_google_perftools_conf_t)); | ||
if (gptcf == NULL) { | ||
return NULL; | ||
} | ||
|
||
/* | ||
* set by pcalloc() | ||
* | ||
* gptcf->profiles = { 0, NULL }; | ||
*/ | ||
|
||
return gptcf; | ||
} | ||
|
||
|
||
static ngx_int_t | ||
ngx_google_perftools_worker(ngx_cycle_t *cycle) | ||
{ | ||
u_char *profile; | ||
ngx_google_perftools_conf_t *gptcf; | ||
|
||
gptcf = (ngx_google_perftools_conf_t *) | ||
ngx_get_conf(cycle->conf_ctx, ngx_google_perftools_module); | ||
|
||
if (gptcf->profiles.len == 0) { | ||
return NGX_OK; | ||
} | ||
|
||
profile = ngx_alloc(gptcf->profiles.len + NGX_INT_T_LEN + 2, cycle->log); | ||
if (profile == NULL) { | ||
return NGX_OK; | ||
} | ||
|
||
if (getenv("CPUPROFILE")) { | ||
|
||
/* disable inherited Profiler enabled in master process */ | ||
ProfilerStop(); | ||
} | ||
|
||
ngx_sprintf(profile, "%V.%d%Z", &gptcf->profiles, ngx_pid); | ||
|
||
if (ProfilerStart(profile)) { | ||
|
||
/* start ITIMER_PROF timer */ | ||
ProfilerRegisterThread(); | ||
|
||
} else { | ||
ngx_log_error(NGX_LOG_CRIT, cycle->log, ngx_errno, | ||
"ProfilerStart(%s) failed", profile); | ||
} | ||
|
||
ngx_free(profile); | ||
|
||
return NGX_OK; | ||
} | ||
|
||
|
||
/* ProfilerStop() is called on Profiler destruction */ |