GC & GPC question.

Khimenko Victor gpc at khim.sch57.msk.ru
Thu Mar 9 22:36:07 CET 2000


9-Mar-00 18:26 you wrote:
> Khimenko Victor wrote:

>> > The relevant hooks are GetMemPtr etc., declared in the GPC unit. You
>> > need them if you want to switch between different allocators.
>>
>> Hmm. It'll require locks in multithreaded program and will be not very
>> convenient.

> I see. BTW, are the normal malloc()/free() routines and Boehm's GC
> thread-safe, do they do their own locking?

Yes for both. Boehm's GC is used in libgcj (GNU Compiler for Java library)
after all ... AFAIK "standard" glibc's malloc()/free() are not thread-safe
but libpthread has it's own thread-safe replacemnts so you can just specify
-lpthread and use malloc()/free() safely.

> I can't guarantee that GPC's heap handling routines are thread-safe as
> I haven't used threads.

It's one thing to gurantee HERE AND NOW and other thing to have this as design
goal: if there are some race conditions and such this CAN be fixed, if there
are bad design (errno for example) it's MUCH harder to fix...

> At first sight, I'd say they are as long as you don't use
> Mark/Release, but if you want to check them (or other RTS routines)
> more throughly, you have the source...

Exactly. I repeat: I do not need threads right now. I just want to use them
sometime in the future. I can fix problem in implementation but it's MUCH
harder to fix problem in API. Sample: errno stuff was solved with ugly #define
but end result is MUCH uglier then "Linux's solution": just return not -1 in
case of error but -ERROR_CODE. But since errno-based API is "set in stone"
now we are using ugly hacks and errno, not clean and mean Linux's solution...

>> Perhaps we can hide it over clever #define ? Let's try:
>>
>> -- cut --
>> uses gpc;
>> #define gc_alloc(x)  (begin var res:^x; save_ptr:GetMemType; save_ptr:=GetMemPtr; GetMemPtr:=GC_alloc; res:=new(x); GetMemPtr:=save_ptr; end)

> Since the variables are declared within a statement part, you'd need
> a second `var' before save_ptr. Also, Pascal's `New' is
> syntactically different from C's malloc(). `New' is only meant for
> typed pointers (simple types, schemata, objects), while `GetMem'
> takes a memory size, but will not initialize any fields of the
> structure. The correspondence is `p = malloc (n)' -> `GetMem (p, n)'.

Oops. But I DO NOT want malloc replacement. I want EXACTLY new replacement.
So I can use p:=gc_alloc(integer); ! BTW I'm NOT newbie in Pascal :-)
I'm newbie in GPC but I'm used quite a few other implementations (not just
Borland Pascal).

>> Oops. Is it possible to use compound statement as expression in GPC somehow ?

> Not AFAIK. Only as an inline function. The following should work,
> but as I said, it will not initialize any fields, so it won't work
> for strings, schemata, files and other types that require
> initialization (but you could write a second routine specialized for
> strings, as shown).

Hmm. How it's different to direct GC's GC_alloc() call then ???

> inline function GCAlloc (x : SizeType) = Res : Pointer;
> var save_ptr : GetMemType;
> begin
>   save_ptr := GetMemPtr;
>   GetMemPtr := @GC_alloc;
>   GetMem (Res, x);
>   GetMemPtr := save_ptr
> end;

> function GCAllocString (const s : String) = Res : PString;
> var save_ptr : GetMemType;
> begin
>   save_ptr := GetMemPtr;
>   GetMemPtr := @GC_alloc;
>   New (Res, Length (s));
>   Res^ := s;
>   GetMemPtr := save_ptr
> end;

> var
>   i : ^Integer;
>   s : PString;

> begin
>   i := GCAlloc (SizeOf (Integer));
>   s := GCAllocString ('foo');
>   Writeln (s^);
> end.

> Of course, you could then hide then `SizeOf' in a macro with
> something like:

> {$define gc_alloc(x) GCAlloc (SizeOf (x))}

>> And BTW how I can continue #define on next line (C's \ in the end of line does
>> not work).

> {$define ...} can span multiple lines without any `\'.

Oops. Sorry. As I said I'm new to GPC ...

> Peter Gerwinski wrote:

>> Khimenko Victor wrote:
>> > Hmm. It'll require locks in multithreaded program and will be not very
>> > convenient. Perhaps we can hide it over clever #define ? Let's try:
>> > [...]
>> > You need to EXPLICITLY change new strategy every time :-((
>> > Especially annoying since you want to use GC_malloc_atomic for plain strings...
>> > [...]
>>
>> What about introducing a second `New' that allows the user to
>> pass an additional parameter to the allocator?

> Might be a solution. (Not that the syntax of `New' isn't already
> complicated enough... :-/)

Hmm. IMO something like p:=new[shm_alloc,pool1](string,100); should be
recognizeable enough and should not disturb existing mess there much.
Even if it's look more like LaTeX then C++ :-)




More information about the Gpc mailing list