Changeset 176452 in webkit
- Timestamp:
- Nov 21, 2014 9:40:50 AM (9 years ago)
- Location:
- trunk/Source/WebKit2
- Files:
-
- 11 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebKit2/ChangeLog
r176450 r176452 1 2014-11-21 Antti Koivisto <antti@apple.com> 2 3 Remove alignment code from IPC coders 4 https://bugs.webkit.org/show_bug.cgi?id=138963 5 6 Reviewed by Anders Carlsson. 7 8 Alignment code achieves nothing except making the messages somewhat bigger. 9 10 * Platform/IPC/ArgumentCoders.cpp: 11 (IPC::ArgumentCoder<CString>::encode): 12 (IPC::ArgumentCoder<CString>::decode): 13 (IPC::ArgumentCoder<String>::encode): 14 (IPC::decodeStringText): 15 * Platform/IPC/ArgumentCoders.h: 16 (IPC::SimpleArgumentCoder::encode): 17 (IPC::SimpleArgumentCoder::decode): 18 * Platform/IPC/ArgumentDecoder.cpp: 19 (IPC::ArgumentDecoder::initialize): 20 (IPC::ArgumentDecoder::bufferIsLargeEnoughToContain): 21 (IPC::ArgumentDecoder::decodeFixedLengthData): 22 (IPC::ArgumentDecoder::decodeVariableLengthByteArray): 23 (IPC::ArgumentDecoder::decodeNumber): 24 (IPC::ArgumentDecoder::decode): 25 (IPC::roundUpToAlignment): Deleted. 26 (IPC::alignedBufferIsLargeEnoughToContain): Deleted. 27 (IPC::ArgumentDecoder::alignBufferPosition): Deleted. 28 (IPC::decodeValueFromBuffer): Deleted. 29 * Platform/IPC/ArgumentDecoder.h: 30 (IPC::ArgumentDecoder::isInvalid): 31 (IPC::ArgumentDecoder::markInvalid): 32 (IPC::ArgumentDecoder::bufferIsLargeEnoughToContain): 33 * Platform/IPC/ArgumentEncoder.cpp: 34 (IPC::ArgumentEncoder::ArgumentEncoder): 35 (IPC::ArgumentEncoder::grow): 36 (IPC::ArgumentEncoder::encodeFixedLengthData): 37 (IPC::ArgumentEncoder::encodeVariableLengthByteArray): 38 (IPC::ArgumentEncoder::encode): 39 * Platform/IPC/ArgumentEncoder.h: 40 (IPC::ArgumentEncoder::buffer): 41 (IPC::ArgumentEncoder::mutableBuffer): 42 * Platform/IPC/DataReference.cpp: 43 (IPC::SharedBufferDataReference::encode): 44 * Platform/IPC/MessageEncoder.cpp: 45 (IPC::MessageEncoder::setIsSyncMessage): 46 (IPC::MessageEncoder::setShouldDispatchMessageWhenWaitingForSyncReply): 47 * Platform/IPC/mac/ConnectionMac.mm: 48 (IPC::Connection::sendOutgoingMessage): 49 1 50 2014-11-21 Anders Carlsson <andersca@apple.com> 2 51 -
trunk/Source/WebKit2/Platform/IPC/ArgumentCoders.cpp
r161148 r176452 58 58 uint32_t length = string.length(); 59 59 encoder << length; 60 encoder.encodeFixedLengthData(reinterpret_cast<const uint8_t*>(string.data()), length , 1);60 encoder.encodeFixedLengthData(reinterpret_cast<const uint8_t*>(string.data()), length); 61 61 } 62 62 … … 81 81 char* buffer; 82 82 CString string = CString::newUninitialized(length, buffer); 83 if (!decoder.decodeFixedLengthData(reinterpret_cast<uint8_t*>(buffer), length , 1))83 if (!decoder.decodeFixedLengthData(reinterpret_cast<uint8_t*>(buffer), length)) 84 84 return false; 85 85 … … 103 103 104 104 if (is8Bit) 105 encoder.encodeFixedLengthData(reinterpret_cast<const uint8_t*>(string.characters8()), length * sizeof(LChar) , alignof(LChar));105 encoder.encodeFixedLengthData(reinterpret_cast<const uint8_t*>(string.characters8()), length * sizeof(LChar)); 106 106 else 107 encoder.encodeFixedLengthData(reinterpret_cast<const uint8_t*>(string.characters16()), length * sizeof(UChar) , alignof(UChar));107 encoder.encodeFixedLengthData(reinterpret_cast<const uint8_t*>(string.characters16()), length * sizeof(UChar)); 108 108 } 109 109 … … 119 119 CharacterType* buffer; 120 120 String string = String::createUninitialized(length, buffer); 121 if (!decoder.decodeFixedLengthData(reinterpret_cast<uint8_t*>(buffer), length * sizeof(CharacterType) , alignof(CharacterType)))121 if (!decoder.decodeFixedLengthData(reinterpret_cast<uint8_t*>(buffer), length * sizeof(CharacterType))) 122 122 return false; 123 123 -
trunk/Source/WebKit2/Platform/IPC/ArgumentCoders.h
r176275 r176452 42 42 static void encode(ArgumentEncoder& encoder, const T& t) 43 43 { 44 encoder.encodeFixedLengthData(reinterpret_cast<const uint8_t*>(&t), sizeof(T) , alignof(T));44 encoder.encodeFixedLengthData(reinterpret_cast<const uint8_t*>(&t), sizeof(T)); 45 45 } 46 46 47 47 static bool decode(ArgumentDecoder& decoder, T& t) 48 48 { 49 return decoder.decodeFixedLengthData(reinterpret_cast<uint8_t*>(&t), sizeof(T) , alignof(T));49 return decoder.decodeFixedLengthData(reinterpret_cast<uint8_t*>(&t), sizeof(T)); 50 50 } 51 51 }; … … 179 179 { 180 180 encoder << static_cast<uint64_t>(vector.size()); 181 encoder.encodeFixedLengthData(reinterpret_cast<const uint8_t*>(vector.data()), vector.size() * sizeof(T) , alignof(T));181 encoder.encodeFixedLengthData(reinterpret_cast<const uint8_t*>(vector.data()), vector.size() * sizeof(T)); 182 182 } 183 183 … … 199 199 temp.resize(size); 200 200 201 decoder.decodeFixedLengthData(reinterpret_cast<uint8_t*>(temp.data()), size * sizeof(T) , alignof(T));201 decoder.decodeFixedLengthData(reinterpret_cast<uint8_t*>(temp.data()), size * sizeof(T)); 202 202 203 203 vector.swap(temp); -
trunk/Source/WebKit2/Platform/IPC/ArgumentDecoder.cpp
r170799 r176452 57 57 } 58 58 59 static inline uint8_t* roundUpToAlignment(uint8_t* ptr, unsigned alignment)60 {61 // Assert that the alignment is a power of 2.62 ASSERT(alignment && !(alignment & (alignment - 1)));63 64 uintptr_t alignmentMask = alignment - 1;65 return reinterpret_cast<uint8_t*>((reinterpret_cast<uintptr_t>(ptr) + alignmentMask) & ~alignmentMask);66 }67 68 59 void ArgumentDecoder::initialize(const uint8_t* buffer, size_t bufferSize) 69 60 { … … 72 63 ASSERT(!(reinterpret_cast<uintptr_t>(m_buffer) % alignof(uint64_t))); 73 64 74 m_bufferPos = m_buffer;65 m_bufferPosition = m_buffer; 75 66 m_bufferEnd = m_buffer + bufferSize; 76 67 memcpy(m_buffer, buffer, bufferSize); 77 68 } 78 69 79 static inline bool alignedBufferIsLargeEnoughToContain(const uint8_t* alignedPosition, const uint8_t* bufferEnd, size_t size) 70 bool ArgumentDecoder::bufferIsLargeEnoughToContain(size_t size) const 80 71 { 81 return bufferEnd >= alignedPosition && static_cast<size_t>(bufferEnd - alignedPosition) >= size;72 return m_buffer + size <= m_bufferEnd; 82 73 } 83 74 84 bool ArgumentDecoder:: alignBufferPosition(unsigned alignment, size_t size)75 bool ArgumentDecoder::decodeFixedLengthData(uint8_t* data, size_t size) 85 76 { 86 uint8_t* alignedPosition = roundUpToAlignment(m_bufferPos, alignment); 87 if (!alignedBufferIsLargeEnoughToContain(alignedPosition, m_bufferEnd, size)) { 88 // We've walked off the end of this buffer. 89 markInvalid(); 90 return false; 91 } 92 93 m_bufferPos = alignedPosition; 94 return true; 95 } 96 97 bool ArgumentDecoder::bufferIsLargeEnoughToContain(unsigned alignment, size_t size) const 98 { 99 return alignedBufferIsLargeEnoughToContain(roundUpToAlignment(m_bufferPos, alignment), m_bufferEnd, size); 100 } 101 102 bool ArgumentDecoder::decodeFixedLengthData(uint8_t* data, size_t size, unsigned alignment) 103 { 104 if (!alignBufferPosition(alignment, size)) 77 if (!bufferIsLargeEnoughToContain(size)) 105 78 return false; 106 79 107 memcpy(data, m_bufferPos , size);108 m_bufferPos += size;80 memcpy(data, m_bufferPosition, size); 81 m_bufferPosition += size; 109 82 110 83 return true; … … 117 90 return false; 118 91 119 if (! alignBufferPosition(1,size))92 if (!bufferIsLargeEnoughToContain(size)) 120 93 return false; 121 94 122 uint8_t* data = m_bufferPos ;123 m_bufferPos += size;95 uint8_t* data = m_bufferPosition; 96 m_bufferPosition += size; 124 97 125 98 dataReference = DataReference(data, size); … … 128 101 129 102 template<typename Type> 130 static void decodeValueFromBuffer(Type& value, uint8_t*& bufferPosition)103 bool ArgumentDecoder::decodeNumber(Type& value) 131 104 { 132 memcpy(&value, bufferPosition, sizeof(value)); 133 bufferPosition += sizeof(Type); 105 if (!bufferIsLargeEnoughToContain(sizeof(Type))) 106 return false; 107 108 memcpy(&value, m_bufferPosition, sizeof(Type)); 109 m_bufferPosition += sizeof(Type); 110 111 return true; 134 112 } 135 113 136 114 bool ArgumentDecoder::decode(bool& result) 137 115 { 138 if (!alignBufferPosition(sizeof(result), sizeof(result))) 139 return false; 140 141 decodeValueFromBuffer(result, m_bufferPos); 142 return true; 116 return decodeNumber(result); 143 117 } 144 118 145 119 bool ArgumentDecoder::decode(uint8_t& result) 146 120 { 147 if (!alignBufferPosition(sizeof(result), sizeof(result))) 148 return false; 149 150 decodeValueFromBuffer(result, m_bufferPos); 151 return true; 121 return decodeNumber(result); 152 122 } 153 123 154 124 bool ArgumentDecoder::decode(uint16_t& result) 155 125 { 156 if (!alignBufferPosition(sizeof(result), sizeof(result))) 157 return false; 158 159 decodeValueFromBuffer(result, m_bufferPos); 160 return true; 126 return decodeNumber(result); 161 127 } 162 128 163 129 bool ArgumentDecoder::decode(uint32_t& result) 164 130 { 165 if (!alignBufferPosition(sizeof(result), sizeof(result))) 166 return false; 167 168 decodeValueFromBuffer(result, m_bufferPos); 169 return true; 131 return decodeNumber(result); 170 132 } 171 133 172 134 bool ArgumentDecoder::decode(uint64_t& result) 173 135 { 174 if (!alignBufferPosition(sizeof(result), sizeof(result))) 175 return false; 176 177 decodeValueFromBuffer(result, m_bufferPos); 178 return true; 136 return decodeNumber(result); 179 137 } 180 138 181 139 bool ArgumentDecoder::decode(int32_t& result) 182 140 { 183 if (!alignBufferPosition(sizeof(result), sizeof(result))) 184 return false; 185 186 decodeValueFromBuffer(result, m_bufferPos); 187 return true; 141 return decodeNumber(result); 188 142 } 189 143 190 144 bool ArgumentDecoder::decode(int64_t& result) 191 145 { 192 if (!alignBufferPosition(sizeof(result), sizeof(result))) 193 return false; 194 195 decodeValueFromBuffer(result, m_bufferPos); 196 return true; 146 return decodeNumber(result); 197 147 } 198 148 199 149 bool ArgumentDecoder::decode(float& result) 200 150 { 201 if (!alignBufferPosition(sizeof(result), sizeof(result))) 202 return false; 203 204 decodeValueFromBuffer(result, m_bufferPos); 205 return true; 151 return decodeNumber(result); 206 152 } 207 153 208 154 bool ArgumentDecoder::decode(double& result) 209 155 { 210 if (!alignBufferPosition(sizeof(result), sizeof(result))) 211 return false; 212 213 decodeValueFromBuffer(result, m_bufferPos); 214 return true; 156 return decodeNumber(result); 215 157 } 216 158 -
trunk/Source/WebKit2/Platform/IPC/ArgumentDecoder.h
r170799 r176452 43 43 size_t length() const { return m_bufferEnd - m_buffer; } 44 44 45 bool isInvalid() const { return m_bufferPos > m_bufferEnd; }46 void markInvalid() { m_bufferPos = m_bufferEnd + 1; }45 bool isInvalid() const { return m_bufferPosition > m_bufferEnd; } 46 void markInvalid() { m_bufferPosition = m_bufferEnd + 1; } 47 47 48 bool decodeFixedLengthData(uint8_t*, size_t , unsigned alignment);48 bool decodeFixedLengthData(uint8_t*, size_t); 49 49 50 50 // The data in the data reference here will only be valid for the lifetime of the ArgumentDecoder object. … … 81 81 return false; 82 82 83 return bufferIsLargeEnoughToContain( alignof(T),numElements * sizeof(T));83 return bufferIsLargeEnoughToContain(numElements * sizeof(T)); 84 84 } 85 85 … … 97 97 void initialize(const uint8_t* buffer, size_t bufferSize); 98 98 99 bool alignBufferPosition(unsigned alignment, size_t size);100 bool bufferIsLargeEnoughToContain(unsigned alignment, size_t size) const;99 bool bufferIsLargeEnoughToContain(size_t) const; 100 template <typename Type> bool decodeNumber(Type& value); 101 101 102 102 private: 103 103 uint8_t* m_buffer; 104 uint8_t* m_bufferPos ;104 uint8_t* m_bufferPosition; 105 105 uint8_t* m_bufferEnd; 106 106 -
trunk/Source/WebKit2/Platform/IPC/ArgumentEncoder.cpp
r170799 r176452 58 58 ArgumentEncoder::ArgumentEncoder() 59 59 : m_buffer(m_inlineBuffer) 60 , m_bufferPointer(m_inlineBuffer)61 60 , m_bufferSize(0) 62 61 , m_bufferCapacity(sizeof(m_inlineBuffer)) … … 104 103 } 105 104 106 uint8_t* ArgumentEncoder::grow( unsigned alignment,size_t size)105 uint8_t* ArgumentEncoder::grow(size_t size) 107 106 { 108 size_t alignedSize = roundUpToAlignment(m_bufferSize, alignment);109 reserve( alignedSize + size);107 size_t position = m_bufferSize; 108 reserve(m_bufferSize + size); 110 109 111 m_bufferSize = alignedSize + size; 112 m_bufferPointer = m_buffer + alignedSize + size; 113 114 return m_buffer + alignedSize; 110 m_bufferSize += size; 111 112 return m_buffer + position; 115 113 } 116 114 117 void ArgumentEncoder::encodeFixedLengthData(const uint8_t* data, size_t size , unsigned alignment)115 void ArgumentEncoder::encodeFixedLengthData(const uint8_t* data, size_t size) 118 116 { 119 ASSERT(!(reinterpret_cast<uintptr_t>(data) % alignment)); 120 121 uint8_t* buffer = grow(alignment, size); 117 uint8_t* buffer = grow(size); 122 118 memcpy(buffer, data, size); 123 119 } … … 126 122 { 127 123 encode(static_cast<uint64_t>(dataReference.size())); 128 encodeFixedLengthData(dataReference.data(), dataReference.size() , 1);124 encodeFixedLengthData(dataReference.data(), dataReference.size()); 129 125 } 130 126 131 127 template<typename Type> 132 static void copyValueToBuffer(Type value, uint8_t* bufferPosition)128 void ArgumentEncoder::encodeNumber(Type value) 133 129 { 130 uint8_t* bufferPosition = grow(sizeof(Type)); 134 131 memcpy(bufferPosition, &value, sizeof(Type)); 135 132 } 136 133 137 void ArgumentEncoder::encode(bool n)134 void ArgumentEncoder::encode(bool value) 138 135 { 139 uint8_t* buffer = grow(sizeof(n), sizeof(n)); 140 copyValueToBuffer(n, buffer); 136 encodeNumber(value); 141 137 } 142 138 143 void ArgumentEncoder::encode(uint8_t n)139 void ArgumentEncoder::encode(uint8_t value) 144 140 { 145 uint8_t* buffer = grow(sizeof(n), sizeof(n)); 146 copyValueToBuffer(n, buffer); 141 encodeNumber(value); 147 142 } 148 143 149 void ArgumentEncoder::encode(uint16_t n)144 void ArgumentEncoder::encode(uint16_t value) 150 145 { 151 uint8_t* buffer = grow(sizeof(n), sizeof(n)); 152 copyValueToBuffer(n, buffer); 146 encodeNumber(value); 153 147 } 154 148 155 void ArgumentEncoder::encode(uint32_t n)149 void ArgumentEncoder::encode(uint32_t value) 156 150 { 157 uint8_t* buffer = grow(sizeof(n), sizeof(n)); 158 copyValueToBuffer(n, buffer); 151 encodeNumber(value); 159 152 } 160 153 161 void ArgumentEncoder::encode(uint64_t n)154 void ArgumentEncoder::encode(uint64_t value) 162 155 { 163 uint8_t* buffer = grow(sizeof(n), sizeof(n)); 164 copyValueToBuffer(n, buffer); 156 encodeNumber(value); 165 157 } 166 158 167 void ArgumentEncoder::encode(int32_t n)159 void ArgumentEncoder::encode(int32_t value) 168 160 { 169 uint8_t* buffer = grow(sizeof(n), sizeof(n)); 170 copyValueToBuffer(n, buffer); 161 encodeNumber(value); 171 162 } 172 163 173 void ArgumentEncoder::encode(int64_t n)164 void ArgumentEncoder::encode(int64_t value) 174 165 { 175 uint8_t* buffer = grow(sizeof(n), sizeof(n)); 176 copyValueToBuffer(n, buffer); 166 encodeNumber(value); 177 167 } 178 168 179 void ArgumentEncoder::encode(float n)169 void ArgumentEncoder::encode(float value) 180 170 { 181 uint8_t* buffer = grow(sizeof(n), sizeof(n)); 182 copyValueToBuffer(n, buffer); 171 encodeNumber(value); 183 172 } 184 173 185 void ArgumentEncoder::encode(double n)174 void ArgumentEncoder::encode(double value) 186 175 { 187 uint8_t* buffer = grow(sizeof(n), sizeof(n)); 188 copyValueToBuffer(n, buffer); 176 encodeNumber(value); 189 177 } 190 178 -
trunk/Source/WebKit2/Platform/IPC/ArgumentEncoder.h
r170799 r176452 42 42 virtual ~ArgumentEncoder(); 43 43 44 void encodeFixedLengthData(const uint8_t*, size_t , unsigned alignment);44 void encodeFixedLengthData(const uint8_t*, size_t); 45 45 void encodeVariableLengthByteArray(const DataReference&); 46 46 … … 63 63 } 64 64 65 uint8_t* buffer() const { return m_buffer; }65 const uint8_t* buffer() const { return m_buffer; } 66 66 size_t bufferSize() const { return m_bufferSize; } 67 67 … … 69 69 Vector<Attachment> releaseAttachments(); 70 70 void reserve(size_t); 71 72 protected: 73 uint8_t* mutableBuffer() { return m_buffer; } 71 74 72 75 private: … … 80 83 void encode(float); 81 84 void encode(double); 85 template<typename Type> void encodeNumber(Type); 82 86 83 uint8_t* grow( unsigned alignment, size_t size);87 uint8_t* grow(size_t); 84 88 85 89 uint8_t m_inlineBuffer[512]; 90 uint8_t* m_buffer; 86 91 87 uint8_t* m_buffer;88 uint8_t* m_bufferPointer;89 90 92 size_t m_bufferSize; 91 93 size_t m_bufferCapacity; -
trunk/Source/WebKit2/Platform/IPC/DataReference.cpp
r170154 r176452 52 52 while (position < bufferSize) { 53 53 unsigned bytesToWrite = m_buffer->getSomeData(partialData, position); 54 encoder.encodeFixedLengthData(reinterpret_cast<const uint8_t*>(partialData), bytesToWrite , 1);54 encoder.encodeFixedLengthData(reinterpret_cast<const uint8_t*>(partialData), bytesToWrite); 55 55 position += bytesToWrite; 56 56 } -
trunk/Source/WebKit2/Platform/IPC/MessageEncoder.cpp
r161148 r176452 52 52 { 53 53 if (isSyncMessage) 54 * buffer() |= SyncMessage;54 *mutableBuffer() |= SyncMessage; 55 55 else 56 * buffer() &= ~SyncMessage;56 *mutableBuffer() &= ~SyncMessage; 57 57 } 58 58 … … 60 60 { 61 61 if (shouldDispatchMessageWhenWaitingForSyncReply) 62 * buffer() |= DispatchMessageWhenWaitingForSyncReply;62 *mutableBuffer() |= DispatchMessageWhenWaitingForSyncReply; 63 63 else 64 * buffer() &= ~DispatchMessageWhenWaitingForSyncReply;64 *mutableBuffer() &= ~DispatchMessageWhenWaitingForSyncReply; 65 65 } 66 66 -
trunk/Source/WebKit2/Platform/IPC/mac/ConnectionMac.mm
r176036 r176452 328 328 mach_msg_descriptor_t* descriptor = reinterpret_cast<mach_msg_descriptor_t*>(descriptorData); 329 329 330 descriptor->out_of_line.address = encoder->buffer();330 descriptor->out_of_line.address = const_cast<uint8_t*>(encoder->buffer()); 331 331 descriptor->out_of_line.size = encoder->bufferSize(); 332 332 descriptor->out_of_line.copy = MACH_MSG_VIRTUAL_COPY; -
trunk/Source/WebKit2/Platform/IPC/unix/ConnectionUnix.cpp
r176036 r176452 515 515 516 516 if (!messageInfo.isMessageBodyIsOutOfLine() && encoder->bufferSize()) { 517 iov[iovLength].iov_base = reinterpret_cast<void*>( encoder->buffer());517 iov[iovLength].iov_base = reinterpret_cast<void*>(const_cast<uint8_t*>(encoder->buffer())); 518 518 iov[iovLength].iov_len = encoder->bufferSize(); 519 519 ++iovLength;
Note: See TracChangeset
for help on using the changeset viewer.