2 * Copyright (c) 2004 Teodor Sigaev <teodor@sigaev.ru>
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
13 * 3. Neither the name of the author nor the names of any co-contributors
14 * may be used to endorse or promote products derived from this software
15 * without specific prior written permission.
17 * THIS SOFTWARE IS PROVIDED BY CONTRIBUTORS ``AS IS'' AND ANY EXPRESS
18 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20 * ARE DISCLAIMED. IN NO EVENT SHALL CONTRIBUTORS BE LIABLE FOR ANY
21 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
23 * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
25 * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
26 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
27 * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32 #include <sys/types.h>
45 attachSharedMemory(int key, char *path, int size, int rdonly) {
50 if ( size>0 && rdonly )
53 shm_key = ftok( (path) ? path : PATH, (key) ? key : KEY); /* Get IPC key */
54 if ((int) shm_key == -1)
55 tlog(TL_CRIT|TL_EXIT, "Ftok error: %s", strerror(errno));
58 flags = IPC_CREAT | IPC_EXCL | 0644;
60 shm_id = shmget(shm_key, size, flags); /* Get SHM segment */
62 if ( errno == EEXIST || errno == ENOENT )
65 tlog(TL_CRIT|TL_EXIT, "shmget error: %s", strerror(errno));
68 flags = ( rdonly ) ? SHM_RDONLY : 0;
70 shm = shmat(shm_id, 0, flags); /* Attach SHM segment */
71 if ( shm == (void*)-1 )
72 tlog(TL_CRIT|TL_EXIT, "shmat error: %s", strerror(errno));
78 detachSharedMemory(void *shm) {
79 if ( shmdt(shm) == -1 )
80 tlog(TL_CRIT, "shmdt error: %s", strerror(errno));
84 attachSemaphore(int key, char *path) {
88 shm_key = ftok( (path) ? path : PATH, (key) ? key : KEY); /* Get IPC key */
89 if ((int) shm_key == -1)
90 tlog(TL_CRIT|TL_EXIT, "Ftok error: %s", strerror(errno));
92 sem_id = semget(shm_key, 1, 0);
94 if ( errno == ENOENT ) { /* not exists */
95 sem_id = semget(shm_key, 1, IPC_CREAT | IPC_EXCL | 0644);
97 tlog(TL_CRIT|TL_EXIT, "semget error: %s", strerror(errno));
98 if ( semctl( sem_id, 0, SETVAL, 1 ) == -1 )
99 tlog(TL_CRIT|TL_EXIT, "sysctl error: %s", strerror(errno));
101 tlog(TL_CRIT|TL_EXIT, "semget error: %s", strerror(errno));
106 void releaseSemaphore(int sem_id) {
113 if (semop(sem_id, &sem, 1) == -1)
114 tlog(TL_CRIT|TL_EXIT, "semop error: %s", strerror(errno));
117 void lockSemaphore(int sem_id) {
124 if (semop(sem_id, &sem, 1) == -1)
125 tlog(TL_CRIT|TL_EXIT, "semop error: %s", strerror(errno));