]> jspc29.x-matter.uni-frankfurt.de Git - daqdata.git/commitdiff
POSIX semaphores to SYSV semaphores adapter added
authorhadaq <hadaq>
Tue, 20 Aug 2002 12:27:50 +0000 (12:27 +0000)
committerhadaq <hadaq>
Tue, 20 Aug 2002 12:27:50 +0000 (12:27 +0000)
compat/Makefile.am
compat/Makefile.in
compat/configure
compat/configure.in
compat/examples/Makefile.in
compat/semaphore.c [new file with mode: 0644]
compat/semaphore.h [new file with mode: 0644]

index 5f7a4f5991a28832be14530049d65efb87af3396..7196ca55e606d258627edd5fabe99e84ac69db79 100644 (file)
@@ -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@
index 3891f6869b17259712ab84e18b0c2fccfcd3534f..05f7820e363435c7e6d2dac27f1da40f4a8bf9c3 100644 (file)
@@ -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)
 
index 969fe00eb8015198c8590a302be4226de0740cb4..e1fcc317a77941f07c930737b7cfca0391cbc331 100644 (file)
@@ -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 <<EOF
+#line 1375 "configure"
+#include "confdefs.h"
+#define _POSIX_C_SOURCE 199309L
+#include <unistd.h>
+#include <fcntl.h>
+#include <semaphore.h>
+#include <stdlib.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+
+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
index 9c9c35541f021d6b15f755767adf57f2424bda49..68fe68fbfb8c5545eeb00379527ccb11c6478fbd 100644 (file)
@@ -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 <unistd.h>
+#include <fcntl.h>
+#include <semaphore.h>
+#include <stdlib.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+
+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)
index 22b69c001b9d4288cb047918dc0a631ad1fa0949..e2f1beb677505bc107256b6da128aed6d77dab55 100644 (file)
@@ -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 (file)
index 0000000..0a0cb45
--- /dev/null
@@ -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 <unistd.h>
+
+#include <errno.h>
+#include <limits.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <sys/types.h>
+#include <sys/ipc.h>
+#include <sys/sem.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+
+#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 (file)
index 0000000..aaaa7d9
--- /dev/null
@@ -0,0 +1,22 @@
+#ifndef OUR_SEMAPHORE_H
+#define OUR_SEMAPHORE_H
+
+#include <sys/types.h>
+
+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