Annotation of embedaddon/nginx/src/misc/ngx_google_perftools_module.c, revision 1.1
1.1 ! misho 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 {
! 26: ngx_str_t profiles;
! 27: } ngx_google_perftools_conf_t;
! 28:
! 29:
! 30: static ngx_command_t ngx_google_perftools_commands[] = {
! 31:
! 32: { ngx_string("google_perftools_profiles"),
! 33: NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_TAKE1,
! 34: ngx_conf_set_str_slot,
! 35: 0,
! 36: offsetof(ngx_google_perftools_conf_t, profiles),
! 37: NULL },
! 38:
! 39: ngx_null_command
! 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:
! 50: ngx_module_t ngx_google_perftools_module = {
! 51: NGX_MODULE_V1,
! 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 */
! 62: NGX_MODULE_V1_PADDING
! 63: };
! 64:
! 65:
! 66: static void *
! 67: ngx_google_perftools_create_conf(ngx_cycle_t *cycle)
! 68: {
! 69: ngx_google_perftools_conf_t *gptcf;
! 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;
! 90: ngx_google_perftools_conf_t *gptcf;
! 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 */
! 113: ProfilerRegisterThread();
! 114:
! 115: } else {
! 116: ngx_log_error(NGX_LOG_CRIT, cycle->log, ngx_errno,
! 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 */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>