]> rtime.felk.cvut.cz Git - frescor/fosa.git/blob - marte_non_local_jump/context.adb
d0379f6cd6f4af09060c0b96cd83dfb320c90294
[frescor/fosa.git] / marte_non_local_jump / context.adb
1 with Text_IO; use Text_IO;\r
2 with Basic_Integer_Types;\r
3 with Non_Local_Jump;\r
4 with System;\r
5 \r
6 use type Basic_Integer_Types.Unsigned_32;\r
7 \r
8 package body Context is\r
9 \r
10    Jmp_Buff : aliased Non_Local_Jump.Jmp_Context;\r
11    pragma Volatile (Jmp_Buff);\r
12 \r
13    TCB : System.Address := System.Null_Address;\r
14    pragma Volatile (TCB);\r
15 \r
16    function Pthread_Self return System.Address;\r
17    pragma Import (C, Pthread_Self, "pthread_self");\r
18 \r
19    function Execute_Work(Work : Work_Acc) return Integer is\r
20    begin\r
21       Put_Line ("Start work");\r
22       TCB := Pthread_Self;\r
23       Non_Local_Jump.Save_Context(Jmp_Buff'Access);\r
24       if Non_Local_Jump.After_Jump (Jmp_Buff'Access) = 0 then\r
25          Put_Line ("---Not After Jump---");\r
26          Work.all;\r
27          return 0;\r
28       else\r
29          Put_Line ("---After Jump---");\r
30          return 1;\r
31       end if;\r
32    end Execute_Work;\r
33 \r
34    procedure Restore_Work is\r
35    begin\r
36       Non_Local_Jump.Restore_Context (TCB, Jmp_Buff'Access);\r
37    end Restore_Work;\r
38 \r
39 end Context;\r