{ %target=linux }
{ %opt=-Xt }

program phello;
{$linklib c}

{$packrecords c}

uses
  ctypes, unixtype, pthreads;

const N = 2;
var
  res:array[1..N] of Integer;

function Hello(arg: pointer): pointer; cdecl;
begin
//  writeln('Hello from thread #', PInteger(arg)^);
  res[PInteger(arg)^] := PInteger(arg)^;
  Hello := nil;
  pthread_exit(pointer(Hello));
end;

var
  i: Integer;
  ret: Pointer;
  arg: array[1..N] of Integer;
  threads: array[1..N] of TThreadID;
  attr: TThreadAttr;
begin
  Writeln('Testing simple thread creation');
  pthread_attr_init(@attr);
  for i := 1 to N do
  begin
    Writeln('Creating thread #',i);
    arg[i] := i;
    if pthread_create(@threads[i], @attr, @Hello, @arg[i]) <> 0 then
      Writeln('Failed to create thread');
  end;
  for i := 1 to N do
  begin
    Write('Waiting for thread #',i, ' ... ');
    pthread_join(threads[i], ret);
    Writeln('result: ', res[i]);
  end;
end.


