Date: Mon, 15 Sep 1997 02:22:55 +0000 (GMT) From: Terry Lambert <tlambert@primenet.com> To: karpen@ocean.campus.luth.se (Mikael Karpberg) Cc: tlambert@primenet.com, julian@whistle.com, mike@smith.net.au, gram@cdsec.com, hackers@FreeBSD.ORG Subject: Re: Memory leak in getservbyXXX? Message-ID: <199709150222.TAA11074@usr09.primenet.com> In-Reply-To: <199709150033.CAA01290@ocean.campus.luth.se> from "Mikael Karpberg" at Sep 15, 97 02:33:48 am
next in thread | previous in thread | raw e-mail | index | archive | help
> That seems... DUMB! Returning something that the user must free instead of
> static buffers, when that's the normal behaviour is just very very bad.
Say I have one of these little jewels of a function:
char *
static_copy( char *src)
{
static copy[ 128];
strcpy( copy, src);
return copy;
}
Now say I have two threads:
thread1()
{
char *pcopy;
... something that takes a medium time ...
pcopy = static_copy( "thread 1 data");
... something that takes a long time ...
... dosomething with pcopy ...
}
thread2()
{
char *pcopy;
... something that takes a short time ...
pcopy = static_copy( "thread 2 data");
... something that takes a medium time ...
... dosomething with pcopy ...
}
And I run thread 1 at the same time as thread 2.
What does the buffer from the function contain when thread 1
goes to use it?
What does it contain when thread 2 goes to used it?
Someone gets screwed, don't they?
> Three words: Thread local storage.
One function name:
CreateFreeeThreadedMarshallerSoICanGetAtMyOwnDamnAddressSpace()
for instanced classes and objects.
The *really* correct way to fix this is:
somefunction( arguments, user_buffer_for_result);
This ensures the data is thread local, without totally screwing up
the ability to pass data by pointer among threads.
And unlike traditional thread local starage, I don't have to
rewrite my PTE's every time I allocate some storage, and I
don't have to either go into kernel mode or run with three
protection domains instead of two in order to have seperate per
thread allocation spaces. And my thread-thread context switch
within a single process isn't nearly as high overhead.
> Let each tread have its OWN static buffer. This is actually nicer in some
> ways then having the programmer pass buffers to pointers, etc, in *_r
> versions of calls. It's nicer because it's less work for the user of the
> library. And returning something the user must free is just out of the
> question. That's ugly beyond belief. Everyone deals with their own memory.
> Libraries too.
Static buffers in library functions are what is ugly beyond belief.
> All that is needed is [ ... ]
Congradulations; you've reinvented intra-process inter-thread data
marshalling... welcome to the Microsoft "Viper" framework and the
ActiveX Template Library version 1.2.
> Then just allocate that struct with malloc, and make a pointer
> in TLS point to it. [ ... ]
But why stop at Microsoft's Common Object Model (the UNIX version is
called CORBA, by the way, and is generally preferred by UNIX people,
as it's an open standard -- ie: documented somewhere), when you can
go full steam ahead and invent Macintosh memory handles as well?
AUGH!
> /Mikael -- donning asbesto suit
Lucky you were wearing the suit... 8-).
Regards,
Terry Lambert
terry@lambert.org
---
Any opinions in this posting are my own and not those of my present
or previous employers.
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199709150222.TAA11074>
