* Alfred Perlstein <[EMAIL PROTECTED]> [001213 14:20] wrote:
> * Matt Dillon <[EMAIL PROTECTED]> [001213 13:07] wrote:
> > :I believe that your changes have been sorely needed for many
> > :years. While I would like to see regular mbufs given a callback
> > :mechanism, your present approach of using an mbuf cluster
> > :solves 90% of the problem.
> > :
> > : Kirk McKusick
> >
> > ... Aflred, be careful that you don't break things we only just fixed
> > last year. The descriptor passing code has been broken for many years.
> >
> > I think the reason we have to scan the descriptor list is related to
> > locating isolated self-referential 'loops' with descriptor passing and
> > unix domain sockets and closing them. e.g. when you pass a descriptor
> > for a unix-domain socket through a unix-domain socket, it is possible
> > for the socket descriptors to reference each other and thus never have
> > their ref count drop to 0 even when all associated processes have
> > close()'d. This happens all the time. Be sure you don't break the
> > fix that solves that particular problem.
>
> Ok, I'll see if that can happen. Basically since the reference
> never goes to zero on the socket, the buffers are never forced to
> be flushed/cleared and the mbuf will then never be free'd resulting
> it it leaking itself. Basically a socket hanging there with an
> mbuf referencing itself.
>
> I wonder if Linux fixed/has this problem.
Ok, my patch has this problem:
void
parent(int con)
{
int fd;
fd = open("/tmp/wank", O_RDONLY);
send_fd_withdata(con, con, "wank", 4);
sleep (5);
exit(1);
}
void
child(int con)
{
int fd, error;
char buf[100];
sleep(5);
get_fd_withdata(con, &fd, buf, sizeof(buf));
send_fd_withdata(con, fd, "foo", 3);
exit(1);
buf[4] = '\0';
printf("%s\n", buf);
if ((error = read(fd, buf, sizeof(buf))) < 0)
perror("read");
buf[sizeof(buf)-1] = '\0';
printf("%s\n", buf);
}
This causes a leak, I think the trick is to just always call sorflush()
when the pcb is free'd.
Looking at linux they still are using gc. I'll give this a lot
more thought before resubmitting this idea.
sorry,
--
-Alfred Perlstein - [[EMAIL PROTECTED]|[EMAIL PROTECTED]]
"I have the heart of a child; I keep it in a jar on my desk."
To Unsubscribe: send mail to [EMAIL PROTECTED]
with "unsubscribe freebsd-net" in the body of the message