log.pll

来自「一个嵌入式系统的C代码」· PLL 代码 · 共 135 行

PLL
135
字号
PROGRAM Log(INPUT, OUTPUT);

{-----------------------------------------------------------}
{ PURPOSE: ACME Application Log program                     }
{          - uses shared memory to record/observe what      }
{            users are doing with ACME application          }
{          - does not implement mutual exclusion at all     }
{	   - will try to read when there is nothing to read }
{ AUTHOR:  David Jones                                      }
{ DATE:    1-MAY-95   Created                               }
{-----------------------------------------------------------}

CONST
  NUM_ELEMENTS = 5; {** NUMBER OF ELEMENTS TO BE STORED **}
  QUEUE_START  = 3; {** INDEX WHERE QUEUE STARTS **}

VAR
  logging_shm, process_id, action_id : INTEGER;

{*******************************************}
{ ConnectIPC                                }
{   - either create and initialise shared   }
{     memory, OR                            }
{   - connect to the existing shared memory }
{   - shm id is returned as VAR parameter   }
{*******************************************}

FUNCTION ConnectIPC : INTEGER;
VAR
  result, count : INTEGER;

BEGIN
  logging_shm := SYSTEM( SHR_OPEN, 'myshm' );
  IF logging_shm <= 0 THEN
  BEGIN
    logging_shm := SYSTEM( SHR_CREATE, 'myshm', NUM_ELEMENTS*2+QUEUE_START );

    {** Initialise shared memory data structure **}
    result := SYSTEM( SHR_WRITE, logging_shm, 0, 0 );
    result := SYSTEM( SHR_WRITE, logging_shm, 1, QUEUE_START );
    result := SYSTEM( SHR_WRITE, logging_shm, 2, QUEUE_START );

    FOR count := QUEUE_START TO NUM_ELEMENTS*2+QUEUE_START-1 DO
    BEGIN
      result := SYSTEM( SHR_WRITE, logging_shm, count, -1 )
    END
  END;
  ConnectIPC := 1;
END;

{********************************************}
{ CloseIPC				     }
{   - free up any IPC primitives used        }
{********************************************}

PROCEDURE CloseIPC;
VAR
  result : INTEGER;
BEGIN
  result := SYSTEM( SHR_CLOSE, logging_shm );
END;

{********************************************}
{ ReadAction                                 }
{   - get from shm the next process, action  }
{     ids, if there are some there           }
{********************************************}

PROCEDURE ReadAction;
VAR
  get, result : INTEGER;
BEGIN
  { get location of next id pair to read }
  get := SYSTEM( SHR_READ, logging_shm, 2 );

  process_id := SYSTEM( SHR_READ, logging_shm, get );
  action_id := SYSTEM( SHR_READ, logging_shm, get+1 );

  {* check to see if there was something to read *}
  IF ( process_id = -1 ) OR ( action_id = -1 ) THEN
  BEGIN
    Writeln( '*********' );
    Writeln( '**ERROR** log is empty' );
    Writeln( '*********' )
  END
  ELSE
  BEGIN
    {* delete pair from log *}
    result := SYSTEM( SHR_WRITE, logging_shm, get, -1 );
    result := SYSTEM( SHR_WRITE, logging_shm, get+1, -1 );

    {* update get location *}
    get := get + 2;
    IF get = NUM_ELEMENTS * 2 + QUEUE_START THEN
      get := QUEUE_START;
    result := SYSTEM( SHR_WRITE, logging_shm, 2, get )
  END
END;

PROCEDURE DoAction;
VAR
  temp : INTEGER;
BEGIN
  WHILE 1 = 1 DO
  BEGIN
    Writeln( 'enter to read next element' );
    Read( temp# );

    ReadAction;

    Write( 'Process ', process_id# );

    IF action_id = 1 THEN
      Writeln( ' created new user.' );

    IF action_id = 2 THEN
      Writeln( ' deleted user.' );

    IF action_id = 3 THEN
      Writeln( ' viewed users.' );

    IF action_id = 4 THEN
      Writeln( ' exited application.' )
  END
END;

BEGIN
  IF ConnectIPC = 1 THEN
    DoAction
  ELSE
    Writeln( '** UNABLE TO OPEN IPC PRIMITIVES **' )
END.

{------------------------------ EOF -----------------------------}

⌨️ 快捷键说明

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