with DATA_RECORDING; use DATA_RECORDING; with CONVERSIONS; use CONVERSIONS; with UATL_DISPLAY; use UATL_DISPLAY; with CONFIGURATION; with UNCHECKED_DEALLOCATION; package body COMMON_TO_BOTH_488 is function QUEUE_COUNT (QUEUE_NAME : in MESSAGE_LINK) return INTEGER is LIST_PTR : MESSAGE_POINTER := QUEUE_NAME.NEXT; COUNT : INTEGER := 0; begin loop exit when LIST_PTR.NEXT = null; COUNT := COUNT + 1; LIST_PTR := LIST_PTR.NEXT; end loop; return COUNT; end QUEUE_COUNT; task body QUEUE_TASK is procedure RELEASE is new UNCHECKED_DEALLOCATION (MESSAGE_LINK, MESSAGE_POINTER); LIST_PTR : MESSAGE_POINTER; MSG_PTR : MESSAGE_POINTER; begin -- task Queue loop select accept QUEUE(QUEUE_NAME : in out MESSAGE_LINK; LINK : MESSAGE_POINTER) do if QUEUE_NAME.NEXT = null then -- link into array of pointers QUEUE_NAME.NEXT := LINK; -- to unlock only else -- navigate to end of list LIST_PTR := QUEUE_NAME.NEXT; loop exit when LIST_PTR.NEXT = null; LIST_PTR := LIST_PTR.NEXT; end loop; LIST_PTR.NEXT := LINK; -- link at end of list end if; end QUEUE; or -- of the select accept DEQUEUE(QUEUE_NAME : in out MESSAGE_LINK) do if QUEUE_NAME.NEXT /= null then MSG_PTR := QUEUE_NAME.NEXT; QUEUE_NAME.NEXT := QUEUE_NAME.NEXT.NEXT; RELEASE (MSG_PTR); -- garbage collection end if; end DEQUEUE; end select; end loop; end QUEUE_TASK; task body IO_488 is function CONVERT is new CONVERT_TO_BYTE_ARRAY (GENERAL_488_MESSAGE); begin loop accept UNLOCK; loop accept RECEIVE(BUFFER : out GENERAL_488_MESSAGE) do BUFFER := RECEIVE_QUEUE.NEXT.MESSAGE; end RECEIVE; if MESSAGE_WILL_BE_RECORDED(IEEE488,FROM_488_BUS) then RECORD_MESSAGE (MSG => CONVERT(RECEIVE_QUEUE.NEXT.MESSAGE), INTERFACE_ID => IEEE488, BATCH_ID => FROM_488_BUS); end if; if MESSAGE_WILL_BE_DISPLAYED(IEEE488,FROM_488_BUS) then ONLINE_DISPLAY (MSG => CONVERT(RECEIVE_QUEUE.NEXT.MESSAGE), BAT => FROM_488_BUS, INT => IEEE488); end if; QUEUE_TASK.DEQUEUE(RECEIVE_QUEUE); exit when RECEIVE_QUEUE.NEXT = null; end loop; end loop; end IO_488; end COMMON_TO_BOTH_488;