forked from bartvdbraak/blender
84d350f4b5
=========================== Attempt to switch moviecache to use CacheLimiter. Some changes in limiter were necessary: - Limiter counted mapped memory twice when was chacking how many memory is used. - It was using "global" memory usage not memory usage by cached elements. It will cause big problems when there's large mesh or plenty of undo steps are in memory nothing would be cached in sequencer. - To solve this problem introduced "callback" to measure cached element size. It could be not very accurate in general, but it works well for image buffers. And if this callback isn't set old-school memory usage check would be used. - The whole cache used to get freed when memory limit exceeded, now it'll drop only as much elements as necessary to reduce memory usage. Sequence cache wasn't switched to use moviecache but now it's really easy to do. When i'll be sure new caching scheme works fine. Now clip editor uses as much memory for cache as it's set in User Preferences (Preferences -> System -> Sequencer -> Memory Cache Limit) which si 128Mb by default. Please do not complain about few cached frames out-of-box and just increase limit there. Caching fixed amount of frames wasn't so nice indeed.
150 lines
3.7 KiB
C
150 lines
3.7 KiB
C
/*
|
|
*
|
|
* ***** BEGIN GPL LICENSE BLOCK *****
|
|
*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License
|
|
* as published by the Free Software Foundation; either version 2
|
|
* of the License, or (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software Foundation,
|
|
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
*
|
|
* Contributor(s): Peter Schlaile <peter@schlaile.de> 2005
|
|
*
|
|
* ***** END GPL LICENSE BLOCK *****
|
|
*/
|
|
|
|
/** \file memutil/MEM_CacheLimiterC-Api.h
|
|
* \ingroup memutil
|
|
*/
|
|
|
|
|
|
#ifndef MEM_CACHELIMITERC_API_H
|
|
#define MEM_CACHELIMITERC_API_H
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
struct MEM_CacheLimiter_s;
|
|
struct MEM_CacheLimiterHandle_s;
|
|
|
|
typedef struct MEM_CacheLimiter_s MEM_CacheLimiterC;
|
|
typedef struct MEM_CacheLimiterHandle_s MEM_CacheLimiterHandleC;
|
|
|
|
/* function used to remove data from memory */
|
|
typedef void(*MEM_CacheLimiter_Destruct_Func)(void*);
|
|
|
|
/* function used to measure stored data element size */
|
|
typedef intptr_t(*MEM_CacheLimiter_DataSize_Func) (void*);
|
|
|
|
#ifndef MEM_CACHELIMITER_H
|
|
extern void MEM_CacheLimiter_set_maximum(int m);
|
|
extern int MEM_CacheLimiter_get_maximum(void);
|
|
#endif // MEM_CACHELIMITER_H
|
|
/**
|
|
* Create new MEM_CacheLimiter object
|
|
* managed objects are destructed with the data_destructor
|
|
*
|
|
* @param data_destructor
|
|
* @return A new MEM_CacheLimter object
|
|
*/
|
|
|
|
extern MEM_CacheLimiterC * new_MEM_CacheLimiter(
|
|
MEM_CacheLimiter_Destruct_Func data_destructor,
|
|
MEM_CacheLimiter_DataSize_Func data_size);
|
|
|
|
/**
|
|
* Delete MEM_CacheLimiter
|
|
*
|
|
* Frees the memory of the CacheLimiter but does not touch managed objects!
|
|
*
|
|
* @param This "This" pointer
|
|
*/
|
|
|
|
extern void delete_MEM_CacheLimiter(MEM_CacheLimiterC * This);
|
|
|
|
/**
|
|
* Manage object
|
|
*
|
|
* @param This "This" pointer, data data object to manage
|
|
* @return CacheLimiterHandle to ref, unref, touch the managed object
|
|
*/
|
|
|
|
extern MEM_CacheLimiterHandleC * MEM_CacheLimiter_insert(
|
|
MEM_CacheLimiterC * This, void * data);
|
|
|
|
/**
|
|
* Free objects until memory constraints are satisfied
|
|
*
|
|
* @param This "This" pointer
|
|
*/
|
|
|
|
extern void MEM_CacheLimiter_enforce_limits(MEM_CacheLimiterC * This);
|
|
|
|
/**
|
|
* Unmanage object previously inserted object.
|
|
* Does _not_ delete managed object!
|
|
*
|
|
* @param This "This" pointer, handle of object
|
|
*/
|
|
|
|
extern void MEM_CacheLimiter_unmanage(MEM_CacheLimiterHandleC * handle);
|
|
|
|
|
|
/**
|
|
* Raise priority of object (put it at the tail of the deletion chain)
|
|
*
|
|
* @param handle of object
|
|
*/
|
|
|
|
extern void MEM_CacheLimiter_touch(MEM_CacheLimiterHandleC * handle);
|
|
|
|
/**
|
|
* Increment reference counter. Objects with reference counter != 0 are _not_
|
|
* deleted.
|
|
*
|
|
* @param handle of object
|
|
*/
|
|
|
|
extern void MEM_CacheLimiter_ref(MEM_CacheLimiterHandleC * handle);
|
|
|
|
/**
|
|
* Decrement reference counter. Objects with reference counter != 0 are _not_
|
|
* deleted.
|
|
*
|
|
* @param handle of object
|
|
*/
|
|
|
|
extern void MEM_CacheLimiter_unref(MEM_CacheLimiterHandleC * handle);
|
|
|
|
/**
|
|
* Get reference counter.
|
|
*
|
|
* @param This "This" pointer, handle of object
|
|
*/
|
|
|
|
extern int MEM_CacheLimiter_get_refcount(MEM_CacheLimiterHandleC * handle);
|
|
|
|
/**
|
|
* Get pointer to managed object
|
|
*
|
|
* @param handle of object
|
|
*/
|
|
|
|
extern void * MEM_CacheLimiter_get(MEM_CacheLimiterHandleC * handle);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
|
|
#endif // MEM_CACHELIMITERC_API_H
|