curr_task.adb

来自「用于进行gcc测试」· ADB 代码 · 共 135 行

ADB
135
字号
-- { dg-do run }-- { dg-options "-gnatws" }with Ada.Exceptions;with Ada.Text_IO;with Ada.Task_Identification;procedure Curr_Task is   use Ada.Task_Identification;   --  Simple semaphore   protected Semaphore is      entry Lock;      procedure Unlock;   private      TID        : Task_Id := Null_Task_Id;      Lock_Count : Natural := 0;   end Semaphore;   ----------   -- Lock --   ----------   procedure Lock is   begin      Semaphore.Lock;   end Lock;   ---------------   -- Semaphore --   ---------------   protected body Semaphore is      ----------      -- Lock --      ----------      entry Lock when Lock_Count = 0        or else TID = Current_Task      is      begin         if not           (Lock_Count = 0            or else TID = Lock'Caller)         then            Ada.Text_IO.Put_Line              ("Barrier leaks " & Lock_Count'Img                 & ' ' & Image (TID)                 & ' ' & Image (Lock'Caller));         end if;         Lock_Count := Lock_Count + 1;         TID := Lock'Caller;      end Lock;      ------------      -- Unlock --      ------------      procedure Unlock is      begin         if TID = Current_Task then            Lock_Count := Lock_Count - 1;         else            raise Tasking_Error;         end if;      end Unlock;   end Semaphore;   ------------   -- Unlock --   ------------   procedure Unlock is   begin      Semaphore.Unlock;   end Unlock;   task type Secondary is      entry Start;   end Secondary;   procedure Parse (P1 : Positive);   -----------   -- Parse --   -----------   procedure Parse (P1 : Positive) is   begin      Lock;      delay 0.01;      if P1 mod 2 = 0 then         Lock;         delay 0.01;         Unlock;      end if;      Unlock;   end Parse;   ---------------   -- Secondary --   ---------------   task body Secondary is   begin      accept Start;      for K in 1 .. 20 loop         Parse (K);      end loop;      raise Constraint_Error;   exception      when Program_Error =>         null;   end Secondary;   TS : array (1 .. 2) of Secondary;begin   Parse (1);   for J in TS'Range loop      TS (J).Start;   end loop;end Curr_Task;

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?