Annotation of embedaddon/nginx/src/misc/ngx_google_perftools_module.c, revision 1.1.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>