[fpc-devel] POSIX threads and classes
Helmut Hartl
helmut.hartl at firmos.at
Mon May 7 23:52:13 CEST 2007
> > fpc 2.0.4, opensuse 10.2, glibc-2.4-31.1
You may try this version of your program
-----
program Project1;
{$mode objfpc}{$H+}
uses
UnixType,pthreads;
type
TCondv = class
private
Cond : UnixType.pthread_cond_t;
CAttr : UnixType.pthread_condattr_t;
public
constructor Create;
destructor Destroy; override;
end;
{TCondv}
constructor TCondv.Create;
begin
pthread_condattr_init(@CAttr);
pthread_cond_init(@Cond, @CAttr);
end;
destructor TCondv.Destroy;
begin
inherited;
pthread_cond_destroy(@Cond);
pthread_condattr_destroy(@CAttr);
end;
{TCondv}
var
obj1 : TCondv;
obj2 : TCondv;
begin
obj1 := TCondv.Create;
obj2 := TCondv.Create;
obj1.Destroy;
obj2.Destroy;
end.
---------------
I had bad experiences with types differently declared in pthreads and
UnixTypes.
Namely the following:
In pthread:
pthread_cond_t = record
__c_lock: _pthread_fastlock;
__c_waiting: _pthread_descr;
end;
In UnixType: (ptypes.inc)
pthread_cond_t = record
__c_lock: _pthread_fastlock;
__c_waiting: pointer;
__padding:
array[0..48-1-sizeof(_pthread_fastlock)-sizeof(pointer)-sizeof(clonglong
)] of byte;
__align: clonglong;
end;
A call like: i:=pthread_cond_timedwait(@FSignal, @MMutex, at tim);
Fails with the first version (EINVAL), but succedes with the second one.
HTH,
helmut
More information about the fpc-devel
mailing list