From 49a3448b7074ad8c780aca7daad1d8f854905ee1 Mon Sep 17 00:00:00 2001 From: hadaq Date: Tue, 20 Aug 2002 12:27:50 +0000 Subject: [PATCH] POSIX semaphores to SYSV semaphores adapter added --- compat/Makefile.am | 10 +-- compat/Makefile.in | 14 ++-- compat/configure | 60 ++++++++++++++- compat/configure.in | 39 +++++++++- compat/examples/Makefile.in | 2 + compat/semaphore.c | 149 ++++++++++++++++++++++++++++++++++++ compat/semaphore.h | 22 ++++++ 7 files changed, 282 insertions(+), 14 deletions(-) create mode 100644 compat/semaphore.c create mode 100644 compat/semaphore.h diff --git a/compat/Makefile.am b/compat/Makefile.am index 5f7a4f5..7196ca5 100644 --- a/compat/Makefile.am +++ b/compat/Makefile.am @@ -1,10 +1,10 @@ AUTOMAKE_OPTIONS = foreign -include_HEADERS = @libgen_header@ @stdint_header@ @syslog_header@ -EXTRA_HEADERS = libgen.h stdint.h syslog.h +include_HEADERS = @libgen_header@ @stdint_header@ @syslog_header@ @semaphore_header@ +EXTRA_HEADERS = libgen.h stdint.h syslog.h semaphore.h lib_LIBRARIES = libcompat.a libcompat_a_SOURCES = -EXTRA_libcompat_a_SOURCES = syslog.c -libcompat_a_LIBADD = @syslog_object@ -libcompat_a_DEPENDENCIES = @syslog_object@ +EXTRA_libcompat_a_SOURCES = syslog.c semaphore.c +libcompat_a_LIBADD = @syslog_object@ @semaphore_object@ +libcompat_a_DEPENDENCIES = @syslog_object@ @semaphore_object@ diff --git a/compat/Makefile.in b/compat/Makefile.in index 3891f68..05f7820 100644 --- a/compat/Makefile.in +++ b/compat/Makefile.in @@ -64,20 +64,22 @@ PACKAGE = @PACKAGE@ RANLIB = @RANLIB@ VERSION = @VERSION@ libgen_header = @libgen_header@ +semaphore_header = @semaphore_header@ +semaphore_object = @semaphore_object@ stdint_header = @stdint_header@ syslog_header = @syslog_header@ syslog_object = @syslog_object@ AUTOMAKE_OPTIONS = foreign -include_HEADERS = @libgen_header@ @stdint_header@ @syslog_header@ -EXTRA_HEADERS = libgen.h stdint.h syslog.h +include_HEADERS = @libgen_header@ @stdint_header@ @syslog_header@ @semaphore_header@ +EXTRA_HEADERS = libgen.h stdint.h syslog.h semaphore.h lib_LIBRARIES = libcompat.a libcompat_a_SOURCES = -EXTRA_libcompat_a_SOURCES = syslog.c -libcompat_a_LIBADD = @syslog_object@ -libcompat_a_DEPENDENCIES = @syslog_object@ +EXTRA_libcompat_a_SOURCES = syslog.c semaphore.c +libcompat_a_LIBADD = @syslog_object@ @semaphore_object@ +libcompat_a_DEPENDENCIES = @syslog_object@ @semaphore_object@ ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 mkinstalldirs = $(SHELL) $(top_srcdir)/config/mkinstalldirs CONFIG_CLEAN_FILES = @@ -103,7 +105,7 @@ DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) TAR = gtar GZIP_ENV = --best -DEP_FILES = .deps/syslog.P +DEP_FILES = .deps/semaphore.P .deps/syslog.P SOURCES = $(libcompat_a_SOURCES) $(EXTRA_libcompat_a_SOURCES) OBJECTS = $(libcompat_a_OBJECTS) diff --git a/compat/configure b/compat/configure index 969fe00..e1fcc31 100644 --- a/compat/configure +++ b/compat/configure @@ -694,9 +694,9 @@ else fi -PACKAGE=config +PACKAGE=compat -VERSION=0.3 +VERSION=0.4 if test "`cd $srcdir && pwd`" != "`pwd`" && test -f $srcdir/config.status; then { echo "configure: error: source directory already configured; run "make distclean" there first" 1>&2; exit 1; } @@ -1365,6 +1365,60 @@ fi +echo $ac_n "checking whether _POSIX_SEMAPHORES works""... $ac_c" 1>&6 +echo "configure:1370: checking whether _POSIX_SEMAPHORES works" >&5 +if test "$cross_compiling" = yes; then + { echo "configure: error: can not run test program while cross compiling" 1>&2; exit 1; } +else + cat > conftest.$ac_ext < +#include +#include +#include +#include +#include + +int main() { + int retVal; + sem_t *sem; + + sem = sem_open("/foobar", O_CREAT, S_IRWXU, 0); + if ((sem_t *) -1 == sem || NULL == sem) { + retVal = EXIT_FAILURE; + } else { + retVal = EXIT_SUCCESS; + sem_close(sem); + sem_unlink("/foobar"); + } + exit(retVal); +} + +EOF +if { (eval echo configure:1401: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +then + echo "$ac_t"""yes"" 1>&6 + semaphore_header= + semaphore_object= + +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -fr conftest* + echo "$ac_t"""no"" 1>&6 + semaphore_header=semaphore.h + semaphore_object=semaphore.o + +fi +rm -fr conftest* +fi + + + + + trap '' 1 2 15 cat > confcache <<\EOF @@ -1532,6 +1586,8 @@ s%@libgen_header@%$libgen_header%g s%@stdint_header@%$stdint_header%g s%@syslog_header@%$syslog_header%g s%@syslog_object@%$syslog_object%g +s%@semaphore_header@%$semaphore_header%g +s%@semaphore_object@%$semaphore_object%g CEOF EOF diff --git a/compat/configure.in b/compat/configure.in index 9c9c355..68fe68f 100644 --- a/compat/configure.in +++ b/compat/configure.in @@ -1,7 +1,7 @@ dnl Process this file with autoconf to produce a configure script. AC_INIT(syslog.c) AC_CONFIG_AUX_DIR(config) -AM_INIT_AUTOMAKE(config, 0.3) +AM_INIT_AUTOMAKE(compat, 0.4) AM_MAINTAINER_MODE dnl Checks for programs. @@ -57,5 +57,42 @@ AC_SUBST(syslog_object) dnl Checks for typedefs, structures, and compiler characteristics. dnl Checks for library functions. +AC_MSG_CHECKING([whether _POSIX_SEMAPHORES works]) +AC_TRY_RUN( +#define _POSIX_C_SOURCE 199309L +#include +#include +#include +#include +#include +#include + +int main() { + int retVal; + sem_t *sem; + + sem = sem_open("/foobar", O_CREAT, S_IRWXU, 0); + if ((sem_t *) -1 == sem || NULL == sem) { + retVal = EXIT_FAILURE; + } else { + retVal = EXIT_SUCCESS; + sem_close(sem); + sem_unlink("/foobar"); + } + exit(retVal); +} +, + AC_MSG_RESULT("yes") + semaphore_header= + semaphore_object= +, + AC_MSG_RESULT("no") + semaphore_header=semaphore.h + semaphore_object=semaphore.o +) + +AC_SUBST(semaphore_header) +AC_SUBST(semaphore_object) + AC_OUTPUT(Makefile examples/Makefile) diff --git a/compat/examples/Makefile.in b/compat/examples/Makefile.in index 22b69c0..e2f1beb 100644 --- a/compat/examples/Makefile.in +++ b/compat/examples/Makefile.in @@ -64,6 +64,8 @@ PACKAGE = @PACKAGE@ RANLIB = @RANLIB@ VERSION = @VERSION@ libgen_header = @libgen_header@ +semaphore_header = @semaphore_header@ +semaphore_object = @semaphore_object@ stdint_header = @stdint_header@ syslog_header = @syslog_header@ syslog_object = @syslog_object@ diff --git a/compat/semaphore.c b/compat/semaphore.c new file mode 100644 index 0000000..0a0cb45 --- /dev/null +++ b/compat/semaphore.c @@ -0,0 +1,149 @@ +static char *rcsId = "$Header: /misc/hadesprojects/daq/cvsroot/eventbuilder/compat/semaphore.c,v 1.1 2002-08-20 12:27:50 hadaq Exp $"; + + +#define _XOPEN_SOURCE +#include + +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#if !(defined(__Lynx__) || (defined(__linux) && __GNUC_MINOR__ < 91)) +union semun { + int val; + struct semid_ds *buf; + unsigned short *array; +}; + +#endif + +#include "semaphore.h" + +static char *name2Path(char *path, char *name) +{ + char *prefix; + + if (NULL == (prefix = getenv("OUR_SEMAPHORE_PREFIX"))) { + prefix = ""; + } + if (strlen(prefix) + strlen(name) + 1 > _POSIX_PATH_MAX) { + errno = ENAMETOOLONG; + path = NULL; + } else { + strcpy(path, prefix); + strcat(path, name); + } + return path; +} + +sem_t *SEMAPHORE_sem_open(char *name, int oflags, mode_t mode, unsigned int value) +{ + int *sem; + char path[_POSIX_PATH_MAX]; + key_t key; + int semflg; + int fd; + union semun arg; + + if (NULL == name2Path(path, name)) { + return (sem_t *) -1; + } + if (0 > (fd = open(path, oflags, mode))) { + return (sem_t *) -1; + } + if ((key_t) - 1 == (key = ftok(path, 'A'))) { + close(fd); + return (sem_t *) -1; + } + close(fd); + + if (NULL == (sem = malloc(sizeof(int)))) { + return (sem_t *) -1; + } + semflg = mode; /* BUGBUG This depends on ipc modes having + the same */ + /* semantics as file modes */ + if ((oflags & O_CREAT) != 0) { + semflg |= IPC_CREAT; + } + if ((oflags & O_EXCL) != 0) { + semflg |= IPC_EXCL; + } + if (semget(key, 1, 0) != -1) { /* semaphore existst already */ + if (0 > (*sem = semget(key, 1, semflg))) { + free(sem); + return (sem_t *) -1; + } + } else { + arg.val = value; + if (0 > (*sem = semget(key, 1, semflg)) + || 0 > semctl(*sem, 0, SETVAL, arg) + ) { + free(sem); + return (sem_t *) -1; + } + } + return sem; +} + +int SEMAPHORE_sem_close(sem_t *sem) +{ + free(sem); + return 0; +} + +int SEMAPHORE_sem_unlink(char *name) +{ + int retVal; + sem_t semS, *sem = &semS; + char path[_POSIX_PATH_MAX]; + key_t key; + union semun arg; + + retVal = 0; + + arg.val = 0; + if ( + NULL == name2Path(path, name) + || (key_t) - 1 == (key = ftok(path, 'A')) + || 0 > (*sem = semget(key, 1, 0)) + || 0 > semctl(*sem, 0, IPC_RMID, arg) + ) { + retVal = -1; + } + if (-1 == unlink(path)) { + retVal = -1; + } + return retVal; +} + +int SEMAPHORE_sem_wait(sem_t *sem) +{ + static struct sembuf waitOpS = + {0, -1, 0}, *waitOp = &waitOpS; + + return semop(*sem, waitOp, 1); +} + +int SEMAPHORE_sem_trywait(sem_t *sem) +{ + static struct sembuf trywaitOpS = + {0, -1, IPC_NOWAIT}, *trywaitOp = &trywaitOpS; + + return semop(*sem, trywaitOp, 1); +} + +int SEMAPHORE_sem_post(sem_t *sem) +{ + static struct sembuf postOpS = + {0, +1, 0}, *postOp = &postOpS; + + return semop(*sem, postOp, 1); +} diff --git a/compat/semaphore.h b/compat/semaphore.h new file mode 100644 index 0000000..aaaa7d9 --- /dev/null +++ b/compat/semaphore.h @@ -0,0 +1,22 @@ +#ifndef OUR_SEMAPHORE_H +#define OUR_SEMAPHORE_H + +#include + +typedef int sem_t; + +#define sem_open SEMAPHORE_sem_open +#define sem_close SEMAPHORE_sem_close +#define sem_unlink SEMAPHORE_sem_unlink +#define sem_wait SEMAPHORE_sem_wait +#define sem_trywait SEMAPHORE_sem_trywait +#define sem_post SEMAPHORE_sem_post + +sem_t *SEMAPHORE_sem_open(char *name, int oflags, mode_t mode, unsigned int value); +int SEMAPHORE_sem_close(sem_t * sem); +int SEMAPHORE_sem_unlink(char *name); +int SEMAPHORE_sem_wait(sem_t * sem); +int SEMAPHORE_sem_trywait(sem_t * sem); +int SEMAPHORE_sem_post(sem_t * sem); + +#endif -- 2.43.0