Annotation of embedaddon/nginx/src/os/unix/ngx_shmem.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: #if (NGX_HAVE_MAP_ANON)
                     13: 
                     14: ngx_int_t
                     15: ngx_shm_alloc(ngx_shm_t *shm)
                     16: {
                     17:     shm->addr = (u_char *) mmap(NULL, shm->size,
                     18:                                 PROT_READ|PROT_WRITE,
                     19:                                 MAP_ANON|MAP_SHARED, -1, 0);
                     20: 
                     21:     if (shm->addr == MAP_FAILED) {
                     22:         ngx_log_error(NGX_LOG_ALERT, shm->log, ngx_errno,
                     23:                       "mmap(MAP_ANON|MAP_SHARED, %uz) failed", shm->size);
                     24:         return NGX_ERROR;
                     25:     }
                     26: 
                     27:     return NGX_OK;
                     28: }
                     29: 
                     30: 
                     31: void
                     32: ngx_shm_free(ngx_shm_t *shm)
                     33: {
                     34:     if (munmap((void *) shm->addr, shm->size) == -1) {
                     35:         ngx_log_error(NGX_LOG_ALERT, shm->log, ngx_errno,
                     36:                       "munmap(%p, %uz) failed", shm->addr, shm->size);
                     37:     }
                     38: }
                     39: 
                     40: #elif (NGX_HAVE_MAP_DEVZERO)
                     41: 
                     42: ngx_int_t
                     43: ngx_shm_alloc(ngx_shm_t *shm)
                     44: {
                     45:     ngx_fd_t  fd;
                     46: 
                     47:     fd = open("/dev/zero", O_RDWR);
                     48: 
                     49:     if (fd == -1) {
                     50:         ngx_log_error(NGX_LOG_ALERT, shm->log, ngx_errno,
                     51:                       "open(\"/dev/zero\") failed");
                     52:         return NGX_ERROR;
                     53:     }
                     54: 
                     55:     shm->addr = (u_char *) mmap(NULL, shm->size, PROT_READ|PROT_WRITE,
                     56:                                 MAP_SHARED, fd, 0);
                     57: 
                     58:     if (shm->addr == MAP_FAILED) {
                     59:         ngx_log_error(NGX_LOG_ALERT, shm->log, ngx_errno,
                     60:                       "mmap(/dev/zero, MAP_SHARED, %uz) failed", shm->size);
                     61:     }
                     62: 
                     63:     if (close(fd) == -1) {
                     64:         ngx_log_error(NGX_LOG_ALERT, shm->log, ngx_errno,
                     65:                       "close(\"/dev/zero\") failed");
                     66:     }
                     67: 
                     68:     return (shm->addr == MAP_FAILED) ? NGX_ERROR : NGX_OK;
                     69: }
                     70: 
                     71: 
                     72: void
                     73: ngx_shm_free(ngx_shm_t *shm)
                     74: {
                     75:     if (munmap((void *) shm->addr, shm->size) == -1) {
                     76:         ngx_log_error(NGX_LOG_ALERT, shm->log, ngx_errno,
                     77:                       "munmap(%p, %uz) failed", shm->addr, shm->size);
                     78:     }
                     79: }
                     80: 
                     81: #elif (NGX_HAVE_SYSVSHM)
                     82: 
                     83: #include <sys/ipc.h>
                     84: #include <sys/shm.h>
                     85: 
                     86: 
                     87: ngx_int_t
                     88: ngx_shm_alloc(ngx_shm_t *shm)
                     89: {
                     90:     int  id;
                     91: 
                     92:     id = shmget(IPC_PRIVATE, shm->size, (SHM_R|SHM_W|IPC_CREAT));
                     93: 
                     94:     if (id == -1) {
                     95:         ngx_log_error(NGX_LOG_ALERT, shm->log, ngx_errno,
                     96:                       "shmget(%uz) failed", shm->size);
                     97:         return NGX_ERROR;
                     98:     }
                     99: 
                    100:     ngx_log_debug1(NGX_LOG_DEBUG_CORE, shm->log, 0, "shmget id: %d", id);
                    101: 
                    102:     shm->addr = shmat(id, NULL, 0);
                    103: 
                    104:     if (shm->addr == (void *) -1) {
                    105:         ngx_log_error(NGX_LOG_ALERT, shm->log, ngx_errno, "shmat() failed");
                    106:     }
                    107: 
                    108:     if (shmctl(id, IPC_RMID, NULL) == -1) {
                    109:         ngx_log_error(NGX_LOG_ALERT, shm->log, ngx_errno,
                    110:                       "shmctl(IPC_RMID) failed");
                    111:     }
                    112: 
                    113:     return (shm->addr == (void *) -1) ? NGX_ERROR : NGX_OK;
                    114: }
                    115: 
                    116: 
                    117: void
                    118: ngx_shm_free(ngx_shm_t *shm)
                    119: {
                    120:     if (shmdt(shm->addr) == -1) {
                    121:         ngx_log_error(NGX_LOG_ALERT, shm->log, ngx_errno,
                    122:                       "shmdt(%p) failed", shm->addr);
                    123:     }
                    124: }
                    125: 
                    126: #endif

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>