Date: Sun, 19 Feb 2006 23:39:39 +0530 From: "Joseph Koshy" <joseph.koshy@gmail.com> To: "David Xu" <davidxu@freebsd.org> Cc: Bachilo Dmitry <root@solink.ru>, freebsd-current@freebsd.org Subject: Re: Bad system call (core dumped) Message-ID: <84dead720602191009p5fa3c317w254b13454dbc8cb8@mail.gmail.com> In-Reply-To: <43F16E2D.5010109@freebsd.org> References: <200602101246.31666.root@solink.ru> <200602141023.35850.root@solink.ru> <84dead720602132054y6d114b1eo8126fca84ac8972a@mail.gmail.com> <200602141058.24366.root@solink.ru> <43F1656A.2050100@freebsd.org> <84dead720602132140p1cc2b471h5c25c877b7311791@mail.gmail.com> <43F16E2D.5010109@freebsd.org>
next in thread | previous in thread | raw e-mail | index | archive | help
------=_Part_13861_23762493.1140372579894 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable Content-Disposition: inline jk> Userland code should be checking for kernel support for jk> features before attempting to use them. dx> I don't think user code should check it before it can be dx> used, actually, it is being used by thread libraries to dx> implement named semaphore, it is requred by POSIX. Well, support for posix semaphores is not turned on in GENERIC, and so code that calls sem_init(3) is rudely sent a SIGSYS today. How about the attached patch to make our libraries better behaved with kernels that lack the P1003_1B_SEMAPHORES option? -- FreeBSD Volunteer, http://people.freebsd.org/~jkoshy ------=_Part_13861_23762493.1140372579894 Content-Type: text/plain; name=p.txt; charset=us-ascii Content-Transfer-Encoding: 7bit X-Attachment-Id: f_ejvo90fc Content-Disposition: attachment; filename="p.txt" Index: libc/gen/sem.c =================================================================== RCS file: /cvs/FreeBSD/src/lib/libc/gen/sem.c,v retrieving revision 1.15 diff -u -u -r1.15 sem.c --- libc/gen/sem.c 18 Oct 2005 17:24:03 -0000 1.15 +++ libc/gen/sem.c 19 Feb 2006 17:48:17 -0000 @@ -59,6 +59,7 @@ #include "namespace.h" #include <sys/types.h> #include <sys/queue.h> +#include <sys/sysctl.h> #include <errno.h> #include <fcntl.h> #include <pthread.h> @@ -70,6 +71,7 @@ #include "un-namespace.h" #include "libc_private.h" +static int sem_supported = -1; /* changed by the first call to __sem_init() */ static sem_t sem_alloc(unsigned int value, semid_t semid, int system_sem); static void sem_free(sem_t sem); @@ -140,6 +142,21 @@ __sem_init(sem_t *sem, int pshared, unsigned int value) { semid_t semid; + int mib[2]; + size_t len; + + if (sem_supported < 0) { + mib[0] = CTL_P1003_1B; + mib[1] = CTL_P1003_1B_SEMAPHORES; + len = sizeof(sem_supported); + if (sysctl(mib, 2, &sem_supported, &len, NULL, 0) < 0) + sem_supported = 0; + } + + if (!sem_supported) { + errno = ENOSYS; + return -1; + } /* * We always have to create the kernel semaphore if the Index: libc/gen/sem_init.3 =================================================================== RCS file: /cvs/FreeBSD/src/lib/libc/gen/sem_init.3,v retrieving revision 1.18 diff -u -u -r1.18 sem_init.3 --- libc/gen/sem_init.3 13 Jul 2005 13:15:21 -0000 1.18 +++ libc/gen/sem_init.3 19 Feb 2006 18:02:56 -0000 @@ -78,6 +78,10 @@ .Dv SEM_VALUE_MAX . .It Bq Er ENOSPC Memory allocation error. +.It Bq Er ENOSYS +The system does not support +.Tn POSIX +semaphores. .It Bq Er EPERM Unable to initialize a shared semaphore. .El @@ -94,6 +98,12 @@ function conforms to .St -p1003.1-96 . .Pp +Support for +.Tn POSIX +semaphores requires the currently running kernel to have been configured +with +.Cd "options P1003_1B_SEMAPHORES" . +.Pp This implementation does not support shared semaphores, and reports this fact by setting .Va errno Index: libthr/thread/thr_sem.c =================================================================== RCS file: /cvs/FreeBSD/src/lib/libthr/thread/thr_sem.c,v retrieving revision 1.6 diff -u -u -r1.6 thr_sem.c --- libthr/thread/thr_sem.c 1 Sep 2005 15:21:23 -0000 1.6 +++ libthr/thread/thr_sem.c 19 Feb 2006 17:34:56 -0000 @@ -32,6 +32,7 @@ #include "namespace.h" #include <sys/types.h> +#include <sys/sysctl.h> #include <sys/queue.h> #include <errno.h> #include <fcntl.h> @@ -44,6 +45,7 @@ #include "thr_private.h" +static int sem_supported = -1; /* changed by the first call to _sem_init() */ __weak_reference(_sem_init, sem_init); __weak_reference(_sem_destroy, sem_destroy); @@ -99,6 +101,21 @@ _sem_init(sem_t *sem, int pshared, unsigned int value) { semid_t semid; + int mib[2]; + size_t len; + + if (sem_supported < 0) { + mib[0] = CTL_P1003_1B; + mib[1] = CTL_P1003_1B_SEMAPHORES; + len = sizeof(sem_supported); + if (sysctl(mib, 2, &sem_supported, &len, NULL, 0) < 0) + sem_supported = 0; + } + + if (!sem_supported) { + errno = ENOSYS; + return -1; + } semid = (semid_t)SEM_USER; if ((pshared != 0) && (ksem_init(&semid, value) != 0)) Index: libpthread/thread/thr_sem.c =================================================================== RCS file: /cvs/FreeBSD/src/lib/libpthread/thread/thr_sem.c,v retrieving revision 1.17 diff -u -u -r1.17 thr_sem.c --- libpthread/thread/thr_sem.c 1 Sep 2005 15:16:46 -0000 1.17 +++ libpthread/thread/thr_sem.c 19 Feb 2006 17:44:36 -0000 @@ -31,6 +31,7 @@ #include "namespace.h" #include <sys/types.h> +#include <sys/sysctl.h> #include <sys/queue.h> #include <errno.h> #include <fcntl.h> @@ -43,7 +44,6 @@ #include "libc_private.h" #include "thr_private.h" - extern int pthread_cond_wait(pthread_cond_t *, pthread_mutex_t *); extern int pthread_cond_timedwait(pthread_cond_t *, pthread_mutex_t *, struct timespec *); @@ -53,6 +53,7 @@ __weak_reference(_sem_timedwait, sem_timedwait); __weak_reference(_sem_post, sem_post); +static int sem_supported = -1; /* changed by the first call to _sem_init() */ static inline int sem_check_validity(sem_t *sem) @@ -123,6 +124,21 @@ _sem_init(sem_t *sem, int pshared, unsigned int value) { semid_t semid; + int mib[2]; + size_t len; + + if (sem_supported < 0) { + mib[0] = CTL_P1003_1B; + mib[1] = CTL_P1003_1B_SEMAPHORES; + len = sizeof(sem_supported); + if (sysctl(mib, 2, &sem_supported, &len, NULL, 0) < 0) + sem_supported = 0; + } + + if (!sem_supported) { + errno = ENOSYS; + return -1; + } semid = (semid_t)SEM_USER; if ((pshared != 0) && (ksem_init(&semid, value) != 0)) ------=_Part_13861_23762493.1140372579894--
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?84dead720602191009p5fa3c317w254b13454dbc8cb8>