3 ms·
We have to call free when the program shuts down because the program is available through a library interface, and so it can be called as a linked library in ad
by DarkShikari 18y ago
We have to call free when the program shuts down because the program is available through a library interface, and so it can be called as a linked library in addition to being used as a standalone program. If it wasn't for that, we wouldn't even need free.
The program is structured so that based on the parameters it is given, we know exactly what needs to be allocated: how many video frames need to be malloced and so forth. This is all done in the initialization functions and after the program has started, it never needs to grab any memory ever again. This is not a case of "we're allocating the max we need and distributing it later"--it's a case of since we know how the program works, we know what exactly what it will need to do and how many frames it will do it to simultaneously.
There are only four things in the entire program that are malloced:
1. Video frame objects (big structs with tons of pointers to data that goes along with a video frame). A new_frame function exists to malloc and return a video frame. This makes it easy to check mallocs. We know exactly how many frames will be needed on startup. These frames make up the vast majority of memory usage of the program.
2. One data struct for each thread. Each thread has its own local struct that it passes around containing data currently being worked on.
3. A scratch buffer, per thread. This is a small malloced buffer used for a few calculations that require variable-size buffers, usually depending on video frame width (i.e. something known at initialization, but not known at compile-time).
4. Bitstream output buffers for each thread. In the extremely rare case that a bitstream exceeds the initial allocated value, this is realloced on demand.
Every single one of these can be free'd trivially at the end of runtime.
- lacker 18y agoWell, of course you find malloc easy if you know your exact memory requirements when your code starts. If you are writing something like a long-running server process, you will be more able to appreciate garbage collection.
- statictype 18y agoInteresting. Thanks for the details. I'm guessing this is a non-interactive library\application which takes input at start-up, does work and then exits? (because otherwise, I assume it would be impossible to reason about how much memory is required)
- DarkShikari 18y agoThe program is x264 and it can be interactive to some extent--it has a "reconfig" function that allows you to reconfigure the parameters on the fly, though it has some limitations as to what you can adjust and what you cannot. One potential purpose of this is a "speed control" feature where you adjust settings on the fly to ensure realtime operation, such as for a broadcast encoding server (my company does this).