Chromatic
2007-08-08 07:17:17 UTC
# New Ticket Created by chromatic
# Please include the string: [perl #44499]
# in the subject line of all future correspondence about this issue.
# <URL: http://rt.perl.org/rt3/Ticket/Display.html?id=44499 >
The string_from_cstring() function has a slight flaw, in that it has to
allocate a piece of memory and create a C-style string from a nice happy
STRING. It's the responsibility of the caller to discard the C string
appropriately.
This is tricky if that string immediately gets passed to real_exception() or
some other C function which does not return control; there's no chance to
free the string with string_cstring_free().
One solution is to use pointer tagging to mark pointers passed to
real_exception() and the like as freeable. However, that means scanning them
and getting their types right with regard to varargs and ow the hurting.
Another option is to cache the C string in the STRING structure itself in the
same way that Perl 5 caches IVs and NVs and PVs in the SV structure. (If
that doesn't mean anything to you, congratulations. I have this little
throbbing right behind my left eyeball just typing that.)
In other words, pin the lifetime of the malloced memory to the lifetime of a
garbage collected entity.
Obviously it's necessary to free the C string when destroying the string
(that's the point!) and it's necessary to free it and NULL out the pointer
when the string's contents change, but this would get rid of a memory leak
and, in the case of strings often converted to C strings, could improve
performance. (It also simplifies a problem in certain NCI calls that I
really don't want to get into.)
Though I hate to admit it, I think one of the pointers in the the PObj union
might work for this.
-- c
# Please include the string: [perl #44499]
# in the subject line of all future correspondence about this issue.
# <URL: http://rt.perl.org/rt3/Ticket/Display.html?id=44499 >
The string_from_cstring() function has a slight flaw, in that it has to
allocate a piece of memory and create a C-style string from a nice happy
STRING. It's the responsibility of the caller to discard the C string
appropriately.
This is tricky if that string immediately gets passed to real_exception() or
some other C function which does not return control; there's no chance to
free the string with string_cstring_free().
One solution is to use pointer tagging to mark pointers passed to
real_exception() and the like as freeable. However, that means scanning them
and getting their types right with regard to varargs and ow the hurting.
Another option is to cache the C string in the STRING structure itself in the
same way that Perl 5 caches IVs and NVs and PVs in the SV structure. (If
that doesn't mean anything to you, congratulations. I have this little
throbbing right behind my left eyeball just typing that.)
In other words, pin the lifetime of the malloced memory to the lifetime of a
garbage collected entity.
Obviously it's necessary to free the C string when destroying the string
(that's the point!) and it's necessary to free it and NULL out the pointer
when the string's contents change, but this would get rid of a memory leak
and, in the case of strings often converted to C strings, could improve
performance. (It also simplifies a problem in certain NCI calls that I
really don't want to get into.)
Though I hate to admit it, I think one of the pointers in the the PObj union
might work for this.
-- c