?? RIGHT := 110 ??
?? NEWTITLE := 'NOS/VE Program Management : Tasking support in ring 6' ??
MODULE pmm$tasking_support_ring_6;

{ PURPOSE:
{   This module contains the ring 6 interfaces to support tasking.


?? NEWTITLE := 'Global Declarations Referenced by This Module', EJECT ??
?? PUSH (LISTEXT := ON) ??
*copyc lle$load_map_diagnostics
*copyc pme$program_services_exceptions
*copyc ost$caller_identifier
*copyc lot$loader_type_definitions
?? POP ??
*copyc mmp$store_segment_attributes
*copyc osp$append_status_integer
*copyc osp$begin_subsystem_activity
*copyc osp$end_subsystem_activity
*copyc osp$set_status_abnormal
*copyc osp$set_status_condition
*copyc osp$system_error
*copyc pmp$find_executing_task_xcb
*copyc pmp$get_executing_task_gtid

*copy lov$allocated_segments
*copy lov$highest_segment_index
?? OLDTITLE ??
?? NEWTITLE := '[XDCL, #GATE] pmp$get_executing_task_gtid_r6', EJECT ??
*copy pmh$get_executing_task_gtid_r6

  PROCEDURE [XDCL, #GATE] pmp$get_executing_task_gtid_r6
    (VAR global_task_id: ost$global_task_id);

    VAR
      local_global_task_id: ost$global_task_id;

    pmp$get_executing_task_gtid (local_global_task_id);
    global_task_id := local_global_task_id;

  PROCEND pmp$get_executing_task_gtid_r6;
?? OLDTITLE ??
?? NEWTITLE := '[XDCL, #GATE] pmp$expand_segment', EJECT ??
*copy pmh$expand_segment

  PROCEDURE [XDCL, #GATE] pmp$expand_segment
    (    pva: ^cell;
         length: ost$segment_length;
     VAR starting_pva: ^cell;
     VAR status: ost$status);



{ '{**' inserted to remove the requirement that the segment be a common block
{**   lov$common_blocks: [XREF] ^array [ * ] of lot$common_block_definition,
{**   i: integer,


    VAR
      attribute_fixer: array [1 .. 1] of mmt$attribute_descriptor,
      caller_id: ost$caller_identifier,
      j: integer,
      loader_pva: ^cell,
      segment: ^lot$segment_allocation,
      segment_number: ost$segment;

    #CALLER_ID (caller_id);
    status.normal := TRUE;

    segment_number := #SEGMENT (pva);

{** IF lov$common_blocks <> NIL THEN
{**   FOR i := LOWERBOUND (lov$common_blocks^) TO UPPERBOUND (lov$common_blocks^) DO
{**     IF segment_number = lov$common_blocks^ [i].address.segment THEN

    IF lov$allocated_segments <> NIL THEN
      FOR j := LOWERBOUND (lov$allocated_segments^) TO UPPERBOUND (lov$allocated_segments^) DO
        IF segment_number = lov$allocated_segments^ [j].segment THEN
          segment := ^lov$allocated_segments^ [j];
          IF (segment^.current_length + length) > segment^.maximum_length THEN
            osp$set_status_condition (lle$program_segment_overflow, status);
            osp$append_status_integer (osc$status_parameter_delimiter, segment_number, 10, FALSE, status);
            RETURN;
          IFEND;

          starting_pva := #ADDRESS (caller_id.ring, segment_number, segment^.current_length);
          loader_pva := #ADDRESS (loc$loader_ring, segment_number, 0);

          segment^.current_length := segment^.current_length + length;
          segment^.attributes.extensible := TRUE;

          attribute_fixer [1].keyword := mmc$kw_max_segment_length;
          attribute_fixer [1].max_length := segment^.current_length;

          mmp$store_segment_attributes (loader_pva, loc$loader_ring, attribute_fixer, status);

          RETURN;
        IFEND;
      FOREND;
    IFEND;

{**     IFEND;
{**   FOREND;
{** IFEND;

    osp$set_status_condition (pme$common_block_not_defined, status);
    osp$append_status_integer (osc$status_parameter_delimiter, segment_number, 10, FALSE, status);

  PROCEND pmp$expand_segment;
?? OLDTITLE ??
?? NEWTITLE := '[XDCL, #GATE] pmp$begin_subsystem_activity', EJECT ??
*copy pmh$begin_subsystem_activity

  PROCEDURE [XDCL, #GATE] pmp$begin_subsystem_activity
    (VAR status: ost$status);

    VAR
      xcb_p: ^ost$execution_control_block;

    status.normal := TRUE;
    pmp$find_executing_task_xcb (xcb_p);
    IF (xcb_p^.system_table_lock_count = 255) THEN
      osp$system_error ('Subsystem table lock count exceeded', ^status);
    IFEND;

    osp$begin_subsystem_activity;

  PROCEND pmp$begin_subsystem_activity;
?? OLDTITLE ??
?? NEWTITLE := '[XDCL, #GATE] pmp$end_subsystem_activity', EJECT ??
*copy pmh$end_subsystem_activity

  PROCEDURE [XDCL, #GATE] pmp$end_subsystem_activity
    (VAR status: ost$status);

    status.normal := TRUE;
    osp$end_subsystem_activity;

  PROCEND pmp$end_subsystem_activity;
?? OLDTITLE ??
MODEND pmm$tasking_support_ring_6;
