MODULE osm$spi_support_r1;
?? PUSH (LISTEXT := ON) ??
*copyc osd$default_pragmats
*copyc amt$local_file_name
*copyc dmp$allocate_file_space_r1
*copyc i#call_monitor
*copyc i#real_memory_address
*copyc jmv$jcb
*copyc mmp$get_segment_sfid
*copyc osc$multiprocessor_constants
*copyc ose$spi_conditions
*copyc osp$fetch_locked_variable
*copyc osp$set_locked_variable
*copyc osp$set_status_abnormal
*copyc ost$execution_control_block
*copyc ost$processor_id_set
*copyc osv$spi_control
*copyc osv$page_size
*copyc osv$mainframe_wired_heap
*copyc pmp$delay
*copyc pmp$find_executing_task_xcb
*copyc pmp$get_executing_task_gtid
*copyc pmp$ready_task
?? POP ??

?? TITLE := 'PROCEDURE osp$reserve_spi_r1_support', EJECT ??

  PROCEDURE [XDCL, #GATE] osp$reserve_spi_r1_support
    (    spi_identifier: ost$spi_identifier;
         collection_file: amt$local_file_name;
         number_of_spi_samples: ost$number_of_spi_samples;
         spi_sampling_interval: ost$spi_sampling_interval;
         processor_id_set: ost$processor_id_set;
         data_string: string (32);
     VAR status: ost$status);

    VAR
      actual: integer,
      locked: boolean,
      i: integer,
      rma: integer;

    status.normal := TRUE;
    osp$set_locked_variable (osv$spi_control.lock, 0, 1, actual, locked);
    IF NOT locked THEN
      IF osv$spi_control.jsn = jmv$jcb.system_name THEN
        osp$set_status_abnormal ('OS', ose$job_has_spi_environment, '',
              status);
      ELSE
        osp$set_status_abnormal ('OS', ose$spi_environment_not_avail, '',
              status);
      IFEND;
      RETURN;
    IFEND;

    osv$spi_control.number_of_spi_samples := number_of_spi_samples;
    osv$spi_control.ijle_p := jmv$jcb.ijle_p;
    osv$spi_control.jsn := jmv$jcb.system_name;
    osv$spi_control.operation_status := osc$spi_wait_for_start;
    osv$spi_control.spi_sampling_interval := spi_sampling_interval;
    osv$spi_control.spi_identifier := spi_identifier;
    osv$spi_control.collection_file := collection_file;
    osv$spi_control.data_string := data_string;
    osv$spi_control.processor_0_select := 0 IN processor_id_set;
    osv$spi_control.processor_1_select := 1 IN processor_id_set;
    osv$spi_control.processor_2_select := 2 IN processor_id_set;
    osv$spi_control.processor_3_select := 3 IN processor_id_set;
    osv$spi_control.processor_4_select := 4 IN processor_id_set;
    osv$spi_control.processor_5_select := 5 IN processor_id_set;
    osv$spi_control.pp_available := FALSE;
    pmp$get_executing_task_gtid (osv$spi_control.initiator_task);

  PROCEND osp$reserve_spi_r1_support;

?? TITLE := 'PROCEDURE osp$release_spi_r1_support', EJECT ??

  PROCEDURE [XDCL, #GATE] osp$release_spi_r1_support
    (VAR status: ost$status);

    VAR
      actual: integer,
      i: integer,
      local_status: ost$status,
      result: boolean;

    status.normal := TRUE;
    osp$fetch_locked_variable (osv$spi_control.lock, i);
    IF (i = 0) OR (osv$spi_control.jsn <> jmv$jcb.system_name) THEN
      osp$set_status_abnormal ('OS', ose$spi_illegal_request, '', status);
      RETURN;
    IFEND;

    IF osv$spi_control.operation_status <> osc$spi_process_complete THEN
      osv$spi_control.operation_status := osc$spi_termination_requested;
    IFEND;

{   Wake up the collector task to process termination status.

    pmp$ready_task (osv$spi_control.collector_task, status);
    osv$spi_control.jsn := '   ';
    osv$spi_control.ijle_p := NIL;

    osp$set_locked_variable (osv$spi_control.lock, 1, 0, actual, result);

  PROCEND osp$release_spi_r1_support;

?? TITLE := 'PROCEDURE osp$start_spi_collection_r1', EJECT ??

  PROCEDURE [XDCL, #GATE] osp$start_spi_collection_r1
    (VAR status: ost$status);

    status.normal := TRUE;
    IF osv$spi_control.operation_status = osc$spi_process_complete THEN
      osp$set_status_abnormal ('OS', ose$collection_task_ended, '', status);
      RETURN;
    IFEND;

    osv$spi_control.operation_status := osc$spi_start_collecting;
    pmp$ready_task (osv$spi_control.collector_task, status);

  PROCEND osp$start_spi_collection_r1;

?? TITLE := 'PROCEDURE osp$stop_spi_collection_r1', EJECT ??

  PROCEDURE [XDCL, #GATE] osp$stop_spi_collection_r1
    (VAR status: ost$status);

    status.normal := TRUE;
    IF osv$spi_control.operation_status = osc$spi_process_complete THEN
      osp$set_status_abnormal ('OS', ose$collection_task_ended, '', status);
      RETURN;
    IFEND;

    osv$spi_control.operation_status := osc$spi_stop_collecting;
    pmp$ready_task (osv$spi_control.collector_task, status);

  PROCEND osp$stop_spi_collection_r1;


?? TITLE := 'PROCEDURE osp$fetch_spi_lock', EJECT ??

  PROCEDURE [XDCL, #GATE] osp$fetch_spi_lock
    (VAR i: integer);

    osp$fetch_locked_variable (osv$spi_control.lock, i);

  PROCEND osp$fetch_spi_lock;

MODEND osm$spi_support_r1;
