OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license | 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 | 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 | 6 * tree. An additional intellectual property rights grant can be found |
7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
9 */ | 9 */ |
10 | 10 |
11 #include "webrtc/modules/desktop_capture/shared_desktop_frame.h" | 11 #include "webrtc/modules/desktop_capture/shared_desktop_frame.h" |
12 | 12 |
| 13 #include "webrtc/base/atomicops.h" |
13 #include "webrtc/base/scoped_ptr.h" | 14 #include "webrtc/base/scoped_ptr.h" |
14 #include "webrtc/system_wrappers/interface/atomic32.h" | |
15 | 15 |
16 namespace webrtc { | 16 namespace webrtc { |
17 | 17 |
18 class SharedDesktopFrame::Core { | 18 class SharedDesktopFrame::Core { |
19 public: | 19 public: |
20 Core(DesktopFrame* frame) : frame_(frame) {} | 20 Core(DesktopFrame* frame) : ref_count_(0), frame_(frame) {} |
21 | 21 |
22 DesktopFrame* frame() { return frame_.get(); } | 22 DesktopFrame* frame() { return frame_.get(); } |
23 | 23 |
24 bool HasOneRef() { return ref_count_.Value() == 1; } | 24 bool HasOneRef() { return rtc::AtomicOps::AcquireLoad(&ref_count_) == 1; } |
25 | 25 |
26 virtual int32_t AddRef() { | 26 virtual int32_t AddRef() { return rtc::AtomicOps::Increment(&ref_count_); } |
27 return ++ref_count_; | |
28 } | |
29 | 27 |
30 virtual int32_t Release() { | 28 virtual int32_t Release() { |
31 int32_t ref_count; | 29 int32_t ref_count; |
32 ref_count = --ref_count_; | 30 ref_count = rtc::AtomicOps::Decrement(&ref_count_); |
33 if (ref_count == 0) | 31 if (ref_count == 0) |
34 delete this; | 32 delete this; |
35 return ref_count; | 33 return ref_count; |
36 } | 34 } |
37 | 35 |
38 private: | 36 private: |
39 virtual ~Core() {} | 37 virtual ~Core() {} |
40 | 38 |
41 Atomic32 ref_count_; | 39 volatile int ref_count_; |
42 rtc::scoped_ptr<DesktopFrame> frame_; | 40 rtc::scoped_ptr<DesktopFrame> frame_; |
43 | 41 |
44 RTC_DISALLOW_COPY_AND_ASSIGN(Core); | 42 RTC_DISALLOW_COPY_AND_ASSIGN(Core); |
45 }; | 43 }; |
46 | 44 |
47 SharedDesktopFrame::~SharedDesktopFrame() {} | 45 SharedDesktopFrame::~SharedDesktopFrame() {} |
48 | 46 |
49 // static | 47 // static |
50 SharedDesktopFrame* SharedDesktopFrame::Wrap( | 48 SharedDesktopFrame* SharedDesktopFrame::Wrap( |
51 DesktopFrame* desktop_frame) { | 49 DesktopFrame* desktop_frame) { |
(...skipping 19 matching lines...) Expand all Loading... |
71 | 69 |
72 SharedDesktopFrame::SharedDesktopFrame(rtc::scoped_refptr<Core> core) | 70 SharedDesktopFrame::SharedDesktopFrame(rtc::scoped_refptr<Core> core) |
73 : DesktopFrame(core->frame()->size(), | 71 : DesktopFrame(core->frame()->size(), |
74 core->frame()->stride(), | 72 core->frame()->stride(), |
75 core->frame()->data(), | 73 core->frame()->data(), |
76 core->frame()->shared_memory()), | 74 core->frame()->shared_memory()), |
77 core_(core) { | 75 core_(core) { |
78 } | 76 } |
79 | 77 |
80 } // namespace webrtc | 78 } // namespace webrtc |
OLD | NEW |