struct timeshift_conf timeshift_conf;
+memoryinfo_t timeshift_memoryinfo = { .my_name = "Timeshift" };
+memoryinfo_t timeshift_memoryinfo_ram = { .my_name = "Timeshift RAM buffer" };
+
/*
* Packet log
*/
{
htsmsg_t *m;
+ memoryinfo_register(×hift_memoryinfo);
+ memoryinfo_register(×hift_memoryinfo_ram);
+
timeshift_filemgr_init();
/* Defaults */
timeshift_filemgr_term();
free(timeshift_conf.path);
timeshift_conf.path = NULL;
+
+ memoryinfo_unregister(×hift_memoryinfo);
+ memoryinfo_unregister(×hift_memoryinfo_ram);
}
/*
if (ts->path)
free(ts->path);
+
free(ts);
+ memoryinfo_free(×hift_memoryinfo, sizeof(timeshift_t));
}
/**
{
timeshift_t *ts = calloc(1, sizeof(timeshift_t));
+ memoryinfo_alloc(×hift_memoryinfo, sizeof(timeshift_t));
+
/* Must hold global lock */
lock_assert(&global_lock);
#define __TVH_TIMESHIFT_H__
#include "idnode.h"
+#include "memoryinfo.h"
typedef struct timeshift_conf {
idnode_t idnode;
extern struct timeshift_conf timeshift_conf;
extern const idclass_t timeshift_conf_class;
+extern memoryinfo_t timeshift_memoryinfo;
+extern memoryinfo_t timeshift_memoryinfo_ram;
+
void timeshift_init ( void );
void timeshift_term ( void );
-/**
+/*
* TV headend - Timeshift File Manager
* Copyright (C) 2012 Adam Sutton
*
/* Free memory */
while ((ti = TAILQ_FIRST(&tsf->iframes))) {
TAILQ_REMOVE(&tsf->iframes, ti, link);
+ memoryinfo_free(×hift_memoryinfo, sizeof(*ti));
free(ti);
}
while ((tid = TAILQ_FIRST(&tsf->sstart))) {
TAILQ_REMOVE(&tsf->sstart, tid, link);
sm = tid->data;
streaming_msg_free(sm);
+ memoryinfo_free(×hift_memoryinfo, sizeof(*tid));
free(tid);
}
free(tsf->path);
+ memoryinfo_free(×hift_memoryinfo_ram, tsf->ram_size);
free(tsf->ram);
+ memoryinfo_free(×hift_memoryinfo, sizeof(*tsf));
free(tsf);
pthread_mutex_lock(×hift_reaper_lock);
/* maintain unused memory block */
ram = realloc(tsf->ram, tsf->woff);
if (ram) {
+ memoryinfo_append(×hift_memoryinfo_ram, tsf->ram_size - tsf->woff);
tsf->ram = ram;
tsf->ram_size = tsf->woff;
}
timeshift_file_t *tsf;
tsf = calloc(1, sizeof(timeshift_file_t));
+ memoryinfo_alloc(×hift_memoryinfo, sizeof(*tsf));
tsf->time = mono2sec(start_time) / TIMESHIFT_FILE_PERIOD;
tsf->last = start_time;
tsf->wfd = -1;
tvhtrace(LS_TIMESHIFT, "ts %d create RAM segment with %"PRId64" bytes (time %"PRId64")",
ts->id, tsf_tmp->ram_size, start_time);
ts->ram_segments++;
+ memoryinfo_alloc(×hift_memoryinfo_ram, tsf_tmp->ram_size);
}
break;
} else {
ts->id, ti ? " (from last file)" : "");
timeshift_index_data_t *ti2 = calloc(1, sizeof(timeshift_index_data_t));
if (ti) {
+ memoryinfo_alloc(×hift_memoryinfo, sizeof(timeshift_index_data_t));
sm = streaming_msg_clone(ti->data);
} else {
sm = streaming_msg_create(SMT_START);
pthread_mutex_unlock(&tsf->ram_lock);
return -1;
}
+ memoryinfo_append(×hift_memoryinfo_ram, alloc);
tsf->ram = ram;
tsf->ram_size += alloc;
}
{
timeshift_index_data_t *ti = calloc(1, sizeof(timeshift_index_data_t));
+ memoryinfo_alloc(×hift_memoryinfo, sizeof(*ti));
ti->pos = tsf->size;
ti->data = sm;
TAILQ_INSERT_TAIL(&tsf->sstart, ti, link);
if (pkt->pkt_componentindex == ts->vididx &&
pkt->pkt_frametype == PKT_I_FRAME) {
timeshift_index_iframe_t *ti = calloc(1, sizeof(timeshift_index_iframe_t));
+ memoryinfo_alloc(×hift_memoryinfo, sizeof(*ti));
ti->pos = tsf->size;
ti->time = sm->sm_time;
TAILQ_INSERT_TAIL(&tsf->iframes, ti, link);