@@ -5648,6 +5648,7 @@ struct async_file_read_job
5648
5648
LONG cancelled ;
5649
5649
struct list queue_entry ;
5650
5650
struct async_file_read_job * next ;
5651
+ ULONG64 queue_time_mcs ;
5651
5652
};
5652
5653
5653
5654
@@ -5668,7 +5669,9 @@ static void *async_file_read_thread(void *dummy)
5668
5669
ULONG buffer_length = 0 ;
5669
5670
void * buffer = NULL ;
5670
5671
struct list * entry ;
5672
+ struct timespec ts ;
5671
5673
NTSTATUS status ;
5674
+ ULONG64 delay ;
5672
5675
ULONG total ;
5673
5676
int result ;
5674
5677
@@ -5719,6 +5722,13 @@ static void *async_file_read_thread(void *dummy)
5719
5722
break ;
5720
5723
}
5721
5724
5725
+ clock_gettime ( CLOCK_MONOTONIC , & ts );
5726
+ delay = ts .tv_sec * (ULONG64 )1000000 + ts .tv_nsec / 1000 - job -> queue_time_mcs ;
5727
+ if (delay < 1000 )
5728
+ usleep ( 1000 - delay );
5729
+ else
5730
+ usleep ( 50 );
5731
+
5722
5732
total = result ;
5723
5733
status = (total || !job -> length ) ? STATUS_SUCCESS : STATUS_END_OF_FILE ;
5724
5734
done :
@@ -5779,6 +5789,7 @@ static NTSTATUS queue_async_file_read( HANDLE handle, int unix_handle, int needs
5779
5789
IO_STATUS_BLOCK * io , void * buffer , ULONG length , LARGE_INTEGER * offset )
5780
5790
{
5781
5791
struct async_file_read_job * job ;
5792
+ struct timespec ts ;
5782
5793
5783
5794
pthread_once ( & async_file_read_once , async_file_read_init );
5784
5795
@@ -5810,6 +5821,8 @@ static NTSTATUS queue_async_file_read( HANDLE handle, int unix_handle, int needs
5810
5821
job -> offset = * offset ;
5811
5822
job -> thread_id = GetCurrentThreadId ();
5812
5823
job -> cancelled = 0 ;
5824
+ clock_gettime ( CLOCK_MONOTONIC , & ts );
5825
+ job -> queue_time_mcs = ts .tv_sec * (ULONG64 )1000000 + ts .tv_nsec / 1000 ;
5813
5826
5814
5827
list_add_tail ( & async_file_read_queue , & job -> queue_entry );
5815
5828
0 commit comments