Re: [PATCH 2/2] decorate: add "clear_decoration()"

2013-04-08 Thread Junio C Hamano
Jeff King  writes:

> On Sun, Apr 07, 2013 at 11:14:17PM -0700, Junio C Hamano wrote:
>
>> So far, all the users of the decoration API used decoration that
>> only grows and discarded at the end of the program execution.
>> 
>> Introduce for_each_decoration() that lets the caller iterate over
>> all defined decorations and use it to implement clear_decoration()
>> function.
>> 
>> Signed-off-by: Junio C Hamano 
>
> Both this and the first patch look good to me. I had documented
> api-decorate long ago as part of the cache-metadata-on-disk series (it
> was built on generic maps, which I also refactored decorate on top of).
> But I didn't see anything in my version that was missing from yours (in
> fact, it was much sparser, because it just referred to the generic map
> api, which we never merged).
>
> Out of curiosity: where is the patch 3 that presumably led you to
> wanting these?

It is nowhere near ready to be published, as I am not finding any
time for coding today X-<.
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH 2/2] decorate: add "clear_decoration()"

2013-04-08 Thread Jeff King
On Sun, Apr 07, 2013 at 11:14:17PM -0700, Junio C Hamano wrote:

> So far, all the users of the decoration API used decoration that
> only grows and discarded at the end of the program execution.
> 
> Introduce for_each_decoration() that lets the caller iterate over
> all defined decorations and use it to implement clear_decoration()
> function.
> 
> Signed-off-by: Junio C Hamano 

Both this and the first patch look good to me. I had documented
api-decorate long ago as part of the cache-metadata-on-disk series (it
was built on generic maps, which I also refactored decorate on top of).
But I didn't see anything in my version that was missing from yours (in
fact, it was much sparser, because it just referred to the generic map
api, which we never merged).

Out of curiosity: where is the patch 3 that presumably led you to
wanting these?

-Peff
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH 2/2] decorate: add "clear_decoration()"

2013-04-07 Thread Junio C Hamano
So far, all the users of the decoration API used decoration that
only grows and discarded at the end of the program execution.

Introduce for_each_decoration() that lets the caller iterate over
all defined decorations and use it to implement clear_decoration()
function.

Signed-off-by: Junio C Hamano 
---
 Documentation/technical/api-decorate.txt | 22 ++
 decorate.c   | 19 +++
 decorate.h   |  4 
 3 files changed, 45 insertions(+)

diff --git a/Documentation/technical/api-decorate.txt 
b/Documentation/technical/api-decorate.txt
index 0cc2b64..600366d 100644
--- a/Documentation/technical/api-decorate.txt
+++ b/Documentation/technical/api-decorate.txt
@@ -35,3 +35,25 @@ the `obj`.  You cannot tell if `obj` does not appear in the 
hashtable
 at all, or if `obj` has decoration whose value is NULL, so if you want
 to use the decoration API for "Did I see this object?" hashtable,
 use decoration value that is _not_ NULL.
+
+Iterating
+-
+
+`for_each_decoration(struct decoration *deco, for_each_decoration_fn fn)`
+iterates over all the entries in the hashtable, and calls `fn` on each
+entry.  The `fn` callback function takes a single `struct object_decoration`
+as its parameter, that has `base` field that points at the `obj`
+given to an earlier call to `add_decoration` and `decoration` field
+that remembers the `decoration`.
+
+Clearing
+
+
+`clear_decoration(struct decoration *deco, for_each_decoration_fn fn)`,
+when `fn` is not NULL, iterates over all the entries and calls the
+callback function `fn` using `for_each_decoration`, and then frees
+the memory used for the hashtable but not the `struct decoration` itself.
+
+The callback function can be used to release the resource used by
+the `decoration` the earlier `add_decoration` registered to the
+hashtable.
diff --git a/decorate.c b/decorate.c
index 2f8a63e..3e15358 100644
--- a/decorate.c
+++ b/decorate.c
@@ -86,3 +86,22 @@ void *lookup_decoration(struct decoration *n, const struct 
object *obj)
j = 0;
}
 }
+
+void for_each_decoration(struct decoration *n, for_each_decoration_fn fn)
+{
+   int i;
+
+   for (i = 0; i < n->size; i++) {
+   struct object_decoration *entry = &n->hash[i];
+   if (!entry->base)
+   continue;
+   fn(entry);
+   }
+}
+
+void clear_decoration(struct decoration *n, for_each_decoration_fn fn)
+{
+   if (fn)
+   for_each_decoration(n, fn);
+   free(n->hash);
+}
diff --git a/decorate.h b/decorate.h
index e732804..4a0d37e 100644
--- a/decorate.h
+++ b/decorate.h
@@ -15,4 +15,8 @@ struct decoration {
 extern void *add_decoration(struct decoration *n, const struct object *obj, 
void *decoration);
 extern void *lookup_decoration(struct decoration *n, const struct object *obj);
 
+typedef void (*for_each_decoration_fn)(struct object_decoration *);
+extern void for_each_decoration(struct decoration *, for_each_decoration_fn);
+extern void clear_decoration(struct decoration *, for_each_decoration_fn);
+
 #endif
-- 
1.8.2.1-450-gd047976

--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html