@@ -120,39 +120,6 @@ pub(crate) fn open_protocol<T>(
120
120
}
121
121
}
122
122
123
- pub ( crate ) fn create_event (
124
- signal : u32 ,
125
- tpl : efi:: Tpl ,
126
- handler : Option < efi:: EventNotify > ,
127
- context : * mut crate :: ffi:: c_void ,
128
- ) -> io:: Result < NonNull < crate :: ffi:: c_void > > {
129
- let boot_services: NonNull < efi:: BootServices > =
130
- boot_services ( ) . ok_or ( BOOT_SERVICES_UNAVAILABLE ) ?. cast ( ) ;
131
- let mut event: r_efi:: efi:: Event = crate :: ptr:: null_mut ( ) ;
132
- let r = unsafe {
133
- let create_event = ( * boot_services. as_ptr ( ) ) . create_event ;
134
- ( create_event) ( signal, tpl, handler, context, & mut event)
135
- } ;
136
- if r. is_error ( ) {
137
- Err ( crate :: io:: Error :: from_raw_os_error ( r. as_usize ( ) ) )
138
- } else {
139
- NonNull :: new ( event) . ok_or ( const_error ! ( io:: ErrorKind :: Other , "null protocol" ) )
140
- }
141
- }
142
-
143
- /// # SAFETY
144
- /// - The supplied event must be valid
145
- pub ( crate ) unsafe fn close_event ( evt : NonNull < crate :: ffi:: c_void > ) -> io:: Result < ( ) > {
146
- let boot_services: NonNull < efi:: BootServices > =
147
- boot_services ( ) . ok_or ( BOOT_SERVICES_UNAVAILABLE ) ?. cast ( ) ;
148
- let r = unsafe {
149
- let close_event = ( * boot_services. as_ptr ( ) ) . close_event ;
150
- ( close_event) ( evt. as_ptr ( ) )
151
- } ;
152
-
153
- if r. is_error ( ) { Err ( crate :: io:: Error :: from_raw_os_error ( r. as_usize ( ) ) ) } else { Ok ( ( ) ) }
154
- }
155
-
156
123
/// Gets the Protocol for current system handle.
157
124
///
158
125
/// Note: Some protocols need to be manually freed. It is the caller's responsibility to do so.
@@ -735,3 +702,56 @@ impl Drop for ServiceProtocol {
735
702
}
736
703
}
737
704
}
705
+
706
+ #[ repr( transparent) ]
707
+ pub ( crate ) struct OwnedEvent ( NonNull < crate :: ffi:: c_void > ) ;
708
+
709
+ impl OwnedEvent {
710
+ pub ( crate ) fn new (
711
+ signal : u32 ,
712
+ tpl : efi:: Tpl ,
713
+ handler : Option < efi:: EventNotify > ,
714
+ context : Option < NonNull < crate :: ffi:: c_void > > ,
715
+ ) -> io:: Result < Self > {
716
+ let boot_services: NonNull < efi:: BootServices > =
717
+ boot_services ( ) . ok_or ( BOOT_SERVICES_UNAVAILABLE ) ?. cast ( ) ;
718
+ let mut event: r_efi:: efi:: Event = crate :: ptr:: null_mut ( ) ;
719
+ let context = context. map ( NonNull :: as_ptr) . unwrap_or ( crate :: ptr:: null_mut ( ) ) ;
720
+
721
+ let r = unsafe {
722
+ let create_event = ( * boot_services. as_ptr ( ) ) . create_event ;
723
+ ( create_event) ( signal, tpl, handler, context, & mut event)
724
+ } ;
725
+
726
+ if r. is_error ( ) {
727
+ Err ( crate :: io:: Error :: from_raw_os_error ( r. as_usize ( ) ) )
728
+ } else {
729
+ NonNull :: new ( event)
730
+ . ok_or ( const_error ! ( io:: ErrorKind :: Other , "failed to create event" ) )
731
+ . map ( Self )
732
+ }
733
+ }
734
+
735
+ pub ( crate ) fn into_raw ( self ) -> * mut crate :: ffi:: c_void {
736
+ let r = self . 0 . as_ptr ( ) ;
737
+ crate :: mem:: forget ( self ) ;
738
+ r
739
+ }
740
+
741
+ /// SAFETY: Assumes that ptr is a non-null valid UEFI event
742
+ pub ( crate ) unsafe fn from_raw ( ptr : * mut crate :: ffi:: c_void ) -> Self {
743
+ Self ( unsafe { NonNull :: new_unchecked ( ptr) } )
744
+ }
745
+ }
746
+
747
+ impl Drop for OwnedEvent {
748
+ fn drop ( & mut self ) {
749
+ if let Some ( boot_services) = boot_services ( ) {
750
+ let bt: NonNull < r_efi:: efi:: BootServices > = boot_services. cast ( ) ;
751
+ unsafe {
752
+ let close_event = ( * bt. as_ptr ( ) ) . close_event ;
753
+ ( close_event) ( self . 0 . as_ptr ( ) )
754
+ } ;
755
+ }
756
+ }
757
+ }
0 commit comments