mco_register_disk_alloc_callback
注册一个具有持久支持的回调函数,运行时在检测到低内存条件时调用该回调函数。
使用持久支持注册一个回调函数,当运行时检测到内存不足的情况时,该函数将被调用,以便应用程序能够做出相应的反应。回调函数的调用取决于参数 threshold_kind 和 threshold_value 中指定的阈值条件。如果需要将任何特定于应用程序的数据传递到回调函数中,则通过 mco_db_connect_ctx() 创建的连接上下文来完成。
请注意,此函数提供的功能与 mco_register_alloc_callback() 相同,但针对的是持久数据库而非内存数据库。存在两种不同的分配器:一种用于临时(内存)对象,另一种用于持久对象。这两种分配器的状态(例如已用和可用内存的数量)以及相关事件(例如内存溢出)是相互独立的。
回调函数的注册是按连接进行的,当从注册了回调函数的连接分配内存时,会调用该回调函数。重要提示:应用程序不得从回调函数自身释放数据库内存。相反,建议要么通知不同的垃圾回收线程,要么由回调函数设置一个“全局”标志,并定期从主应用程序线程检查该标志。
void mco_register_disk_alloc_callback(
/*IN*/ mco_db_h db,
/*IN*/ mco_alloc_callback_t callback,
/*IN*/ mco_alloc_callback_threshold_kind_t threshold_kind,
/*IN*/ mco_offs_t threshold_value
);参数
db
mco_db_h
由 mco_db_connect() 建立的数据库句柄。
callback
mco_alloc_callback_t
运行时调用的分配处理程序回调函数,用于确定内存分配状态。
threshold_kind
mco_alloc_callback_threshold_kind_t
分配阈值类型,用于指示要应用的阈值类型。
threshold_value
mco_offs_t
设置阈值的值。
返回
没有返回值。
示例
/* 应用程序代码片段 */
const char * dbname = "SimpleDb";
int main(int argc, char* argv[])
{
mco_db_h db;
MCO_RET rc;
char *mem = malloc( DBSIZE );
if( (rc = mco_runtime_start()) != MCO_S_OK)
exit(-1);
rc = mco_db_open( dbname, simple_get_dictionary(), mem, DBSIZE, (uint2)PAGESIZE );
if( (MCO_S_OK == rc)
{
rc = mco_db_connect( dbname, &db );
...
/* start a thread to manage the garbage collection procedure */
sample_start_connected_task( &task, gc_task, dbname, 0 );
/* register alloc callback */
mco_register_disk_alloc_callback( db, alloc_callback,
MCO_ALLOC_USED, DATABASE_SIZE / 2 );
/* connect to database */
rc = mco_db_connect(dbName, &db);
...
}
...
}