[Python-Dev] Activating pymalloc

Tim Peters tim.one@comcast.net
Fri, 15 Mar 2002 15:46:43 -0500


[Tim]
>> but the crucial phrase "the same memory API family" is left undefined.

[martin@v.loewis.de]
> I always thought the notion of a "memory API family" is fairly obvious
> - none of those families has more than three members.

How do you know?  The phrase simply isn't defined.  "Fairly obvious" isn't
reference-doc quality, and I clearly disagreed the first time around that
"it's obvious".  That means it isn't <wink>.

> There is always one for allocation and one for deallocation, and
> perhaps one for reallocation. That's it.

Perhaps.

>> Like, are the functions and macros interchangeable?

> Of course not. You use the macros for efficiency, accepting that you
> incorporate the implementation in your code, which results in a
> depenency between the binary extension module and the binary Python
> installation.

I wasn't talking about efficiency or binary compatibility, just about what
(exactly) constitutes "same memory API family" (which, BTW, belongs in the
reference docs proper, not in the middle of a page of examples).

>> For example, if you know something was allocated via PyMem_Malloc,
>> is it OK to release it via PyMem_FREE?  I simply can't guess from
>> what the docs say, again because what constitutes "a family" is left
>> undefined.

> If you buy the notion of memory API families,

I'd be delighted to, if the concept were spelled out.

> you cannot deallocate the things this way.
> ...
> Of course, you will get away with mixing the macro and non-macro
> versions, at least if you are not crossing Python version boundaries.
> Do that and you are on your own, though (if desired, Python could
> easily guarantee that you can mix APIs in this way, but I see no need
> for that guarantee).

I see nothing in the docs either forbidding or allowing such mixture; your
view relies on the personal understanding of "memory API family" you've
fought your way to after making a focused study of the source code.
Extension authors aren't so conscientious, although I expect some have
picked up by now that all the macro forms have been "deprecated" outside the
core.

> ... If I can get the TeX to create a table for me, I'll see whether
> I can produce a table. More likely, Fred will have to fix it...

That would be great.  Fred can do this from a plain text table with ease --
wrestling with TeX shouldn't stand in the way.

>> The endless layers of indirection macros make this quite a pain

> I'm also uncomfortable with those. Fortunately, the family of the
> "object allocator" does not deserve being documented - I doubt anybody
> will ever need this. Also, the overriding hooks for replacing the
> function names and signatures don't need to be documented.

Agreed.

>> Which API?

> PyObject_MALLOC/REALLOC/FREE, and PyCore_* (both object and raw).

Gotcha.

>> In the Python source, the thread implementations use malloc and free
>> on purpose, but it also turns up a curious
> >
> > 		    free((char *)Py_FileSystemDefaultEncoding);
> [...]
>> Does that mean that, on Windows, we may free() a static char*?!

> Of course not. This is wrapped in
>
> #if defined(HAVE_LANGINFO_H) && defined(CODESET)
>
> neither of which is defined on Windows.

As I said, it's worthy of a comment.  *I* have no idea whether
HAVE_LANGINFO_H and/or CODESET are defined on Windows.  If the correctness
of this code *relies* on that they're not defined on Windows (as it still
appears it does), an "#if Windows ... #error" would even be appropriate.