@@ -30,6 +30,7 @@ use async_trait::async_trait;
3030pub ( crate ) use canonical:: CanonicalDeviceArrayExport ;
3131use cudarc:: driver:: CudaEvent ;
3232use cudarc:: driver:: CudaStream ;
33+ use cudarc:: driver:: DevicePtr ;
3334use cudarc:: runtime:: sys:: cudaEvent_t;
3435pub ( crate ) use offsets:: I32Offsets ;
3536pub ( crate ) use offsets:: i32_offsets_from_lengths;
@@ -169,9 +170,18 @@ impl PrivateData {
169170 // null pointer
170171 Ok ( ptr:: null ( ) )
171172 }
172- Some ( handle) => usize:: try_from ( handle. cuda_device_ptr ( ) ?)
173- . map ( |ptr| ptr as * const c_void )
174- . map_err ( |_| vortex_err ! ( "CUDA device pointer does not fit in usize" ) ) ,
173+ Some ( handle) => {
174+ // The buffer may have been populated on a different stream (for example,
175+ // pooled file reads use a dedicated H2D stream). Access it through cudarc's
176+ // stream-aware API so this export stream waits for pending writes before
177+ // its Arrow sync event is recorded.
178+ let view = handle. cuda_view :: < u8 > ( ) ?;
179+ let ( device_ptr, record_read) = view. device_ptr ( ctx. stream ( ) ) ;
180+ drop ( record_read) ;
181+ usize:: try_from ( device_ptr)
182+ . map ( |ptr| ptr as * const c_void )
183+ . map_err ( |_| vortex_err ! ( "CUDA device pointer does not fit in usize" ) )
184+ }
175185 }
176186 } )
177187 . collect :: < VortexResult < Vec < _ > > > ( ) ?
0 commit comments