Explorar o código

Merge pull request #88005 from jsjtxietian/audio-data-race

Fix data race regarding `prof_time` in `AudioDriver` and `AudioServer`
Rémi Verschelde hai 1 ano
pai
achega
9346094fb8
Modificáronse 2 ficheiros con 10 adicións e 10 borrados
  1. 3 3
      servers/audio_server.cpp
  2. 7 7
      servers/audio_server.h

+ 3 - 3
servers/audio_server.cpp

@@ -316,7 +316,7 @@ void AudioServer::_driver_process(int p_frames, int32_t *p_buffer) {
 	}
 
 #ifdef DEBUG_ENABLED
-	prof_time += OS::get_singleton()->get_ticks_usec() - prof_ticks;
+	prof_time.add(OS::get_singleton()->get_ticks_usec() - prof_ticks);
 #endif
 }
 
@@ -1400,7 +1400,7 @@ void AudioServer::update() {
 		// Driver time includes server time + effects times
 		// Server time includes effects times
 		uint64_t driver_time = AudioDriver::get_singleton()->get_profiling_time();
-		uint64_t server_time = prof_time;
+		uint64_t server_time = prof_time.get();
 
 		// Subtract the server time from the driver time
 		if (driver_time > server_time) {
@@ -1459,7 +1459,7 @@ void AudioServer::update() {
 	}
 
 	AudioDriver::get_singleton()->reset_profiling_time();
-	prof_time = 0;
+	prof_time.set(0);
 #endif
 
 	for (CallbackItem *ci : update_callback_list) {

+ 7 - 7
servers/audio_server.h

@@ -52,8 +52,8 @@ class AudioDriver {
 	uint64_t _last_mix_frames = 0;
 
 #ifdef DEBUG_ENABLED
-	uint64_t prof_ticks = 0;
-	uint64_t prof_time = 0;
+	SafeNumeric<uint64_t> prof_ticks;
+	SafeNumeric<uint64_t> prof_time;
 #endif
 
 protected:
@@ -69,8 +69,8 @@ protected:
 	int _get_configured_mix_rate();
 
 #ifdef DEBUG_ENABLED
-	_FORCE_INLINE_ void start_counting_ticks() { prof_ticks = OS::get_singleton()->get_ticks_usec(); }
-	_FORCE_INLINE_ void stop_counting_ticks() { prof_time += OS::get_singleton()->get_ticks_usec() - prof_ticks; }
+	_FORCE_INLINE_ void start_counting_ticks() { prof_ticks.set(OS::get_singleton()->get_ticks_usec()); }
+	_FORCE_INLINE_ void stop_counting_ticks() { prof_time.add(OS::get_singleton()->get_ticks_usec() - prof_ticks.get()); }
 #else
 	_FORCE_INLINE_ void start_counting_ticks() {}
 	_FORCE_INLINE_ void stop_counting_ticks() {}
@@ -125,8 +125,8 @@ public:
 	unsigned int get_input_size() { return input_size; }
 
 #ifdef DEBUG_ENABLED
-	uint64_t get_profiling_time() const { return prof_time; }
-	void reset_profiling_time() { prof_time = 0; }
+	uint64_t get_profiling_time() const { return prof_time.get(); }
+	void reset_profiling_time() { prof_time.set(0); }
 #endif
 
 	AudioDriver() {}
@@ -183,7 +183,7 @@ private:
 	uint64_t mix_count = 0;
 	uint64_t mix_frames = 0;
 #ifdef DEBUG_ENABLED
-	uint64_t prof_time = 0;
+	SafeNumeric<uint64_t> prof_time;
 #endif
 
 	float channel_disable_threshold_db = 0.0f;