Difference between revisions of "Thread.library"
Jump to navigation
Jump to search
(Added paragraph skeleton) |
(→the unit: Added unit source) |
||
Line 14: | Line 14: | ||
== the unit == | == the unit == | ||
+ | |||
+ | <source lang="pascal"> | ||
+ | unit contrib_thread; | ||
+ | |||
+ | |||
+ | {$MODE OBJFPC} {$H+} {$PACKRECORDS C} | ||
+ | |||
+ | Interface | ||
+ | |||
+ | uses | ||
+ | Exec; | ||
+ | |||
+ | |||
+ | |||
+ | Type | ||
+ | uint32_t = LongWord; | ||
+ | // pvoid = TProcedure; | ||
+ | // pvoid = pointer; | ||
+ | |||
+ | // ppvoid = ^pvoid; | ||
+ | // BOOL = LongBool; | ||
+ | |||
+ | |||
+ | Type | ||
+ | TThreadEntryFunction = Function(data: pvoid): pvoid; cdecl; | ||
+ | |||
+ | |||
+ | |||
+ | Var | ||
+ | ThreadBase: pLibrary; | ||
+ | |||
+ | |||
+ | Function CreateThread(entry: TThreadEntryFunction; data: pvoid): uint32_t; | ||
+ | Function WaitThread(thread_id: uint32_t; res: ppvoid): BOOL; | ||
+ | Procedure WaitAllThreads; | ||
+ | Function DetachThread(thread_id: uint32_t): BOOL; | ||
+ | Function CurrentThread: uint32_t; | ||
+ | Function CreateMutex: pvoid; | ||
+ | Function DestroyMutex(mutex: pvoid): BOOL; | ||
+ | Procedure LockMutex(mutex: pvoid); | ||
+ | Function TryLockMutex(mutex: pvoid): BOOL; | ||
+ | Procedure UnlockMutex(mutex: pvoid); | ||
+ | Function CreateCondition: pvoid; | ||
+ | Function DestroyCondition(condition: pvoid): BOOL; | ||
+ | Function WaitCondition(condition: pvoid; mutex: pvoid): BOOL; | ||
+ | Procedure SignalCondition(condition: pvoid); | ||
+ | Procedure BroadcastCondition(condition: pvoid); | ||
+ | Procedure ExitThread(res: pvoid); | ||
+ | |||
+ | |||
+ | Implementation | ||
+ | |||
+ | |||
+ | |||
+ | Function CreateThread(entry: TThreadEntryFunction; data: pvoid): uint32_t; | ||
+ | Type | ||
+ | TLocalCall = Function(entry: TThreadEntryFunction; data: pvoid; LibBase: Pointer): uint32_t; cdecl; | ||
+ | Var | ||
+ | Call: TLocalCall; | ||
+ | Begin | ||
+ | Call := TLocalCall(GetLibAdress(ThreadBase, 5)); | ||
+ | CreateThread := Call(entry, data, ThreadBase); | ||
+ | End; | ||
+ | |||
+ | |||
+ | |||
+ | Function WaitThread(thread_id: uint32_t; res: ppvoid): BOOL; | ||
+ | Type | ||
+ | TLocalCall = Function(thread_id: uint32_t; res: ppvoid; LibBase: Pointer): BOOL; cdecl; | ||
+ | Var | ||
+ | Call: TLocalCall; | ||
+ | Begin | ||
+ | Call := TLocalCall(GetLibAdress(ThreadBase, 6)); | ||
+ | WaitThread := Call(thread_id, res, ThreadBase); | ||
+ | End; | ||
+ | |||
+ | |||
+ | |||
+ | Procedure WaitAllThreads; | ||
+ | Type | ||
+ | TLocalCall = Procedure(LibBase: Pointer); cdecl; | ||
+ | Var | ||
+ | Call: TLocalCall; | ||
+ | Begin | ||
+ | Call := TLocalCall(GetLibAdress(ThreadBase, 7)); | ||
+ | Call(ThreadBase); | ||
+ | End; | ||
+ | |||
+ | |||
+ | |||
+ | Function DetachThread(thread_id: uint32_t): BOOL; | ||
+ | Type | ||
+ | TLocalCall = Function(thread_id: uint32_t; LibBase: Pointer): BOOL; cdecl; | ||
+ | Var | ||
+ | Call: TLocalCall; | ||
+ | Begin | ||
+ | Call := TLocalCall(GetLibAdress(ThreadBase, 8)); | ||
+ | DetachThread := Call(thread_id, ThreadBase); | ||
+ | End; | ||
+ | |||
+ | |||
+ | |||
+ | Function CurrentThread: uint32_t; | ||
+ | Type | ||
+ | TLocalCall = Function(LibBase: Pointer): uint32_t; cdecl; | ||
+ | Var | ||
+ | Call: TLocalCall; | ||
+ | Begin | ||
+ | Call := TLocalCall(GetLibAdress(ThreadBase, 9)); | ||
+ | CurrentThread := Call(ThreadBase); | ||
+ | End; | ||
+ | |||
+ | |||
+ | |||
+ | Function CreateMutex: pvoid; | ||
+ | Type | ||
+ | TLocalCall = Function(LibBase: Pointer): pvoid; cdecl; | ||
+ | Var | ||
+ | Call: TLocalCall; | ||
+ | Begin | ||
+ | Call := TLocalCall(GetLibAdress(ThreadBase, 10)); | ||
+ | CreateMutex := Call(ThreadBase); | ||
+ | End; | ||
+ | |||
+ | |||
+ | |||
+ | Function DestroyMutex(mutex: pvoid): BOOL; | ||
+ | Type | ||
+ | TLocalCall = Function(mutex: pvoid; LibBase: Pointer): BOOL; cdecl; | ||
+ | Var | ||
+ | Call: TLocalCall; | ||
+ | Begin | ||
+ | Call := TLocalCall(GetLibAdress(ThreadBase, 11)); | ||
+ | DestroyMutex := Call(mutex, ThreadBase); | ||
+ | End; | ||
+ | |||
+ | |||
+ | |||
+ | Procedure LockMutex(mutex: pvoid); | ||
+ | Type | ||
+ | TLocalCall = Procedure(mutex: pvoid; LibBase: Pointer); cdecl; | ||
+ | Var | ||
+ | Call: TLocalCall; | ||
+ | Begin | ||
+ | Call := TLocalCall(GetLibAdress(ThreadBase, 12)); | ||
+ | Call(mutex, ThreadBase); | ||
+ | End; | ||
+ | |||
+ | |||
+ | |||
+ | Function TryLockMutex(mutex: pvoid): BOOL; | ||
+ | Type | ||
+ | TLocalCall = Function(mutex: pvoid; LibBase: Pointer): BOOL; cdecl; | ||
+ | Var | ||
+ | Call: TLocalCall; | ||
+ | Begin | ||
+ | Call := TLocalCall(GetLibAdress(ThreadBase, 13)); | ||
+ | TryLockMutex := Call(mutex, ThreadBase); | ||
+ | End; | ||
+ | |||
+ | |||
+ | |||
+ | Procedure UnlockMutex(mutex: pvoid); | ||
+ | Type | ||
+ | TLocalCall = Procedure(mutex: pvoid; LibBase: Pointer); cdecl; | ||
+ | Var | ||
+ | Call: TLocalCall; | ||
+ | Begin | ||
+ | Call := TLocalCall(GetLibAdress(ThreadBase, 14)); | ||
+ | Call(mutex, ThreadBase); | ||
+ | End; | ||
+ | |||
+ | |||
+ | |||
+ | Function CreateCondition: pvoid; | ||
+ | Type | ||
+ | TLocalCall = Function(LibBase: Pointer): pvoid; cdecl; | ||
+ | Var | ||
+ | Call: TLocalCall; | ||
+ | Begin | ||
+ | Call := TLocalCall(GetLibAdress(ThreadBase, 15)); | ||
+ | CreateCondition := Call(ThreadBase); | ||
+ | End; | ||
+ | |||
+ | |||
+ | Function DestroyCondition(condition: pvoid): BOOL; | ||
+ | Type | ||
+ | TLocalCall = Function(condition: pvoid; LibBase: Pointer): BOOL; cdecl; | ||
+ | Var | ||
+ | Call: TLocalCall; | ||
+ | Begin | ||
+ | Call := TLocalCall(GetLibAdress(ThreadBase, 16)); | ||
+ | DestroyCondition := Call(condition, ThreadBase); | ||
+ | End; | ||
+ | |||
+ | |||
+ | Function WaitCondition(condition: pvoid; mutex: pvoid): BOOL; | ||
+ | Type | ||
+ | TLocalCall = Function(condition: pvoid; mutex: pvoid; LibBase: Pointer): BOOL; cdecl; | ||
+ | Var | ||
+ | Call: TLocalCall; | ||
+ | Begin | ||
+ | Call := TLocalCall(GetLibAdress(ThreadBase, 17)); | ||
+ | WaitCondition := Call(condition, mutex, ThreadBase); | ||
+ | End; | ||
+ | |||
+ | |||
+ | Procedure SignalCondition(condition: pvoid); | ||
+ | Type | ||
+ | TLocalCall = Procedure(condition: pvoid; LibBase: Pointer); cdecl; | ||
+ | Var | ||
+ | Call: TLocalCall; | ||
+ | Begin | ||
+ | Call := TLocalCall(GetLibAdress(ThreadBase, 18)); | ||
+ | Call(condition, ThreadBase); | ||
+ | End; | ||
+ | |||
+ | |||
+ | Procedure BroadcastCondition(condition: pvoid); | ||
+ | Type | ||
+ | TLocalCall = Procedure(condition: pvoid; LibBase: Pointer); cdecl; | ||
+ | Var | ||
+ | Call: TLocalCall; | ||
+ | Begin | ||
+ | Call := TLocalCall(GetLibAdress(ThreadBase, 19)); | ||
+ | Call(condition, ThreadBase); | ||
+ | End; | ||
+ | |||
+ | |||
+ | Procedure ExitThread(res: pvoid); | ||
+ | Type | ||
+ | TLocalCall = Procedure(res: pvoid; LibBase: Pointer); cdecl; | ||
+ | Var | ||
+ | Call: TLocalCall; | ||
+ | Begin | ||
+ | Call := TLocalCall(GetLibAdress(ThreadBase, 20)); | ||
+ | Call(res, ThreadBase); | ||
+ | End; | ||
+ | |||
+ | |||
+ | |||
+ | Initialization | ||
+ | ThreadBase := OpenLibrary('Thread.library',0); | ||
+ | |||
+ | Finalization | ||
+ | CloseLibrary(ThreadBase); | ||
+ | |||
+ | end. | ||
+ | </source> |
Revision as of 17:55, 20 September 2013
threads.library
[insert background information here]
examples
example 1
example 2
example 3
example 4
the unit
unit contrib_thread;
{$MODE OBJFPC} {$H+} {$PACKRECORDS C}
Interface
uses
Exec;
Type
uint32_t = LongWord;
// pvoid = TProcedure;
// pvoid = pointer;
// ppvoid = ^pvoid;
// BOOL = LongBool;
Type
TThreadEntryFunction = Function(data: pvoid): pvoid; cdecl;
Var
ThreadBase: pLibrary;
Function CreateThread(entry: TThreadEntryFunction; data: pvoid): uint32_t;
Function WaitThread(thread_id: uint32_t; res: ppvoid): BOOL;
Procedure WaitAllThreads;
Function DetachThread(thread_id: uint32_t): BOOL;
Function CurrentThread: uint32_t;
Function CreateMutex: pvoid;
Function DestroyMutex(mutex: pvoid): BOOL;
Procedure LockMutex(mutex: pvoid);
Function TryLockMutex(mutex: pvoid): BOOL;
Procedure UnlockMutex(mutex: pvoid);
Function CreateCondition: pvoid;
Function DestroyCondition(condition: pvoid): BOOL;
Function WaitCondition(condition: pvoid; mutex: pvoid): BOOL;
Procedure SignalCondition(condition: pvoid);
Procedure BroadcastCondition(condition: pvoid);
Procedure ExitThread(res: pvoid);
Implementation
Function CreateThread(entry: TThreadEntryFunction; data: pvoid): uint32_t;
Type
TLocalCall = Function(entry: TThreadEntryFunction; data: pvoid; LibBase: Pointer): uint32_t; cdecl;
Var
Call: TLocalCall;
Begin
Call := TLocalCall(GetLibAdress(ThreadBase, 5));
CreateThread := Call(entry, data, ThreadBase);
End;
Function WaitThread(thread_id: uint32_t; res: ppvoid): BOOL;
Type
TLocalCall = Function(thread_id: uint32_t; res: ppvoid; LibBase: Pointer): BOOL; cdecl;
Var
Call: TLocalCall;
Begin
Call := TLocalCall(GetLibAdress(ThreadBase, 6));
WaitThread := Call(thread_id, res, ThreadBase);
End;
Procedure WaitAllThreads;
Type
TLocalCall = Procedure(LibBase: Pointer); cdecl;
Var
Call: TLocalCall;
Begin
Call := TLocalCall(GetLibAdress(ThreadBase, 7));
Call(ThreadBase);
End;
Function DetachThread(thread_id: uint32_t): BOOL;
Type
TLocalCall = Function(thread_id: uint32_t; LibBase: Pointer): BOOL; cdecl;
Var
Call: TLocalCall;
Begin
Call := TLocalCall(GetLibAdress(ThreadBase, 8));
DetachThread := Call(thread_id, ThreadBase);
End;
Function CurrentThread: uint32_t;
Type
TLocalCall = Function(LibBase: Pointer): uint32_t; cdecl;
Var
Call: TLocalCall;
Begin
Call := TLocalCall(GetLibAdress(ThreadBase, 9));
CurrentThread := Call(ThreadBase);
End;
Function CreateMutex: pvoid;
Type
TLocalCall = Function(LibBase: Pointer): pvoid; cdecl;
Var
Call: TLocalCall;
Begin
Call := TLocalCall(GetLibAdress(ThreadBase, 10));
CreateMutex := Call(ThreadBase);
End;
Function DestroyMutex(mutex: pvoid): BOOL;
Type
TLocalCall = Function(mutex: pvoid; LibBase: Pointer): BOOL; cdecl;
Var
Call: TLocalCall;
Begin
Call := TLocalCall(GetLibAdress(ThreadBase, 11));
DestroyMutex := Call(mutex, ThreadBase);
End;
Procedure LockMutex(mutex: pvoid);
Type
TLocalCall = Procedure(mutex: pvoid; LibBase: Pointer); cdecl;
Var
Call: TLocalCall;
Begin
Call := TLocalCall(GetLibAdress(ThreadBase, 12));
Call(mutex, ThreadBase);
End;
Function TryLockMutex(mutex: pvoid): BOOL;
Type
TLocalCall = Function(mutex: pvoid; LibBase: Pointer): BOOL; cdecl;
Var
Call: TLocalCall;
Begin
Call := TLocalCall(GetLibAdress(ThreadBase, 13));
TryLockMutex := Call(mutex, ThreadBase);
End;
Procedure UnlockMutex(mutex: pvoid);
Type
TLocalCall = Procedure(mutex: pvoid; LibBase: Pointer); cdecl;
Var
Call: TLocalCall;
Begin
Call := TLocalCall(GetLibAdress(ThreadBase, 14));
Call(mutex, ThreadBase);
End;
Function CreateCondition: pvoid;
Type
TLocalCall = Function(LibBase: Pointer): pvoid; cdecl;
Var
Call: TLocalCall;
Begin
Call := TLocalCall(GetLibAdress(ThreadBase, 15));
CreateCondition := Call(ThreadBase);
End;
Function DestroyCondition(condition: pvoid): BOOL;
Type
TLocalCall = Function(condition: pvoid; LibBase: Pointer): BOOL; cdecl;
Var
Call: TLocalCall;
Begin
Call := TLocalCall(GetLibAdress(ThreadBase, 16));
DestroyCondition := Call(condition, ThreadBase);
End;
Function WaitCondition(condition: pvoid; mutex: pvoid): BOOL;
Type
TLocalCall = Function(condition: pvoid; mutex: pvoid; LibBase: Pointer): BOOL; cdecl;
Var
Call: TLocalCall;
Begin
Call := TLocalCall(GetLibAdress(ThreadBase, 17));
WaitCondition := Call(condition, mutex, ThreadBase);
End;
Procedure SignalCondition(condition: pvoid);
Type
TLocalCall = Procedure(condition: pvoid; LibBase: Pointer); cdecl;
Var
Call: TLocalCall;
Begin
Call := TLocalCall(GetLibAdress(ThreadBase, 18));
Call(condition, ThreadBase);
End;
Procedure BroadcastCondition(condition: pvoid);
Type
TLocalCall = Procedure(condition: pvoid; LibBase: Pointer); cdecl;
Var
Call: TLocalCall;
Begin
Call := TLocalCall(GetLibAdress(ThreadBase, 19));
Call(condition, ThreadBase);
End;
Procedure ExitThread(res: pvoid);
Type
TLocalCall = Procedure(res: pvoid; LibBase: Pointer); cdecl;
Var
Call: TLocalCall;
Begin
Call := TLocalCall(GetLibAdress(ThreadBase, 20));
Call(res, ThreadBase);
End;
Initialization
ThreadBase := OpenLibrary('Thread.library',0);
Finalization
CloseLibrary(ThreadBase);
end.