OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "ipc/ipc_message_attachment_set.h" | 5 #include "ipc/ipc_message_attachment_set.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include "base/logging.h" | 8 #include "base/logging.h" |
9 #include "base/posix/eintr_wrapper.h" | 9 #include "base/posix/eintr_wrapper.h" |
10 #include "ipc/ipc_message_attachment.h" | 10 #include "ipc/ipc_message_attachment.h" |
(...skipping 27 matching lines...) Expand all Loading... |
38 << consumed_descriptor_highwater_ << "/" << size(); | 38 << consumed_descriptor_highwater_ << "/" << size(); |
39 } | 39 } |
40 | 40 |
41 unsigned MessageAttachmentSet::num_descriptors() const { | 41 unsigned MessageAttachmentSet::num_descriptors() const { |
42 return std::count_if(attachments_.begin(), attachments_.end(), | 42 return std::count_if(attachments_.begin(), attachments_.end(), |
43 [](scoped_refptr<MessageAttachment> i) { | 43 [](scoped_refptr<MessageAttachment> i) { |
44 return i->GetType() == MessageAttachment::TYPE_PLATFORM_FILE; | 44 return i->GetType() == MessageAttachment::TYPE_PLATFORM_FILE; |
45 }); | 45 }); |
46 } | 46 } |
47 | 47 |
| 48 unsigned MessageAttachmentSet::num_mojo_handles() const { |
| 49 return std::count_if(attachments_.begin(), attachments_.end(), |
| 50 [](scoped_refptr<MessageAttachment> i) { |
| 51 return i->GetType() == MessageAttachment::TYPE_MOJO_HANDLE; |
| 52 }); |
| 53 } |
| 54 |
48 unsigned MessageAttachmentSet::size() const { | 55 unsigned MessageAttachmentSet::size() const { |
49 return static_cast<unsigned>(attachments_.size()); | 56 return static_cast<unsigned>(attachments_.size()); |
50 } | 57 } |
51 | 58 |
52 bool MessageAttachmentSet::AddAttachment( | 59 bool MessageAttachmentSet::AddAttachment( |
53 scoped_refptr<MessageAttachment> attachment) { | 60 scoped_refptr<MessageAttachment> attachment) { |
54 #if defined(OS_POSIX) | 61 #if defined(OS_POSIX) |
55 if (attachment->GetType() != MessageAttachment::TYPE_PLATFORM_FILE || | 62 if (attachment->GetType() == MessageAttachment::TYPE_PLATFORM_FILE && |
56 num_descriptors() == kMaxDescriptorsPerMessage) { | 63 num_descriptors() == kMaxDescriptorsPerMessage) { |
57 DLOG(WARNING) << "Cannot add file descriptor. MessageAttachmentSet full."; | 64 DLOG(WARNING) << "Cannot add file descriptor. MessageAttachmentSet full."; |
58 return false; | 65 return false; |
59 } | 66 } |
60 #endif | 67 #endif |
61 | 68 |
62 attachments_.push_back(attachment); | 69 attachments_.push_back(attachment); |
63 return true; | 70 return true; |
64 } | 71 } |
65 | 72 |
(...skipping 29 matching lines...) Expand all Loading... |
95 consumed_descriptor_highwater_ = 0; | 102 consumed_descriptor_highwater_ = 0; |
96 | 103 |
97 if (index != consumed_descriptor_highwater_) | 104 if (index != consumed_descriptor_highwater_) |
98 return scoped_refptr<MessageAttachment>(); | 105 return scoped_refptr<MessageAttachment>(); |
99 | 106 |
100 consumed_descriptor_highwater_ = index + 1; | 107 consumed_descriptor_highwater_ = index + 1; |
101 | 108 |
102 return attachments_[index]; | 109 return attachments_[index]; |
103 } | 110 } |
104 | 111 |
| 112 void MessageAttachmentSet::CommitAll() { |
| 113 attachments_.clear(); |
| 114 consumed_descriptor_highwater_ = 0; |
| 115 } |
| 116 |
105 #if defined(OS_POSIX) | 117 #if defined(OS_POSIX) |
106 | 118 |
107 void MessageAttachmentSet::PeekDescriptors(base::PlatformFile* buffer) const { | 119 void MessageAttachmentSet::PeekDescriptors(base::PlatformFile* buffer) const { |
108 for (size_t i = 0; i != attachments_.size(); ++i) | 120 for (size_t i = 0; i != attachments_.size(); ++i) |
109 buffer[i] = internal::GetPlatformFile(attachments_[i]); | 121 buffer[i] = internal::GetPlatformFile(attachments_[i]); |
110 } | 122 } |
111 | 123 |
112 bool MessageAttachmentSet::ContainsDirectoryDescriptor() const { | 124 bool MessageAttachmentSet::ContainsDirectoryDescriptor() const { |
113 struct stat st; | 125 struct stat st; |
114 | 126 |
115 for (auto i = attachments_.begin(); i != attachments_.end(); ++i) { | 127 for (auto i = attachments_.begin(); i != attachments_.end(); ++i) { |
116 if (fstat(internal::GetPlatformFile(*i), &st) == 0 && S_ISDIR(st.st_mode)) | 128 if (fstat(internal::GetPlatformFile(*i), &st) == 0 && S_ISDIR(st.st_mode)) |
117 return true; | 129 return true; |
118 } | 130 } |
119 | 131 |
120 return false; | 132 return false; |
121 } | 133 } |
122 | 134 |
123 void MessageAttachmentSet::CommitAll() { | |
124 attachments_.clear(); | |
125 consumed_descriptor_highwater_ = 0; | |
126 } | |
127 | |
128 void MessageAttachmentSet::ReleaseFDsToClose( | 135 void MessageAttachmentSet::ReleaseFDsToClose( |
129 std::vector<base::PlatformFile>* fds) { | 136 std::vector<base::PlatformFile>* fds) { |
130 for (size_t i = 0; i < attachments_.size(); ++i) { | 137 for (size_t i = 0; i < attachments_.size(); ++i) { |
131 internal::PlatformFileAttachment* file = | 138 internal::PlatformFileAttachment* file = |
132 static_cast<internal::PlatformFileAttachment*>(attachments_[i].get()); | 139 static_cast<internal::PlatformFileAttachment*>(attachments_[i].get()); |
133 if (file->Owns()) | 140 if (file->Owns()) |
134 fds->push_back(file->TakePlatformFile()); | 141 fds->push_back(file->TakePlatformFile()); |
135 } | 142 } |
136 | 143 |
137 CommitAll(); | 144 CommitAll(); |
138 } | 145 } |
139 | 146 |
140 void MessageAttachmentSet::AddDescriptorsToOwn(const base::PlatformFile* buffer, | 147 void MessageAttachmentSet::AddDescriptorsToOwn(const base::PlatformFile* buffer, |
141 unsigned count) { | 148 unsigned count) { |
142 DCHECK(count <= kMaxDescriptorsPerMessage); | 149 DCHECK(count <= kMaxDescriptorsPerMessage); |
143 DCHECK_EQ(num_descriptors(), 0u); | 150 DCHECK_EQ(num_descriptors(), 0u); |
144 DCHECK_EQ(consumed_descriptor_highwater_, 0u); | 151 DCHECK_EQ(consumed_descriptor_highwater_, 0u); |
145 | 152 |
146 attachments_.reserve(count); | 153 attachments_.reserve(count); |
147 for (unsigned i = 0; i < count; ++i) | 154 for (unsigned i = 0; i < count; ++i) |
148 AddAttachment( | 155 AddAttachment( |
149 new internal::PlatformFileAttachment(base::ScopedFD(buffer[i]))); | 156 new internal::PlatformFileAttachment(base::ScopedFD(buffer[i]))); |
150 } | 157 } |
151 | 158 |
152 #endif // OS_POSIX | 159 #endif // OS_POSIX |
153 | 160 |
154 } // namespace IPC | 161 } // namespace IPC |
155 | 162 |
156 | 163 |
OLD | NEW |