Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(39)

Side by Side Diff: webrtc/modules/audio_processing/swapped_nonblocking_queue.h

Issue 1398473004: Changed queue implementation to the proposed vector-based solution. (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@lock_unittest_CL
Patch Set: Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 /*
2 * Copyright (c) 2015 The WebRTC project authors. All Rights Reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
11 #ifndef WEBRTC_MODULES_AUDIO_PROCESSING_SWAPPED_NONBLOCKING_QUEUE_H_
12 #define WEBRTC_MODULES_AUDIO_PROCESSING_SWAPPED_NONBLOCKING_QUEUE_H_
13
14 #include <vector>
15
16 #include "webrtc/base/checks.h"
17 #include "webrtc/base/criticalsection.h"
18
19 namespace webrtc {
20
21 // This class is to be used as a one-way queue where data is
kwiberg-webrtc 2015/10/10 10:16:56 "is to be used as a" -> "is"
peah-webrtc 2015/10/12 13:01:06 Sorry, I don't follow that. Please elaborate furth
kwiberg-webrtc 2015/10/12 14:05:48 Just replace the left-hand side string with the ri
peah-webrtc 2015/10/13 11:56:11 Ah :-). Of course, I thought it was something more
peah-webrtc 2015/10/13 11:56:11 Done.
22 // written from one end and read from the other end.
23 // The read and write operations are protected by a common lock.
kwiberg-webrtc 2015/10/10 10:16:56 At this level, it's probably better to just say th
peah-webrtc 2015/10/12 13:01:07 Done.
hlundin-webrtc 2015/10/13 06:37:57 +1. Spare the implementation details.
peah-webrtc 2015/10/13 11:56:11 Done.
24 // The queueable objects must all implement a swap() method.
kwiberg-webrtc 2015/10/10 10:16:55 That shouldn't be necessary. As long as the usual
peah-webrtc 2015/10/12 13:01:08 I changed the comment a bit. Could you please veri
kwiberg-webrtc 2015/10/12 14:05:48 Looks good.
peah-webrtc 2015/10/13 11:56:11 Acknowledged.
25 template <typename T>
26 class SwappedNonBlockingQueue {
kwiberg-webrtc 2015/10/10 10:16:56 It's a swapping queue, not a swappable one. "Nonbl
The Sun (google.com) 2015/10/10 14:00:54 SwapQueue is a great term! Nonblocking or not.
peah-webrtc 2015/10/12 13:01:07 Totally agree! I changed it to swap_queue and skip
kwiberg-webrtc 2015/10/12 14:05:48 Acknowledged.
27 public:
28 explicit SwappedNonBlockingQueue<T>(size_t initial_size) {
kwiberg-webrtc 2015/10/10 10:16:56 No need to repeat the <T> here.
peah-webrtc 2015/10/12 13:01:08 Done.
29 queue_.resize(initial_size);
kwiberg-webrtc 2015/10/10 10:16:56 std::vector has a constructor that does this. And
peah-webrtc 2015/10/12 13:01:08 Done.
30 Reset();
kwiberg-webrtc 2015/10/10 10:16:56 This takes a lock, and just sets two members to ze
peah-webrtc 2015/10/12 13:01:07 Done.
hlundin-webrtc 2015/10/13 06:37:57 OTOH, calling Reset() here makes it more obvious t
peah-webrtc 2015/10/13 11:56:11 That was partly my initial intention as well, and
31 }
32
33 explicit SwappedNonBlockingQueue<T>(size_t initial_size, const T& initializer)
the sun 2015/10/09 12:09:54 Remove "explicit". "initial_size" -> "max_size" o
peah-webrtc 2015/10/12 13:01:08 Done.
34 : SwappedNonBlockingQueue<T>(initial_size) {
35 // Fill the queue with elements identical to initializer
36 for (typename std::vector<T>::iterator it = queue_.begin();
the sun 2015/10/09 12:09:55 for (auto it = ... ?
peah-webrtc 2015/10/12 13:01:07 Done.
37 it != queue_.end(); ++it)
the sun 2015/10/09 12:09:54 Always use braces, please.
peah-webrtc 2015/10/12 13:01:08 Done.
hlundin-webrtc 2015/10/13 06:37:57 I agree, but I know that braces here would get pus
peah-webrtc 2015/10/13 11:56:11 Acknowledged.
38 *it = initializer;
39 }
kwiberg-webrtc 2015/10/10 10:16:55 std::vector has a constructor for this too.
peah-webrtc 2015/10/12 13:01:07 I removed this one and instead added the one below
kwiberg-webrtc 2015/10/12 14:05:48 No, I count three constructors in the new patch se
peah-webrtc 2015/10/13 11:56:11 Will have a look at that
40
kwiberg-webrtc 2015/10/10 10:16:56 The constructors are the complicated part of this.
peah-webrtc 2015/10/12 13:01:07 Sounds good! I took the implementation of this one
peah-webrtc 2015/10/12 13:01:07 Done.
41 // Resets the queue to have zero content.
42 void Reset() {
the sun 2015/10/09 12:09:54 Really needed?
kwiberg-webrtc 2015/10/10 10:16:56 +1. Also, consider calling it clear() or Clear();
peah-webrtc 2015/10/12 13:01:08 I think it is needed as it provides lower cost res
43 rtc::CritScope cs(&crit_queue_);
44 last_write_index_ = 0;
45 last_read_index_ = 0;
46 }
47
48 // Inserts a chunk of data into the queue in a thread safe manner.
49 // The input is replaced by an undefined chunk of type T.
the sun 2015/10/09 12:09:54 replaced by -> swapped with
peah-webrtc 2015/10/12 13:01:08 Done.
50 // Returns false if the queue is full, and true if not.
kwiberg-webrtc 2015/10/10 10:16:55 It's not an arbitrary value; it's either one which
peah-webrtc 2015/10/12 13:01:07 Makes sense! I revised the comments of the class a
peah-webrtc 2015/10/12 13:01:07 I added some documentation. Please let me know if
kwiberg-webrtc 2015/10/12 14:05:48 Acknowledged.
hlundin-webrtc 2015/10/13 06:37:57 Clarify that false if returned if the queue is ful
peah-webrtc 2015/10/13 11:56:11 Good point! I added some more documentation regard
51 bool Insert(T* const input) {
kwiberg-webrtc 2015/10/10 10:16:56 Better drop the const here, or people will confuse
peah-webrtc 2015/10/12 13:01:07 Done.
peah-webrtc 2015/10/12 13:01:07 Done.
52 rtc::CritScope cs(&crit_queue_);
53
54 // Early return if the queue is full.
55 size_t next_write_index_ =
the sun 2015/10/09 12:09:54 No trailing underscore on local variables. Can yo
peah-webrtc 2015/10/12 13:01:07 I removed those functions because with the current
peah-webrtc 2015/10/12 13:01:07 Did this, but a bit differently. I also kept the s
56 (last_write_index_ < (queue_.size() - 1) ? last_write_index_ + 1 : 0);
57 if (next_write_index_ == last_read_index_)
58 return false;
kwiberg-webrtc 2015/10/10 10:16:56 Hmm. This means you'll keep at most size() - 1 ele
peah-webrtc 2015/10/12 13:01:08 Good point. I added the num_elements_ idea, but ke
peah-webrtc 2015/10/12 13:01:08 I added the num_elements_ as member which simplifi
59
60 last_write_index_ = next_write_index_;
61 input->swap(queue_[last_write_index_]);
kwiberg-webrtc 2015/10/10 10:16:56 See http://en.cppreference.com/w/cpp/concept/Swapp
peah-webrtc 2015/10/12 13:01:07 Thanks!!!! Does this look as what you intended?
kwiberg-webrtc 2015/10/12 14:05:48 Yes.
peah-webrtc 2015/10/13 11:56:11 Acknowledged.
62
63 return true;
64 }
65
66 // Removes a chunk of data from the queue in a thread safe manner.
67 // Returns false if the queue is empty, and true if not.
hlundin-webrtc 2015/10/13 06:37:57 Again, clarify that false is returned if the queue
peah-webrtc 2015/10/13 11:56:11 Good point! I added some more documentation regard
68 bool Remove(T* const output) {
69 rtc::CritScope cs(&crit_queue_);
70
71 // Early return for empty queue.
72 if (last_read_index_ == last_write_index_)
73 return false;
74
75 last_read_index_ =
the sun 2015/10/09 12:09:55 Use modulo instead of conditional
kwiberg-webrtc 2015/10/10 10:16:56 I'd also have used a conditional, because mod can
peah-webrtc 2015/10/12 13:01:07 Great investigation! Cool!!! I'll keep the conditi
76 (last_read_index_ < (queue_.size() - 1) ? last_read_index_ + 1 : 0);
77 output->swap(queue_[last_read_index_]);
78
79 return true;
80 }
81
82 size_t EmptyQueue() {
the sun 2015/10/09 12:09:55 1. Is this really needed in the API? should retur
kwiberg-webrtc 2015/10/10 10:16:56 +1 to what Fredrik said. The best thing would be i
peah-webrtc 2015/10/12 13:01:07 Agree, I removed the function.
peah-webrtc 2015/10/12 13:01:08 Done.
83 rtc::CritScope cs(&crit_queue_);
84 if (last_read_index_ == last_write_index_)
85 return false;
86 }
87
88 size_t FullQueue() {
the sun 2015/10/09 12:09:54 1. Is this really needed in the API? bool, const,
kwiberg-webrtc 2015/10/10 10:16:56 +1
peah-webrtc 2015/10/12 13:01:08 Agree, I removed the function.
peah-webrtc 2015/10/12 13:01:08 Done.
89 rtc::CritScope cs(&crit_queue_);
90 size_t next_write_index_ =
the sun 2015/10/09 12:09:54 Move to internal CheckIfFull() utility
peah-webrtc 2015/10/12 13:01:08 I removed that functionality, as it with the curre
91 (last_write_index_ < (queue_.size() - 1) ? last_write_index_ + 1 : 0);
92 if (next_write_index_ == last_read_index_)
93 return false;
94 }
95
96 private:
97 std::vector<T> queue_;
kwiberg-webrtc 2015/10/10 10:16:56 GUARDED_BY?
peah-webrtc 2015/10/12 13:01:08 Done.
98 size_t last_write_index_ GUARDED_BY(crit_queue_);
99 size_t last_read_index_ GUARDED_BY(crit_queue_);
100 rtc::CriticalSection crit_queue_;
the sun 2015/10/09 12:09:54 Make mutable
kwiberg-webrtc 2015/10/10 10:16:55 This class is unusable if it's const, so I don't s
The Sun (google.com) 2015/10/10 14:00:54 That's to make it possible for IsEmpty and IsFull
kwiberg-webrtc 2015/10/10 17:48:40 Yeah, OK. No caller is going to make use of that,
peah-webrtc 2015/10/12 13:01:08 Agree to both of you! I removed the IsEmpty and Is
101
102 RTC_DISALLOW_COPY_AND_ASSIGN(SwappedNonBlockingQueue);
103 };
104
105 } // namespace webrtc
106
107 #endif // WEBRTC_MODULES_AUDIO_PROCESSING_SWAPPED_NONBLOCKING_QUEUE_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698