Closed
Bug 535934
Opened 15 years ago
Closed 15 years ago
Add Nelson's newsgroup posting on arenas as comments to secport.c
Categories
(NSS :: Documentation, defect, P2)
NSS
Documentation
Tracking
(Not tracked)
RESOLVED
FIXED
3.12.6
People
(Reporter: wtc, Assigned: nelson)
Details
Attachments
(1 file)
2.33 KB,
patch
|
nelson
:
review-
|
Details | Diff | Splinter Review |
In a newsgroup posting on 2009-12-17, Nelson wrote a good description of arenas in reply to Andreev's question Re: Should I use SECITEM_AllocItem or PORT_Arena{,Z}Alloc memory allocation ? The attached patch adds Nelson's description as comments to secport.c. Andreev, do you think the comments will be more discoverable if I add them to secport.h instead?
Attachment #418477 -
Flags: review?(nelson)
Comment 1•15 years ago
|
||
Nice idea, thank you. I believe secport.c is appropriate.
Assignee | ||
Comment 2•15 years ago
|
||
My description was accurate enough to understand how to use ArenaPools, I think, but it is inaccurate in a few details that would be misleading to someone actually trying to maintain the arenapool code, I think. So, if we're going to put it into the code, I should refine it first.
Comment 3•15 years ago
|
||
Refinements are usually postponed for indefinite time. I believe that your description can be put into the code "as is", it's better than nothing. Later, if your time permits, you could refine the description according your taste.
Assignee | ||
Comment 4•15 years ago
|
||
Comment on attachment 418477 [details] [diff] [review] Proposed patch I'm glad I took the time to review that comment and the code behind it. I found that I had misremembered an important detail about thread safety of marks. The following comment corrects those mistakes. * ArenaPools are like heaps. The memory in them consists of large blocks, * called arenas, which are allocated from the/a system heap. Inside an * ArenaPool, the arenas are organized as if they were in a stack. Newly * allocated arenas are "pushed" on that stack. When you attempt to * allocate memory from an ArenaPool, the code first looks to see if there * is enough unused space in the top arena on the stack to satisfy your * request, and if so, your request is satisfied from that arena. * Otherwise, a new arena is allocated (or taken from NSPR's list of freed * arenas) and pushed on to the stack. The new arena is always big enough * to satisfy the request, and is also at least a minimum size that is * established at the time that the ArenaPool is created. * * The ArenaMark function returns the address of a marker in the arena at * the top of the arena stack. It is the address of the place in the arena * on the top of the arena stack from which the next block of memory will * be allocated. 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, a thread can get a mark, and then get * another mark. * * It is intended that all the marks in an ArenaPool may only be owned by a * single thread. In DEBUG builds, this is enforced. In non-DEBUG builds, * it is not. In DEBUG builds, when a thread gets a mark from an * ArenaPool, no other thread may acquire a mark in that ArenaPool while * that mark exists, that is, until that mark is unmarked or released. * Therefore, it is important that every mark be unmarked or released when * the creating thread has no further need for exclusive ownership of the * right to manage the ArenaPool. * * The ArenaUnmark function discards the ArenaMark at the address given, * and all marks nested inside that mark (that is, acquired from that same * ArenaPool while that mark existed). It is an error for a thread other * than the mark's creator to try to unmark it. When a thread has unmarked * all its marks from an ArenaPool, then another thread is able to set * marks in that ArenaPool. ArenaUnmark does not deallocate (or "pop") any * memory allocated from the ArenaPool since the mark was created. * * ArenaRelease "pops" the stack back to the mark, deallocating all the * memory allocated from the arenas in the ArenaPool since that mark was * created, and removing any arenas from the ArenaPool that have no * remaining active allocations when that is done. It implicitly releases * any marks nested inside the mark being explicitly released. It is the * only operation, other than destroying the arenapool, that potentially * reduces the number of arenas on the stack. Otherwise, the stack 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. *
Attachment #418477 -
Flags: review?(nelson) → review-
Reporter | ||
Comment 5•15 years ago
|
||
Nelson, could you check in the new comment? Thanks.
Assignee | ||
Comment 6•15 years ago
|
||
Checking in secport.c; new revision: 1.26; previous revision: 1.25 Done.
Status: NEW → RESOLVED
Closed: 15 years ago
Resolution: --- → FIXED
Version: unspecified → trunk
Assignee | ||
Updated•15 years ago
|
Assignee: wtc → nelson
Priority: -- → P2
You need to log in
before you can comment on or make changes to this bug.
Description
•