[alsa-devel] [alsa-cvslog] alsa-lib: Add struct timeval and timespec definition when _POSIX_C_SOURCE is not defined

Sergey Vlasov vsu at altlinux.ru
Mon Jun 25 17:24:56 CEST 2007

On Mon, Jun 25, 2007 at 03:15:39PM +0200, Takashi Iwai wrote:
> > #include <sys/select.h>
> > #include <alsa/global.h>
> > 
> > $ gcc -c --std=c99 x.c
> > In file included from x.c:2:
> > /usr/include/alsa/global.h:134: error: redefinition of 'struct timeval'
> > /usr/include/alsa/global.h:139: error: redefinition of 'struct timespec'
> > 
> > (Without #include <sys/select.h> only 'struct timespec' is redefined.)
> > 
> > IMHO attempts to define structures which should be defined by system
> > headers are too dangerous - if someone is using preprocessor flags
> > which hide required parts of system headers, it is their problem, and
> > the risk of mismatch is too high.
> I agree.
> Jaroslav, which system has no definition of these types?  Maybe it'd
> be better to check it in configure script, rather than the simple
> ifdef.

This won't help here - the above problem happens when alsa-lib headers
are used by other programs, not when alsa-lib is built itself.

> > BTW, <time.h> does not provide 'struct timeval' at all, even with
> > _GNU_SOURCE - it defines only 'struct timespec'; however, this does
> > not cause problems, because ALSA headers currently use only pointers
> > to snd_timestamp_t, which works even without a complete definition of
> > 'struct timeval'.  We can try to include <sys/time.h> to get 'struct
> > timeval', or even <sys/select.h> (which currently seems to provide
> > both 'struct timeval' and 'struct timespec' even with -ansi, and
> > http://www.opengroup.org/onlinepubs/009695399/basedefs/sys/select.h.html
> > tells that it should always provide their definitions).
> A patch is welcome :)

Just not sure which one...

The situation on my system (with glibc-2.5) is as follows:

 - <time.h> defines 'struct timespec', unless -ansi (or -std=c99)
   option is used; it never defines 'struct timeval', even with
   -D_GNU_SOURCE (which should enable everything).  This means that if
   only <time.h> is used, alsa/timer.h will not compile with -ansi due
   to the 'snd_htimestamp_t tstamp' member in snd_timer_tread_t,
   unless the program includes some other header which defines 'struct
   timespec' before alsa/timer.h.

 - <sys/time.h> defines both 'struct timeval' and 'struct timespec',
   even with -ansi; however, according to the current Open Group spec
   <sys/time.h> must provide only 'struct timeval' and is not required
   to provide 'struct timespec', so the behavior may change in a
   future glibc release - again, a missing 'struct timespec'
   definition is fatal for alsa/timer.h.

 - <sys/select.h> defines both 'struct timeval' and 'struct timespec'
   even with -ansi.  In the Open Group spec <sys/select.h> is
   specified to define 'struct timeval', and also define 'struct
   timespec' "as described in <time.h>" (where it is described as
   optional), so it should be not worse than <time.h>.

Would it be OK to include <sys/select.h> instead of <time.h> and
remove attempt to define system structs from alsa/global.h?  Another
option is to include both <time.h> and <sys/time.h>.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: Digital signature
Url : http://mailman.alsa-project.org/pipermail/alsa-devel/attachments/20070625/ed82606b/attachment.sig 

More information about the Alsa-devel mailing list