|
|
DataMuseum.dkPresents historical artifacts from the history of: Rational R1000/400 |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about Rational R1000/400 Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 6954 (0x1b2a)
Types: TextFile
Notes: R1k Text-file segment
└─⟦8527c1e9b⟧ Bits:30000544 8mm tape, Rational 1000, Arrival backup of disks in PAM's R1000
└─⟦cfc2e13cd⟧ »Space Info Vol 2«
└─⟦8e77c7d76⟧
└─⟦this⟧
-- Copyright 1988, 1992 Verdix Corporation
------------------------------------------------------------------------------
-- User interface to the counting semaphore data structures and subprograms
--
-- Provides backward compatibility with earlier releases of VADS.
--
-- The interface to ALL the low kernel services is now provided in
-- ada_krn_i.a. Types used by these services is defined in ada_krn_defs.a.
--
-- This package simply layers upon the counting semaphore data structures and
-- subprograms found in ada_krn_defs.a and ada_krn_i.a.
--
-- Differences from earlier releases:
-- [1] The intr_flag and intr_status are only applicable to the
-- VADS_MICRO.
-- [2] For the delete() service, if the conditional_delete_flag is TRUE,
-- the semaphore might not be deleted even though no tasks are
-- waiting on it. This caveat isn't applicable to the VADS_MICRO.
------------------------------------------------------------------------------
with ada_krn_defs;
with ada_krn_i;
package v_i_csema is
pragma suppress(ALL_CHECKS);
pragma suppress(EXCEPTION_TABLES);
pragma not_elaborated;
type intr_status_t is new ada_krn_defs.intr_status_t;
-- DISABLE_INTR_STATUS : constant intr_status_t :=
-- intr_status_t(ada_krn_defs.DISABLE_INTR_STATUS);
function DISABLE_INTR_STATUS return intr_status_t;
pragma inline_only(DISABLE_INTR_STATUS);
-- Predefined wait_time values
WAIT_FOREVER: constant duration := -1.0;
DO_NOT_WAIT: constant duration := 0.0;
--------------------------------------------------------------------------
-- Counting semaphore data structure
--------------------------------------------------------------------------
type cnt_sema_record_t is new ada_krn_defs.count_semaphore_t;
type a_cnt_sema_t is new ada_krn_defs.a_count_semaphore_t;
--------------------------------------------------------------------------
-- Create a new counting semaphore.
--
-- Normally, the critical region for updating the semaphore's
-- count is protected by a binary semaphore.
--
-- However, if the intr_flag is TRUE, then,
-- its critical region is protected by disabling interrupts. This
-- allows the counting semaphore to be accessed from an ISR.
--
-- STORAGE_ERROR exception is raised if not enough memory for semaphore.
--
-- Use of the intr_flag and intr_status fields is only applicable
-- to the VADS_MICRO.
--------------------------------------------------------------------------
function create(initial_count: integer := 1;
intr_flag: boolean := FALSE;
intr_status: intr_status_t := DISABLE_INTR_STATUS
) return a_cnt_sema_t;
pragma inline_only(create);
--------------------------------------------------------------------------
-- Deletes a previously created counting semaphore. Returns TRUE if
-- deletion was successful.
--
-- If conditional_delete_flag parameter is TRUE, then, semaphore
-- is not deleted if any task is waiting on it.
-- Otherwise, semaphore is always deleted and waiting tasks
-- are resumed.
--
-- Note: if the conditional_delete_flag is TRUE, the semaphore might not
-- be deleted even though no tasks are waiting on it. This caveat isn't
-- applicable to the VADS_MICRO.
--------------------------------------------------------------------------
function delete(cnt_sema: a_cnt_sema_t; conditional_delete_flag: boolean)
return boolean;
pragma inline_only(delete);
--------------------------------------------------------------------------
-- Waits on a counting semaphore.
--
-- Returns TRUE, if semaphore count > 0. The count is decremented
-- before returning.
--
-- If count <= 0, then, returns according to the wait_time parameter:
-- < 0.0 - returns when count > 0. This may necessitate
-- suspension of current task until another task
-- signals.
-- = 0.0 - returns FALSE immediately if count <= 0.
-- > 0.0 - if count doesn't become positive
-- within "wait_time" amount of time, returns FALSE.
--
-- Note: returns FALSE for any wait_time, if semaphore was deleted.
--
--------------------------------------------------------------------------
function wait(cnt_sema: a_cnt_sema_t;
wait_time: duration) return boolean;
pragma inline_only(wait);
--------------------------------------------------------------------------
-- Signals a counting semaphore.
--
-- Increments the semphore's count. If count > 0, resumes next
-- task waiting on semaphore.
--------------------------------------------------------------------------
procedure signal(cnt_sema: a_cnt_sema_t);
pragma inline_only(signal);
end v_i_csema;
with system;
with ada_krn_defs;
with ada_krn_i;
with unchecked_deallocation;
package body v_i_csema is
pragma suppress(ALL_CHECKS);
pragma suppress(EXCEPTION_TABLES);
function create(initial_count: integer := 1;
intr_flag: boolean := FALSE;
intr_status: intr_status_t := DISABLE_INTR_STATUS
) return a_cnt_sema_t
is
s: ada_krn_defs.a_count_semaphore_t :=
new ada_krn_defs.count_semaphore_t;
begin
if intr_flag then
declare
attr_rec: ada_krn_defs.count_semaphore_attr_t;
begin
ada_krn_defs.count_intr_attr_init(
ada_krn_defs.to_a_count_semaphore_attr_t(attr_rec'address),
ada_krn_defs.intr_status_t(intr_status));
if not ada_krn_i.count_semaphore_init(s, initial_count,
ada_krn_defs.to_a_count_semaphore_attr_t(attr_rec'address))
then
raise STORAGE_ERROR;
end if;
end;
else
if not ada_krn_i.count_semaphore_init(s, initial_count,
ada_krn_defs.DEFAULT_COUNT_SEMAPHORE_ATTR)
then
raise STORAGE_ERROR;
end if;
end if;
return a_cnt_sema_t(s);
end;
procedure free is new unchecked_deallocation(
ada_krn_defs.count_semaphore_t,
ada_krn_defs.a_count_semaphore_t);
function delete(cnt_sema: a_cnt_sema_t; conditional_delete_flag: boolean)
return boolean
is
s: ada_krn_defs.a_count_semaphore_t :=
ada_krn_defs.a_count_semaphore_t(cnt_sema);
begin
if conditional_delete_flag and then
ada_krn_i.count_semaphore_get_in_use(s)
then
return FALSE;
end if;
ada_krn_i.count_semaphore_destroy(s);
free(s);
return TRUE;
end;
function wait(cnt_sema: a_cnt_sema_t;
wait_time: duration) return boolean
is
begin
return ada_krn_i.count_semaphore_wait(
ada_krn_defs.a_count_semaphore_t(cnt_sema), wait_time);
end;
procedure signal(cnt_sema: a_cnt_sema_t) is
begin
ada_krn_i.count_semaphore_signal(
ada_krn_defs.a_count_semaphore_t(cnt_sema));
end;
function DISABLE_INTR_STATUS return intr_status_t is
begin
return intr_status_t(ada_krn_defs.DISABLE_INTR_STATUS);
end;
end v_i_csema