Heaps may be shared between threads within a process.
When a new thread is created:
it can use the same heap as the thread which is doing the creating.
it can use the heap which has been explicitly created for it by the thread which is doing the creating.
it can use the heap automatically created for it by the operating system.
Only in the first two cases is the heap being shared.
Both are achieved by using the version of
RThread::Create()
prototyped as:
TInt Create(const TDesC& aName,
TThreadFunction aFunction,
TInt aStackSize,
RHeap* aHeap,
TAny* aPtr,
TOwnerType aType=EOwnerProcess);
If aHeap
is NULL
, the new thread uses the
same heap as the parent thread. For example:
RThread t;
_LIT(KTxtShared1,"Shared1");
... ...
TInt r=t.Create(KTxtShared1,
threadEntryPoint,
KDefaultStackSize,
NULL,
NULL);
The calling thread can create a new heap using
User::ChunkHeap()
or UserHeap::ChunkHeap()
(this is
the same function; the User
class is derived from
UserHeap
) and pass this heap to the RThread::Create()
function. For example:
_LIT(KTxtShare,"Share");
_LIT(KTxtShared1,"Shared1");
...
RHeap* pH=User::ChunkHeap(KTxtShare,0x1000,0x100000);
RThread t;
TInt r=t.Create(KTxtShared1,
threadEntryPoint,
KDefaultStackSize,
pH,NULL);
The new heap is contained within its own chunk.
If the creating thread no longer has any interest in
this explicitly created heap, it can close it by calling Close()
.
Note that the corresponding call to Open()
was done automatically
by User::ChunkHeap()
. The function Open()
should be
used to re-open the heap for sharing; this increases the access count.
Note that Open()
can only be called on a heap created
using User::ChunkHeap()
.
The heaps which are created automatically for a thread should not be
closed with a call to Close()
since the chunk in which the heap is
created contains the thread's stack as well as the heap. In this case, if
Close()
is called the thread is panicked.