summaryrefslogtreecommitdiff
path: root/cesar/mac/common/src/tonemap.c
diff options
context:
space:
mode:
Diffstat (limited to 'cesar/mac/common/src/tonemap.c')
-rw-r--r--cesar/mac/common/src/tonemap.c42
1 files changed, 35 insertions, 7 deletions
diff --git a/cesar/mac/common/src/tonemap.c b/cesar/mac/common/src/tonemap.c
index 84efbaf02e..0cde1fdbd3 100644
--- a/cesar/mac/common/src/tonemap.c
+++ b/cesar/mac/common/src/tonemap.c
@@ -104,6 +104,8 @@ tonemap_alloc ()
tm_entry->tmdma_desc_head = first;
/* Tone map in use. */
tm_entry->released = TONEMAP_IN_USE;
+ /* Initialize release_link. */
+ list_init_node (&tm_entry->release_link);
/* Return allocated tone map. */
return tm_entry;
}
@@ -132,17 +134,43 @@ tonemap_disable (tonemaps_t *tms, u8 tmi)
}
void
-tonemap_release_forced (tonemaps_t *tms, u8 tmi)
+tonemap_release (tonemaps_t *tms, u8 tmi,
+ tonemap_release_list_t *tm_release_list)
{
/* Check parameters. */
dbg_assert (tms);
dbg_assert ((TONEMAP_INDEX_IS_NEGOTIATED (tmi)));
- dbg_assert (tms->tm[tmi]);
-
- /* Atomic deletion. */
tonemap_t *tm = tms->tm[tmi];
+ dbg_assert (tm);
+ dbg_assert (tm_release_list);
+
+ /* Put the tonemap in the release list and get it out of the
+ * station set. */
+ list_push (tm_release_list, &tm->release_link);
+ tm->released = TONEMAP_RELEASE_TIMER_S;
tms->tm[tmi] = NULL;
- tonemap_free (tm);
+}
+
+bool
+tonemap_release_list_clean (tonemap_release_list_t *tm_release_list)
+{
+ /* Check parameter. */
+ dbg_assert (tm_release_list);
+
+ /* Parse the release list to free the expired tonemaps. */
+ list_node_t *i, *i_next;
+ for (i = list_begin (tm_release_list); i != list_end (tm_release_list);
+ i = i_next)
+ {
+ i_next = list_next (i);
+ tonemap_t *tm = PARENT_OF (tonemap_t, release_link, i);
+ if (!--tm->released)
+ {
+ list_remove (tm_release_list, i);
+ tonemap_free (tm);
+ }
+ }
+ return list_empty (tm_release_list);
}
void
@@ -488,7 +516,7 @@ tonemaps_disabled_clean (tonemaps_t *tms)
}
void
-tonemaps_reset (tonemaps_t *tms)
+tonemaps_reset (tonemaps_t *tms, tonemap_release_list_t *tm_release_list)
{
/* Check parameter. */
dbg_assert (tms);
@@ -504,7 +532,7 @@ tonemaps_reset (tonemaps_t *tms)
{
/* Release if in use. */
if (tms->tm[i])
- tonemap_release_forced (tms, i);
+ tonemap_release (tms, i, tm_release_list);
}
/* Reset to default value. */
tonemaps_init (tms);