svn commit: r301071 - head/sys/sys

Bruce Evans brde at optusnet.com.au
Wed Jun 1 09:32:02 UTC 2016


On Tue, 31 May 2016, Ed Schouten wrote:

> Log:
>  Improve POSIX conformance of <signal.h>.
>
>  - This header file has always depended on pthread_t, pthread_attr_t,
>    struct timespec, size_t and uid_t. Only as of POSIX 2008, these
>    dependencies have been states explicitly. They should now be defined.

Not always.  POSIX didn't have pthreads or timespecs before about 1993.

>  - In our implementation, struct sigevent::sigev_notify_attributes has
>    type "void *" instead of "pthread_attr_t *". My guess is that this was
>    done to prevent pulling in the pthread types, but this can easily be
>    avoided by using the underlying structure types.

Not easily, since the tags of the underlying struct types are in the
application namespace, at least up to POSIX 2001.

> Modified:
>  head/sys/sys/signal.h
>
> Modified: head/sys/sys/signal.h
> ==============================================================================
> --- head/sys/sys/signal.h	Tue May 31 18:45:52 2016	(r301070)
> +++ head/sys/sys/signal.h	Tue May 31 19:05:41 2016	(r301071)
> @@ -45,6 +45,23 @@
> #include <machine/_limits.h>	/* __MINSIGSTKSZ */
> #include <machine/signal.h>	/* sig_atomic_t; trap codes; sigcontext */
>
> +#if __POSIX_VISIBLE >= 200809
> +
> +#include <sys/_pthreadtypes.h>

This gives the following pollution (which breaks almost everything since
<sys/types.h> includes this header:
- struct tag names pthread*
- struct member names state and mutex
POSIX could reasonably be unimproved by reserving pthread* but not ordinary
identifiers like state and mutex.

> ...
> @@ -160,6 +177,9 @@ union sigval {
> #endif
>
> #if __POSIX_VISIBLE >= 199309
> +
> +struct pthread_attr;
> +

The 1993 version certainly doesn't reserve pthread*.

The 1996 version has a nice table of reserved symbols for every header.
For signal.h, they are just ones with a prefix of sa_, si_, sigev_
and sival_ (these shall not be declared or #defined by the application),
and SIG_, SA_, SI_ and SIGEV_ (these may be used by the application iff
they are #undef'ed before use).  This doesn't proprtly separate optional
things.

A draft 2001 version as a not so nice table.  The rules are now too
tangled to present in a single table, so there are several tables that
are hard to parse.  The first table has sa_, uc_ (new), SIG[A-Z]
(stronger), SIG_[A-Z] (weaker).  Then it has ss_ (new) and sv_ (new)
for XSI only.  Then it has si_, SI_, sigev_, SIGEV_ and sival_ for
RTS only.  The second table has SA_, SIG_[0-9a-z_] (different/weaker),
then massive pollution: BUS_, CLD_, FPE_, ILL_, POLL_, SEGV_, SI_
(now in both tables), SS_, SV_ and TRAP_.

A draft 2007 version is like the 2001 version.  It fixes the sorting
of uc_ and makes RTS non-optional.  In the second table, it moves SS_,
SV_ and TRAP_ under XSI, and moves POLL_ under OBS XSR.

I think pthread is not reserved since it is not in these tables.  Later
versions of POSIX were broken to allow <signal.h> to be pollutied
with all the symbols in <time.h>, but I don't want to check what
is in that now.  <time.h> is slightly simpler in POSIX but much
more polluted than <signal.h> in FreeBSD.

> struct sigevent {
> 	int	sigev_notify;		/* Notification type */
> 	int	sigev_signo;		/* Signal number */
> @@ -168,7 +188,7 @@ struct sigevent {
> 		__lwpid_t	_threadid;

Names like _threadid are bogus.  sigev is reserved for uses like this.
Noy using a prefix makes the namespace random.

> 		struct {
> 			void (*_function)(union sigval);
> -			void *_attribute; /* pthread_attr_t * */
> +			struct pthread_attr **_attribute;

pthread is not reserved.  pthread*_t is only reserved by the general
rule that everything ending in _t is reserved.

This also has indentation errors.

> 		} _sigev_thread;

> 		unsigned short _kevent_flags;

Further bogus names.  At least they use a prefix.

> 		long __spare__[8];

A more bogus name.

> @@ -190,6 +210,7 @@ struct sigevent {
> #define	SIGEV_KEVENT	3		/* Generate a kevent. */
> #define	SIGEV_THREAD_ID	4		/* Send signal to a kernel thread. */

It is correct to used the reserved prefix for our extensions, but this style
is inconsistent with old parts of the file.  In the old parts, we ifdef
out extensions to a fault.   This makes the code hard to read but provides
good documentation of what is portable.

> #endif
> +
> #endif /* __POSIX_VISIBLE >= 199309 */
>
> #if __POSIX_VISIBLE >= 199309 || __XSI_VISIBLE
>

Bruce


More information about the svn-src-all mailing list