|  |  | 
|  | /* | 
|  | * 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); | 
|  |  | 
|  | 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 |