@@ -471,6 +471,52 @@ enum WASIAbi {
471
471
472
472
typealias UserData = UInt64
473
473
474
+ struct Subscription : Equatable {
475
+ enum Union : Equatable , GuestPointee {
476
+ case clock( Clock )
477
+ case fdRead( Fd )
478
+ case fdWrite( Fd )
479
+
480
+ static let sizeInGuest : UInt32 = 40
481
+ static let alignInGuest : UInt32 = max ( Clock . alignInGuest, Fd . alignInGuest)
482
+
483
+ static func readFromGuest( _ pointer: UnsafeGuestRawPointer ) -> Self {
484
+ var pointer = pointer
485
+ let tag = UInt8 . readFromGuest ( & pointer)
486
+
487
+ switch tag {
488
+ case 0 :
489
+ return . clock( . readFromGuest( & pointer) )
490
+
491
+ case 1 :
492
+ return . fdRead( . readFromGuest( & pointer) )
493
+
494
+ case 2 :
495
+ return . fdWrite( . readFromGuest( & pointer) )
496
+
497
+ default :
498
+ // FIXME: should this throw?
499
+ fatalError ( )
500
+ }
501
+ }
502
+
503
+ static func writeToGuest( at pointer: UnsafeGuestRawPointer , value: Self ) {
504
+ var pointer = pointer
505
+ switch value {
506
+ case . clock( let clock) :
507
+ UInt8 . writeToGuest ( at: & pointer, value: 0 )
508
+ Clock . writeToGuest ( at: & pointer, value: clock)
509
+ case . fdRead( let fd) :
510
+ UInt8 . writeToGuest ( at: & pointer, value: 1 )
511
+ Fd . writeToGuest ( at: & pointer, value: fd)
512
+ case . fdWrite( let fd) :
513
+ UInt8 . writeToGuest ( at: & pointer, value: 2 )
514
+ Fd . writeToGuest ( at: & pointer, value: fd)
515
+ }
516
+ }
517
+ }
518
+ }
519
+
474
520
enum ClockId : UInt32 {
475
521
/// The clock measuring real time. Time value zero corresponds with
476
522
/// 1970-01-01T00:00:00Z.
0 commit comments