This is the mail archive of the newlib@sourceware.org mailing list for the newlib project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

non-portable sigjmp_buf


Hi,

I'm using the sigjmp_buf definition in libc/include/machine/setjmp.h
for my operating system, which runs on the amd64 architecture:

  typedef int sigjmp_buf[_JBLEN+2];

There are two issues with this definition that prevent it from
generalizing.  First, it assumes that _JBLEN is in integer-sized
units.  This is not always the case: if _JBTYPE is defined, then that
is the type that should be used (cf. jmp_buf's definition).  Second,
it assumes that the size of sigset_t is an integer.  This is not
necessarily the case.  On my system, for instance, sigset_t is a
64-bit quantity.  The attach patch corrects both of these problems.
(The definition is modelled after jmp_buf's definition.)

There remains a small issue with this approach, which is that on
32-bit architectures with 64-bit sigset_t's, sigsetjmp and siglongjmp
may do an unaligned write or read, respectively, when saving the
signal mask.  This could be fixed for platforms that decide to use
these definitions in the future by changing the definition and the
sigsetjmp and siglongjmp implementation, however, this is rather
messy.  An alternative is to change the definition of sigjmp_buf to be
a structure:

  struct _sigjmp_buf
  {
    _JBTYPE buf[_JBLEN];
    int saved_mask;
    sigset_t mask;
  };
  typedef struct _sigjmp_buf sigjmp_buf[1];

This is backwards compatible with the current ABI as all users
currently assume that the size of registers and sigset_t are equal to
sizeof (int).

Neal

2009-05-02  Neal H. Walfield  <neal@gnu.org>

	* libc/include/machine/setjmp.h (sigjmp_buf): Size according to
	_JBTYPE and the size of sigset_t.

--- newlib/newlib/libc/include/machine/setjmp.h	2008-02-29 23:46:46.000000000 +0100
+++ newlib/newlib/libc/include/machine/setjmp.h~	2008-02-29 23:41:19.000000000 +0100
@@ -259,7 +259,11 @@
 #endif
 
 /* POSIX sigsetjmp/siglongjmp macros */
-typedef int sigjmp_buf[_JBLEN+2];
+#ifdef _JBTYPE
+typedef _JBTYPE sigjmp_buf[_JBLEN+1+(sizeof (sigset_t)/sizeof (_JBTYPE))];
+#else
+typedef int sigjmp_buf[_JBLEN+1+(sizeof (sigset_t)/sizeof (int))];
+#endif
 
 #define _SAVEMASK	_JBLEN
 #define _SIGMASK	(_JBLEN+1)


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]