On 2009-12-17 13:39 PST, Konstantin Andreev wrote:
> Hello, Nelson.
> 
> Thank you for your response.
> 
> On Tue, 17 Dec 2009, Nelson B Bolyard wrote:

>> The use of arena pool marks is merely necessary to ensure proper
>> cleanup in the rare case where the first of those two allocations
>> succeeds but the second fails.
> 
> Hmm... interesting. Do I understand right, "arena marks" are like
> transaction boundaries for memory allocations ? May I consider the
> equivalence:
> 
>     PORT_ArenaMark    ~~ begin transaction
>     PORT_ArenaUnmark  ~~ commit transaction
>     PORT_ArenaRelease ~~ rollback transaction

That's a reasonable first approximation, yes.

ArenaPools are like heaps.  The memory in them is allocated in large
blocks called arenas.  Inside the ArenaPool, the arenas are organized as if
they were in a stack.  New allocations may be viewed as additional arenas
"pushed" on that stack.  The ArenaMark function returns the address of a
marker in the stack of arenas.  It is the address where the next arena
would be pushed onto the arena stack.  ArenaUnmark merely discards the
ArenaMark.  ArenaRelease "pops" the stack, removing all the arenas from
the stack that were allocated after the mark was created.  It is the only
operation, other than destroying the arenapool, that reduces the size of
the stack.  Otherwise, the stack just grows until the arenapool is
destroyed, at which point all the arenas are freed or returned to a "free
arena list", depending on their sizes.

Each ArenaPool has its own separate stack, and hence marks are only relevant
to the ArenaPool from which they are gotten.

Marks may be nested.  That is, you can get a mark, and then get another
mark.  it is also possible that multiple threads might acquire marks in
the same ArenaPool if that pool is used as memory for some shared object.
You cannot release a mark if another thread has acquired a mark in the
same ArenaPool since you acquired that mark.  When there is a nested
mark belonging to another thread, your attempt to release is treated
like an unmark instead.  That's why it's important to explicitly unmark.
Your mark may be nested.  Every mark should be followed by either an unmark
or a release.
-- 
dev-tech-crypto mailing list
dev-tech-crypto@lists.mozilla.org
https://lists.mozilla.org/listinfo/dev-tech-crypto

Reply via email to