/* * Copyright (c) 2019 TAOS Data, Inc. * * This program is free software: you can use, redistribute, and/or modify * it under the terms of the GNU Affero General Public License, version 3 * or later ("AGPL"), as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ #define ALLOW_FORBID_FUNC #define _DEFAULT_SOURCE #include "os.h" int32_t taosCreateShm(SShm* pShm, int32_t shmsize) { int32_t shmid = shmget(IPC_PRIVATE, shmsize, IPC_CREAT | 0600); if (shmid < 0) { return -1; } void* shmptr = shmat(shmid, NULL, 0); if (shmptr == NULL) { return -1; } pShm->id = shmid; pShm->size = shmsize; pShm->ptr = shmptr; return 0; } void taosDropShm(SShm* pShm) { if (pShm->id > 0) { if (pShm->ptr != NULL) { shmdt(pShm->ptr); } shmctl(pShm->id, IPC_RMID, NULL); } pShm->id = 0; pShm->size = 0; pShm->ptr = NULL; } int32_t taosAttachShm(SShm* pShm) { if (pShm->id > 0 && pShm->size > 0) { pShm->ptr = shmat(pShm->id, NULL, 0); if (pShm->ptr != NULL) { return 0; } } return -1; } void taosDetachShm(SShm* pShm) { if (pShm->id > 0) { if (pShm->ptr != NULL) { shmdt(pShm->ptr); pShm->ptr = NULL; } } pShm->id = 0; pShm->size = 0; pShm->ptr = NULL; }