|  | 
 | /* | 
 |  * Copyright (C) Igor Sysoev | 
 |  */ | 
 |  | 
 |  | 
 | #include <ngx_config.h> | 
 | #include <ngx_core.h> | 
 |  | 
 |  | 
 | #if (NGX_HAVE_ATOMIC_OPS) | 
 |  | 
 |  | 
 | ngx_int_t | 
 | ngx_shmtx_create(ngx_shmtx_t *mtx, void *addr, u_char *name) | 
 | { | 
 |     mtx->lock = addr; | 
 |  | 
 |     return NGX_OK; | 
 | } | 
 |  | 
 | #else | 
 |  | 
 |  | 
 | ngx_int_t | 
 | ngx_shmtx_create(ngx_shmtx_t *mtx, void *addr, u_char *name) | 
 | { | 
 |     if (mtx->name) { | 
 |  | 
 |         if (ngx_strcmp(name, mtx->name) == 0) { | 
 |             mtx->name = name; | 
 |             return NGX_OK; | 
 |         } | 
 |  | 
 |         ngx_shmtx_destory(mtx); | 
 |     } | 
 |  | 
 |     mtx->fd = ngx_open_file(name, NGX_FILE_RDWR, NGX_FILE_CREATE_OR_OPEN, | 
 |                             NGX_FILE_DEFAULT_ACCESS); | 
 |  | 
 |     if (mtx->fd == NGX_INVALID_FILE) { | 
 |         ngx_log_error(NGX_LOG_EMERG, ngx_cycle->log, ngx_errno, | 
 |                       ngx_open_file_n " \"%s\" failed", name); | 
 |         return NGX_ERROR; | 
 |     } | 
 |  | 
 |     if (ngx_delete_file(name) == NGX_FILE_ERROR) { | 
 |         ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, ngx_errno, | 
 |                       ngx_delete_file_n " \"%s\" failed", name); | 
 |     } | 
 |  | 
 |     mtx->name = name; | 
 |  | 
 |     return NGX_OK; | 
 | } | 
 |  | 
 |  | 
 | void | 
 | ngx_shmtx_destory(ngx_shmtx_t *mtx) | 
 | { | 
 |     if (ngx_close_file(mtx->fd) == NGX_FILE_ERROR) { | 
 |         ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, ngx_errno, | 
 |                       ngx_close_file_n " \"%s\" failed", mtx->name); | 
 |     } | 
 | } | 
 |  | 
 |  | 
 | #endif |