Re: [Vala] How to wrap select(2)'s fd_set?
- From: "Michael 'Mickey' Lauer" <mickey vanille-media de>
- To: vala-list gnome org
- Subject: Re: [Vala] How to wrap select(2)'s fd_set?
- Date: Thu, 5 Feb 2009 14:01:13 +0100
Am Friday 30 January 2009 14:26:51 schrieb Michael 'Mickey' Lauer:
Am Friday 30 January 2009 08:30:43 schrieb Jürg Billeter:
FdSet should be a struct, not a class, we do not need reference type
semantics here. This eliminates unnecessary heap allocation. FD_ZERO
should be bound as initialization method as it just zeroes the streuct.
Understood.
[CCode (cname = "fd_set", cheader_filename = "sys/select.h"]
public struct FdSet {
[CCode (cname = "FD_ZERO")]
public FdSet ();
...
}
With this change, I get a strange C-compilation error:
/local/pkg/fso/fso-gsm0710muxd/src/multiplexer.c: In
Funktion »multiplexer_writefd«:
/local/pkg/fso/fso-gsm0710muxd/src/multiplexer.c:324: Fehler: expected
expression before »do«
/local/pkg/fso/fso-gsm0710muxd/src/multiplexer.c:325: Fehler: expected
expression before »do«
/local/pkg/fso/fso-gsm0710muxd/src/multiplexer.c:326: Fehler: expected
expression before »do«
The respective generated code is:
gboolean multiplexer_writefd (Multiplexer* self, const char* command, gint
fd) {
fd_set _tmp0 = {0};
fd_set readfds;
fd_set _tmp1 = {0};
fd_set writefds;
fd_set _tmp2 = {0};
fd_set exceptfds;
struct timeval t = {(glong) 1, (glong) 0};
gint r;
gboolean _tmp3;
gssize bwritten;
g_return_val_if_fail (self != NULL, FALSE);
g_return_val_if_fail (command != NULL, FALSE);
readfds = (FD_ZERO (&_tmp0), _tmp0);
writefds = (FD_ZERO (&_tmp1), _tmp1);
exceptfds = (FD_ZERO (&_tmp2), _tmp2);
FD_SET (fd, &writefds);
...
I have no idea where this 'do' comes from.
Ok, I now found out:
FD_ZERO is defined as __FD_ZERO which in turn is defined as:
/* We don't use `memset' because this would require a prototype and
the array isn't too big. */
#define __FD_ZERO(s) \
do { \
unsigned int __i; \
fd_set *__arr = (s); \
for (__i = 0; __i < sizeof (fd_set) / sizeof (__fd_mask); ++__i) \
__FDS_BITS (__arr)[__i] = 0; \
} while (0)
The valac-generated part
readfds = (FD_ZERO (&_tmp0), _tmp0);
is a syntax error then.
Anything we can do about that or just give in and leaving FdSet a full class?
--
:M:
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]