COMPILATION LISTING OF SEGMENT ms_salvager_v2_ Compiled by: Multics PL/I Compiler, Release 28e, of February 14, 1985 Compiled at: Honeywell Multics Op. - System M Compiled on: 05/09/85 1113.6 mst Thu Options: optimize map 1 /* *********************************************************** 2* * * 3* * Copyright, (C) Honeywell Information Systems Inc., 1982 * 4* * * 5* *********************************************************** */ 6 7 /* ****************************************************** 8* * * 9* * * 10* * Copyright (c) 1972 by Massachusetts Institute of * 11* * Technology and Honeywell Information Systems, Inc. * 12* * * 13* * * 14* ****************************************************** */ 15 16 ms_salvager_v2_: proc (a_mptr, a_saved_messages, a_code); 17 18 /* Adapted from original version 2 ms_salvager_ by J. Stern, 11/4/74 */ 19 20 dcl establish_cleanup_proc_ entry (entry); 21 22 dcl ( 23 a_saved_messages, /* number of saved messages (argument) */ 24 block_bits, /* number of bits in a message block */ 25 dirl, /* length of dir portion of message seg pname */ 26 i, /* do loop index */ 27 mseg_data_v2_$block_trailer_data ext, /* word count of trailer size */ 28 max_hdr_ms_len ext, /* maximum length of header message */ 29 mseg_data_v2_$version_number ext, /* current version of message segment primitives */ 30 saved_blocks init (0), /* number of saved message blocks */ 31 saved_messages init (0), /* number of saved messages (internal) */ 32 status_words (0: 9), /* storage for status information */ 33 tsaved_blocks, /* number of saved blocks per pass */ 34 tsaved_messages) /* number of saved messages per pass */ 35 fixed bin; 36 37 dcl (alloc_len, /* length of allocation bit string */ 38 block_offset, /* offset to a message block */ 39 block_size, /* size of message block */ 40 hdr_alloc_len, /* number of allocation bits used for header */ 41 mseg_data_v2_$block_size ext, 42 nrec, /* number of records used by message segment */ 43 seg_size, /* maximum size of a segment */ 44 temp, /* calculation variable */ 45 trailer_offset) fixed bin (18); 46 47 dcl ( 48 a_code, /* error code (argument) */ 49 code /* error code (internal) */ 50 ) fixed bin (35); 51 52 dcl dir char (168) aligned; /* directory portion of message segment pathname */ 53 54 dcl ent char (32) aligned; /* entry portion of message segment pathname */ 55 56 dcl (forward init ("1"b), /* ON if salvage is forward */ 57 set_block_size init ("0"b), /* ON if block size in hdr to be set */ 58 total_success init ("0"b)) /* ON if salvage pass is totally successful */ 59 bit (1) aligned; 60 61 dcl mseg_data_v2_$mseg_b36 ext bit (36) aligned; /* header recognition pattern */ 62 63 dcl (addr, addrel, bit, divide, fixed, mod, null, ptr, rel, substr) builtin; 64 65 dcl (a_mptr, /* pointer to message segment (argument) */ 66 block_ptr, /* pointer to a message block */ 67 end_ptr, /* pointer to last message for salvage pass */ 68 eptr, /* pointer to status information */ 69 last_backward_ptr init (null), /* pointer to last saved message in backward salvage */ 70 last_forward_ptr init (null), /* pointer to last saved message in forward salvage */ 71 last_saved_ms_ptr, /* pointer to last message saved in a pass */ 72 new_alloc_ptr, /* pointer to new allocation bit string */ 73 old_first_ptr, /* pointer to old first message */ 74 old_last_ptr, /* pointer to old last message */ 75 salv_ptr) /* pointer to beginning point for salvage */ 76 ptr; 77 78 dcl block_mask bit (block_bits) aligned based; /* mask for zeroing out unused message blocks */ 79 80 dcl hdr_ms_mask bit (36*max_hdr_ms_len) aligned based; /* for zeroing out header message */ 81 82 dcl 1 status_dope based (eptr) aligned, /* mask for getting nrec from status info */ 83 2 pad (7) fixed bin aligned, 84 2 curlen bit (12) unaligned; 85 86 dcl error_table_$bad_segment ext fixed bin (35); 87 dcl error_table_$no_message ext fixed bin (35); 88 89 /* */ 90 1 1 /* BEGIN include file mseg_hdr_v2.incl.pl1 */ 1 2 1 3 dcl mptr ptr, /* pointer to message segment */ 1 4 1 5 1 mseg_hdr_v2 aligned based (mptr), /* message segment header format */ 1 6 2 lock bit (36) aligned, /* standard file system lock */ 1 7 2 mseg_pattern bit (36) aligned, /* to identify message segments */ 1 8 2 pad (6) fixed bin, 1 9 2 first_ms_offset bit (18) aligned, /* offset to first logical message */ 1 10 2 last_ms_offset bit (18) aligned, /* offset to last logical message */ 1 11 2 alloc_len fixed bin, /* length of allocation bit string */ 1 12 2 space_left fixed bin, /* number of empty blocks */ 1 13 2 number_of_messages fixed bin, /* number of messages in segment */ 1 14 2 block_size fixed bin, /* message block size */ 1 15 2 switches, 1 16 3 aip bit (1) unaligned, /* ON if allocation is in progress */ 1 17 3 os bit (1) unaligned, /* ON if message segment was salvaged */ 1 18 3 ms_in_hdr bit (1) unaligned, /* ON if there is a message in the header */ 1 19 3 pad2 bit (30) unaligned, 1 20 2 version_number fixed bin, 1 21 2 hdr_ms_len fixed bin, /* length of header message, if any */ 1 22 2 hdr_ms, /* space for header message */ 1 23 3 filler (126) fixed bin, 1 24 3 hdr_ms_end fixed bin, 1 25 2 alloc_bits bit (alloc_len) aligned; /* allocation bit string */ 1 26 1 27 /* END include file mseg_hdr_v2.incl.pl1 */ 91 92 2 1 /* BEGIN include file ms_block_trailer_v2.incl.pl1 */ 2 2 2 3 dcl tr_ptr ptr, /* pointer to message block trailer area */ 2 4 2 5 1 ms_block_trailer_v2 aligned based (tr_ptr), /* message block trailer structure */ 2 6 2 tr_pattern bit (36) aligned, /* for identifying beginning of trailer */ 2 7 2 f_offset bit (18) unaligned, /* offset to next logical message */ 2 8 2 b_offset bit (18) unaligned, /* offset to previous logical message */ 2 9 2 ms_size bit (18) unaligned, /* bit count of message */ 2 10 2 time bit (54) unaligned, /* time message was sent */ 2 11 2 ring_no bit (18) unaligned, /* validation level */ 2 12 2 pad bit (18) unaligned, 2 13 2 sender_id char (32) aligned; /* id of message sender */ 2 14 2 15 /* END include file ms_block_trailer_v2.incl.pl1 */ 93 94 95 dcl hcs_$fs_get_path_name ext entry 96 (ptr, char (*) aligned, fixed bin, char (*) aligned, fixed bin (35)); 97 98 dcl hcs_$get_max_length_seg entry (ptr, fixed bin (18), fixed bin (35)); 99 100 dcl hcs_$status_long ext entry 101 (char (*) aligned, char (*) aligned, fixed bin (1), ptr, ptr, fixed bin (35)); 102 103 dcl hcs_$truncate_seg ext entry 104 (ptr, fixed bin, fixed bin (35)); 105 106 dcl ptr_is_good_v2_$ms_salvager_entry ext entry 107 (ptr, fixed bin (18)) returns (bit (1) aligned); 108 109 dcl ms_salv_util_v2_ ext entry 110 (bit (1) aligned, ptr, ptr, fixed bin (18), fixed bin (18), fixed bin, fixed bin, ptr, fixed bin (35)); 111 112 /* */ 113 eptr = addr (status_words); 114 mptr = a_mptr; /* copy argument */ 115 116 call establish_cleanup_proc_ (cleanup_handler); 117 118 cleanup_handler: proc; 119 call hcs_$truncate_seg (mptr, 1, code); /* throw everything away */ 120 go to FIN; 121 end; 122 123 124 call hcs_$get_max_length_seg (mptr, seg_size, code); 125 if code ^= 0 then go to FIN; 126 127 block_size = fixed (mseg_hdr_v2.block_size, 18); /* fetch block size */ 128 if block_size <= 0 129 then do; 130 SET_BLOCK_SIZE: 131 block_size = fixed (mseg_data_v2_$block_size, 18); /* take default and hope it's right */ 132 set_block_size = "1"b; /* remember to set later */ 133 end; 134 135 else /* block size not <= 0 */ 136 if mod (seg_size, block_size) ^= 0 /* bad block size */ 137 then go to SET_BLOCK_SIZE; 138 139 140 alloc_len = divide (seg_size, block_size, 18, 0); /* compute length of allocation bits */ 141 142 temp = divide ((fixed (rel (addr (mptr -> mseg_hdr_v2.hdr_ms_end)), 18)+1)*36 + alloc_len+35, 36, 18, 0); 143 hdr_alloc_len = divide (temp+block_size-1, block_size, 18, 0); /* compute alloc bits used by header */ 144 max_hdr_ms_len = temp - fixed (rel (addr (mptr -> mseg_hdr_v2.hdr_ms)), 17); 145 146 trailer_offset = fixed (block_size-mseg_data_v2_$block_trailer_data, 18); /* compute trailer offset */ 147 148 call hcs_$fs_get_path_name (mptr, dir, dirl, ent, code); /* get dir and ent names of segment */ 149 if code ^= 0 150 then go to FIN; 151 152 call hcs_$status_long (dir, ent, 1, eptr, null, code); /* get number of records used by message segment */ 153 if code ^= 0 154 then go to FIN; 155 156 nrec = fixed (status_dope.curlen, 18); 157 158 /* */ 159 160 begin; 161 162 dcl new_alloc_bits bit (alloc_len) init ("0"b) aligned; /* new allocation bit string */ 163 164 new_alloc_ptr = addr (new_alloc_bits); /* set pointer to new bit string */ 165 166 old_first_ptr, salv_ptr = /* set possible first message,salvage ptr */ 167 ptr (mptr, fixed (mseg_hdr_v2.first_ms_offset, 18)); 168 old_last_ptr, end_ptr = /* set possible last message,end salvage ptr */ 169 ptr (mptr, fixed (mseg_hdr_v2.last_ms_offset, 18)); 170 do i = 1 to hdr_alloc_len; /* turn on header allocation bits */ 171 substr (new_alloc_bits, i, 1) = "1"b; 172 end; 173 174 /* salvage */ 175 176 SALVAGE_LOOP: 177 178 if (ptr_is_good_v2_$ms_salvager_entry (salv_ptr, block_size)) /* check validity of salvaging pointer */ 179 then if (fixed (rel (salv_ptr), 18))+block_size <= nrec*1024 180 then do; /* pointer is valid, go */ 181 182 tsaved_messages = 0; /* initialize number of saved messages per pass */ 183 last_saved_ms_ptr = null; /* initialize pointer to last saver message */ 184 call ms_salv_util_v2_ 185 (forward, salv_ptr, new_alloc_ptr, nrec, alloc_len, 186 tsaved_messages, tsaved_blocks, last_saved_ms_ptr, code); 187 if code ^= 0 188 then go to FIN; 189 saved_messages = /* add in number of saved messages */ 190 saved_messages + tsaved_messages; 191 saved_blocks = /* add in number of saved blocks */ 192 saved_blocks + tsaved_blocks; 193 if last_saved_ms_ptr = end_ptr /* total success? */ 194 then total_success = "1"b; /* set a flag to remember */ 195 196 if tsaved_messages ^= 0 /* partial success? */ 197 then do; /* yes */ 198 199 if (forward) /* forward salvage? */ 200 then last_forward_ptr = /* yes, save pointer to last good message */ 201 last_saved_ms_ptr; 202 203 else /* backward salvage */ 204 last_backward_ptr = /* save pointer to last good message */ 205 last_saved_ms_ptr; 206 207 end; 208 209 if (total_success) /* if successful, don't need another pass */ 210 then go to SET_HEADER_DATA; 211 212 end; 213 214 if (forward) /* first pass at salvaging? */ 215 then do; /* yes, prepare for next pass */ 216 forward = "0"b; /* set direction of salvage */ 217 salv_ptr = old_last_ptr; /* set salvaging pointer */ 218 end_ptr = old_first_ptr; /* set hopeful end of salvage ptr */ 219 go to SALVAGE_LOOP; 220 end; 221 222 /* */ 223 224 /* join message fragments */ 225 226 if saved_messages ^= 0 /* any success in salvaging? */ 227 then do; /* yes */ 228 229 if set_block_size /* need to set block size in header */ 230 then mseg_hdr_v2.block_size = block_size; /* do it */ 231 232 if last_forward_ptr ^= null /* forward salvage partly successful */ 233 then do; /* yes */ 234 235 if last_backward_ptr ^= null /* backward salvage partly successful? */ 236 then do; /* yes */ 237 addrel (last_forward_ptr, trailer_offset) -> ms_block_trailer_v2.f_offset = 238 bit (fixed (rel (last_backward_ptr), 18), 18); 239 addrel (last_backward_ptr, trailer_offset) -> ms_block_trailer_v2.b_offset = 240 bit (fixed (rel (last_forward_ptr), 18), 18); 241 end; 242 243 else /* backward salvage unsuccessful */ 244 do; 245 mseg_hdr_v2.last_ms_offset = /* reset last message offset in header */ 246 bit (fixed (rel (last_forward_ptr), 18), 18); 247 addrel (last_forward_ptr, trailer_offset) -> ms_block_trailer_v2.f_offset = 248 "0"b; /* zero out next offset of new last message */ 249 end; 250 251 end; 252 253 else /* forward salvage no good */ 254 do; /* backward salvage must have been */ 255 mseg_hdr_v2.first_ms_offset = /* reset first message offset */ 256 bit (fixed (rel (last_backward_ptr), 18), 18); 257 addrel (last_backward_ptr, trailer_offset) -> ms_block_trailer_v2.b_offset = 258 "0"b; /* zero prev message offset of new 1st message */ 259 end; 260 261 /* reset other header data */ 262 263 SET_HEADER_DATA: 264 265 if (total_success) /* was salvaging totally successful? */ 266 then do; /* yes */ 267 268 if (forward) /* direction was forward */ 269 then mseg_hdr_v2.last_ms_offset = /* reset last message offset */ 270 bit (fixed (rel (last_forward_ptr), 18), 18); 271 272 else /* direction was backward */ 273 mseg_hdr_v2.first_ms_offset = /* reset first message offset */ 274 bit (fixed (rel (last_backward_ptr), 18), 18); 275 276 end; 277 278 block_bits = fixed (block_size*36, 17); /* set length of block mask */ 279 do i = 1 to alloc_len; /* zero out unused blocks */ 280 if substr (new_alloc_bits, i, 1) = "0"b /* block is unused */ 281 then do; 282 block_offset = block_size * fixed (i-1, 18); 283 if divide (block_offset+block_size, 1000, 18, 0) > nrec 284 then go to FIN; /* block offset off end of records used, only 0s left */ 285 block_ptr = ptr (salv_ptr, block_offset); 286 block_ptr -> block_mask = "0"b; 287 end; 288 end; 289 290 end; 291 292 if mseg_hdr_v2.switches.ms_in_hdr /* there is a message in the header */ 293 then do; 294 if mseg_hdr_v2.hdr_ms_len <= 0 | /* check for a reasonable length */ 295 mseg_hdr_v2.hdr_ms_len > max_hdr_ms_len 296 then do; /* unreasonable length */ 297 mseg_hdr_v2.switches.ms_in_hdr = "0"b; /* delete the message */ 298 addr (mseg_hdr_v2.hdr_ms) -> hdr_ms_mask = "0"b; 299 end; 300 end; 301 302 if saved_messages ^= 0 /* something was saved */ 303 | mseg_hdr_v2.switches.ms_in_hdr 304 then do; /* reset the header data */ 305 mseg_hdr_v2.space_left = /* reset space left */ 306 alloc_len- (hdr_alloc_len+saved_blocks); 307 mseg_hdr_v2.alloc_bits = new_alloc_bits; /* reset allocation bit string */ 308 mseg_hdr_v2.number_of_messages = 309 saved_messages; /* set message count */ 310 mseg_hdr_v2.alloc_len = alloc_len; /* set allocation bits length */ 311 mseg_hdr_v2.mseg_pattern = mseg_data_v2_$mseg_b36; /* set header pattern */ 312 mseg_hdr_v2.version_number = mseg_data_v2_$version_number; /* set version number */ 313 end; 314 315 if saved_messages = 0 /* no messages were saved */ 316 then do; 317 if mseg_hdr_v2.switches.ms_in_hdr /* a header message was saved */ 318 then mseg_hdr_v2.first_ms_offset, /* zero out forward and backward offsets */ 319 mseg_hdr_v2.last_ms_offset = "0"b; 320 else /* no success salvaging */ 321 do; 322 call hcs_$truncate_seg (mptr, 1, code); /* throw everything away */ 323 end; 324 end; 325 326 end; /* of BEGIN block */ 327 328 FIN: 329 330 if saved_messages ^= 0 | mseg_hdr_v2.switches.ms_in_hdr /* something was saved */ 331 then do; 332 mseg_hdr_v2.switches.aip = "0"b; /* turn of aip bit */ 333 mseg_hdr_v2.switches.os = "1"b; /* message segment was salvaged */ 334 end; 335 a_saved_messages = saved_messages; /* return number of saved messages */ 336 a_code = code; /* return code */ 337 return; 338 339 end ms_salvager_v2_; SOURCE FILES USED IN THIS COMPILATION. LINE NUMBER DATE MODIFIED NAME PATHNAME 0 05/06/85 1619.0 ms_salvager_v2_.pl1 >spec>on>mseg>ms_salvager_v2_.pl1 91 1 05/06/85 1121.8 mseg_hdr_v2.incl.pl1 >spec>on>mseg>mseg_hdr_v2.incl.pl1 93 2 05/06/85 1121.7 ms_block_trailer_v2.incl.pl1 >spec>on>mseg>ms_block_trailer_v2.incl.pl1 NAMES DECLARED IN THIS COMPILATION. IDENTIFIER OFFSET LOC STORAGE CLASS DATA TYPE ATTRIBUTES AND REFERENCES (* indicates a set context) NAMES DECLARED BY DECLARE STATEMENT. a_code parameter fixed bin(35,0) dcl 47 set ref 16 336* a_mptr parameter pointer dcl 65 ref 16 114 a_saved_messages parameter fixed bin(17,0) dcl 22 set ref 16 335* addr builtin function dcl 63 ref 113 142 144 164 298 addrel builtin function dcl 63 ref 237 239 247 257 aip 16 based bit(1) level 3 packed unaligned dcl 1-3 set ref 332* alloc_bits 220 based bit level 2 dcl 1-3 set ref 307* alloc_len 000121 automatic fixed bin(18,0) dcl 37 in procedure "ms_salvager_v2_" set ref 140* 142 162 184* 279 305 307 310 alloc_len 12 based fixed bin(17,0) level 2 in structure "mseg_hdr_v2" dcl 1-3 in procedure "ms_salvager_v2_" set ref 310* b_offset 1(18) based bit(18) level 2 packed unaligned dcl 2-3 set ref 239* 257* bit builtin function dcl 63 ref 237 239 245 255 268 272 block_bits 000100 automatic fixed bin(17,0) dcl 22 set ref 278* 286 block_mask based bit dcl 78 set ref 286* block_offset 000122 automatic fixed bin(18,0) dcl 37 set ref 282* 283 285 block_ptr 000220 automatic pointer dcl 65 set ref 285* 286 block_size 000123 automatic fixed bin(18,0) dcl 37 in procedure "ms_salvager_v2_" set ref 127* 128 130* 135 140 143 143 146 176* 176 229 278 282 283 block_size 15 based fixed bin(17,0) level 2 in structure "mseg_hdr_v2" dcl 1-3 in procedure "ms_salvager_v2_" set ref 127 229* code 000131 automatic fixed bin(35,0) dcl 47 set ref 119* 124* 125 148* 149 152* 153 184* 187 322* 336 curlen 7 based bit(12) level 2 packed unaligned dcl 82 ref 156 dir 000132 automatic char(168) dcl 52 set ref 148* 152* dirl 000101 automatic fixed bin(17,0) dcl 22 set ref 148* divide builtin function dcl 63 ref 140 142 143 283 end_ptr 000222 automatic pointer dcl 65 set ref 168* 193 218* ent 000204 automatic char(32) dcl 54 set ref 148* 152* eptr 000224 automatic pointer dcl 65 set ref 113* 152* 156 establish_cleanup_proc_ 000010 constant entry external dcl 20 ref 116 f_offset 1 based bit(18) level 2 packed unaligned dcl 2-3 set ref 237* 247* first_ms_offset 10 based bit(18) level 2 dcl 1-3 set ref 166 255* 272* 317* fixed builtin function dcl 63 ref 127 130 142 144 146 156 166 168 176 237 239 245 255 268 272 278 282 forward 000214 automatic bit(1) initial dcl 56 set ref 56* 184* 199 214 216* 268 hcs_$fs_get_path_name 000024 constant entry external dcl 95 ref 148 hcs_$get_max_length_seg 000026 constant entry external dcl 98 ref 124 hcs_$status_long 000030 constant entry external dcl 100 ref 152 hcs_$truncate_seg 000032 constant entry external dcl 103 ref 119 322 hdr_alloc_len 000124 automatic fixed bin(18,0) dcl 37 set ref 143* 170 305 hdr_ms 21 based structure level 2 dcl 1-3 set ref 144 298 hdr_ms_end 217 based fixed bin(17,0) level 3 dcl 1-3 set ref 142 hdr_ms_len 20 based fixed bin(17,0) level 2 dcl 1-3 ref 294 294 hdr_ms_mask based bit dcl 80 set ref 298* i 000102 automatic fixed bin(17,0) dcl 22 set ref 170* 171* 279* 280 282* last_backward_ptr 000226 automatic pointer initial dcl 65 set ref 65* 203* 235 237 239 255 257 272 last_forward_ptr 000230 automatic pointer initial dcl 65 set ref 65* 199* 232 237 239 245 247 268 last_ms_offset 11 based bit(18) level 2 dcl 1-3 set ref 168 245* 268* 317* last_saved_ms_ptr 000232 automatic pointer dcl 65 set ref 183* 184* 193 199 203 max_hdr_ms_len 000014 external static fixed bin(17,0) dcl 22 set ref 144* 294 298 mod builtin function dcl 63 ref 135 mptr 000244 automatic pointer dcl 1-3 set ref 114* 119* 124* 127 142 144 148* 166 166 168 168 229 245 255 268 272 292 294 294 297 298 302 305 307 308 310 311 312 317 317 317 322* 328 332 333 ms_block_trailer_v2 based structure level 1 dcl 2-3 ms_in_hdr 16(02) based bit(1) level 3 packed unaligned dcl 1-3 set ref 292 297* 302 317 328 ms_salv_util_v2_ 000036 constant entry external dcl 109 ref 184 mseg_data_v2_$block_size 000020 external static fixed bin(18,0) dcl 37 ref 130 mseg_data_v2_$block_trailer_data 000012 external static fixed bin(17,0) dcl 22 ref 146 mseg_data_v2_$mseg_b36 000022 external static bit(36) dcl 61 ref 311 mseg_data_v2_$version_number 000016 external static fixed bin(17,0) dcl 22 ref 312 mseg_hdr_v2 based structure level 1 dcl 1-3 mseg_pattern 1 based bit(36) level 2 dcl 1-3 set ref 311* new_alloc_bits 000100 automatic bit initial dcl 162 set ref 162* 164 171* 280 307 new_alloc_ptr 000234 automatic pointer dcl 65 set ref 164* 184* nrec 000125 automatic fixed bin(18,0) dcl 37 set ref 156* 176 184* 283 null builtin function dcl 63 ref 65 65 152 152 183 232 235 number_of_messages 14 based fixed bin(17,0) level 2 dcl 1-3 set ref 308* old_first_ptr 000236 automatic pointer dcl 65 set ref 166* 218 old_last_ptr 000240 automatic pointer dcl 65 set ref 168* 217 os 16(01) based bit(1) level 3 packed unaligned dcl 1-3 set ref 333* ptr builtin function dcl 63 ref 166 168 285 ptr_is_good_v2_$ms_salvager_entry 000034 constant entry external dcl 106 ref 176 rel builtin function dcl 63 ref 142 144 176 237 239 245 255 268 272 salv_ptr 000242 automatic pointer dcl 65 set ref 166* 176* 176 184* 217* 285 saved_blocks 000103 automatic fixed bin(17,0) initial dcl 22 set ref 22* 191* 191 305 saved_messages 000104 automatic fixed bin(17,0) initial dcl 22 set ref 22* 189* 189 226 302 308 315 328 335 seg_size 000126 automatic fixed bin(18,0) dcl 37 set ref 124* 135 140 set_block_size 000215 automatic bit(1) initial dcl 56 set ref 56* 132* 229 space_left 13 based fixed bin(17,0) level 2 dcl 1-3 set ref 305* status_dope based structure level 1 dcl 82 status_words 000105 automatic fixed bin(17,0) array dcl 22 set ref 113 substr builtin function dcl 63 set ref 171* 280 switches 16 based structure level 2 dcl 1-3 temp 000127 automatic fixed bin(18,0) dcl 37 set ref 142* 143 144 total_success 000216 automatic bit(1) initial dcl 56 set ref 56* 193* 209 263 trailer_offset 000130 automatic fixed bin(18,0) dcl 37 set ref 146* 237 239 247 257 tsaved_blocks 000117 automatic fixed bin(17,0) dcl 22 set ref 184* 191 tsaved_messages 000120 automatic fixed bin(17,0) dcl 22 set ref 182* 184* 189 196 version_number 17 based fixed bin(17,0) level 2 dcl 1-3 set ref 312* NAMES DECLARED BY DECLARE STATEMENT AND NEVER REFERENCED. error_table_$bad_segment external static fixed bin(35,0) dcl 86 error_table_$no_message external static fixed bin(35,0) dcl 87 tr_ptr automatic pointer dcl 2-3 NAMES DECLARED BY EXPLICIT CONTEXT. FIN 000766 constant label dcl 328 ref 120 125 149 153 187 283 SALVAGE_LOOP 000326 constant label dcl 176 ref 219 SET_BLOCK_SIZE 000074 constant label dcl 130 ref 135 SET_HEADER_DATA 000563 constant label dcl 263 ref 209 cleanup_handler 001007 constant entry internal dcl 118 ref 116 116 ms_salvager_v2_ 000016 constant entry external dcl 16 THERE WERE NO NAMES DECLARED BY CONTEXT OR IMPLICATION. STORAGE REQUIREMENTS FOR THIS PROGRAM. Object Text Link Symbol Defs Static Start 0 0 1236 1276 1036 1246 Length 1522 1036 40 207 200 0 BLOCK NAME STACK SIZE TYPE WHY NONQUICK/WHO SHARES STACK FRAME ms_salvager_v2_ 238 external procedure is an external procedure. cleanup_handler 74 internal procedure is assigned to an entry variable. begin block on line 160 102 begin block uses auto adjustable storage. STORAGE FOR AUTOMATIC VARIABLES. STACK FRAME LOC IDENTIFIER BLOCK NAME begin block on line 160 000100 new_alloc_bits begin block on line 160 ms_salvager_v2_ 000100 block_bits ms_salvager_v2_ 000101 dirl ms_salvager_v2_ 000102 i ms_salvager_v2_ 000103 saved_blocks ms_salvager_v2_ 000104 saved_messages ms_salvager_v2_ 000105 status_words ms_salvager_v2_ 000117 tsaved_blocks ms_salvager_v2_ 000120 tsaved_messages ms_salvager_v2_ 000121 alloc_len ms_salvager_v2_ 000122 block_offset ms_salvager_v2_ 000123 block_size ms_salvager_v2_ 000124 hdr_alloc_len ms_salvager_v2_ 000125 nrec ms_salvager_v2_ 000126 seg_size ms_salvager_v2_ 000127 temp ms_salvager_v2_ 000130 trailer_offset ms_salvager_v2_ 000131 code ms_salvager_v2_ 000132 dir ms_salvager_v2_ 000204 ent ms_salvager_v2_ 000214 forward ms_salvager_v2_ 000215 set_block_size ms_salvager_v2_ 000216 total_success ms_salvager_v2_ 000220 block_ptr ms_salvager_v2_ 000222 end_ptr ms_salvager_v2_ 000224 eptr ms_salvager_v2_ 000226 last_backward_ptr ms_salvager_v2_ 000230 last_forward_ptr ms_salvager_v2_ 000232 last_saved_ms_ptr ms_salvager_v2_ 000234 new_alloc_ptr ms_salvager_v2_ 000236 old_first_ptr ms_salvager_v2_ 000240 old_last_ptr ms_salvager_v2_ 000242 salv_ptr ms_salvager_v2_ 000244 mptr ms_salvager_v2_ THE FOLLOWING EXTERNAL OPERATORS ARE USED BY THIS PROGRAM. enter_begin leave_begin call_ext_out_desc call_ext_out return tra_ext alloc_auto_adj mod_fx1 ext_entry int_entry THE FOLLOWING EXTERNAL ENTRIES ARE CALLED BY THIS PROGRAM. establish_cleanup_proc_ hcs_$fs_get_path_name hcs_$get_max_length_seg hcs_$status_long hcs_$truncate_seg ms_salv_util_v2_ ptr_is_good_v2_$ms_salvager_entry THE FOLLOWING EXTERNAL VARIABLES ARE USED BY THIS PROGRAM. max_hdr_ms_len mseg_data_v2_$block_size mseg_data_v2_$block_trailer_data mseg_data_v2_$mseg_b36 mseg_data_v2_$version_number LINE LOC LINE LOC LINE LOC LINE LOC LINE LOC LINE LOC LINE LOC 16 000012 22 000023 56 000025 65 000031 113 000034 114 000036 116 000042 124 000053 125 000066 127 000070 128 000073 130 000074 132 000077 133 000101 135 000102 140 000106 142 000111 143 000123 144 000127 146 000140 148 000143 149 000175 152 000177 153 000237 156 000241 160 000245 162 000250 164 000266 166 000270 168 000300 170 000310 171 000320 172 000324 176 000326 182 000356 183 000357 184 000361 187 000410 189 000416 191 000421 193 000423 196 000431 199 000433 203 000441 209 000443 214 000445 216 000451 217 000452 218 000454 219 000456 226 000457 229 000461 232 000466 235 000472 237 000476 239 000511 241 000525 245 000526 247 000537 251 000544 255 000545 257 000556 263 000563 268 000565 272 000602 278 000613 279 000616 280 000626 282 000633 283 000636 285 000645 286 000652 288 000660 292 000662 294 000666 297 000673 298 000675 302 000705 305 000714 307 000722 308 000730 310 000732 311 000734 312 000737 315 000741 317 000743 322 000750 326 000765 328 000766 332 000774 333 000777 335 001001 336 001003 337 001005 118 001006 119 001014 120 001031 ----------------------------------------------------------- Historical Background This edition of the Multics software materials and documentation is provided and donated to Massachusetts Institute of Technology by Group BULL including BULL HN Information Systems Inc. as a contribution to computer science knowledge. This donation is made also to give evidence of the common contributions of Massachusetts Institute of Technology, Bell Laboratories, General Electric, Honeywell Information Systems Inc., Honeywell BULL Inc., Groupe BULL and BULL HN Information Systems Inc. to the development of this operating system. Multics development was initiated by Massachusetts Institute of Technology Project MAC (1963-1970), renamed the MIT Laboratory for Computer Science and Artificial Intelligence in the mid 1970s, under the leadership of Professor Fernando Jose Corbato. Users consider that Multics provided the best software architecture for managing computer hardware properly and for executing programs. Many subsequent operating systems incorporated Multics principles. Multics was distributed in 1975 to 2000 by Group Bull in Europe , and in the U.S. by Bull HN Information Systems Inc., as successor in interest by change in name only to Honeywell Bull Inc. and Honeywell Information Systems Inc. . ----------------------------------------------------------- Permission to use, copy, modify, and distribute these programs and their documentation for any purpose and without fee is hereby granted,provided that the below copyright notice and historical background appear in all copies and that both the copyright notice and historical background and this permission notice appear in supporting documentation, and that the names of MIT, HIS, BULL or BULL HN not be used in advertising or publicity pertaining to distribution of the programs without specific prior written permission. Copyright 1972 by Massachusetts Institute of Technology and Honeywell Information Systems Inc. Copyright 2006 by BULL HN Information Systems Inc. Copyright 2006 by Bull SAS All Rights Reserved