Re: Review of gnio, round 1
- From: Alexander Larsson <alexl redhat com>
- To: Dan Winship <danw gnome org>
- Cc: desrt desrt ca, gtk-devel-list <gtk-devel-list gnome org>, gicmo gnome org
- Subject: Re: Review of gnio, round 1
- Date: Mon, 27 Apr 2009 22:32:18 +0200
On Mon, 2009-04-27 at 13:22 -0400, Dan Winship wrote:
> There are also other flags we might want to think about. In libsoup, all
> sockets get marked FD_CLOEXEC because of a long-ago bug. (The Red Carpet
> daemon used librpm to do stuff, and librpm would spawn postinstall
> scripts without doing the necessary cleanup like closing fds, and so
> sometimes you'd try to restart rcd, and it would fail to start up again,
> because some process like cupsd which had previously been restarted by
> rcd now was holding a leaked copy of the old rcd process's listening
> socket, and so the new rcd process couldn't re-bind that address.)
> Anyway, ideally people would use spawning APIs that cleaned up fds
> properly, but the fact is, unless you're writing inetd, you generally
> don't intend to hand off your sockets to child processes anyway, so
> setting FD_CLOEXEC unconditionally (or using SOCK_CLOEXEC where
> available) generally makes sense.
There is also SO_KEEPALIVE which seems to see some use. And possibly
SO_LINGER, although that seems fraught with problems.
> > Win32 issues:
>
> I'd filed a bug about some other win32 issues over the weekend.
> (http://bugzilla.gnome.org/show_bug.cgi?id=580236)
More todo... Need to get some win32 people involved to test this stuff.
> > * Need to check errors from WSAStartup
>
> Would it be better to have only one place in gio that calls WSAStartup?
> (Currently that's g_inet_address_get_type().)
Yes, i forgot that. I think thats a good place. I'll fix that.
> > We don't currently allow passing in the protocol to the socket. This
> > means we can't for instance use SCTP (the upcomming TCP replacement)
> > with GSocket.
>
> I imagine the theory is that G_SOCKET_TYPE_STREAM,
> G_SOCKET_TYPE_DATAGRAM, and G_SOCKET_TYPE_SEQPACKET invariably also
> imply tcp, udp, and sctp, respectively.
Well, you can use sctp in the one-to-one mode with SOCK_STREAM too. I'll
add the protocol argument so the user can explicitly pick one.
> > g_socket_finalize closes socket even if g_socket_close() is already
> > closed, need to add an is_closed variable. We should also check this in
> > all operations so that we don't accidentally call stuff on an fd that
> > may have been reused by now.
>
> libsoup's solution here is to implement "close" as
> shutdown(fd,SHUT_RDWR), and only actually call close(fd) at finalization
> time.
Whats the advantage here over close() and then setting some is_closed
bit?
> > GSocketConnection *g_socket_connection_connect_to_host (const gchar
> > *host,
> > const gchar
> > *default_port,
> > GCancellable *cancellable,
> > GError **error);
>
> IMHO, ports should always be numbers, not strings. getservbyname() is
> useless, because you want your app to work on last year's distro that
> doesn't know about this year's protocols. So apps should just provide a
> #define for their port number and use that, rather than hoping that the
> service's name will be in /etc/services.
I agree.
> > The unix socket code really should support linux-style abstract
> > socketnames. Ideally in some way that makes it easy to fall back if this
> > is not supported.
>
> My vision of how this works is something like:
>
> - GUnixSocket{Connection,Service} - does unix sockets. Has APIs for
> using abstract names, but they return G_IO_ERROR_NOT_SUPPORTED on
> non-Linux.
>
> - GWin32NamedPipe{Connection,Service} - a Windows named pipe.
> Implements GIOStream, but is not related to any of the socket
> types.
>
> - GNamedBidirectionalIPC{Connection,Service} - Takes an
> application name and a channel name, and a flag for "session" or
> "system" level, and then "it does something", such that if one
> app makes the server and another app makes a client with the
> same parameters, then they can talk to each other. On Windows,
> this would use a named pipe, on Linux it would use abstract
> sockets, on other unixes, it would use a unix socket in /tmp.
> Or maybe it passes fds over D-Bus. And maybe on OS X it uses
> Mach ports.
I like the basic idea, but.... soo ... many ... classes... :)
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]