?? RIGHT := 110 ??
?? NEWTITLE := 'NOS/VE Network Access : Get Periodic Statistical Data' ??
MODULE nam$fetch_statistical_data;
?? RIGHT := 110 ??

{ PURPOSE:
{   This module contains the procedures to get the statistical data collected
{   by the NAM/VE layers and management entities.

?? NEWTITLE := 'Global Declarations Referenced by this Module', EJECT ??
?? PUSH (LISTEXT := ON) ??
*copyc nlt$device_count
*copyc oss$task_shared
*copyc ost$data_id
*copyc ost$signature_lock_status
?? POP ??
*copyc nav$global_statistics
*copyc nav$global_osi_statistics
*copyc osv$task_shared_heap
*copyc syv$nos_system_time
?? TITLE := 'Global Declarations Declared by this Module', EJECT ??

  VAR
    last_intranet_statistic: [STATIC, oss$task_shared] ^ost$intranet_statistics := NIL,
    last_namve_statistic: [STATIC, oss$task_shared] ^ost$namve_statistics := NIL,
    last_channel_device_statistic: [STATIC, oss$task_shared] ^ost$channel_device_statistics := NIL,
    last_namve_osi_statistic: [STATIC, oss$task_shared] ^ost$namve_osi_statistics := NIL;

?? TITLE := '[XDCL, #GATE] nap$get_intranet_statistics', EJECT ??

{ PURPOSE:
{   The purpose of this request is to get the data for the intranet layer
{   periodic statistics.  The statistics are collected separately for each
{   network solution.

  PROCEDURE [XDCL, #GATE] nap$get_intranet_statistics
    (    incremental: boolean;
     VAR intranet_statistic: ost$intranet_statistics);

    VAR
      i: nlt$device_count,
      local_statistic: ost$intranet_statistics,
      statistic1_p: ^nat$intranet_statistic,
      statistic2_p: ^nat$intranet_statistic,
      statistic3_p: ^nat$intranet_statistic,
      networks_count: nlt$device_count;

    local_statistic.time := #FREE_RUNNING_CLOCK (0) - syv$nos_system_time.corresponding_frc;
    networks_count := (UPPERBOUND (nav$global_statistics.intranet^) -
          LOWERBOUND (nav$global_statistics.intranet^)) + 1;
    PUSH local_statistic.stats: [1 .. networks_count];

    FOR i := 1 TO networks_count DO
      statistic1_p := ^local_statistic.stats^ [i];
      statistic2_p := ^nav$global_statistics.intranet^ [i];

      statistic1_p^.logical_unit_number := statistic2_p^.logical_unit_number;
      statistic1_p^.network_id := statistic2_p^.network_id;
      statistic1_p^.current_send_pdus_queued := statistic2_p^.current_send_pdus_queued;
      statistic1_p^.multicasts_received := statistic_value (^statistic2_p^.multicasts_received);
      statistic1_p^.multicasts_sent := statistic_value (^statistic2_p^.multicasts_sent);
      statistic1_p^.receive.value := statistic_value (^statistic2_p^.receive.value);
      statistic1_p^.receive_pdus_discarded := statistic_value (^statistic2_p^.receive_pdus_discarded);
      statistic1_p^.send.value := statistic_value (^statistic2_p^.send.value);
      statistic1_p^.send_pdus_discarded := statistic_value (^statistic2_p^.send_pdus_discarded);
    FOREND;

    IF incremental THEN
      IF last_intranet_statistic = NIL THEN
        ALLOCATE last_intranet_statistic IN osv$task_shared_heap^;
        ALLOCATE last_intranet_statistic^.stats: [1 .. networks_count] IN osv$task_shared_heap^;
        intranet_statistic := local_statistic;
      ELSE
        intranet_statistic.time := local_statistic.time - last_intranet_statistic^.time;
        FOR i := 1 TO networks_count DO
          statistic1_p := ^local_statistic.stats^ [i];
          statistic2_p := ^last_intranet_statistic^.stats^ [i];
          statistic3_p := ^intranet_statistic.stats^ [i];

          statistic3_p^.current_send_pdus_queued := statistic1_p^.current_send_pdus_queued -
                statistic2_p^.current_send_pdus_queued;
          statistic3_p^.multicasts_received := statistic1_p^.multicasts_received -
                statistic2_p^.multicasts_received;
          statistic3_p^.multicasts_sent := statistic1_p^.multicasts_sent - statistic2_p^.multicasts_sent;
          IF statistic1_p^.receive.pdu_total > statistic2_p^.receive.pdu_total THEN
            statistic3_p^.receive.pdu_average := ((statistic1_p^.receive.pdu_average *
                  statistic1_p^.receive.pdu_total) - (statistic2_p^.receive.pdu_average *
                  last_intranet_statistic^.stats^ [i].receive.pdu_total)) DIV
                  (statistic1_p^.receive.pdu_total - statistic2_p^.receive.pdu_total);
            statistic3_p^.receive.pdu_total := statistic1_p^.receive.pdu_total -
                  statistic2_p^.receive.pdu_total;
          ELSE
            statistic3_p^.receive.pdu_average := 0;
            statistic3_p^.receive.pdu_total := 0;
          IFEND;
          statistic3_p^.receive_pdus_discarded := statistic1_p^.receive_pdus_discarded -
                statistic2_p^.receive_pdus_discarded;
          IF statistic1_p^.send.pdu_total > statistic2_p^.send.pdu_total THEN
            statistic3_p^.send.pdu_average_size := ((statistic1_p^.send.pdu_average_size *
                  statistic1_p^.send.pdu_total) - (statistic2_p^.send.pdu_average_size *
                  statistic2_p^.send.pdu_total)) DIV (statistic1_p^.send.pdu_total -
                  statistic2_p^.send.pdu_total);
            statistic3_p^.send.pdu_fragment_average := ((statistic1_p^.send.pdu_fragment_average *
                  statistic1_p^.send.pdu_total) - (statistic2_p^.send.pdu_fragment_average *
                  statistic2_p^.send.pdu_total)) DIV (statistic1_p^.send.pdu_total -
                  statistic2_p^.send.pdu_total);
            statistic3_p^.send.pdu_total := statistic1_p^.send.pdu_total - statistic2_p^.send.pdu_total;
          ELSE
            statistic3_p^.send.pdu_average_size := 0;
            statistic3_p^.send.pdu_fragment_average := 0;
            statistic3_p^.send.pdu_total := 0;
          IFEND;
          statistic3_p^.send_pdus_discarded := statistic1_p^.send_pdus_discarded -
                statistic2_p^.send_pdus_discarded;
        FOREND;
      IFEND;
      last_intranet_statistic^.time := local_statistic.time;
      last_intranet_statistic^.stats^ := local_statistic.stats^;
    ELSE
      intranet_statistic.time := local_statistic.time;
      intranet_statistic.stats^ := local_statistic.stats^;
    IFEND;

  PROCEND nap$get_intranet_statistics;
?? TITLE := '[XDCL] nap$get_namve_statistics', EJECT ??

{ PURPOSE:
{   The purpose of this request is to get the statistical data for the NAM/VE layers.

  PROCEDURE [XDCL, #GATE] nap$get_namve_statistics
    (    incremental: boolean;
     VAR namve_statistic: ost$namve_statistics);

    VAR
      i: 1 .. 2,
      j: 1 .. 2,
      local_statistic: ost$namve_statistics;

    local_statistic.time := #FREE_RUNNING_CLOCK (0) - syv$nos_system_time.corresponding_frc;

    local_statistic.stats.internet.broadcasts_sent := statistic_value
          (^nav$global_statistics.internet.broadcasts_sent);
    local_statistic.stats.internet.pdus_received := statistic_value
          (^nav$global_statistics.internet.pdus_received);
    local_statistic.stats.internet.pdus_relayed := statistic_value
          (^nav$global_statistics.internet.pdus_relayed);
    local_statistic.stats.internet.pdus_routed_locally :=
          statistic_value (^nav$global_statistics.internet.pdus_routed_locally);
    local_statistic.stats.internet.pdus_sent := statistic_value (^nav$global_statistics.internet.pdus_sent);

    local_statistic.stats.transport.active_connections :=
          statistic_value (^nav$global_statistics.transport.active_connections);
    local_statistic.stats.transport.reference_number_wait :=
          statistic_value (^nav$global_statistics.transport.reference_number_wait);
    local_statistic.stats.transport.initiated_connections :=
          statistic_value (^nav$global_statistics.transport.initiated_connections);
    local_statistic.stats.transport.connections_terminated :=
          statistic_value (^nav$global_statistics.transport.connections_terminated);
    local_statistic.stats.transport.data_packets_received :=
          statistic_value (^nav$global_statistics.transport.data_packets_received);
    local_statistic.stats.transport.data_packets_sent := statistic_value
          (^nav$global_statistics.transport.data_packets_sent);
    local_statistic.stats.transport.xdata_packets_received :=
          statistic_value (^nav$global_statistics.transport.xdata_packets_received);
    local_statistic.stats.transport.xdata_packets_sent :=
          statistic_value (^nav$global_statistics.transport.xdata_packets_sent);
    local_statistic.stats.transport.retransmissions := statistic_value
          (^nav$global_statistics.transport.retransmissions);
    local_statistic.stats.transport.duplicate_data_packets :=
          statistic_value (^nav$global_statistics.transport.duplicate_data_packets);
    local_statistic.stats.transport.duplicate_xdata_packets :=
          statistic_value (^nav$global_statistics.transport.duplicate_xdata_packets);
    local_statistic.stats.transport.discarded_data_packets :=
          statistic_value (^nav$global_statistics.transport.discarded_data_packets);
    local_statistic.stats.transport.discarded_xdata_packets :=
          statistic_value (^nav$global_statistics.transport.discarded_xdata_packets);
    local_statistic.stats.transport.probe_packets_received :=
          statistic_value (^nav$global_statistics.transport.probe_packets_received);
    local_statistic.stats.transport.probe_packets_sent :=
          statistic_value (^nav$global_statistics.transport.probe_packets_sent);
    local_statistic.stats.transport.probe_packets_discarded :=
          statistic_value (^nav$global_statistics.transport.probe_packets_discarded);
    local_statistic.stats.transport.acknowledgment_requests_recved :=
          statistic_value (^nav$global_statistics.transport.acknowledgment_requests_recved);
    local_statistic.stats.transport.acknowledgment_requests_sent :=
          statistic_value (^nav$global_statistics.transport.acknowledgment_requests_sent);
    local_statistic.stats.transport.acknowledgments_discarded :=
          statistic_value (^nav$global_statistics.transport.acknowledgments_discarded);
    local_statistic.stats.transport.error_packets_received :=
          statistic_value (^nav$global_statistics.transport.error_packets_received);
    local_statistic.stats.transport.error_packets_sent :=
          statistic_value (^nav$global_statistics.transport.error_packets_sent);

    local_statistic.stats.session.interrupt_requests_received :=
          statistic_value (^nav$global_statistics.session.interrupt_requests_received);
    local_statistic.stats.session.interrupt_requests_sent :=
          statistic_value (^nav$global_statistics.session.interrupt_requests_sent);
    local_statistic.stats.session.synchronize_requests_received :=
          statistic_value (^nav$global_statistics.session.synchronize_requests_received);
    local_statistic.stats.session.synchronize_requests_sent :=
          statistic_value (^nav$global_statistics.session.synchronize_requests_sent);

    local_statistic.stats.routing.duplicate_received_ridus :=
          nav$global_statistics.routing.duplicate_received_ridus;
    local_statistic.stats.routing.ridus_aged_out := nav$global_statistics.routing.ridus_aged_out;
    local_statistic.stats.routing.ridus_received := nav$global_statistics.routing.ridus_received;
    local_statistic.stats.routing.ridus_sent := nav$global_statistics.routing.ridus_sent;
    local_statistic.stats.routing.table_partial_updates :=
          nav$global_statistics.routing.table_partial_updates;
    local_statistic.stats.routing.table_recomputed_direct_network :=
          nav$global_statistics.routing.table_recomputed_direct_network;
    local_statistic.stats.routing.table_recomputed_remote_network :=
          nav$global_statistics.routing.table_recomputed_remote_network;

    local_statistic.stats.directory.broadcast_translations_received :=
          statistic_value (^nav$global_statistics.directory.broadcast_translations_received);
    local_statistic.stats.directory.current_cache_entries :=
          nav$global_statistics.directory.current_cache_entries;
    local_statistic.stats.directory.current_registered_titles :=
          nav$global_statistics.directory.current_registered_titles;
    local_statistic.stats.directory.directory_searches_active :=
          nav$global_statistics.directory.directory_searches_active;
    local_statistic.stats.directory.directory_searches_initiated :=
          statistic_value (^nav$global_statistics.directory.directory_searches_initiated);
    local_statistic.stats.directory.translation_requests_broadcast :=
          nav$global_statistics.directory.translation_requests_broadcast;
    local_statistic.stats.directory.translation_requests_received :=
          nav$global_statistics.directory.translation_requests_received;
    local_statistic.stats.directory.translations_broadcast :=
          nav$global_statistics.directory.translations_broadcast;
    local_statistic.stats.directory.translations_delivered :=
          nav$global_statistics.directory.translations_delivered;
    local_statistic.stats.directory.translations_found_in_cache :=
          nav$global_statistics.directory.translations_found_in_cache;
    local_statistic.stats.directory.translations_found_in_local_dir :=
          nav$global_statistics.directory.translations_found_in_local_dir;
    local_statistic.stats.directory.translations_received :=
          statistic_value (^nav$global_statistics.directory.translations_received);
    local_statistic.stats.directory.translations_sent := nav$global_statistics.directory.translations_sent;

    local_statistic.stats.file_access := nav$global_statistics.file_access;

    local_statistic.stats.buffer_manager := nav$global_statistics.buffer_manager;

    local_statistic.stats.pp_buffer_pool := nav$global_statistics.pp_buffer_pool;

    IF incremental THEN
      IF last_namve_statistic = NIL THEN
        ALLOCATE last_namve_statistic IN osv$task_shared_heap^;
        namve_statistic := local_statistic;
      ELSE
        namve_statistic.time := local_statistic.time - last_namve_statistic^.time;
        namve_statistic.stats.internet.broadcasts_sent := local_statistic.stats.internet.broadcasts_sent -
              last_namve_statistic^.stats.internet.broadcasts_sent;
        namve_statistic.stats.internet.pdus_received := local_statistic.stats.internet.pdus_received -
              last_namve_statistic^.stats.internet.pdus_received;
        namve_statistic.stats.internet.pdus_relayed := local_statistic.stats.internet.pdus_relayed -
              last_namve_statistic^.stats.internet.pdus_relayed;
        namve_statistic.stats.internet.pdus_routed_locally :=
              local_statistic.stats.internet.pdus_routed_locally -
              last_namve_statistic^.stats.internet.pdus_routed_locally;
        namve_statistic.stats.internet.pdus_sent := local_statistic.stats.internet.pdus_sent -
              last_namve_statistic^.stats.internet.pdus_sent;

        namve_statistic.stats.transport.active_connections :=
              local_statistic.stats.transport.active_connections -
              last_namve_statistic^.stats.transport.active_connections;
        namve_statistic.stats.transport.reference_number_wait :=
              local_statistic.stats.transport.reference_number_wait -
              last_namve_statistic^.stats.transport.reference_number_wait;
        namve_statistic.stats.transport.initiated_connections :=
              local_statistic.stats.transport.initiated_connections -
              last_namve_statistic^.stats.transport.initiated_connections;
        namve_statistic.stats.transport.connections_terminated :=
              local_statistic.stats.transport.connections_terminated -
              last_namve_statistic^.stats.transport.connections_terminated;
        namve_statistic.stats.transport.data_packets_received :=
              local_statistic.stats.transport.data_packets_received -
              last_namve_statistic^.stats.transport.data_packets_received;
        namve_statistic.stats.transport.data_packets_sent :=
              local_statistic.stats.transport.data_packets_sent -
              last_namve_statistic^.stats.transport.data_packets_sent;
        namve_statistic.stats.transport.xdata_packets_received :=
              local_statistic.stats.transport.xdata_packets_received -
              last_namve_statistic^.stats.transport.xdata_packets_received;
        namve_statistic.stats.transport.xdata_packets_sent :=
              local_statistic.stats.transport.xdata_packets_sent -
              last_namve_statistic^.stats.transport.xdata_packets_sent;
        namve_statistic.stats.transport.retransmissions := local_statistic.stats.transport.retransmissions -
              last_namve_statistic^.stats.transport.retransmissions;
        namve_statistic.stats.transport.duplicate_data_packets :=
              local_statistic.stats.transport.duplicate_data_packets -
              last_namve_statistic^.stats.transport.duplicate_data_packets;
        namve_statistic.stats.transport.duplicate_xdata_packets :=
              local_statistic.stats.transport.duplicate_xdata_packets -
              last_namve_statistic^.stats.transport.duplicate_xdata_packets;
        namve_statistic.stats.transport.discarded_data_packets :=
              local_statistic.stats.transport.discarded_data_packets -
              last_namve_statistic^.stats.transport.discarded_data_packets;
        namve_statistic.stats.transport.discarded_xdata_packets :=
              local_statistic.stats.transport.discarded_xdata_packets -
              last_namve_statistic^.stats.transport.discarded_xdata_packets;
        namve_statistic.stats.transport.probe_packets_received :=
              local_statistic.stats.transport.probe_packets_received -
              last_namve_statistic^.stats.transport.probe_packets_received;
        namve_statistic.stats.transport.probe_packets_sent :=
              local_statistic.stats.transport.probe_packets_sent -
              last_namve_statistic^.stats.transport.probe_packets_sent;
        namve_statistic.stats.transport.probe_packets_discarded :=
              local_statistic.stats.transport.probe_packets_discarded -
              last_namve_statistic^.stats.transport.probe_packets_discarded;
        namve_statistic.stats.transport.acknowledgment_requests_recved :=
              local_statistic.stats.transport.acknowledgment_requests_recved -
              last_namve_statistic^.stats.transport.acknowledgment_requests_recved;
        namve_statistic.stats.transport.acknowledgment_requests_sent :=
              local_statistic.stats.transport.acknowledgment_requests_sent -
              last_namve_statistic^.stats.transport.acknowledgment_requests_sent;
        namve_statistic.stats.transport.acknowledgments_discarded :=
              local_statistic.stats.transport.acknowledgments_discarded -
              last_namve_statistic^.stats.transport.acknowledgments_discarded;
        namve_statistic.stats.transport.error_packets_received :=
              local_statistic.stats.transport.error_packets_received -
              last_namve_statistic^.stats.transport.error_packets_received;
        namve_statistic.stats.transport.error_packets_sent :=
              local_statistic.stats.transport.error_packets_sent -
              last_namve_statistic^.stats.transport.error_packets_sent;

        namve_statistic.stats.session.interrupt_requests_received :=
              local_statistic.stats.session.interrupt_requests_received -
              last_namve_statistic^.stats.session.interrupt_requests_received;
        namve_statistic.stats.session.interrupt_requests_sent :=
              local_statistic.stats.session.interrupt_requests_sent -
              last_namve_statistic^.stats.session.interrupt_requests_sent;
        namve_statistic.stats.session.synchronize_requests_received :=
              local_statistic.stats.session.synchronize_requests_received -
              last_namve_statistic^.stats.session.synchronize_requests_received;
        namve_statistic.stats.session.synchronize_requests_sent :=
              local_statistic.stats.session.synchronize_requests_sent -
              last_namve_statistic^.stats.session.synchronize_requests_sent;

        namve_statistic.stats.routing.duplicate_received_ridus :=
              local_statistic.stats.routing.duplicate_received_ridus -
              last_namve_statistic^.stats.routing.duplicate_received_ridus;
        namve_statistic.stats.routing.ridus_aged_out := local_statistic.stats.routing.ridus_aged_out -
              last_namve_statistic^.stats.routing.ridus_aged_out;
        namve_statistic.stats.routing.ridus_received := local_statistic.stats.routing.ridus_received -
              last_namve_statistic^.stats.routing.ridus_received;
        namve_statistic.stats.routing.ridus_sent := local_statistic.stats.routing.ridus_sent -
              last_namve_statistic^.stats.routing.ridus_sent;
        namve_statistic.stats.routing.table_partial_updates :=
              local_statistic.stats.routing.table_partial_updates -
              last_namve_statistic^.stats.routing.table_partial_updates;
        namve_statistic.stats.routing.table_recomputed_direct_network :=
              local_statistic.stats.routing.table_recomputed_direct_network -
              last_namve_statistic^.stats.routing.table_recomputed_direct_network;
        namve_statistic.stats.routing.table_recomputed_remote_network :=
              local_statistic.stats.routing.table_recomputed_remote_network -
              last_namve_statistic^.stats.routing.table_recomputed_remote_network;

        namve_statistic.stats.directory.broadcast_translations_received :=
              local_statistic.stats.directory.broadcast_translations_received -
              last_namve_statistic^.stats.directory.broadcast_translations_received;
        namve_statistic.stats.directory.current_cache_entries :=
              local_statistic.stats.directory.current_cache_entries -
              last_namve_statistic^.stats.directory.current_cache_entries;
        namve_statistic.stats.directory.current_registered_titles :=
              local_statistic.stats.directory.current_registered_titles -
              last_namve_statistic^.stats.directory.current_registered_titles;
        namve_statistic.stats.directory.directory_searches_active :=
              local_statistic.stats.directory.directory_searches_active -
              last_namve_statistic^.stats.directory.directory_searches_active;
        namve_statistic.stats.directory.directory_searches_initiated :=
              local_statistic.stats.directory.directory_searches_initiated -
              last_namve_statistic^.stats.directory.directory_searches_initiated;
        namve_statistic.stats.directory.translation_requests_broadcast :=
              local_statistic.stats.directory.translation_requests_broadcast -
              last_namve_statistic^.stats.directory.translation_requests_broadcast;
        namve_statistic.stats.directory.translation_requests_received :=
              local_statistic.stats.directory.translation_requests_received -
              last_namve_statistic^.stats.directory.translation_requests_received;
        namve_statistic.stats.directory.translations_broadcast :=
              local_statistic.stats.directory.translations_broadcast -
              last_namve_statistic^.stats.directory.translations_broadcast;
        namve_statistic.stats.directory.translations_delivered :=
              local_statistic.stats.directory.translations_delivered -
              last_namve_statistic^.stats.directory.translations_delivered;
        namve_statistic.stats.directory.translations_found_in_cache :=
              local_statistic.stats.directory.translations_found_in_cache -
              last_namve_statistic^.stats.directory.translations_found_in_cache;
        namve_statistic.stats.directory.translations_found_in_local_dir :=
              local_statistic.stats.directory.translations_found_in_local_dir -
              last_namve_statistic^.stats.directory.translations_found_in_local_dir;
        namve_statistic.stats.directory.translations_received :=
              local_statistic.stats.directory.translations_received -
              last_namve_statistic^.stats.directory.translations_received;
        namve_statistic.stats.directory.translations_sent :=
              local_statistic.stats.directory.translations_sent -
              last_namve_statistic^.stats.directory.translations_sent;

        namve_statistic.stats.file_access.active_connections :=
              local_statistic.stats.file_access.active_connections -
              last_namve_statistic^.stats.file_access.active_connections;
        namve_statistic.stats.file_access.file_access_requests :=
              local_statistic.stats.file_access.file_access_requests -
              last_namve_statistic^.stats.file_access.file_access_requests;

        namve_statistic.stats.buffer_manager.containers_allocated [1] :=
              local_statistic.stats.buffer_manager.containers_allocated [1] -
              last_namve_statistic^.stats.buffer_manager.containers_allocated [1];
        namve_statistic.stats.buffer_manager.containers_allocated [2] :=
              local_statistic.stats.buffer_manager.containers_allocated [2] -
              last_namve_statistic^.stats.buffer_manager.containers_allocated [2];
        namve_statistic.stats.buffer_manager.containers_freed [1] :=
              local_statistic.stats.buffer_manager.containers_freed [1] -
              last_namve_statistic^.stats.buffer_manager.containers_freed [1];
        namve_statistic.stats.buffer_manager.containers_freed [2] :=
              local_statistic.stats.buffer_manager.containers_freed [2] -
              last_namve_statistic^.stats.buffer_manager.containers_freed [2];
        namve_statistic.stats.buffer_manager.descriptor_pool_empty_count :=
              local_statistic.stats.buffer_manager.descriptor_pool_empty_count -
              last_namve_statistic^.stats.buffer_manager.descriptor_pool_empty_count;

        namve_statistic.stats.pp_buffer_pool.replenish_pools_count :=
              local_statistic.stats.pp_buffer_pool.replenish_pools_count -
              last_namve_statistic^.stats.pp_buffer_pool.replenish_pools_count;

        FOR i := 1 TO 2 DO
          FOR j := 1 TO 2 DO
            namve_statistic.stats.pp_buffer_pool.empty_pools_count [i] [j] :=
                  local_statistic.stats.pp_buffer_pool.empty_pools_count [i] [j] -
                  last_namve_statistic^.stats.pp_buffer_pool.empty_pools_count [i] [j];
          FOREND;
          namve_statistic.stats.pp_buffer_pool.pools_replenished [i] :=
                local_statistic.stats.pp_buffer_pool.pools_replenished [i] -
                last_namve_statistic^.stats.pp_buffer_pool.pools_replenished [i];
        FOREND;

      IFEND;
      last_namve_statistic^ := local_statistic;
    ELSE
      namve_statistic := local_statistic;
    IFEND;

  PROCEND nap$get_namve_statistics;

?? TITLE := '[XDCL] nap$get_osi_device_spec_stats', EJECT ??

{ PURPOSE:
{   The purpose of this request is to get the data for the channel connection
{   periodic statistics.  The statistics are collected separately for each
{   network solution.

  PROCEDURE [XDCL, #GATE] nap$get_osi_device_spec_stats
    (    incremental: boolean;
     VAR channel_device_statistic: ost$channel_device_statistics);

    VAR
      i: nlt$device_count,
      local_statistic: ost$channel_device_statistics,
      networks_count: nlt$device_count;

    local_statistic.time := #FREE_RUNNING_CLOCK (0) - syv$nos_system_time.corresponding_frc;
    networks_count := (UPPERBOUND (nav$global_osi_statistics.channel_connection_device^) -
          LOWERBOUND (nav$global_osi_statistics.channel_connection_device^)) + 1;
    PUSH local_statistic.statistics: [1 .. networks_count];

    FOR i := 1 TO networks_count DO
      local_statistic.statistics^ [i].network_id := nav$global_osi_statistics.channel_connection_device^ [i].
            network_id;
      local_statistic.statistics^ [i].credit_pdus_received :=
            nav$global_osi_statistics.channel_connection_device^ [i].credit_pdus_received;
      local_statistic.statistics^ [i].credit_pdus_sent := statistic_value
            (^nav$global_osi_statistics.channel_connection_device^ [i].credit_pdus_sent);
      local_statistic.statistics^ [i].current_normal_connections :=
            statistic_value (^nav$global_osi_statistics.channel_connection_device^ [i].
            current_normal_connections);
      local_statistic.statistics^ [i].current_priority_connections :=
            statistic_value (^nav$global_osi_statistics.channel_connection_device^ [i].
            current_priority_connections);
      local_statistic.statistics^ [i].device_resets := statistic_value
            (^nav$global_osi_statistics.channel_connection_device^ [i].device_resets);
      local_statistic.statistics^ [i].duplicate_connect_indications :=
            statistic_value (^nav$global_osi_statistics.channel_connection_device^ [i].
            duplicate_connect_indications);
      local_statistic.statistics^ [i].normal_send_pdus_queued :=
            statistic_value (^nav$global_osi_statistics.channel_connection_device^ [i].
            normal_send_pdus_queued);
      local_statistic.statistics^ [i].pdus_processed_out_of_order :=
            statistic_value (^nav$global_osi_statistics.channel_connection_device^ [i].
            pdus_processed_out_of_order);
      local_statistic.statistics^ [i].priority_receive.value :=
            statistic_value (^nav$global_osi_statistics.channel_connection_device^ [i].priority_receive.
            value);
      local_statistic.statistics^ [i].priority_receive_expedited_pdus :=
            statistic_value (^nav$global_osi_statistics.channel_connection_device^ [i].
            priority_receive_expedited_pdus);
      local_statistic.statistics^ [i].priority_receive_pdus_discarded :=
            statistic_value (^nav$global_osi_statistics.channel_connection_device^ [i].
            priority_receive_pdus_discarded);
      local_statistic.statistics^ [i].priority_send.value :=
            statistic_value (^nav$global_osi_statistics.channel_connection_device^ [i].priority_send.value);
      local_statistic.statistics^ [i].priority_send_expedited_pdus :=
            statistic_value (^nav$global_osi_statistics.channel_connection_device^ [i].
            priority_send_expedited_pdus);
      local_statistic.statistics^ [i].priority_send_pdus_discarded :=
            statistic_value (^nav$global_osi_statistics.channel_connection_device^ [i].
            priority_send_pdus_discarded);
      local_statistic.statistics^ [i].priority_send_pdus_queued :=
            statistic_value (^nav$global_osi_statistics.channel_connection_device^ [i].
            priority_send_pdus_queued);
      local_statistic.statistics^ [i].receive.value := statistic_value
            (^nav$global_osi_statistics.channel_connection_device^ [i].receive.value);
      local_statistic.statistics^ [i].receive_pdus_discarded :=
            statistic_value (^nav$global_osi_statistics.channel_connection_device^ [i].
            receive_pdus_discarded);
      local_statistic.statistics^ [i].received_expedited_pdus :=
            statistic_value (^nav$global_osi_statistics.channel_connection_device^ [i].
            received_expedited_pdus);
      local_statistic.statistics^ [i].send.value := statistic_value
            (^nav$global_osi_statistics.channel_connection_device^ [i].send.value);
      local_statistic.statistics^ [i].send_expedited_pdus :=
            statistic_value (^nav$global_osi_statistics.channel_connection_device^ [i].send_expedited_pdus);
      local_statistic.statistics^ [i].send_pdus_discarded :=
            statistic_value (^nav$global_osi_statistics.channel_connection_device^ [i].send_pdus_discarded);
    FOREND;

    IF incremental THEN
      IF last_channel_device_statistic = NIL THEN
        ALLOCATE last_channel_device_statistic IN osv$task_shared_heap^;
        ALLOCATE last_channel_device_statistic^.statistics: [1 .. networks_count] IN osv$task_shared_heap^;
        channel_device_statistic := local_statistic;
      ELSE
        channel_device_statistic.time := local_statistic.time - last_channel_device_statistic^.time;
        FOR i := 1 TO networks_count DO
          channel_device_statistic.statistics^ [i].credit_pdus_received :=
                local_statistic.statistics^ [i].credit_pdus_received -
                last_channel_device_statistic^.statistics^ [i].credit_pdus_received;
          channel_device_statistic.statistics^ [i].credit_pdus_sent :=
                local_statistic.statistics^ [i].credit_pdus_sent -
                last_channel_device_statistic^.statistics^ [i].credit_pdus_sent;
          channel_device_statistic.statistics^ [i].current_normal_connections := local_statistic.
                statistics^ [i].current_normal_connections - last_channel_device_statistic^.statistics^ [i].
                current_normal_connections;
          channel_device_statistic.statistics^ [i].current_priority_connections :=
                local_statistic.statistics^ [i].current_priority_connections -
                last_channel_device_statistic^.statistics^ [i].current_priority_connections;
          channel_device_statistic.statistics^ [i].device_resets :=
                local_statistic.statistics^ [i].device_resets - last_channel_device_statistic^.
                statistics^ [i].device_resets;
          channel_device_statistic.statistics^ [i].duplicate_connect_indications :=
                local_statistic.statistics^ [i].duplicate_connect_indications -
                last_channel_device_statistic^.statistics^ [i].duplicate_connect_indications;
          channel_device_statistic.statistics^ [i].normal_send_pdus_queued :=
                local_statistic.statistics^ [i].normal_send_pdus_queued -
                last_channel_device_statistic^.statistics^ [i].normal_send_pdus_queued;
          channel_device_statistic.statistics^ [i].pdus_processed_out_of_order :=
                local_statistic.statistics^ [i].pdus_processed_out_of_order -
                last_channel_device_statistic^.statistics^ [i].pdus_processed_out_of_order;
          IF local_statistic.statistics^ [i].priority_receive.pdu_total >
                last_channel_device_statistic^.statistics^ [i].priority_receive.pdu_total THEN
            channel_device_statistic.statistics^ [i].priority_receive.pdu_average :=
                  ((local_statistic.statistics^ [i].priority_receive.pdu_average *
                  local_statistic.statistics^ [i].priority_receive.pdu_total) -
                  (last_channel_device_statistic^.statistics^ [i].priority_receive.pdu_average *
                  last_channel_device_statistic^.statistics^ [i].priority_receive.pdu_total)) DIV
                  (local_statistic.statistics^ [i].priority_receive.pdu_total -
                  last_channel_device_statistic^.statistics^ [i].priority_receive.pdu_total);
            channel_device_statistic.statistics^ [i].priority_receive.pdu_total :=
                  local_statistic.statistics^ [i].priority_receive.pdu_total -
                  last_channel_device_statistic^.statistics^ [i].priority_receive.pdu_total;
          ELSE
            channel_device_statistic.statistics^ [i].priority_receive.pdu_average := 0;
            channel_device_statistic.statistics^ [i].priority_receive.pdu_total := 0;
          IFEND;
          channel_device_statistic.statistics^ [i].priority_receive_expedited_pdus :=
                local_statistic.statistics^ [i].priority_receive_expedited_pdus -
                last_channel_device_statistic^.statistics^ [i].priority_receive_expedited_pdus;
          channel_device_statistic.statistics^ [i].priority_receive_pdus_discarded :=
                local_statistic.statistics^ [i].priority_receive_pdus_discarded -
                last_channel_device_statistic^.statistics^ [i].priority_receive_pdus_discarded;
          IF local_statistic.statistics^ [i].priority_send.pdu_total >
                last_channel_device_statistic^.statistics^ [i].priority_send.pdu_total THEN
            channel_device_statistic.statistics^ [i].priority_send.pdu_average :=
                  ((local_statistic.statistics^ [i].priority_send.pdu_average * local_statistic.
                  statistics^ [i].priority_send.pdu_total) - (last_channel_device_statistic^.statistics^ [i].
                  priority_send.pdu_average * last_channel_device_statistic^.statistics^ [i].priority_send.
                  pdu_total)) DIV (local_statistic.statistics^ [i].priority_send.pdu_total -
                  last_channel_device_statistic^.statistics^ [i].priority_send.pdu_total);
            channel_device_statistic.statistics^ [i].priority_send.pdu_total := local_statistic.
                  statistics^ [i].priority_send.pdu_total - last_channel_device_statistic^.statistics^ [i].
                  priority_send.pdu_total;
          ELSE
            channel_device_statistic.statistics^ [i].priority_send.pdu_average := 0;
            channel_device_statistic.statistics^ [i].priority_send.pdu_total := 0;
          IFEND;
          channel_device_statistic.statistics^ [i].priority_send_expedited_pdus :=
                local_statistic.statistics^ [i].priority_send_expedited_pdus -
                last_channel_device_statistic^.statistics^ [i].priority_send_expedited_pdus;
          channel_device_statistic.statistics^ [i].priority_send_pdus_discarded :=
                local_statistic.statistics^ [i].priority_send_pdus_discarded -
                last_channel_device_statistic^.statistics^ [i].priority_send_pdus_discarded;
          channel_device_statistic.statistics^ [i].priority_send_pdus_queued := local_statistic.
                statistics^ [i].priority_send_pdus_queued - last_channel_device_statistic^.statistics^ [i].
                priority_send_pdus_queued;
          IF local_statistic.statistics^ [i].receive.pdu_total > last_channel_device_statistic^.
                statistics^ [i].receive.pdu_total THEN
            channel_device_statistic.statistics^ [i].receive.pdu_average :=
                  ((local_statistic.statistics^ [i].receive.pdu_average *
                  local_statistic.statistics^ [i].receive.pdu_total) -
                  (last_channel_device_statistic^.statistics^ [i].receive.pdu_average *
                  last_channel_device_statistic^.statistics^ [i].receive.pdu_total)) DIV
                  (local_statistic.statistics^ [i].receive.pdu_total -
                  last_channel_device_statistic^.statistics^ [i].receive.pdu_total);
            channel_device_statistic.statistics^ [i].receive.pdu_total :=
                  local_statistic.statistics^ [i].receive.pdu_total -
                  last_channel_device_statistic^.statistics^ [i].receive.pdu_total;
          ELSE
            channel_device_statistic.statistics^ [i].receive.pdu_average := 0;
            channel_device_statistic.statistics^ [i].receive.pdu_total := 0;
          IFEND;
          channel_device_statistic.statistics^ [i].received_expedited_pdus :=
                local_statistic.statistics^ [i].received_expedited_pdus -
                last_channel_device_statistic^.statistics^ [i].received_expedited_pdus;
          channel_device_statistic.statistics^ [i].receive_pdus_discarded :=
                local_statistic.statistics^ [i].receive_pdus_discarded -
                last_channel_device_statistic^.statistics^ [i].receive_pdus_discarded;
          IF local_statistic.statistics^ [i].send.pdu_total >
                last_channel_device_statistic^.statistics^ [i].send.pdu_total THEN
            channel_device_statistic.statistics^ [i].send.pdu_average :=
                  ((local_statistic.statistics^ [i].send.pdu_average *
                  local_statistic.statistics^ [i].send.pdu_total) -
                  (last_channel_device_statistic^.statistics^ [i].send.pdu_average *
                  last_channel_device_statistic^.statistics^ [i].send.pdu_total)) DIV
                  (local_statistic.statistics^ [i].send.pdu_total -
                  last_channel_device_statistic^.statistics^ [i].send.pdu_total);
            channel_device_statistic.statistics^ [i].send.pdu_total :=
                  local_statistic.statistics^ [i].send.pdu_total -
                  last_channel_device_statistic^.statistics^ [i].send.pdu_total;
          ELSE
            channel_device_statistic.statistics^ [i].send.pdu_average := 0;
            channel_device_statistic.statistics^ [i].send.pdu_total := 0;
          IFEND;
          channel_device_statistic.statistics^ [i].send_expedited_pdus :=
                local_statistic.statistics^ [i].send_expedited_pdus -
                last_channel_device_statistic^.statistics^ [i].send_expedited_pdus;
          channel_device_statistic.statistics^ [i].send_pdus_discarded :=
                local_statistic.statistics^ [i].send_pdus_discarded -
                last_channel_device_statistic^.statistics^ [i].send_pdus_discarded;
        FOREND;
      IFEND;
      last_channel_device_statistic^.time := local_statistic.time;
      last_channel_device_statistic^.statistics^ := local_statistic.statistics^;
    ELSE
      channel_device_statistic.time := local_statistic.time;
      channel_device_statistic.statistics^ := local_statistic.statistics^;
    IFEND;

  PROCEND nap$get_osi_device_spec_stats;
?? TITLE := '[XDCL] nap$get_osi_statistics', EJECT ??

{ PURPOSE:
{   The purpose of this request is to get the statistical data for the NAM/VE OSI layers.

  PROCEDURE [XDCL, #GATE] nap$get_osi_statistics
    (    incremental: boolean;
     VAR namve_osi_statistic: ost$namve_osi_statistics);

    VAR
      local_statistic: ost$namve_osi_statistics;

    local_statistic.time := #FREE_RUNNING_CLOCK (0) - syv$nos_system_time.corresponding_frc;

    local_statistic.statistics.channel_connection.broadcast_connect_requests :=
          statistic_value (^nav$global_osi_statistics.channel_connection.broadcast_connect_requests);
    local_statistic.statistics.channel_connection.normal_connections :=
          statistic_value (^nav$global_osi_statistics.channel_connection.normal_connections);
    local_statistic.statistics.channel_connection.priority_connections :=
          statistic_value (^nav$global_osi_statistics.channel_connection.priority_connections);

    local_statistic.statistics.link_access_agent.current_saps_open :=
          statistic_value (^nav$global_osi_statistics.link_access_agent.current_saps_open);
    local_statistic.statistics.link_access_agent.pdus_received :=
          statistic_value (^nav$global_osi_statistics.link_access_agent.pdus_received);
    local_statistic.statistics.link_access_agent.pdus_sent :=
          statistic_value (^nav$global_osi_statistics.link_access_agent.pdus_sent);
    local_statistic.statistics.link_access_agent.total_bytes_received :=
          statistic_value (^nav$global_osi_statistics.link_access_agent.total_bytes_received);
    local_statistic.statistics.link_access_agent.total_bytes_sent :=
          statistic_value (^nav$global_osi_statistics.link_access_agent.total_bytes_sent);

    local_statistic.statistics.network_access_agent.broadcasts_sent :=
          statistic_value (^nav$global_osi_statistics.network_access_agent.broadcasts_sent);
    local_statistic.statistics.network_access_agent.pdus_received :=
          statistic_value (^nav$global_osi_statistics.network_access_agent.pdus_received);
    local_statistic.statistics.network_access_agent.pdus_sent :=
          statistic_value (^nav$global_osi_statistics.network_access_agent.pdus_sent);
    local_statistic.statistics.network_access_agent.total_bytes_received :=
          statistic_value (^nav$global_osi_statistics.network_access_agent.total_bytes_received);
    local_statistic.statistics.network_access_agent.total_bytes_sent :=
          statistic_value (^nav$global_osi_statistics.network_access_agent.total_bytes_sent);

    local_statistic.statistics.system_management_entity.cdna_address_select_device_reqs :=
          nav$global_osi_statistics.system_management_entity.cdna_address_select_device_reqs;
    local_statistic.statistics.system_management_entity.noncdna_addr_select_device_reqs :=
          nav$global_osi_statistics.system_management_entity.noncdna_addr_select_device_reqs;
    local_statistic.statistics.system_management_entity.cdna_address_route_unknown :=
          nav$global_osi_statistics.system_management_entity.cdna_address_route_unknown;
    local_statistic.statistics.system_management_entity.noncdna_address_route_unknown :=
          nav$global_osi_statistics.system_management_entity.noncdna_address_route_unknown;
    local_statistic.statistics.system_management_entity.device_routing_queries :=
          nav$global_osi_statistics.system_management_entity.device_routing_queries;
    local_statistic.statistics.system_management_entity.subnet_attribute_updates_rcvd :=
          nav$global_osi_statistics.system_management_entity.subnet_attribute_updates_rcvd;

    local_statistic.statistics.transport_access_agent.data_pdus_received :=
          statistic_value (^nav$global_osi_statistics.transport_access_agent.data_pdus_received);
    local_statistic.statistics.transport_access_agent.data_pdus_sent :=
          nav$global_osi_statistics.transport_access_agent.data_pdus_sent;
    local_statistic.statistics.transport_access_agent.expedited_pdus_received :=
          nav$global_osi_statistics.transport_access_agent.expedited_pdus_received;
    local_statistic.statistics.transport_access_agent.expedited_pdus_sent :=
          statistic_value (^nav$global_osi_statistics.transport_access_agent.expedited_pdus_sent);
    local_statistic.statistics.transport_access_agent.total_bytes_received :=
          statistic_value (^nav$global_osi_statistics.transport_access_agent.total_bytes_received);
    local_statistic.statistics.transport_access_agent.total_bytes_sent :=
          statistic_value (^nav$global_osi_statistics.transport_access_agent.total_bytes_sent);

    IF incremental THEN
      IF last_namve_osi_statistic = NIL THEN
        ALLOCATE last_namve_osi_statistic IN osv$task_shared_heap^;
        namve_osi_statistic := local_statistic;
      ELSE
        namve_osi_statistic.time := local_statistic.time - last_namve_osi_statistic^.time;
        namve_osi_statistic.statistics.channel_connection.broadcast_connect_requests :=
              local_statistic.statistics.channel_connection.broadcast_connect_requests -
              last_namve_osi_statistic^.statistics.channel_connection.broadcast_connect_requests;
        namve_osi_statistic.statistics.channel_connection.normal_connections :=
              local_statistic.statistics.channel_connection.normal_connections -
              last_namve_osi_statistic^.statistics.channel_connection.normal_connections;
        namve_osi_statistic.statistics.channel_connection.priority_connections :=
              local_statistic.statistics.channel_connection.priority_connections -
              last_namve_osi_statistic^.statistics.channel_connection.priority_connections;

        namve_osi_statistic.statistics.link_access_agent.current_saps_open :=
              local_statistic.statistics.link_access_agent.current_saps_open -
              last_namve_osi_statistic^.statistics.link_access_agent.current_saps_open;
        namve_osi_statistic.statistics.link_access_agent.pdus_received :=
              local_statistic.statistics.link_access_agent.pdus_received -
              last_namve_osi_statistic^.statistics.link_access_agent.pdus_received;
        namve_osi_statistic.statistics.link_access_agent.pdus_sent :=
              local_statistic.statistics.link_access_agent.pdus_sent -
              last_namve_osi_statistic^.statistics.link_access_agent.pdus_sent;
        namve_osi_statistic.statistics.link_access_agent.total_bytes_received :=
              local_statistic.statistics.link_access_agent.total_bytes_received -
              last_namve_osi_statistic^.statistics.link_access_agent.total_bytes_received;
        namve_osi_statistic.statistics.link_access_agent.total_bytes_sent :=
              local_statistic.statistics.link_access_agent.total_bytes_sent -
              last_namve_osi_statistic^.statistics.link_access_agent.total_bytes_sent;

        namve_osi_statistic.statistics.network_access_agent.broadcasts_sent :=
              local_statistic.statistics.network_access_agent.broadcasts_sent -
              last_namve_osi_statistic^.statistics.network_access_agent.broadcasts_sent;
        namve_osi_statistic.statistics.network_access_agent.pdus_received :=
              local_statistic.statistics.network_access_agent.pdus_received -
              last_namve_osi_statistic^.statistics.network_access_agent.pdus_received;
        namve_osi_statistic.statistics.network_access_agent.pdus_sent :=
              local_statistic.statistics.network_access_agent.pdus_sent -
              last_namve_osi_statistic^.statistics.network_access_agent.pdus_sent;
        namve_osi_statistic.statistics.network_access_agent.total_bytes_received :=
              local_statistic.statistics.network_access_agent.total_bytes_received -
              last_namve_osi_statistic^.statistics.network_access_agent.total_bytes_received;
        namve_osi_statistic.statistics.network_access_agent.total_bytes_sent :=
              local_statistic.statistics.network_access_agent.total_bytes_sent -
              last_namve_osi_statistic^.statistics.network_access_agent.total_bytes_sent;

        namve_osi_statistic.statistics.system_management_entity.cdna_address_select_device_reqs :=
              local_statistic.statistics.system_management_entity.cdna_address_select_device_reqs -
              last_namve_osi_statistic^.statistics.system_management_entity.cdna_address_select_device_reqs;
        namve_osi_statistic.statistics.system_management_entity.noncdna_addr_select_device_reqs :=
              local_statistic.statistics.system_management_entity.noncdna_addr_select_device_reqs -
              last_namve_osi_statistic^.statistics.system_management_entity.noncdna_addr_select_device_reqs;
        namve_osi_statistic.statistics.system_management_entity.cdna_address_route_unknown :=
              local_statistic.statistics.system_management_entity.cdna_address_route_unknown -
              last_namve_osi_statistic^.statistics.system_management_entity.cdna_address_route_unknown;
        namve_osi_statistic.statistics.system_management_entity.noncdna_address_route_unknown :=
              local_statistic.statistics.system_management_entity.noncdna_address_route_unknown -
              last_namve_osi_statistic^.statistics.system_management_entity.noncdna_address_route_unknown;
        namve_osi_statistic.statistics.system_management_entity.device_routing_queries :=
              local_statistic.statistics.system_management_entity.device_routing_queries -
              last_namve_osi_statistic^.statistics.system_management_entity.device_routing_queries;
        namve_osi_statistic.statistics.system_management_entity.subnet_attribute_updates_rcvd :=
              local_statistic.statistics.system_management_entity.subnet_attribute_updates_rcvd -
              last_namve_osi_statistic^.statistics.system_management_entity.subnet_attribute_updates_rcvd;

        namve_osi_statistic.statistics.transport_access_agent.data_pdus_received :=
              local_statistic.statistics.transport_access_agent.data_pdus_received -
              last_namve_osi_statistic^.statistics.transport_access_agent.data_pdus_received;
        namve_osi_statistic.statistics.transport_access_agent.data_pdus_sent :=
              local_statistic.statistics.transport_access_agent.data_pdus_sent -
              last_namve_osi_statistic^.statistics.transport_access_agent.data_pdus_sent;
        namve_osi_statistic.statistics.transport_access_agent.expedited_pdus_received :=
              local_statistic.statistics.transport_access_agent.expedited_pdus_received -
              last_namve_osi_statistic^.statistics.transport_access_agent.expedited_pdus_received;
        namve_osi_statistic.statistics.transport_access_agent.expedited_pdus_sent :=
              local_statistic.statistics.transport_access_agent.expedited_pdus_sent -
              last_namve_osi_statistic^.statistics.transport_access_agent.expedited_pdus_sent;
        namve_osi_statistic.statistics.transport_access_agent.total_bytes_received :=
              local_statistic.statistics.transport_access_agent.total_bytes_received -
              last_namve_osi_statistic^.statistics.transport_access_agent.total_bytes_received;
        namve_osi_statistic.statistics.transport_access_agent.total_bytes_sent :=
              local_statistic.statistics.transport_access_agent.total_bytes_sent -
              last_namve_osi_statistic^.statistics.transport_access_agent.total_bytes_sent;
      IFEND;
      last_namve_osi_statistic^ := local_statistic;
    ELSE
      namve_osi_statistic := local_statistic;
    IFEND;

  PROCEND nap$get_osi_statistics;

?? TITLE := 'statistic_value', EJECT ??

  FUNCTION [INLINE] statistic_value
    (    statistic: ^integer): integer;

    VAR
      actual_value: integer,
      compare_swap_status: osc$cs_successful .. osc$cs_variable_locked,
      initial_value: integer,
      new_value: integer;

    initial_value := 0;
    new_value := 0;

    REPEAT
      #COMPARE_SWAP (statistic^, initial_value, new_value, actual_value, compare_swap_status);
    UNTIL compare_swap_status <> osc$cs_variable_locked;
    statistic_value := actual_value;

  FUNCEND statistic_value;

MODEND nam$fetch_statistical_data;
