"type sys._esys_002 {}\n"
"type sys.any 24\n"
"type sys._esys_003 *sys.any\n"
- "type sys._osys_372 {_esys_370 sys._esys_003}\n"
+ "type sys._osys_373 {_esys_371 sys._esys_003}\n"
"type sys.uint32 6\n"
- "type sys._isys_374 {_esys_371 sys.uint32}\n"
- "type sys._esys_001 (sys._esys_002 sys._osys_372 sys._isys_374)\n"
+ "type sys._isys_375 {_esys_372 sys.uint32}\n"
+ "type sys._esys_001 (sys._esys_002 sys._osys_373 sys._isys_375)\n"
"var !sys.mal sys._esys_001\n"
"type sys._esys_005 {}\n"
"type sys._esys_006 {}\n"
"type sys._esys_009 {}\n"
"type sys._esys_010 {}\n"
"type sys.int32 5\n"
- "type sys._isys_380 {_esys_379 sys.int32}\n"
- "type sys._esys_008 (sys._esys_009 sys._esys_010 sys._isys_380)\n"
+ "type sys._isys_381 {_esys_380 sys.int32}\n"
+ "type sys._esys_008 (sys._esys_009 sys._esys_010 sys._isys_381)\n"
"var !sys.panicl sys._esys_008\n"
"type sys._esys_012 {}\n"
"type sys._esys_013 {}\n"
"type sys.bool 12\n"
- "type sys._isys_385 {_esys_384 sys.bool}\n"
- "type sys._esys_011 (sys._esys_012 sys._esys_013 sys._isys_385)\n"
+ "type sys._isys_386 {_esys_385 sys.bool}\n"
+ "type sys._esys_011 (sys._esys_012 sys._esys_013 sys._isys_386)\n"
"var !sys.printbool sys._esys_011\n"
"type sys._esys_015 {}\n"
"type sys._esys_016 {}\n"
"type sys.float64 10\n"
- "type sys._isys_390 {_esys_389 sys.float64}\n"
- "type sys._esys_014 (sys._esys_015 sys._esys_016 sys._isys_390)\n"
+ "type sys._isys_391 {_esys_390 sys.float64}\n"
+ "type sys._esys_014 (sys._esys_015 sys._esys_016 sys._isys_391)\n"
"var !sys.printfloat sys._esys_014\n"
"type sys._esys_018 {}\n"
"type sys._esys_019 {}\n"
"type sys.int64 7\n"
- "type sys._isys_395 {_esys_394 sys.int64}\n"
- "type sys._esys_017 (sys._esys_018 sys._esys_019 sys._isys_395)\n"
+ "type sys._isys_396 {_esys_395 sys.int64}\n"
+ "type sys._esys_017 (sys._esys_018 sys._esys_019 sys._isys_396)\n"
"var !sys.printint sys._esys_017\n"
"type sys._esys_021 {}\n"
"type sys._esys_022 {}\n"
"type sys._esys_023 25\n"
"type sys.string *sys._esys_023\n"
- "type sys._isys_400 {_esys_399 sys.string}\n"
- "type sys._esys_020 (sys._esys_021 sys._esys_022 sys._isys_400)\n"
+ "type sys._isys_401 {_esys_400 sys.string}\n"
+ "type sys._esys_020 (sys._esys_021 sys._esys_022 sys._isys_401)\n"
"var !sys.printstring sys._esys_020\n"
"type sys._esys_025 {}\n"
"type sys._esys_026 {}\n"
"type sys._esys_027 *sys.any\n"
- "type sys._isys_405 {_esys_404 sys._esys_027}\n"
- "type sys._esys_024 (sys._esys_025 sys._esys_026 sys._isys_405)\n"
+ "type sys._isys_406 {_esys_405 sys._esys_027}\n"
+ "type sys._esys_024 (sys._esys_025 sys._esys_026 sys._isys_406)\n"
"var !sys.printpointer sys._esys_024\n"
"type sys._esys_029 {}\n"
- "type sys._osys_412 {_esys_409 sys.string}\n"
- "type sys._isys_414 {_esys_410 sys.string _esys_411 sys.string}\n"
- "type sys._esys_028 (sys._esys_029 sys._osys_412 sys._isys_414)\n"
+ "type sys._osys_413 {_esys_410 sys.string}\n"
+ "type sys._isys_415 {_esys_411 sys.string _esys_412 sys.string}\n"
+ "type sys._esys_028 (sys._esys_029 sys._osys_413 sys._isys_415)\n"
"var !sys.catstring sys._esys_028\n"
"type sys._esys_031 {}\n"
- "type sys._osys_422 {_esys_419 sys.int32}\n"
- "type sys._isys_424 {_esys_420 sys.string _esys_421 sys.string}\n"
- "type sys._esys_030 (sys._esys_031 sys._osys_422 sys._isys_424)\n"
+ "type sys._osys_423 {_esys_420 sys.int32}\n"
+ "type sys._isys_425 {_esys_421 sys.string _esys_422 sys.string}\n"
+ "type sys._esys_030 (sys._esys_031 sys._osys_423 sys._isys_425)\n"
"var !sys.cmpstring sys._esys_030\n"
"type sys._esys_033 {}\n"
- "type sys._osys_433 {_esys_429 sys.string}\n"
- "type sys._isys_435 {_esys_430 sys.string _esys_431 sys.int32 _esys_432 sys.int32}\n"
- "type sys._esys_032 (sys._esys_033 sys._osys_433 sys._isys_435)\n"
+ "type sys._osys_434 {_esys_430 sys.string}\n"
+ "type sys._isys_436 {_esys_431 sys.string _esys_432 sys.int32 _esys_433 sys.int32}\n"
+ "type sys._esys_032 (sys._esys_033 sys._osys_434 sys._isys_436)\n"
"var !sys.slicestring sys._esys_032\n"
"type sys._esys_035 {}\n"
"type sys.uint8 2\n"
- "type sys._osys_444 {_esys_441 sys.uint8}\n"
- "type sys._isys_446 {_esys_442 sys.string _esys_443 sys.int32}\n"
- "type sys._esys_034 (sys._esys_035 sys._osys_444 sys._isys_446)\n"
+ "type sys._osys_445 {_esys_442 sys.uint8}\n"
+ "type sys._isys_447 {_esys_443 sys.string _esys_444 sys.int32}\n"
+ "type sys._esys_034 (sys._esys_035 sys._osys_445 sys._isys_447)\n"
"var !sys.indexstring sys._esys_034\n"
"type sys._esys_037 {}\n"
- "type sys._osys_453 {_esys_451 sys.string}\n"
- "type sys._isys_455 {_esys_452 sys.int64}\n"
- "type sys._esys_036 (sys._esys_037 sys._osys_453 sys._isys_455)\n"
+ "type sys._osys_454 {_esys_452 sys.string}\n"
+ "type sys._isys_456 {_esys_453 sys.int64}\n"
+ "type sys._esys_036 (sys._esys_037 sys._osys_454 sys._isys_456)\n"
"var !sys.intstring sys._esys_036\n"
"type sys._esys_039 {}\n"
- "type sys._osys_462 {_esys_459 sys.string}\n"
+ "type sys._osys_463 {_esys_460 sys.string}\n"
"type sys._esys_040 *sys.uint8\n"
- "type sys._isys_464 {_esys_460 sys._esys_040 _esys_461 sys.int32}\n"
- "type sys._esys_038 (sys._esys_039 sys._osys_462 sys._isys_464)\n"
+ "type sys._isys_465 {_esys_461 sys._esys_040 _esys_462 sys.int32}\n"
+ "type sys._esys_038 (sys._esys_039 sys._osys_463 sys._isys_465)\n"
"var !sys.byteastring sys._esys_038\n"
"type sys._esys_042 {}\n"
"type sys._esys_043 <>\n"
- "type sys._osys_473 {_esys_469 sys._esys_043}\n"
+ "type sys._osys_474 {_esys_470 sys._esys_043}\n"
"type sys._esys_044 *sys.uint8\n"
"type sys._esys_045 *sys.uint8\n"
- "type sys._ssys_480 {}\n"
- "type sys._esys_046 *sys._ssys_480\n"
- "type sys._isys_475 {_esys_470 sys._esys_044 _esys_471 sys._esys_045 _esys_472 sys._esys_046}\n"
- "type sys._esys_041 (sys._esys_042 sys._osys_473 sys._isys_475)\n"
+ "type sys._ssys_481 {}\n"
+ "type sys._esys_046 *sys._ssys_481\n"
+ "type sys._isys_476 {_esys_471 sys._esys_044 _esys_472 sys._esys_045 _esys_473 sys._esys_046}\n"
+ "type sys._esys_041 (sys._esys_042 sys._osys_474 sys._isys_476)\n"
"var !sys.mkiface sys._esys_041\n"
"type sys._esys_048 {}\n"
- "type sys._osys_484 {_esys_483 sys.int32}\n"
+ "type sys._osys_485 {_esys_484 sys.int32}\n"
"type sys._esys_049 {}\n"
- "type sys._esys_047 (sys._esys_048 sys._osys_484 sys._esys_049)\n"
+ "type sys._esys_047 (sys._esys_048 sys._osys_485 sys._esys_049)\n"
"var !sys.argc sys._esys_047\n"
"type sys._esys_051 {}\n"
- "type sys._osys_488 {_esys_487 sys.int32}\n"
+ "type sys._osys_489 {_esys_488 sys.int32}\n"
"type sys._esys_052 {}\n"
- "type sys._esys_050 (sys._esys_051 sys._osys_488 sys._esys_052)\n"
+ "type sys._esys_050 (sys._esys_051 sys._osys_489 sys._esys_052)\n"
"var !sys.envc sys._esys_050\n"
"type sys._esys_054 {}\n"
- "type sys._osys_493 {_esys_491 sys.string}\n"
- "type sys._isys_495 {_esys_492 sys.int32}\n"
- "type sys._esys_053 (sys._esys_054 sys._osys_493 sys._isys_495)\n"
+ "type sys._osys_494 {_esys_492 sys.string}\n"
+ "type sys._isys_496 {_esys_493 sys.int32}\n"
+ "type sys._esys_053 (sys._esys_054 sys._osys_494 sys._isys_496)\n"
"var !sys.argv sys._esys_053\n"
"type sys._esys_056 {}\n"
- "type sys._osys_501 {_esys_499 sys.string}\n"
- "type sys._isys_503 {_esys_500 sys.int32}\n"
- "type sys._esys_055 (sys._esys_056 sys._osys_501 sys._isys_503)\n"
+ "type sys._osys_502 {_esys_500 sys.string}\n"
+ "type sys._isys_504 {_esys_501 sys.int32}\n"
+ "type sys._esys_055 (sys._esys_056 sys._osys_502 sys._isys_504)\n"
"var !sys.envv sys._esys_055\n"
"type sys._esys_058 {}\n"
- "type sys._osys_510 {_esys_507 sys.float64 _esys_508 sys.int32}\n"
- "type sys._isys_512 {_esys_509 sys.float64}\n"
- "type sys._esys_057 (sys._esys_058 sys._osys_510 sys._isys_512)\n"
+ "type sys._osys_511 {_esys_508 sys.float64 _esys_509 sys.int32}\n"
+ "type sys._isys_513 {_esys_510 sys.float64}\n"
+ "type sys._esys_057 (sys._esys_058 sys._osys_511 sys._isys_513)\n"
"var !sys.frexp sys._esys_057\n"
"type sys._esys_060 {}\n"
- "type sys._osys_519 {_esys_516 sys.float64}\n"
- "type sys._isys_521 {_esys_517 sys.float64 _esys_518 sys.int32}\n"
- "type sys._esys_059 (sys._esys_060 sys._osys_519 sys._isys_521)\n"
+ "type sys._osys_520 {_esys_517 sys.float64}\n"
+ "type sys._isys_522 {_esys_518 sys.float64 _esys_519 sys.int32}\n"
+ "type sys._esys_059 (sys._esys_060 sys._osys_520 sys._isys_522)\n"
"var !sys.ldexp sys._esys_059\n"
"type sys._esys_062 {}\n"
- "type sys._osys_529 {_esys_526 sys.float64 _esys_527 sys.float64}\n"
- "type sys._isys_531 {_esys_528 sys.float64}\n"
- "type sys._esys_061 (sys._esys_062 sys._osys_529 sys._isys_531)\n"
+ "type sys._osys_530 {_esys_527 sys.float64 _esys_528 sys.float64}\n"
+ "type sys._isys_532 {_esys_529 sys.float64}\n"
+ "type sys._esys_061 (sys._esys_062 sys._osys_530 sys._isys_532)\n"
"var !sys.modf sys._esys_061\n"
"type sys._esys_064 {}\n"
- "type sys._osys_538 {_esys_535 sys.bool}\n"
- "type sys._isys_540 {_esys_536 sys.float64 _esys_537 sys.int32}\n"
- "type sys._esys_063 (sys._esys_064 sys._osys_538 sys._isys_540)\n"
+ "type sys._osys_539 {_esys_536 sys.bool}\n"
+ "type sys._isys_541 {_esys_537 sys.float64 _esys_538 sys.int32}\n"
+ "type sys._esys_063 (sys._esys_064 sys._osys_539 sys._isys_541)\n"
"var !sys.isInf sys._esys_063\n"
"type sys._esys_066 {}\n"
- "type sys._osys_547 {_esys_545 sys.bool}\n"
- "type sys._isys_549 {_esys_546 sys.float64}\n"
- "type sys._esys_065 (sys._esys_066 sys._osys_547 sys._isys_549)\n"
+ "type sys._osys_548 {_esys_546 sys.bool}\n"
+ "type sys._isys_550 {_esys_547 sys.float64}\n"
+ "type sys._esys_065 (sys._esys_066 sys._osys_548 sys._isys_550)\n"
"var !sys.isNaN sys._esys_065\n"
"type sys._esys_068 {}\n"
- "type sys._osys_555 {_esys_553 sys.float64}\n"
- "type sys._isys_557 {_esys_554 sys.int32}\n"
- "type sys._esys_067 (sys._esys_068 sys._osys_555 sys._isys_557)\n"
+ "type sys._osys_556 {_esys_554 sys.float64}\n"
+ "type sys._isys_558 {_esys_555 sys.int32}\n"
+ "type sys._esys_067 (sys._esys_068 sys._osys_556 sys._isys_558)\n"
"var !sys.Inf sys._esys_067\n"
"type sys._esys_070 {}\n"
- "type sys._osys_562 {_esys_561 sys.float64}\n"
+ "type sys._osys_563 {_esys_562 sys.float64}\n"
"type sys._esys_071 {}\n"
- "type sys._esys_069 (sys._esys_070 sys._osys_562 sys._esys_071)\n"
+ "type sys._esys_069 (sys._esys_070 sys._osys_563 sys._esys_071)\n"
"var !sys.NaN sys._esys_069\n"
"type sys._esys_073 {}\n"
"type sys._esys_075 [sys.any] sys.any\n"
"type sys._esys_074 *sys._esys_075\n"
- "type sys._osys_565 {hmap sys._esys_074}\n"
- "type sys._isys_567 {keysize sys.uint32 valsize sys.uint32 keyalg sys.uint32 valalg sys.uint32 hint sys.uint32}\n"
- "type sys._esys_072 (sys._esys_073 sys._osys_565 sys._isys_567)\n"
+ "type sys._osys_566 {hmap sys._esys_074}\n"
+ "type sys._isys_568 {keysize sys.uint32 valsize sys.uint32 keyalg sys.uint32 valalg sys.uint32 hint sys.uint32}\n"
+ "type sys._esys_072 (sys._esys_073 sys._osys_566 sys._isys_568)\n"
"var !sys.newmap sys._esys_072\n"
"type sys._esys_077 {}\n"
- "type sys._osys_576 {val sys.any}\n"
+ "type sys._osys_577 {val sys.any}\n"
"type sys._esys_079 [sys.any] sys.any\n"
"type sys._esys_078 *sys._esys_079\n"
- "type sys._isys_578 {hmap sys._esys_078 key sys.any}\n"
- "type sys._esys_076 (sys._esys_077 sys._osys_576 sys._isys_578)\n"
+ "type sys._isys_579 {hmap sys._esys_078 key sys.any}\n"
+ "type sys._esys_076 (sys._esys_077 sys._osys_577 sys._isys_579)\n"
"var !sys.mapaccess1 sys._esys_076\n"
"type sys._esys_081 {}\n"
- "type sys._osys_584 {val sys.any pres sys.bool}\n"
+ "type sys._osys_585 {val sys.any pres sys.bool}\n"
"type sys._esys_083 [sys.any] sys.any\n"
"type sys._esys_082 *sys._esys_083\n"
- "type sys._isys_586 {hmap sys._esys_082 key sys.any}\n"
- "type sys._esys_080 (sys._esys_081 sys._osys_584 sys._isys_586)\n"
+ "type sys._isys_587 {hmap sys._esys_082 key sys.any}\n"
+ "type sys._esys_080 (sys._esys_081 sys._osys_585 sys._isys_587)\n"
"var !sys.mapaccess2 sys._esys_080\n"
"type sys._esys_085 {}\n"
"type sys._esys_086 {}\n"
"type sys._esys_088 [sys.any] sys.any\n"
"type sys._esys_087 *sys._esys_088\n"
- "type sys._isys_593 {hmap sys._esys_087 key sys.any val sys.any}\n"
- "type sys._esys_084 (sys._esys_085 sys._esys_086 sys._isys_593)\n"
+ "type sys._isys_594 {hmap sys._esys_087 key sys.any val sys.any}\n"
+ "type sys._esys_084 (sys._esys_085 sys._esys_086 sys._isys_594)\n"
"var !sys.mapassign1 sys._esys_084\n"
"type sys._esys_090 {}\n"
"type sys._esys_091 {}\n"
"type sys._esys_093 [sys.any] sys.any\n"
"type sys._esys_092 *sys._esys_093\n"
- "type sys._isys_599 {hmap sys._esys_092 key sys.any val sys.any pres sys.bool}\n"
- "type sys._esys_089 (sys._esys_090 sys._esys_091 sys._isys_599)\n"
+ "type sys._isys_600 {hmap sys._esys_092 key sys.any val sys.any pres sys.bool}\n"
+ "type sys._esys_089 (sys._esys_090 sys._esys_091 sys._isys_600)\n"
"var !sys.mapassign2 sys._esys_089\n"
"type sys._esys_095 {}\n"
"type sys._esys_097 1 sys.any\n"
"type sys._esys_096 *sys._esys_097\n"
- "type sys._osys_606 {hchan sys._esys_096}\n"
- "type sys._isys_608 {elemsize sys.uint32 elemalg sys.uint32 hint sys.uint32}\n"
- "type sys._esys_094 (sys._esys_095 sys._osys_606 sys._isys_608)\n"
+ "type sys._osys_607 {hchan sys._esys_096}\n"
+ "type sys._isys_609 {elemsize sys.uint32 elemalg sys.uint32 hint sys.uint32}\n"
+ "type sys._esys_094 (sys._esys_095 sys._osys_607 sys._isys_609)\n"
"var !sys.newchan sys._esys_094\n"
"type sys._esys_099 {}\n"
- "type sys._osys_615 {elem sys.any}\n"
+ "type sys._osys_616 {elem sys.any}\n"
"type sys._esys_101 1 sys.any\n"
"type sys._esys_100 *sys._esys_101\n"
- "type sys._isys_617 {hchan sys._esys_100}\n"
- "type sys._esys_098 (sys._esys_099 sys._osys_615 sys._isys_617)\n"
+ "type sys._isys_618 {hchan sys._esys_100}\n"
+ "type sys._esys_098 (sys._esys_099 sys._osys_616 sys._isys_618)\n"
"var !sys.chanrecv1 sys._esys_098\n"
"type sys._esys_103 {}\n"
- "type sys._osys_622 {elem sys.any pres sys.bool}\n"
+ "type sys._osys_623 {elem sys.any pres sys.bool}\n"
"type sys._esys_105 1 sys.any\n"
"type sys._esys_104 *sys._esys_105\n"
- "type sys._isys_624 {hchan sys._esys_104}\n"
- "type sys._esys_102 (sys._esys_103 sys._osys_622 sys._isys_624)\n"
+ "type sys._isys_625 {hchan sys._esys_104}\n"
+ "type sys._esys_102 (sys._esys_103 sys._osys_623 sys._isys_625)\n"
"var !sys.chanrecv2 sys._esys_102\n"
"type sys._esys_107 {}\n"
- "type sys._osys_630 {pres sys.bool}\n"
+ "type sys._osys_631 {pres sys.bool}\n"
"type sys._esys_109 1 sys.any\n"
"type sys._esys_108 *sys._esys_109\n"
"type sys._esys_110 *sys.any\n"
- "type sys._isys_632 {hchan sys._esys_108 elem sys._esys_110}\n"
- "type sys._esys_106 (sys._esys_107 sys._osys_630 sys._isys_632)\n"
+ "type sys._isys_633 {hchan sys._esys_108 elem sys._esys_110}\n"
+ "type sys._esys_106 (sys._esys_107 sys._osys_631 sys._isys_633)\n"
"var !sys.chanrecv3 sys._esys_106\n"
"type sys._esys_112 {}\n"
"type sys._esys_113 {}\n"
"type sys._esys_115 1 sys.any\n"
"type sys._esys_114 *sys._esys_115\n"
- "type sys._isys_638 {hchan sys._esys_114 elem sys.any}\n"
- "type sys._esys_111 (sys._esys_112 sys._esys_113 sys._isys_638)\n"
+ "type sys._isys_639 {hchan sys._esys_114 elem sys.any}\n"
+ "type sys._esys_111 (sys._esys_112 sys._esys_113 sys._isys_639)\n"
"var !sys.chansend1 sys._esys_111\n"
"type sys._esys_117 {}\n"
- "type sys._osys_643 {pres sys.bool}\n"
+ "type sys._osys_644 {pres sys.bool}\n"
"type sys._esys_119 1 sys.any\n"
"type sys._esys_118 *sys._esys_119\n"
- "type sys._isys_645 {hchan sys._esys_118 elem sys.any}\n"
- "type sys._esys_116 (sys._esys_117 sys._osys_643 sys._isys_645)\n"
+ "type sys._isys_646 {hchan sys._esys_118 elem sys.any}\n"
+ "type sys._esys_116 (sys._esys_117 sys._osys_644 sys._isys_646)\n"
"var !sys.chansend2 sys._esys_116\n"
"type sys._esys_121 {}\n"
"type sys._esys_122 *sys.uint8\n"
- "type sys._osys_651 {sel sys._esys_122}\n"
- "type sys._isys_653 {size sys.uint32}\n"
- "type sys._esys_120 (sys._esys_121 sys._osys_651 sys._isys_653)\n"
+ "type sys._osys_652 {sel sys._esys_122}\n"
+ "type sys._isys_654 {size sys.uint32}\n"
+ "type sys._esys_120 (sys._esys_121 sys._osys_652 sys._isys_654)\n"
"var !sys.newselect sys._esys_120\n"
"type sys._esys_124 {}\n"
- "type sys._osys_658 {selected sys.bool}\n"
+ "type sys._osys_659 {selected sys.bool}\n"
"type sys._esys_125 *sys.uint8\n"
"type sys._esys_127 1 sys.any\n"
"type sys._esys_126 *sys._esys_127\n"
- "type sys._isys_660 {sel sys._esys_125 hchan sys._esys_126 elem sys.any}\n"
- "type sys._esys_123 (sys._esys_124 sys._osys_658 sys._isys_660)\n"
+ "type sys._isys_661 {sel sys._esys_125 hchan sys._esys_126 elem sys.any}\n"
+ "type sys._esys_123 (sys._esys_124 sys._osys_659 sys._isys_661)\n"
"var !sys.selectsend sys._esys_123\n"
"type sys._esys_129 {}\n"
- "type sys._osys_667 {selected sys.bool}\n"
+ "type sys._osys_668 {selected sys.bool}\n"
"type sys._esys_130 *sys.uint8\n"
"type sys._esys_132 1 sys.any\n"
"type sys._esys_131 *sys._esys_132\n"
"type sys._esys_133 *sys.any\n"
- "type sys._isys_669 {sel sys._esys_130 hchan sys._esys_131 elem sys._esys_133}\n"
- "type sys._esys_128 (sys._esys_129 sys._osys_667 sys._isys_669)\n"
+ "type sys._isys_670 {sel sys._esys_130 hchan sys._esys_131 elem sys._esys_133}\n"
+ "type sys._esys_128 (sys._esys_129 sys._osys_668 sys._isys_670)\n"
"var !sys.selectrecv sys._esys_128\n"
"type sys._esys_135 {}\n"
"type sys._esys_136 {}\n"
"type sys._esys_137 *sys.uint8\n"
- "type sys._isys_676 {sel sys._esys_137}\n"
- "type sys._esys_134 (sys._esys_135 sys._esys_136 sys._isys_676)\n"
+ "type sys._isys_677 {sel sys._esys_137}\n"
+ "type sys._esys_134 (sys._esys_135 sys._esys_136 sys._isys_677)\n"
"var !sys.selectgo sys._esys_134\n"
"type sys._esys_139 {}\n"
"type sys._esys_140 {}\n"
"type sys._esys_142 (sys._esys_143 sys._esys_144 sys._esys_145)\n"
"var !sys.goexit sys._esys_142\n"
"type sys._esys_147 {}\n"
- "type sys._osys_685 {_esys_682 sys.string _esys_683 sys.bool}\n"
- "type sys._isys_687 {_esys_684 sys.string}\n"
- "type sys._esys_146 (sys._esys_147 sys._osys_685 sys._isys_687)\n"
+ "type sys._osys_686 {_esys_683 sys.string _esys_684 sys.bool}\n"
+ "type sys._isys_688 {_esys_685 sys.string}\n"
+ "type sys._esys_146 (sys._esys_147 sys._osys_686 sys._isys_688)\n"
"var !sys.readfile sys._esys_146\n"
"type sys._esys_149 {}\n"
- "type sys._osys_694 {_esys_691 sys.bool}\n"
- "type sys._isys_696 {_esys_692 sys.string _esys_693 sys.string}\n"
- "type sys._esys_148 (sys._esys_149 sys._osys_694 sys._isys_696)\n"
+ "type sys._osys_695 {_esys_692 sys.bool}\n"
+ "type sys._isys_697 {_esys_693 sys.string _esys_694 sys.string}\n"
+ "type sys._esys_148 (sys._esys_149 sys._osys_695 sys._isys_697)\n"
"var !sys.writefile sys._esys_148\n"
"type sys._esys_151 {}\n"
- "type sys._osys_706 {_esys_701 sys.int32 _esys_702 sys.int32}\n"
+ "type sys._osys_707 {_esys_702 sys.int32 _esys_703 sys.int32}\n"
"type sys._esys_152 *sys.uint8\n"
- "type sys._isys_708 {_esys_703 sys._esys_152 _esys_704 sys.int32 _esys_705 sys.int32}\n"
- "type sys._esys_150 (sys._esys_151 sys._osys_706 sys._isys_708)\n"
+ "type sys._isys_709 {_esys_704 sys._esys_152 _esys_705 sys.int32 _esys_706 sys.int32}\n"
+ "type sys._esys_150 (sys._esys_151 sys._osys_707 sys._isys_709)\n"
"var !sys.bytestorune sys._esys_150\n"
"type sys._esys_154 {}\n"
- "type sys._osys_719 {_esys_714 sys.int32 _esys_715 sys.int32}\n"
- "type sys._isys_721 {_esys_716 sys.string _esys_717 sys.int32 _esys_718 sys.int32}\n"
- "type sys._esys_153 (sys._esys_154 sys._osys_719 sys._isys_721)\n"
+ "type sys._osys_720 {_esys_715 sys.int32 _esys_716 sys.int32}\n"
+ "type sys._isys_722 {_esys_717 sys.string _esys_718 sys.int32 _esys_719 sys.int32}\n"
+ "type sys._esys_153 (sys._esys_154 sys._osys_720 sys._isys_722)\n"
"var !sys.stringtorune sys._esys_153\n"
"type sys._esys_156 {}\n"
"type sys._esys_157 {}\n"
- "type sys._isys_728 {_esys_727 sys.int32}\n"
+ "type sys._isys_728 {ms sys.int64}\n"
"type sys._esys_155 (sys._esys_156 sys._esys_157 sys._isys_728)\n"
- "var !sys.exit sys._esys_155\n"
+ "var !sys.sleep sys._esys_155\n"
"type sys._esys_159 {}\n"
"type sys._esys_160 {}\n"
- "type sys._esys_161 {}\n"
- "type sys._esys_158 (sys._esys_159 sys._esys_160 sys._esys_161)\n"
+ "type sys._isys_733 {_esys_732 sys.int32}\n"
+ "type sys._esys_158 (sys._esys_159 sys._esys_160 sys._isys_733)\n"
+ "var !sys.exit sys._esys_158\n"
+ "type sys._esys_162 {}\n"
+ "type sys._esys_163 {}\n"
+ "type sys._esys_164 {}\n"
+ "type sys._esys_161 (sys._esys_162 sys._esys_163 sys._esys_164)\n"
"))\n"
;
// license that can be found in the LICENSE file.
#include "runtime.h"
+#include "amd64_linux.h"
#include "signals.h"
/* From /usr/include/asm-x86_64/sigcontext.h */
}
-sigaction a;
+static sigaction a;
void
initsig(void)
sys·rt_sigaction(i, &a, (void*)0, 8);
}
}
+
+// Linux futex. The simple cases really are simple:
+//
+// futex(addr, FUTEX_WAIT, val, duration, _, _)
+// Inside the kernel, atomically check that *addr == val
+// and go to sleep for at most duration.
+//
+// futex(addr, FUTEX_WAKE, val, _, _, _)
+// Wake up at least val procs sleeping on addr.
+//
+// (Of course, they have added more complicated things since then.)
+
+enum
+{
+ FUTEX_WAIT = 0,
+ FUTEX_WAKE = 1,
+
+ EINTR = 4,
+ EAGAIN = 11,
+};
+
+// TODO(rsc) I tried using 1<<40 here but it woke up (-ETIMEDOUT).
+// I wonder if the timespec that gets to the kernel
+// actually has two 32-bit numbers in it, so that
+// a 64-bit 1<<40 ends up being 0 seconds,
+// 1<<8 nanoseconds.
+static struct timespec longtime =
+{
+ 1<<30, // 34 years
+ 0
+};
+
+static void
+efutex(uint32 *addr, int32 op, int32 val, struct timespec *ts)
+{
+ int64 ret;
+
+again:
+ ret = futex(addr, op, val, ts, nil, 0);
+
+ // These happen when you use a debugger, among other times.
+ if(ret == -EAGAIN || ret == -EINTR){
+ // If we were sleeping, it's okay to wake up early.
+ if(op == FUTEX_WAIT)
+ return;
+
+ // If we were waking someone up, we don't know
+ // whether that succeeded, so wake someone else up too.
+ if(op == FUTEX_WAKE){
+prints("futexwake ");
+sys·printint(ret);
+prints("\n");
+ goto again;
+ }
+ }
+
+ if(ret < 0){
+ prints("futex error addr=");
+ sys·printpointer(addr);
+ prints(" op=");
+ sys·printint(op);
+ prints(" val=");
+ sys·printint(val);
+ prints(" ts=");
+ sys·printpointer(ts);
+ prints(" returned ");
+ sys·printint(-ret);
+ prints("\n");
+ *(int32*)101 = 202;
+ }
+}
+
+// Lock and unlock.
+// A zeroed Lock is unlocked (no need to initialize each lock).
+// The l->key is either 0 (unlocked), 1 (locked), or >=2 (contended).
+
+void
+lock(Lock *l)
+{
+ uint32 v;
+
+ if(l->key != 0) *(int32*)0x1001 = 0x1001;
+ l->key = 1;
+ return;
+
+ for(;;){
+ // Try for lock. If we incremented it from 0 to 1, we win.
+ if((v=xadd(&l->key, 1)) == 1)
+ return;
+
+ // We lose. It was already >=1 and is now >=2.
+ // Use futex to atomically check that the value is still
+ // what we think it is and go to sleep.
+ efutex(&l->key, FUTEX_WAIT, v, &longtime);
+ }
+}
+
+void
+unlock(Lock *l)
+{
+ uint32 v;
+
+ if(l->key != 1) *(int32*)0x1002 = 0x1002;
+ l->key = 0;
+ return;
+
+ // Unlock the lock. If we decremented from 1 to 0, wasn't contended.
+ if((v=xadd(&l->key, -1)) == 0)
+ return;
+
+ // The lock was contended. Mark it as unlocked and wake a waiter.
+ l->key = 0;
+ efutex(&l->key, FUTEX_WAKE, 1, nil);
+}
+
+// Sleep and wakeup (see description in runtime.h)
+
+void
+rsleep(Rendez *r)
+{
+ // Record that we're about to go to sleep and drop the lock.
+ r->sleeping = 1;
+ unlock(r->l);
+
+ // Go to sleep if r->sleeping is still 1.
+ efutex(&r->sleeping, FUTEX_WAIT, 1, &longtime);
+
+ // Reacquire the lock.
+ lock(r->l);
+}
+
+void
+rwakeup(Rendez *r)
+{
+ if(!r->sleeping)
+ return;
+
+ // Clear the sleeping flag in case sleeper
+ // is between unlock and futex.
+ r->sleeping = 0;
+
+ // Wake up if actually made it to sleep.
+ efutex(&r->sleeping, FUTEX_WAKE, 1, nil);
+}
+
+// Like rwakeup(r), unlock(r->l), but drops the lock before
+// waking the other proc. This reduces bouncing back and forth
+// in the scheduler: the first thing the other proc wants to do
+// is acquire r->l, so it helps to unlock it before we wake him.
+void
+rwakeupandunlock(Rendez *r)
+{
+ int32 wassleeping;
+
+ if(!r->sleeping){
+ unlock(r->l);
+ return;
+ }
+
+ r->sleeping = 0;
+ unlock(r->l);
+ efutex(&r->sleeping, FUTEX_WAKE, 1, nil);
+}
+
+enum
+{
+ CLONE_VM = 0x100,
+ CLONE_FS = 0x200,
+ CLONE_FILES = 0x400,
+ CLONE_SIGHAND = 0x800,
+ CLONE_PTRACE = 0x2000,
+ CLONE_VFORK = 0x4000,
+ CLONE_PARENT = 0x8000,
+ CLONE_THREAD = 0x10000,
+ CLONE_NEWNS = 0x20000,
+ CLONE_SYSVSEM = 0x40000,
+ CLONE_SETTLS = 0x80000,
+ CLONE_PARENT_SETTID = 0x100000,
+ CLONE_CHILD_CLEARTID = 0x200000,
+ CLONE_UNTRACED = 0x800000,
+ CLONE_CHILD_SETTID = 0x1000000,
+ CLONE_STOPPED = 0x2000000,
+ CLONE_NEWUTS = 0x4000000,
+ CLONE_NEWIPC = 0x8000000,
+};
+
+void
+newosproc(M *mm, G *gg, void *stk, void (*fn)(void*), void *arg)
+{
+ int64 ret;
+ int32 flags;
+
+ flags = CLONE_PARENT /* getppid doesn't change in child */
+ | CLONE_VM /* share memory */
+ | CLONE_FS /* share cwd, etc */
+ | CLONE_FILES /* share fd table */
+ | CLONE_SIGHAND /* share sig handler table */
+ | CLONE_PTRACE /* revisit - okay for now */
+ | CLONE_THREAD /* revisit - okay for now */
+ ;
+
+ if(0){
+ prints("newosproc stk=");
+ sys·printpointer(stk);
+ prints(" mm=");
+ sys·printpointer(mm);
+ prints(" gg=");
+ sys·printpointer(gg);
+ prints(" fn=");
+ sys·printpointer(fn);
+ prints(" arg=");
+ sys·printpointer(arg);
+ prints(" clone=");
+ sys·printpointer(clone);
+ prints("\n");
+ }
+
+ ret = clone(flags, stk, mm, gg, fn, arg);
+ if(ret < 0)
+ *(int32*)123 = 123;
+}
+
+void
+sys·sleep(int64 ms)
+{
+ struct timeval tv;
+
+ tv.tv_sec = ms/1000;
+ tv.tv_usec = ms%1000 * 1000;
+ select(0, nil, nil, nil, &tv);
+}
+