Annotation of embedaddon/nginx/src/os/unix/ngx_shmem.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: #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>