| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 <stdint.h> | 5 #include <stdint.h> |
| 6 #include <stdio.h> | 6 #include <stdio.h> |
| 7 #include <string.h> | 7 #include <string.h> |
| 8 | 8 |
| 9 #include <memory> | 9 #include <memory> |
| 10 #include <utility> | 10 #include <utility> |
| (...skipping 178 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 189 RefPtr<ChannelEndpoint> ep1; | 189 RefPtr<ChannelEndpoint> ep1; |
| 190 auto mp1 = MessagePipe::CreateProxyLocal(&ep1); | 190 auto mp1 = MessagePipe::CreateProxyLocal(&ep1); |
| 191 BootstrapChannelEndpoints(std::move(ep0), std::move(ep1)); | 191 BootstrapChannelEndpoints(std::move(ep0), std::move(ep1)); |
| 192 | 192 |
| 193 // Write in one direction: MP 0, port 0 -> ... -> MP 1, port 1. | 193 // Write in one direction: MP 0, port 0 -> ... -> MP 1, port 1. |
| 194 | 194 |
| 195 // Prepare to wait on MP 1, port 1. (Add the waiter now. Otherwise, if we do | 195 // Prepare to wait on MP 1, port 1. (Add the waiter now. Otherwise, if we do |
| 196 // it later, it might already be readable.) | 196 // it later, it might already be readable.) |
| 197 waiter.Init(); | 197 waiter.Init(); |
| 198 ASSERT_EQ(MOJO_RESULT_OK, | 198 ASSERT_EQ(MOJO_RESULT_OK, |
| 199 mp1->AddAwakable(1, &waiter, MOJO_HANDLE_SIGNAL_READABLE, false, | 199 mp1->AddAwakable(1, &waiter, 123, false, |
| 200 123, nullptr)); | 200 MOJO_HANDLE_SIGNAL_READABLE, nullptr)); |
| 201 | 201 |
| 202 // Write to MP 0, port 0. | 202 // Write to MP 0, port 0. |
| 203 EXPECT_EQ( | 203 EXPECT_EQ( |
| 204 MOJO_RESULT_OK, | 204 MOJO_RESULT_OK, |
| 205 mp0->WriteMessage(0, UserPointer<const void>(kHello), sizeof(kHello), | 205 mp0->WriteMessage(0, UserPointer<const void>(kHello), sizeof(kHello), |
| 206 nullptr, MOJO_WRITE_MESSAGE_FLAG_NONE)); | 206 nullptr, MOJO_WRITE_MESSAGE_FLAG_NONE)); |
| 207 | 207 |
| 208 // Wait. | 208 // Wait. |
| 209 EXPECT_EQ(MOJO_RESULT_OK, | 209 EXPECT_EQ(MOJO_RESULT_OK, |
| 210 waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context, nullptr)); | 210 waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context, nullptr)); |
| 211 EXPECT_EQ(123u, context); | 211 EXPECT_EQ(123u, context); |
| 212 hss = HandleSignalsState(); | 212 hss = HandleSignalsState(); |
| 213 mp1->RemoveAwakable(1, &waiter, &hss); | 213 mp1->RemoveAwakable(1, false, &waiter, 0, &hss); |
| 214 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, | 214 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, |
| 215 hss.satisfied_signals); | 215 hss.satisfied_signals); |
| 216 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE | | 216 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE | |
| 217 MOJO_HANDLE_SIGNAL_PEER_CLOSED, | 217 MOJO_HANDLE_SIGNAL_PEER_CLOSED, |
| 218 hss.satisfiable_signals); | 218 hss.satisfiable_signals); |
| 219 | 219 |
| 220 // Read from MP 1, port 1. | 220 // Read from MP 1, port 1. |
| 221 EXPECT_EQ(MOJO_RESULT_OK, | 221 EXPECT_EQ(MOJO_RESULT_OK, |
| 222 mp1->ReadMessage(1, UserPointer<void>(buffer), | 222 mp1->ReadMessage(1, UserPointer<void>(buffer), |
| 223 MakeUserPointer(&buffer_size), nullptr, nullptr, | 223 MakeUserPointer(&buffer_size), nullptr, nullptr, |
| 224 MOJO_READ_MESSAGE_FLAG_NONE)); | 224 MOJO_READ_MESSAGE_FLAG_NONE)); |
| 225 EXPECT_EQ(sizeof(kHello), static_cast<size_t>(buffer_size)); | 225 EXPECT_EQ(sizeof(kHello), static_cast<size_t>(buffer_size)); |
| 226 EXPECT_STREQ(kHello, buffer); | 226 EXPECT_STREQ(kHello, buffer); |
| 227 | 227 |
| 228 // Write in the other direction: MP 1, port 1 -> ... -> MP 0, port 0. | 228 // Write in the other direction: MP 1, port 1 -> ... -> MP 0, port 0. |
| 229 | 229 |
| 230 waiter.Init(); | 230 waiter.Init(); |
| 231 ASSERT_EQ(MOJO_RESULT_OK, | 231 ASSERT_EQ(MOJO_RESULT_OK, |
| 232 mp0->AddAwakable(0, &waiter, MOJO_HANDLE_SIGNAL_READABLE, false, | 232 mp0->AddAwakable(0, &waiter, 456, false, |
| 233 456, nullptr)); | 233 MOJO_HANDLE_SIGNAL_READABLE, nullptr)); |
| 234 | 234 |
| 235 EXPECT_EQ( | 235 EXPECT_EQ( |
| 236 MOJO_RESULT_OK, | 236 MOJO_RESULT_OK, |
| 237 mp1->WriteMessage(1, UserPointer<const void>(kWorld), sizeof(kWorld), | 237 mp1->WriteMessage(1, UserPointer<const void>(kWorld), sizeof(kWorld), |
| 238 nullptr, MOJO_WRITE_MESSAGE_FLAG_NONE)); | 238 nullptr, MOJO_WRITE_MESSAGE_FLAG_NONE)); |
| 239 | 239 |
| 240 EXPECT_EQ(MOJO_RESULT_OK, | 240 EXPECT_EQ(MOJO_RESULT_OK, |
| 241 waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context, nullptr)); | 241 waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context, nullptr)); |
| 242 EXPECT_EQ(456u, context); | 242 EXPECT_EQ(456u, context); |
| 243 hss = HandleSignalsState(); | 243 hss = HandleSignalsState(); |
| 244 mp0->RemoveAwakable(0, &waiter, &hss); | 244 mp0->RemoveAwakable(0, false, &waiter, 0, &hss); |
| 245 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, | 245 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, |
| 246 hss.satisfied_signals); | 246 hss.satisfied_signals); |
| 247 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE | | 247 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE | |
| 248 MOJO_HANDLE_SIGNAL_PEER_CLOSED, | 248 MOJO_HANDLE_SIGNAL_PEER_CLOSED, |
| 249 hss.satisfiable_signals); | 249 hss.satisfiable_signals); |
| 250 | 250 |
| 251 buffer_size = static_cast<uint32_t>(sizeof(buffer)); | 251 buffer_size = static_cast<uint32_t>(sizeof(buffer)); |
| 252 EXPECT_EQ(MOJO_RESULT_OK, | 252 EXPECT_EQ(MOJO_RESULT_OK, |
| 253 mp0->ReadMessage(0, UserPointer<void>(buffer), | 253 mp0->ReadMessage(0, UserPointer<void>(buffer), |
| 254 MakeUserPointer(&buffer_size), nullptr, nullptr, | 254 MakeUserPointer(&buffer_size), nullptr, nullptr, |
| 255 MOJO_READ_MESSAGE_FLAG_NONE)); | 255 MOJO_READ_MESSAGE_FLAG_NONE)); |
| 256 EXPECT_EQ(sizeof(kWorld), static_cast<size_t>(buffer_size)); | 256 EXPECT_EQ(sizeof(kWorld), static_cast<size_t>(buffer_size)); |
| 257 EXPECT_STREQ(kWorld, buffer); | 257 EXPECT_STREQ(kWorld, buffer); |
| 258 | 258 |
| 259 // Close MP 0, port 0. | 259 // Close MP 0, port 0. |
| 260 mp0->Close(0); | 260 mp0->Close(0); |
| 261 | 261 |
| 262 // Try to wait for MP 1, port 1 to become readable. This will eventually fail | 262 // Try to wait for MP 1, port 1 to become readable. This will eventually fail |
| 263 // when it realizes that MP 0, port 0 has been closed. (It may also fail | 263 // when it realizes that MP 0, port 0 has been closed. (It may also fail |
| 264 // immediately.) | 264 // immediately.) |
| 265 waiter.Init(); | 265 waiter.Init(); |
| 266 hss = HandleSignalsState(); | 266 hss = HandleSignalsState(); |
| 267 MojoResult result = mp1->AddAwakable(1, &waiter, MOJO_HANDLE_SIGNAL_READABLE, | 267 MojoResult result = mp1->AddAwakable(1, &waiter, 789, false, |
| 268 false, 789, &hss); | 268 MOJO_HANDLE_SIGNAL_READABLE, &hss); |
| 269 if (result == MOJO_RESULT_OK) { | 269 if (result == MOJO_RESULT_OK) { |
| 270 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, | 270 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
| 271 waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context, nullptr)); | 271 waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context, nullptr)); |
| 272 EXPECT_EQ(789u, context); | 272 EXPECT_EQ(789u, context); |
| 273 hss = HandleSignalsState(); | 273 hss = HandleSignalsState(); |
| 274 mp1->RemoveAwakable(1, &waiter, &hss); | 274 mp1->RemoveAwakable(1, false, &waiter, 0, &hss); |
| 275 } | 275 } |
| 276 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfied_signals); | 276 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfied_signals); |
| 277 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfiable_signals); | 277 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfiable_signals); |
| 278 | 278 |
| 279 // And MP 1, port 1. | 279 // And MP 1, port 1. |
| 280 mp1->Close(1); | 280 mp1->Close(1); |
| 281 } | 281 } |
| 282 | 282 |
| 283 TEST_F(RemoteMessagePipeTest, PeerClosed) { | 283 TEST_F(RemoteMessagePipeTest, PeerClosed) { |
| 284 Waiter waiter; | 284 Waiter waiter; |
| 285 HandleSignalsState hss; | 285 HandleSignalsState hss; |
| 286 uint64_t context = 0; | 286 uint64_t context = 0; |
| 287 | 287 |
| 288 // Connect message pipes. MP 0, port 1 will be attached to channel 0 and | 288 // Connect message pipes. MP 0, port 1 will be attached to channel 0 and |
| 289 // connected to MP 1, port 0, which will be attached to channel 1. This leaves | 289 // connected to MP 1, port 0, which will be attached to channel 1. This leaves |
| 290 // MP 0, port 0 and MP 1, port 1 as the "user-facing" endpoints. | 290 // MP 0, port 0 and MP 1, port 1 as the "user-facing" endpoints. |
| 291 | 291 |
| 292 RefPtr<ChannelEndpoint> ep0; | 292 RefPtr<ChannelEndpoint> ep0; |
| 293 auto mp0 = MessagePipe::CreateLocalProxy(&ep0); | 293 auto mp0 = MessagePipe::CreateLocalProxy(&ep0); |
| 294 RefPtr<ChannelEndpoint> ep1; | 294 RefPtr<ChannelEndpoint> ep1; |
| 295 auto mp1 = MessagePipe::CreateProxyLocal(&ep1); | 295 auto mp1 = MessagePipe::CreateProxyLocal(&ep1); |
| 296 BootstrapChannelEndpoints(std::move(ep0), std::move(ep1)); | 296 BootstrapChannelEndpoints(std::move(ep0), std::move(ep1)); |
| 297 | 297 |
| 298 // Close MP 0, port 0. | 298 // Close MP 0, port 0. |
| 299 mp0->Close(0); | 299 mp0->Close(0); |
| 300 | 300 |
| 301 // Try to wait for MP 1, port 1 to be signaled with peer closed. | 301 // Try to wait for MP 1, port 1 to be signaled with peer closed. |
| 302 waiter.Init(); | 302 waiter.Init(); |
| 303 hss = HandleSignalsState(); | 303 hss = HandleSignalsState(); |
| 304 MojoResult result = mp1->AddAwakable( | 304 MojoResult result = mp1->AddAwakable(1, &waiter, 101, false, |
| 305 1, &waiter, MOJO_HANDLE_SIGNAL_PEER_CLOSED, false, 101, &hss); | 305 MOJO_HANDLE_SIGNAL_PEER_CLOSED, &hss); |
| 306 if (result == MOJO_RESULT_OK) { | 306 if (result == MOJO_RESULT_OK) { |
| 307 EXPECT_EQ(MOJO_RESULT_OK, | 307 EXPECT_EQ(MOJO_RESULT_OK, |
| 308 waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context, nullptr)); | 308 waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context, nullptr)); |
| 309 EXPECT_EQ(101u, context); | 309 EXPECT_EQ(101u, context); |
| 310 hss = HandleSignalsState(); | 310 hss = HandleSignalsState(); |
| 311 mp1->RemoveAwakable(1, &waiter, &hss); | 311 mp1->RemoveAwakable(1, false, &waiter, 0, &hss); |
| 312 } | 312 } |
| 313 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfied_signals); | 313 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfied_signals); |
| 314 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfiable_signals); | 314 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfiable_signals); |
| 315 | 315 |
| 316 // And MP 1, port 1. | 316 // And MP 1, port 1. |
| 317 mp1->Close(1); | 317 mp1->Close(1); |
| 318 } | 318 } |
| 319 | 319 |
| 320 TEST_F(RemoteMessagePipeTest, Multiplex) { | 320 TEST_F(RemoteMessagePipeTest, Multiplex) { |
| 321 static const char kHello[] = "hello"; | 321 static const char kHello[] = "hello"; |
| (...skipping 28 matching lines...) Expand all Loading... |
| 350 EXPECT_GT(max_endpoint_info_size, 0u); | 350 EXPECT_GT(max_endpoint_info_size, 0u); |
| 351 ASSERT_EQ(0u, max_platform_handle_count); | 351 ASSERT_EQ(0u, max_platform_handle_count); |
| 352 std::unique_ptr<char[]> endpoint_info(new char[max_endpoint_info_size]); | 352 std::unique_ptr<char[]> endpoint_info(new char[max_endpoint_info_size]); |
| 353 size_t endpoint_info_size; | 353 size_t endpoint_info_size; |
| 354 mp2->EndSerialize(1, channels(0), endpoint_info.get(), &endpoint_info_size, | 354 mp2->EndSerialize(1, channels(0), endpoint_info.get(), &endpoint_info_size, |
| 355 nullptr); | 355 nullptr); |
| 356 EXPECT_EQ(max_endpoint_info_size, endpoint_info_size); | 356 EXPECT_EQ(max_endpoint_info_size, endpoint_info_size); |
| 357 | 357 |
| 358 waiter.Init(); | 358 waiter.Init(); |
| 359 ASSERT_EQ(MOJO_RESULT_OK, | 359 ASSERT_EQ(MOJO_RESULT_OK, |
| 360 mp1->AddAwakable(1, &waiter, MOJO_HANDLE_SIGNAL_READABLE, false, | 360 mp1->AddAwakable(1, &waiter, 123, false, |
| 361 123, nullptr)); | 361 MOJO_HANDLE_SIGNAL_READABLE, nullptr)); |
| 362 | 362 |
| 363 EXPECT_EQ(MOJO_RESULT_OK, | 363 EXPECT_EQ(MOJO_RESULT_OK, |
| 364 mp0->WriteMessage(0, UserPointer<const void>(endpoint_info.get()), | 364 mp0->WriteMessage(0, UserPointer<const void>(endpoint_info.get()), |
| 365 static_cast<uint32_t>(endpoint_info_size), | 365 static_cast<uint32_t>(endpoint_info_size), |
| 366 nullptr, MOJO_WRITE_MESSAGE_FLAG_NONE)); | 366 nullptr, MOJO_WRITE_MESSAGE_FLAG_NONE)); |
| 367 | 367 |
| 368 EXPECT_EQ(MOJO_RESULT_OK, | 368 EXPECT_EQ(MOJO_RESULT_OK, |
| 369 waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context, nullptr)); | 369 waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context, nullptr)); |
| 370 EXPECT_EQ(123u, context); | 370 EXPECT_EQ(123u, context); |
| 371 hss = HandleSignalsState(); | 371 hss = HandleSignalsState(); |
| 372 mp1->RemoveAwakable(1, &waiter, &hss); | 372 mp1->RemoveAwakable(1, false, &waiter, 0, &hss); |
| 373 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, | 373 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, |
| 374 hss.satisfied_signals); | 374 hss.satisfied_signals); |
| 375 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE | | 375 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE | |
| 376 MOJO_HANDLE_SIGNAL_PEER_CLOSED, | 376 MOJO_HANDLE_SIGNAL_PEER_CLOSED, |
| 377 hss.satisfiable_signals); | 377 hss.satisfiable_signals); |
| 378 | 378 |
| 379 EXPECT_EQ(endpoint_info_size, channels(1)->GetSerializedEndpointSize()); | 379 EXPECT_EQ(endpoint_info_size, channels(1)->GetSerializedEndpointSize()); |
| 380 std::unique_ptr<char[]> received_endpoint_info(new char[endpoint_info_size]); | 380 std::unique_ptr<char[]> received_endpoint_info(new char[endpoint_info_size]); |
| 381 buffer_size = static_cast<uint32_t>(endpoint_info_size); | 381 buffer_size = static_cast<uint32_t>(endpoint_info_size); |
| 382 EXPECT_EQ(MOJO_RESULT_OK, | 382 EXPECT_EQ(MOJO_RESULT_OK, |
| 383 mp1->ReadMessage(1, UserPointer<void>(received_endpoint_info.get()), | 383 mp1->ReadMessage(1, UserPointer<void>(received_endpoint_info.get()), |
| 384 MakeUserPointer(&buffer_size), nullptr, nullptr, | 384 MakeUserPointer(&buffer_size), nullptr, nullptr, |
| 385 MOJO_READ_MESSAGE_FLAG_NONE)); | 385 MOJO_READ_MESSAGE_FLAG_NONE)); |
| 386 EXPECT_EQ(endpoint_info_size, static_cast<size_t>(buffer_size)); | 386 EXPECT_EQ(endpoint_info_size, static_cast<size_t>(buffer_size)); |
| 387 EXPECT_EQ(0, memcmp(received_endpoint_info.get(), endpoint_info.get(), | 387 EXPECT_EQ(0, memcmp(received_endpoint_info.get(), endpoint_info.get(), |
| 388 endpoint_info_size)); | 388 endpoint_info_size)); |
| 389 | 389 |
| 390 // Warning: The local side of mp3 is port 0, not port 1. | 390 // Warning: The local side of mp3 is port 0, not port 1. |
| 391 RefPtr<IncomingEndpoint> incoming_endpoint = | 391 RefPtr<IncomingEndpoint> incoming_endpoint = |
| 392 channels(1)->DeserializeEndpoint(received_endpoint_info.get()); | 392 channels(1)->DeserializeEndpoint(received_endpoint_info.get()); |
| 393 ASSERT_TRUE(incoming_endpoint); | 393 ASSERT_TRUE(incoming_endpoint); |
| 394 RefPtr<MessagePipe> mp3 = incoming_endpoint->ConvertToMessagePipe(); | 394 RefPtr<MessagePipe> mp3 = incoming_endpoint->ConvertToMessagePipe(); |
| 395 ASSERT_TRUE(mp3); | 395 ASSERT_TRUE(mp3); |
| 396 | 396 |
| 397 // Write: MP 2, port 0 -> MP 3, port 1. | 397 // Write: MP 2, port 0 -> MP 3, port 1. |
| 398 | 398 |
| 399 waiter.Init(); | 399 waiter.Init(); |
| 400 ASSERT_EQ(MOJO_RESULT_OK, | 400 ASSERT_EQ(MOJO_RESULT_OK, |
| 401 mp3->AddAwakable(0, &waiter, MOJO_HANDLE_SIGNAL_READABLE, false, | 401 mp3->AddAwakable(0, &waiter, 789, false, |
| 402 789, nullptr)); | 402 MOJO_HANDLE_SIGNAL_READABLE, nullptr)); |
| 403 | 403 |
| 404 EXPECT_EQ( | 404 EXPECT_EQ( |
| 405 MOJO_RESULT_OK, | 405 MOJO_RESULT_OK, |
| 406 mp2->WriteMessage(0, UserPointer<const void>(kHello), sizeof(kHello), | 406 mp2->WriteMessage(0, UserPointer<const void>(kHello), sizeof(kHello), |
| 407 nullptr, MOJO_WRITE_MESSAGE_FLAG_NONE)); | 407 nullptr, MOJO_WRITE_MESSAGE_FLAG_NONE)); |
| 408 | 408 |
| 409 EXPECT_EQ(MOJO_RESULT_OK, | 409 EXPECT_EQ(MOJO_RESULT_OK, |
| 410 waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context, nullptr)); | 410 waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context, nullptr)); |
| 411 EXPECT_EQ(789u, context); | 411 EXPECT_EQ(789u, context); |
| 412 hss = HandleSignalsState(); | 412 hss = HandleSignalsState(); |
| 413 mp3->RemoveAwakable(0, &waiter, &hss); | 413 mp3->RemoveAwakable(0, false, &waiter, 0, &hss); |
| 414 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, | 414 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, |
| 415 hss.satisfied_signals); | 415 hss.satisfied_signals); |
| 416 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE | | 416 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE | |
| 417 MOJO_HANDLE_SIGNAL_PEER_CLOSED, | 417 MOJO_HANDLE_SIGNAL_PEER_CLOSED, |
| 418 hss.satisfiable_signals); | 418 hss.satisfiable_signals); |
| 419 | 419 |
| 420 // Make sure there's nothing on MP 0, port 0 or MP 1, port 1 or MP 2, port 0. | 420 // Make sure there's nothing on MP 0, port 0 or MP 1, port 1 or MP 2, port 0. |
| 421 buffer_size = static_cast<uint32_t>(sizeof(buffer)); | 421 buffer_size = static_cast<uint32_t>(sizeof(buffer)); |
| 422 EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT, | 422 EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT, |
| 423 mp0->ReadMessage(0, UserPointer<void>(buffer), | 423 mp0->ReadMessage(0, UserPointer<void>(buffer), |
| (...skipping 16 matching lines...) Expand all Loading... |
| 440 mp3->ReadMessage(0, UserPointer<void>(buffer), | 440 mp3->ReadMessage(0, UserPointer<void>(buffer), |
| 441 MakeUserPointer(&buffer_size), nullptr, nullptr, | 441 MakeUserPointer(&buffer_size), nullptr, nullptr, |
| 442 MOJO_READ_MESSAGE_FLAG_NONE)); | 442 MOJO_READ_MESSAGE_FLAG_NONE)); |
| 443 EXPECT_EQ(sizeof(kHello), static_cast<size_t>(buffer_size)); | 443 EXPECT_EQ(sizeof(kHello), static_cast<size_t>(buffer_size)); |
| 444 EXPECT_STREQ(kHello, buffer); | 444 EXPECT_STREQ(kHello, buffer); |
| 445 | 445 |
| 446 // Write: MP 0, port 0 -> MP 1, port 1 again. | 446 // Write: MP 0, port 0 -> MP 1, port 1 again. |
| 447 | 447 |
| 448 waiter.Init(); | 448 waiter.Init(); |
| 449 ASSERT_EQ(MOJO_RESULT_OK, | 449 ASSERT_EQ(MOJO_RESULT_OK, |
| 450 mp1->AddAwakable(1, &waiter, MOJO_HANDLE_SIGNAL_READABLE, false, | 450 mp1->AddAwakable(1, &waiter, 123, false, |
| 451 123, nullptr)); | 451 MOJO_HANDLE_SIGNAL_READABLE, nullptr)); |
| 452 | 452 |
| 453 EXPECT_EQ( | 453 EXPECT_EQ( |
| 454 MOJO_RESULT_OK, | 454 MOJO_RESULT_OK, |
| 455 mp0->WriteMessage(0, UserPointer<const void>(kWorld), sizeof(kWorld), | 455 mp0->WriteMessage(0, UserPointer<const void>(kWorld), sizeof(kWorld), |
| 456 nullptr, MOJO_WRITE_MESSAGE_FLAG_NONE)); | 456 nullptr, MOJO_WRITE_MESSAGE_FLAG_NONE)); |
| 457 | 457 |
| 458 EXPECT_EQ(MOJO_RESULT_OK, | 458 EXPECT_EQ(MOJO_RESULT_OK, |
| 459 waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context, nullptr)); | 459 waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context, nullptr)); |
| 460 EXPECT_EQ(123u, context); | 460 EXPECT_EQ(123u, context); |
| 461 hss = HandleSignalsState(); | 461 hss = HandleSignalsState(); |
| 462 mp1->RemoveAwakable(1, &waiter, &hss); | 462 mp1->RemoveAwakable(1, false, &waiter, 0, &hss); |
| 463 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, | 463 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, |
| 464 hss.satisfied_signals); | 464 hss.satisfied_signals); |
| 465 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE | | 465 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE | |
| 466 MOJO_HANDLE_SIGNAL_PEER_CLOSED | MOJO_HANDLE_SIGNAL_PEER_CLOSED, | 466 MOJO_HANDLE_SIGNAL_PEER_CLOSED | MOJO_HANDLE_SIGNAL_PEER_CLOSED, |
| 467 hss.satisfiable_signals); | 467 hss.satisfiable_signals); |
| 468 | 468 |
| 469 // Make sure there's nothing on the other ports. | 469 // Make sure there's nothing on the other ports. |
| 470 buffer_size = static_cast<uint32_t>(sizeof(buffer)); | 470 buffer_size = static_cast<uint32_t>(sizeof(buffer)); |
| 471 EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT, | 471 EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT, |
| 472 mp0->ReadMessage(0, UserPointer<void>(buffer), | 472 mp0->ReadMessage(0, UserPointer<void>(buffer), |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 523 | 523 |
| 524 BootstrapChannelEndpointNoWait(0, std::move(ep0)); | 524 BootstrapChannelEndpointNoWait(0, std::move(ep0)); |
| 525 | 525 |
| 526 RefPtr<ChannelEndpoint> ep1; | 526 RefPtr<ChannelEndpoint> ep1; |
| 527 auto mp1 = MessagePipe::CreateProxyLocal(&ep1); | 527 auto mp1 = MessagePipe::CreateProxyLocal(&ep1); |
| 528 | 528 |
| 529 // Prepare to wait on MP 1, port 1. (Add the waiter now. Otherwise, if we do | 529 // Prepare to wait on MP 1, port 1. (Add the waiter now. Otherwise, if we do |
| 530 // it later, it might already be readable.) | 530 // it later, it might already be readable.) |
| 531 waiter.Init(); | 531 waiter.Init(); |
| 532 ASSERT_EQ(MOJO_RESULT_OK, | 532 ASSERT_EQ(MOJO_RESULT_OK, |
| 533 mp1->AddAwakable(1, &waiter, MOJO_HANDLE_SIGNAL_READABLE, false, | 533 mp1->AddAwakable(1, &waiter, 123, false, |
| 534 123, nullptr)); | 534 MOJO_HANDLE_SIGNAL_READABLE, nullptr)); |
| 535 | 535 |
| 536 BootstrapChannelEndpointNoWait(1, std::move(ep1)); | 536 BootstrapChannelEndpointNoWait(1, std::move(ep1)); |
| 537 | 537 |
| 538 // Wait. | 538 // Wait. |
| 539 EXPECT_EQ(MOJO_RESULT_OK, | 539 EXPECT_EQ(MOJO_RESULT_OK, |
| 540 waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context, nullptr)); | 540 waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context, nullptr)); |
| 541 EXPECT_EQ(123u, context); | 541 EXPECT_EQ(123u, context); |
| 542 hss = HandleSignalsState(); | 542 hss = HandleSignalsState(); |
| 543 // Note: MP 1, port 1 should definitely should be readable, but it may or may | 543 // Note: MP 1, port 1 should definitely should be readable, but it may or may |
| 544 // not appear as writable (there's a race, and it may not have noticed that | 544 // not appear as writable (there's a race, and it may not have noticed that |
| 545 // the other side was closed yet -- e.g., inserting a sleep here would make it | 545 // the other side was closed yet -- e.g., inserting a sleep here would make it |
| 546 // much more likely to notice that it's no longer writable). | 546 // much more likely to notice that it's no longer writable). |
| 547 mp1->RemoveAwakable(1, &waiter, &hss); | 547 mp1->RemoveAwakable(1, false, &waiter, 0, &hss); |
| 548 EXPECT_TRUE((hss.satisfied_signals & MOJO_HANDLE_SIGNAL_READABLE)); | 548 EXPECT_TRUE((hss.satisfied_signals & MOJO_HANDLE_SIGNAL_READABLE)); |
| 549 EXPECT_TRUE((hss.satisfiable_signals & MOJO_HANDLE_SIGNAL_READABLE)); | 549 EXPECT_TRUE((hss.satisfiable_signals & MOJO_HANDLE_SIGNAL_READABLE)); |
| 550 | 550 |
| 551 // Read from MP 1, port 1. | 551 // Read from MP 1, port 1. |
| 552 EXPECT_EQ(MOJO_RESULT_OK, | 552 EXPECT_EQ(MOJO_RESULT_OK, |
| 553 mp1->ReadMessage(1, UserPointer<void>(buffer), | 553 mp1->ReadMessage(1, UserPointer<void>(buffer), |
| 554 MakeUserPointer(&buffer_size), nullptr, nullptr, | 554 MakeUserPointer(&buffer_size), nullptr, nullptr, |
| 555 MOJO_READ_MESSAGE_FLAG_NONE)); | 555 MOJO_READ_MESSAGE_FLAG_NONE)); |
| 556 EXPECT_EQ(sizeof(kHello), static_cast<size_t>(buffer_size)); | 556 EXPECT_EQ(sizeof(kHello), static_cast<size_t>(buffer_size)); |
| 557 EXPECT_STREQ(kHello, buffer); | 557 EXPECT_STREQ(kHello, buffer); |
| (...skipping 28 matching lines...) Expand all Loading... |
| 586 // Close MP 0, port 0 before channel 1 is even connected. | 586 // Close MP 0, port 0 before channel 1 is even connected. |
| 587 mp0->Close(0); | 587 mp0->Close(0); |
| 588 | 588 |
| 589 RefPtr<ChannelEndpoint> ep1; | 589 RefPtr<ChannelEndpoint> ep1; |
| 590 auto mp1 = MessagePipe::CreateProxyLocal(&ep1); | 590 auto mp1 = MessagePipe::CreateProxyLocal(&ep1); |
| 591 | 591 |
| 592 // Prepare to wait on MP 1, port 1. (Add the waiter now. Otherwise, if we do | 592 // Prepare to wait on MP 1, port 1. (Add the waiter now. Otherwise, if we do |
| 593 // it later, it might already be readable.) | 593 // it later, it might already be readable.) |
| 594 waiter.Init(); | 594 waiter.Init(); |
| 595 ASSERT_EQ(MOJO_RESULT_OK, | 595 ASSERT_EQ(MOJO_RESULT_OK, |
| 596 mp1->AddAwakable(1, &waiter, MOJO_HANDLE_SIGNAL_READABLE, false, | 596 mp1->AddAwakable(1, &waiter, 123, false, |
| 597 123, nullptr)); | 597 MOJO_HANDLE_SIGNAL_READABLE, nullptr)); |
| 598 | 598 |
| 599 BootstrapChannelEndpointNoWait(1, std::move(ep1)); | 599 BootstrapChannelEndpointNoWait(1, std::move(ep1)); |
| 600 | 600 |
| 601 // Wait. | 601 // Wait. |
| 602 EXPECT_EQ(MOJO_RESULT_OK, | 602 EXPECT_EQ(MOJO_RESULT_OK, |
| 603 waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context, nullptr)); | 603 waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context, nullptr)); |
| 604 EXPECT_EQ(123u, context); | 604 EXPECT_EQ(123u, context); |
| 605 hss = HandleSignalsState(); | 605 hss = HandleSignalsState(); |
| 606 // Note: MP 1, port 1 should definitely should be readable, but it may or may | 606 // Note: MP 1, port 1 should definitely should be readable, but it may or may |
| 607 // not appear as writable (there's a race, and it may not have noticed that | 607 // not appear as writable (there's a race, and it may not have noticed that |
| 608 // the other side was closed yet -- e.g., inserting a sleep here would make it | 608 // the other side was closed yet -- e.g., inserting a sleep here would make it |
| 609 // much more likely to notice that it's no longer writable). | 609 // much more likely to notice that it's no longer writable). |
| 610 mp1->RemoveAwakable(1, &waiter, &hss); | 610 mp1->RemoveAwakable(1, false, &waiter, 0, &hss); |
| 611 EXPECT_TRUE((hss.satisfied_signals & MOJO_HANDLE_SIGNAL_READABLE)); | 611 EXPECT_TRUE((hss.satisfied_signals & MOJO_HANDLE_SIGNAL_READABLE)); |
| 612 EXPECT_TRUE((hss.satisfiable_signals & MOJO_HANDLE_SIGNAL_READABLE)); | 612 EXPECT_TRUE((hss.satisfiable_signals & MOJO_HANDLE_SIGNAL_READABLE)); |
| 613 | 613 |
| 614 // Read from MP 1, port 1. | 614 // Read from MP 1, port 1. |
| 615 EXPECT_EQ(MOJO_RESULT_OK, | 615 EXPECT_EQ(MOJO_RESULT_OK, |
| 616 mp1->ReadMessage(1, UserPointer<void>(buffer), | 616 mp1->ReadMessage(1, UserPointer<void>(buffer), |
| 617 MakeUserPointer(&buffer_size), nullptr, nullptr, | 617 MakeUserPointer(&buffer_size), nullptr, nullptr, |
| 618 MOJO_READ_MESSAGE_FLAG_NONE)); | 618 MOJO_READ_MESSAGE_FLAG_NONE)); |
| 619 EXPECT_EQ(sizeof(kHello), static_cast<size_t>(buffer_size)); | 619 EXPECT_EQ(sizeof(kHello), static_cast<size_t>(buffer_size)); |
| 620 EXPECT_STREQ(kHello, buffer); | 620 EXPECT_STREQ(kHello, buffer); |
| (...skipping 19 matching lines...) Expand all Loading... |
| 640 MessagePipeDispatcher::kDefaultCreateOptions); | 640 MessagePipeDispatcher::kDefaultCreateOptions); |
| 641 auto local_mp = MessagePipe::CreateLocalLocal(); | 641 auto local_mp = MessagePipe::CreateLocalLocal(); |
| 642 dispatcher->Init(local_mp.Clone(), 0); | 642 dispatcher->Init(local_mp.Clone(), 0); |
| 643 Handle handle(std::move(dispatcher), | 643 Handle handle(std::move(dispatcher), |
| 644 MessagePipeDispatcher::kDefaultHandleRights); | 644 MessagePipeDispatcher::kDefaultHandleRights); |
| 645 | 645 |
| 646 // Prepare to wait on MP 1, port 1. (Add the waiter now. Otherwise, if we do | 646 // Prepare to wait on MP 1, port 1. (Add the waiter now. Otherwise, if we do |
| 647 // it later, it might already be readable.) | 647 // it later, it might already be readable.) |
| 648 waiter.Init(); | 648 waiter.Init(); |
| 649 ASSERT_EQ(MOJO_RESULT_OK, | 649 ASSERT_EQ(MOJO_RESULT_OK, |
| 650 mp1->AddAwakable(1, &waiter, MOJO_HANDLE_SIGNAL_READABLE, false, | 650 mp1->AddAwakable(1, &waiter, 123, false, |
| 651 123, nullptr)); | 651 MOJO_HANDLE_SIGNAL_READABLE, nullptr)); |
| 652 | 652 |
| 653 // Write to MP 0, port 0. | 653 // Write to MP 0, port 0. |
| 654 { | 654 { |
| 655 HandleTransport transport(test::HandleTryStartTransport(handle)); | 655 HandleTransport transport(test::HandleTryStartTransport(handle)); |
| 656 EXPECT_TRUE(transport.is_valid()); | 656 EXPECT_TRUE(transport.is_valid()); |
| 657 | 657 |
| 658 std::vector<HandleTransport> transports; | 658 std::vector<HandleTransport> transports; |
| 659 transports.push_back(transport); | 659 transports.push_back(transport); |
| 660 EXPECT_EQ( | 660 EXPECT_EQ( |
| 661 MOJO_RESULT_OK, | 661 MOJO_RESULT_OK, |
| 662 mp0->WriteMessage(0, UserPointer<const void>(kHello), sizeof(kHello), | 662 mp0->WriteMessage(0, UserPointer<const void>(kHello), sizeof(kHello), |
| 663 &transports, MOJO_WRITE_MESSAGE_FLAG_NONE)); | 663 &transports, MOJO_WRITE_MESSAGE_FLAG_NONE)); |
| 664 transport.End(); | 664 transport.End(); |
| 665 | 665 |
| 666 // |handle.dispatcher| should have been closed. This is |DCHECK()|ed when | 666 // |handle.dispatcher| should have been closed. This is |DCHECK()|ed when |
| 667 // the |handle.dispatcher| is destroyed. | 667 // the |handle.dispatcher| is destroyed. |
| 668 EXPECT_TRUE(handle.dispatcher->HasOneRef()); | 668 EXPECT_TRUE(handle.dispatcher->HasOneRef()); |
| 669 handle.reset(); | 669 handle.reset(); |
| 670 } | 670 } |
| 671 | 671 |
| 672 // Wait. | 672 // Wait. |
| 673 EXPECT_EQ(MOJO_RESULT_OK, | 673 EXPECT_EQ(MOJO_RESULT_OK, |
| 674 waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context, nullptr)); | 674 waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context, nullptr)); |
| 675 EXPECT_EQ(123u, context); | 675 EXPECT_EQ(123u, context); |
| 676 hss = HandleSignalsState(); | 676 hss = HandleSignalsState(); |
| 677 mp1->RemoveAwakable(1, &waiter, &hss); | 677 mp1->RemoveAwakable(1, false, &waiter, 0, &hss); |
| 678 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, | 678 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, |
| 679 hss.satisfied_signals); | 679 hss.satisfied_signals); |
| 680 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE | | 680 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE | |
| 681 MOJO_HANDLE_SIGNAL_PEER_CLOSED, | 681 MOJO_HANDLE_SIGNAL_PEER_CLOSED, |
| 682 hss.satisfiable_signals); | 682 hss.satisfiable_signals); |
| 683 | 683 |
| 684 // Read from MP 1, port 1. | 684 // Read from MP 1, port 1. |
| 685 char read_buffer[100] = {0}; | 685 char read_buffer[100] = {0}; |
| 686 uint32_t read_buffer_size = static_cast<uint32_t>(sizeof(read_buffer)); | 686 uint32_t read_buffer_size = static_cast<uint32_t>(sizeof(read_buffer)); |
| 687 HandleVector read_handles; | 687 HandleVector read_handles; |
| (...skipping 12 matching lines...) Expand all Loading... |
| 700 EXPECT_EQ(Dispatcher::Type::MESSAGE_PIPE, | 700 EXPECT_EQ(Dispatcher::Type::MESSAGE_PIPE, |
| 701 read_handles[0].dispatcher->GetType()); | 701 read_handles[0].dispatcher->GetType()); |
| 702 EXPECT_EQ(MessagePipeDispatcher::kDefaultHandleRights, | 702 EXPECT_EQ(MessagePipeDispatcher::kDefaultHandleRights, |
| 703 read_handles[0].rights); | 703 read_handles[0].rights); |
| 704 dispatcher = RefPtr<MessagePipeDispatcher>( | 704 dispatcher = RefPtr<MessagePipeDispatcher>( |
| 705 static_cast<MessagePipeDispatcher*>(read_handles[0].dispatcher.get())); | 705 static_cast<MessagePipeDispatcher*>(read_handles[0].dispatcher.get())); |
| 706 | 706 |
| 707 // Add the waiter now, before it becomes readable to avoid a race. | 707 // Add the waiter now, before it becomes readable to avoid a race. |
| 708 waiter.Init(); | 708 waiter.Init(); |
| 709 ASSERT_EQ(MOJO_RESULT_OK, | 709 ASSERT_EQ(MOJO_RESULT_OK, |
| 710 dispatcher->AddAwakable(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 456, | 710 dispatcher->AddAwakable(&waiter, 456, false, |
| 711 nullptr)); | 711 MOJO_HANDLE_SIGNAL_READABLE, nullptr)); |
| 712 | 712 |
| 713 // Write to "local_mp", port 1. | 713 // Write to "local_mp", port 1. |
| 714 EXPECT_EQ( | 714 EXPECT_EQ( |
| 715 MOJO_RESULT_OK, | 715 MOJO_RESULT_OK, |
| 716 local_mp->WriteMessage(1, UserPointer<const void>(kHello), sizeof(kHello), | 716 local_mp->WriteMessage(1, UserPointer<const void>(kHello), sizeof(kHello), |
| 717 nullptr, MOJO_WRITE_MESSAGE_FLAG_NONE)); | 717 nullptr, MOJO_WRITE_MESSAGE_FLAG_NONE)); |
| 718 | 718 |
| 719 // TODO(vtl): FIXME -- We (racily) crash if I close |dispatcher| immediately | 719 // TODO(vtl): FIXME -- We (racily) crash if I close |dispatcher| immediately |
| 720 // here. (We don't crash if I sleep and then close.) | 720 // here. (We don't crash if I sleep and then close.) |
| 721 | 721 |
| 722 // Wait for the dispatcher to become readable. | 722 // Wait for the dispatcher to become readable. |
| 723 EXPECT_EQ(MOJO_RESULT_OK, | 723 EXPECT_EQ(MOJO_RESULT_OK, |
| 724 waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context, nullptr)); | 724 waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context, nullptr)); |
| 725 EXPECT_EQ(456u, context); | 725 EXPECT_EQ(456u, context); |
| 726 hss = HandleSignalsState(); | 726 hss = HandleSignalsState(); |
| 727 dispatcher->RemoveAwakable(&waiter, &hss); | 727 dispatcher->RemoveAwakable(false, &waiter, 0, &hss); |
| 728 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, | 728 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, |
| 729 hss.satisfied_signals); | 729 hss.satisfied_signals); |
| 730 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE | | 730 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE | |
| 731 MOJO_HANDLE_SIGNAL_PEER_CLOSED, | 731 MOJO_HANDLE_SIGNAL_PEER_CLOSED, |
| 732 hss.satisfiable_signals); | 732 hss.satisfiable_signals); |
| 733 | 733 |
| 734 // Read from the dispatcher. | 734 // Read from the dispatcher. |
| 735 memset(read_buffer, 0, sizeof(read_buffer)); | 735 memset(read_buffer, 0, sizeof(read_buffer)); |
| 736 read_buffer_size = static_cast<uint32_t>(sizeof(read_buffer)); | 736 read_buffer_size = static_cast<uint32_t>(sizeof(read_buffer)); |
| 737 EXPECT_EQ(MOJO_RESULT_OK, | 737 EXPECT_EQ(MOJO_RESULT_OK, |
| 738 dispatcher->ReadMessage(UserPointer<void>(read_buffer), | 738 dispatcher->ReadMessage(UserPointer<void>(read_buffer), |
| 739 MakeUserPointer(&read_buffer_size), 0, | 739 MakeUserPointer(&read_buffer_size), 0, |
| 740 nullptr, MOJO_READ_MESSAGE_FLAG_NONE)); | 740 nullptr, MOJO_READ_MESSAGE_FLAG_NONE)); |
| 741 EXPECT_EQ(sizeof(kHello), static_cast<size_t>(read_buffer_size)); | 741 EXPECT_EQ(sizeof(kHello), static_cast<size_t>(read_buffer_size)); |
| 742 EXPECT_STREQ(kHello, read_buffer); | 742 EXPECT_STREQ(kHello, read_buffer); |
| 743 | 743 |
| 744 // Prepare to wait on "local_mp", port 1. | 744 // Prepare to wait on "local_mp", port 1. |
| 745 waiter.Init(); | 745 waiter.Init(); |
| 746 ASSERT_EQ(MOJO_RESULT_OK, | 746 ASSERT_EQ(MOJO_RESULT_OK, |
| 747 local_mp->AddAwakable(1, &waiter, MOJO_HANDLE_SIGNAL_READABLE, | 747 local_mp->AddAwakable(1, &waiter, 789, false, |
| 748 false, 789, nullptr)); | 748 MOJO_HANDLE_SIGNAL_READABLE, nullptr)); |
| 749 | 749 |
| 750 // Write to the dispatcher. | 750 // Write to the dispatcher. |
| 751 EXPECT_EQ(MOJO_RESULT_OK, dispatcher->WriteMessage( | 751 EXPECT_EQ(MOJO_RESULT_OK, dispatcher->WriteMessage( |
| 752 UserPointer<const void>(kHello), sizeof(kHello), | 752 UserPointer<const void>(kHello), sizeof(kHello), |
| 753 nullptr, MOJO_WRITE_MESSAGE_FLAG_NONE)); | 753 nullptr, MOJO_WRITE_MESSAGE_FLAG_NONE)); |
| 754 | 754 |
| 755 // Wait. | 755 // Wait. |
| 756 EXPECT_EQ(MOJO_RESULT_OK, | 756 EXPECT_EQ(MOJO_RESULT_OK, |
| 757 waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context, nullptr)); | 757 waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context, nullptr)); |
| 758 EXPECT_EQ(789u, context); | 758 EXPECT_EQ(789u, context); |
| 759 hss = HandleSignalsState(); | 759 hss = HandleSignalsState(); |
| 760 local_mp->RemoveAwakable(1, &waiter, &hss); | 760 local_mp->RemoveAwakable(1, false, &waiter, 0, &hss); |
| 761 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, | 761 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, |
| 762 hss.satisfied_signals); | 762 hss.satisfied_signals); |
| 763 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE | | 763 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE | |
| 764 MOJO_HANDLE_SIGNAL_PEER_CLOSED, | 764 MOJO_HANDLE_SIGNAL_PEER_CLOSED, |
| 765 hss.satisfiable_signals); | 765 hss.satisfiable_signals); |
| 766 | 766 |
| 767 // Read from "local_mp", port 1. | 767 // Read from "local_mp", port 1. |
| 768 memset(read_buffer, 0, sizeof(read_buffer)); | 768 memset(read_buffer, 0, sizeof(read_buffer)); |
| 769 read_buffer_size = static_cast<uint32_t>(sizeof(read_buffer)); | 769 read_buffer_size = static_cast<uint32_t>(sizeof(read_buffer)); |
| 770 EXPECT_EQ(MOJO_RESULT_OK, | 770 EXPECT_EQ(MOJO_RESULT_OK, |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 833 RefPtr<ChannelEndpoint> ep0; | 833 RefPtr<ChannelEndpoint> ep0; |
| 834 auto mp0 = MessagePipe::CreateLocalProxy(&ep0); | 834 auto mp0 = MessagePipe::CreateLocalProxy(&ep0); |
| 835 RefPtr<ChannelEndpoint> ep1; | 835 RefPtr<ChannelEndpoint> ep1; |
| 836 auto mp1 = MessagePipe::CreateProxyLocal(&ep1); | 836 auto mp1 = MessagePipe::CreateProxyLocal(&ep1); |
| 837 BootstrapChannelEndpoints(std::move(ep0), std::move(ep1)); | 837 BootstrapChannelEndpoints(std::move(ep0), std::move(ep1)); |
| 838 | 838 |
| 839 // Prepare to wait on MP 1, port 1. (Add the waiter now. Otherwise, if we do | 839 // Prepare to wait on MP 1, port 1. (Add the waiter now. Otherwise, if we do |
| 840 // it later, it might already be readable.) | 840 // it later, it might already be readable.) |
| 841 waiter.Init(); | 841 waiter.Init(); |
| 842 ASSERT_EQ(MOJO_RESULT_OK, | 842 ASSERT_EQ(MOJO_RESULT_OK, |
| 843 mp1->AddAwakable(1, &waiter, MOJO_HANDLE_SIGNAL_READABLE, false, | 843 mp1->AddAwakable(1, &waiter, 123, false, |
| 844 123, nullptr)); | 844 MOJO_HANDLE_SIGNAL_READABLE, nullptr)); |
| 845 | 845 |
| 846 // Write to MP 0, port 0. | 846 // Write to MP 0, port 0. |
| 847 { | 847 { |
| 848 HandleTransport transport(test::HandleTryStartTransport(handle)); | 848 HandleTransport transport(test::HandleTryStartTransport(handle)); |
| 849 EXPECT_TRUE(transport.is_valid()); | 849 EXPECT_TRUE(transport.is_valid()); |
| 850 | 850 |
| 851 std::vector<HandleTransport> transports; | 851 std::vector<HandleTransport> transports; |
| 852 transports.push_back(transport); | 852 transports.push_back(transport); |
| 853 EXPECT_EQ( | 853 EXPECT_EQ( |
| 854 MOJO_RESULT_OK, | 854 MOJO_RESULT_OK, |
| 855 mp0->WriteMessage(0, UserPointer<const void>(kHello), sizeof(kHello), | 855 mp0->WriteMessage(0, UserPointer<const void>(kHello), sizeof(kHello), |
| 856 &transports, MOJO_WRITE_MESSAGE_FLAG_NONE)); | 856 &transports, MOJO_WRITE_MESSAGE_FLAG_NONE)); |
| 857 transport.End(); | 857 transport.End(); |
| 858 | 858 |
| 859 // |handle.dispatcher| should have been closed. This is |DCHECK()|ed when | 859 // |handle.dispatcher| should have been closed. This is |DCHECK()|ed when |
| 860 // the |handle.dispatcher| is destroyed. | 860 // the |handle.dispatcher| is destroyed. |
| 861 EXPECT_TRUE(handle.dispatcher->HasOneRef()); | 861 EXPECT_TRUE(handle.dispatcher->HasOneRef()); |
| 862 handle.reset(); | 862 handle.reset(); |
| 863 } | 863 } |
| 864 | 864 |
| 865 // Wait. | 865 // Wait. |
| 866 EXPECT_EQ(MOJO_RESULT_OK, | 866 EXPECT_EQ(MOJO_RESULT_OK, |
| 867 waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context, nullptr)); | 867 waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context, nullptr)); |
| 868 EXPECT_EQ(123u, context); | 868 EXPECT_EQ(123u, context); |
| 869 hss = HandleSignalsState(); | 869 hss = HandleSignalsState(); |
| 870 mp1->RemoveAwakable(1, &waiter, &hss); | 870 mp1->RemoveAwakable(1, false, &waiter, 0, &hss); |
| 871 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, | 871 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, |
| 872 hss.satisfied_signals); | 872 hss.satisfied_signals); |
| 873 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE | | 873 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE | |
| 874 MOJO_HANDLE_SIGNAL_PEER_CLOSED, | 874 MOJO_HANDLE_SIGNAL_PEER_CLOSED, |
| 875 hss.satisfiable_signals); | 875 hss.satisfiable_signals); |
| 876 | 876 |
| 877 // Read from MP 1, port 1. | 877 // Read from MP 1, port 1. |
| 878 char read_buffer[100] = {0}; | 878 char read_buffer[100] = {0}; |
| 879 uint32_t read_buffer_size = static_cast<uint32_t>(sizeof(read_buffer)); | 879 uint32_t read_buffer_size = static_cast<uint32_t>(sizeof(read_buffer)); |
| 880 HandleVector read_handles; | 880 HandleVector read_handles; |
| (...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 968 ASSERT_TRUE(mapping0->GetBase()); | 968 ASSERT_TRUE(mapping0->GetBase()); |
| 969 ASSERT_EQ(100u, mapping0->GetLength()); | 969 ASSERT_EQ(100u, mapping0->GetLength()); |
| 970 static_cast<char*>(mapping0->GetBase())[0] = 'A'; | 970 static_cast<char*>(mapping0->GetBase())[0] = 'A'; |
| 971 static_cast<char*>(mapping0->GetBase())[50] = 'B'; | 971 static_cast<char*>(mapping0->GetBase())[50] = 'B'; |
| 972 static_cast<char*>(mapping0->GetBase())[99] = 'C'; | 972 static_cast<char*>(mapping0->GetBase())[99] = 'C'; |
| 973 | 973 |
| 974 // Prepare to wait on MP 1, port 1. (Add the waiter now. Otherwise, if we do | 974 // Prepare to wait on MP 1, port 1. (Add the waiter now. Otherwise, if we do |
| 975 // it later, it might already be readable.) | 975 // it later, it might already be readable.) |
| 976 waiter.Init(); | 976 waiter.Init(); |
| 977 ASSERT_EQ(MOJO_RESULT_OK, | 977 ASSERT_EQ(MOJO_RESULT_OK, |
| 978 mp1->AddAwakable(1, &waiter, MOJO_HANDLE_SIGNAL_READABLE, false, | 978 mp1->AddAwakable(1, &waiter, 123, false, |
| 979 123, nullptr)); | 979 MOJO_HANDLE_SIGNAL_READABLE, nullptr)); |
| 980 | 980 |
| 981 // Write to MP 0, port 0. | 981 // Write to MP 0, port 0. |
| 982 { | 982 { |
| 983 HandleTransport transport(test::HandleTryStartTransport(handle)); | 983 HandleTransport transport(test::HandleTryStartTransport(handle)); |
| 984 EXPECT_TRUE(transport.is_valid()); | 984 EXPECT_TRUE(transport.is_valid()); |
| 985 | 985 |
| 986 std::vector<HandleTransport> transports; | 986 std::vector<HandleTransport> transports; |
| 987 transports.push_back(transport); | 987 transports.push_back(transport); |
| 988 EXPECT_EQ( | 988 EXPECT_EQ( |
| 989 MOJO_RESULT_OK, | 989 MOJO_RESULT_OK, |
| 990 mp0->WriteMessage(0, UserPointer<const void>(kHello), sizeof(kHello), | 990 mp0->WriteMessage(0, UserPointer<const void>(kHello), sizeof(kHello), |
| 991 &transports, MOJO_WRITE_MESSAGE_FLAG_NONE)); | 991 &transports, MOJO_WRITE_MESSAGE_FLAG_NONE)); |
| 992 transport.End(); | 992 transport.End(); |
| 993 | 993 |
| 994 // |handle.dispatcher| should have been closed. This is |DCHECK()|ed when | 994 // |handle.dispatcher| should have been closed. This is |DCHECK()|ed when |
| 995 // the |handle.dispatcher| is destroyed. | 995 // the |handle.dispatcher| is destroyed. |
| 996 EXPECT_TRUE(handle.dispatcher->HasOneRef()); | 996 EXPECT_TRUE(handle.dispatcher->HasOneRef()); |
| 997 handle.reset(); | 997 handle.reset(); |
| 998 } | 998 } |
| 999 | 999 |
| 1000 // Wait. | 1000 // Wait. |
| 1001 EXPECT_EQ(MOJO_RESULT_OK, | 1001 EXPECT_EQ(MOJO_RESULT_OK, |
| 1002 waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context, nullptr)); | 1002 waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context, nullptr)); |
| 1003 EXPECT_EQ(123u, context); | 1003 EXPECT_EQ(123u, context); |
| 1004 hss = HandleSignalsState(); | 1004 hss = HandleSignalsState(); |
| 1005 mp1->RemoveAwakable(1, &waiter, &hss); | 1005 mp1->RemoveAwakable(1, false, &waiter, 0, &hss); |
| 1006 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, | 1006 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, |
| 1007 hss.satisfied_signals); | 1007 hss.satisfied_signals); |
| 1008 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE | | 1008 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE | |
| 1009 MOJO_HANDLE_SIGNAL_PEER_CLOSED, | 1009 MOJO_HANDLE_SIGNAL_PEER_CLOSED, |
| 1010 hss.satisfiable_signals); | 1010 hss.satisfiable_signals); |
| 1011 | 1011 |
| 1012 // Read from MP 1, port 1. | 1012 // Read from MP 1, port 1. |
| 1013 char read_buffer[100] = {0}; | 1013 char read_buffer[100] = {0}; |
| 1014 uint32_t read_buffer_size = static_cast<uint32_t>(sizeof(read_buffer)); | 1014 uint32_t read_buffer_size = static_cast<uint32_t>(sizeof(read_buffer)); |
| 1015 HandleVector read_handles; | 1015 HandleVector read_handles; |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1084 // be passed. | 1084 // be passed. |
| 1085 auto dispatcher = | 1085 auto dispatcher = |
| 1086 PlatformHandleDispatcher::Create(PlatformHandleFromFILE(std::move(fp))); | 1086 PlatformHandleDispatcher::Create(PlatformHandleFromFILE(std::move(fp))); |
| 1087 Handle handle(std::move(dispatcher), | 1087 Handle handle(std::move(dispatcher), |
| 1088 PlatformHandleDispatcher::kDefaultHandleRights); | 1088 PlatformHandleDispatcher::kDefaultHandleRights); |
| 1089 | 1089 |
| 1090 // Prepare to wait on MP 1, port 1. (Add the waiter now. Otherwise, if we do | 1090 // Prepare to wait on MP 1, port 1. (Add the waiter now. Otherwise, if we do |
| 1091 // it later, it might already be readable.) | 1091 // it later, it might already be readable.) |
| 1092 waiter.Init(); | 1092 waiter.Init(); |
| 1093 ASSERT_EQ(MOJO_RESULT_OK, | 1093 ASSERT_EQ(MOJO_RESULT_OK, |
| 1094 mp1->AddAwakable(1, &waiter, MOJO_HANDLE_SIGNAL_READABLE, false, | 1094 mp1->AddAwakable(1, &waiter, 123, false, |
| 1095 123, nullptr)); | 1095 MOJO_HANDLE_SIGNAL_READABLE, nullptr)); |
| 1096 | 1096 |
| 1097 // Write to MP 0, port 0. | 1097 // Write to MP 0, port 0. |
| 1098 { | 1098 { |
| 1099 HandleTransport transport(test::HandleTryStartTransport(handle)); | 1099 HandleTransport transport(test::HandleTryStartTransport(handle)); |
| 1100 EXPECT_TRUE(transport.is_valid()); | 1100 EXPECT_TRUE(transport.is_valid()); |
| 1101 | 1101 |
| 1102 std::vector<HandleTransport> transports; | 1102 std::vector<HandleTransport> transports; |
| 1103 transports.push_back(transport); | 1103 transports.push_back(transport); |
| 1104 EXPECT_EQ( | 1104 EXPECT_EQ( |
| 1105 MOJO_RESULT_OK, | 1105 MOJO_RESULT_OK, |
| 1106 mp0->WriteMessage(0, UserPointer<const void>(kWorld), sizeof(kWorld), | 1106 mp0->WriteMessage(0, UserPointer<const void>(kWorld), sizeof(kWorld), |
| 1107 &transports, MOJO_WRITE_MESSAGE_FLAG_NONE)); | 1107 &transports, MOJO_WRITE_MESSAGE_FLAG_NONE)); |
| 1108 transport.End(); | 1108 transport.End(); |
| 1109 | 1109 |
| 1110 // |handle.dispatcher| should have been closed. This is |DCHECK()|ed when | 1110 // |handle.dispatcher| should have been closed. This is |DCHECK()|ed when |
| 1111 // the |handle.dispatcher| is destroyed. | 1111 // the |handle.dispatcher| is destroyed. |
| 1112 EXPECT_TRUE(handle.dispatcher->HasOneRef()); | 1112 EXPECT_TRUE(handle.dispatcher->HasOneRef()); |
| 1113 handle.reset(); | 1113 handle.reset(); |
| 1114 } | 1114 } |
| 1115 | 1115 |
| 1116 // Wait. | 1116 // Wait. |
| 1117 EXPECT_EQ(MOJO_RESULT_OK, | 1117 EXPECT_EQ(MOJO_RESULT_OK, |
| 1118 waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context, nullptr)); | 1118 waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context, nullptr)); |
| 1119 EXPECT_EQ(123u, context); | 1119 EXPECT_EQ(123u, context); |
| 1120 hss = HandleSignalsState(); | 1120 hss = HandleSignalsState(); |
| 1121 mp1->RemoveAwakable(1, &waiter, &hss); | 1121 mp1->RemoveAwakable(1, false, &waiter, 0, &hss); |
| 1122 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, | 1122 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, |
| 1123 hss.satisfied_signals); | 1123 hss.satisfied_signals); |
| 1124 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE | | 1124 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE | |
| 1125 MOJO_HANDLE_SIGNAL_PEER_CLOSED, | 1125 MOJO_HANDLE_SIGNAL_PEER_CLOSED, |
| 1126 hss.satisfiable_signals); | 1126 hss.satisfiable_signals); |
| 1127 | 1127 |
| 1128 // Read from MP 1, port 1. | 1128 // Read from MP 1, port 1. |
| 1129 char read_buffer[100] = {0}; | 1129 char read_buffer[100] = {0}; |
| 1130 uint32_t read_buffer_size = static_cast<uint32_t>(sizeof(read_buffer)); | 1130 uint32_t read_buffer_size = static_cast<uint32_t>(sizeof(read_buffer)); |
| 1131 HandleVector read_handles; | 1131 HandleVector read_handles; |
| (...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1225 MessagePipeDispatcher::kDefaultCreateOptions); | 1225 MessagePipeDispatcher::kDefaultCreateOptions); |
| 1226 auto local_mp = MessagePipe::CreateLocalLocal(); | 1226 auto local_mp = MessagePipe::CreateLocalLocal(); |
| 1227 dispatcher->Init(local_mp.Clone(), 0); | 1227 dispatcher->Init(local_mp.Clone(), 0); |
| 1228 Handle handle(std::move(dispatcher), | 1228 Handle handle(std::move(dispatcher), |
| 1229 MessagePipeDispatcher::kDefaultHandleRights); | 1229 MessagePipeDispatcher::kDefaultHandleRights); |
| 1230 | 1230 |
| 1231 // Prepare to wait on MP 1, port 1. (Add the waiter now. Otherwise, if we do | 1231 // Prepare to wait on MP 1, port 1. (Add the waiter now. Otherwise, if we do |
| 1232 // it later, it might already be readable.) | 1232 // it later, it might already be readable.) |
| 1233 waiter.Init(); | 1233 waiter.Init(); |
| 1234 ASSERT_EQ(MOJO_RESULT_OK, | 1234 ASSERT_EQ(MOJO_RESULT_OK, |
| 1235 mp1->AddAwakable(1, &waiter, MOJO_HANDLE_SIGNAL_READABLE, false, | 1235 mp1->AddAwakable(1, &waiter, 123, false, |
| 1236 123, nullptr)); | 1236 MOJO_HANDLE_SIGNAL_READABLE, nullptr)); |
| 1237 | 1237 |
| 1238 // Write to MP 0, port 0. | 1238 // Write to MP 0, port 0. |
| 1239 { | 1239 { |
| 1240 HandleTransport transport(test::HandleTryStartTransport(handle)); | 1240 HandleTransport transport(test::HandleTryStartTransport(handle)); |
| 1241 EXPECT_TRUE(transport.is_valid()); | 1241 EXPECT_TRUE(transport.is_valid()); |
| 1242 | 1242 |
| 1243 std::vector<HandleTransport> transports; | 1243 std::vector<HandleTransport> transports; |
| 1244 transports.push_back(transport); | 1244 transports.push_back(transport); |
| 1245 EXPECT_EQ( | 1245 EXPECT_EQ( |
| 1246 MOJO_RESULT_OK, | 1246 MOJO_RESULT_OK, |
| 1247 mp0->WriteMessage(0, UserPointer<const void>(kHello), sizeof(kHello), | 1247 mp0->WriteMessage(0, UserPointer<const void>(kHello), sizeof(kHello), |
| 1248 &transports, MOJO_WRITE_MESSAGE_FLAG_NONE)); | 1248 &transports, MOJO_WRITE_MESSAGE_FLAG_NONE)); |
| 1249 transport.End(); | 1249 transport.End(); |
| 1250 | 1250 |
| 1251 // |handle.dispatcher| should have been closed. This is |DCHECK()|ed when | 1251 // |handle.dispatcher| should have been closed. This is |DCHECK()|ed when |
| 1252 // the |handle.dispatcher| is destroyed. | 1252 // the |handle.dispatcher| is destroyed. |
| 1253 EXPECT_TRUE(handle.dispatcher->HasOneRef()); | 1253 EXPECT_TRUE(handle.dispatcher->HasOneRef()); |
| 1254 handle.reset(); | 1254 handle.reset(); |
| 1255 } | 1255 } |
| 1256 | 1256 |
| 1257 // Wait. | 1257 // Wait. |
| 1258 EXPECT_EQ(MOJO_RESULT_OK, | 1258 EXPECT_EQ(MOJO_RESULT_OK, |
| 1259 waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context, nullptr)); | 1259 waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context, nullptr)); |
| 1260 EXPECT_EQ(123u, context); | 1260 EXPECT_EQ(123u, context); |
| 1261 hss = HandleSignalsState(); | 1261 hss = HandleSignalsState(); |
| 1262 mp1->RemoveAwakable(1, &waiter, &hss); | 1262 mp1->RemoveAwakable(1, false, &waiter, 0, &hss); |
| 1263 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, | 1263 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, |
| 1264 hss.satisfied_signals); | 1264 hss.satisfied_signals); |
| 1265 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE | | 1265 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE | |
| 1266 MOJO_HANDLE_SIGNAL_PEER_CLOSED, | 1266 MOJO_HANDLE_SIGNAL_PEER_CLOSED, |
| 1267 hss.satisfiable_signals); | 1267 hss.satisfiable_signals); |
| 1268 | 1268 |
| 1269 // Read from MP 1, port 1. | 1269 // Read from MP 1, port 1. |
| 1270 char read_buffer[100] = {0}; | 1270 char read_buffer[100] = {0}; |
| 1271 uint32_t read_buffer_size = static_cast<uint32_t>(sizeof(read_buffer)); | 1271 uint32_t read_buffer_size = static_cast<uint32_t>(sizeof(read_buffer)); |
| 1272 HandleVector read_handles; | 1272 HandleVector read_handles; |
| (...skipping 15 matching lines...) Expand all Loading... |
| 1288 read_handles[0].rights); | 1288 read_handles[0].rights); |
| 1289 handle = std::move(read_handles[0]); | 1289 handle = std::move(read_handles[0]); |
| 1290 read_handles.clear(); | 1290 read_handles.clear(); |
| 1291 | 1291 |
| 1292 // Now pass it back. | 1292 // Now pass it back. |
| 1293 | 1293 |
| 1294 // Prepare to wait on MP 0, port 0. (Add the waiter now. Otherwise, if we do | 1294 // Prepare to wait on MP 0, port 0. (Add the waiter now. Otherwise, if we do |
| 1295 // it later, it might already be readable.) | 1295 // it later, it might already be readable.) |
| 1296 waiter.Init(); | 1296 waiter.Init(); |
| 1297 ASSERT_EQ(MOJO_RESULT_OK, | 1297 ASSERT_EQ(MOJO_RESULT_OK, |
| 1298 mp0->AddAwakable(0, &waiter, MOJO_HANDLE_SIGNAL_READABLE, false, | 1298 mp0->AddAwakable(0, &waiter, 456, false, |
| 1299 456, nullptr)); | 1299 MOJO_HANDLE_SIGNAL_READABLE, nullptr)); |
| 1300 | 1300 |
| 1301 // Write to MP 1, port 1. | 1301 // Write to MP 1, port 1. |
| 1302 { | 1302 { |
| 1303 HandleTransport transport(test::HandleTryStartTransport(handle)); | 1303 HandleTransport transport(test::HandleTryStartTransport(handle)); |
| 1304 EXPECT_TRUE(transport.is_valid()); | 1304 EXPECT_TRUE(transport.is_valid()); |
| 1305 | 1305 |
| 1306 std::vector<HandleTransport> transports; | 1306 std::vector<HandleTransport> transports; |
| 1307 transports.push_back(transport); | 1307 transports.push_back(transport); |
| 1308 EXPECT_EQ( | 1308 EXPECT_EQ( |
| 1309 MOJO_RESULT_OK, | 1309 MOJO_RESULT_OK, |
| 1310 mp1->WriteMessage(1, UserPointer<const void>(kWorld), sizeof(kWorld), | 1310 mp1->WriteMessage(1, UserPointer<const void>(kWorld), sizeof(kWorld), |
| 1311 &transports, MOJO_WRITE_MESSAGE_FLAG_NONE)); | 1311 &transports, MOJO_WRITE_MESSAGE_FLAG_NONE)); |
| 1312 transport.End(); | 1312 transport.End(); |
| 1313 | 1313 |
| 1314 // |handle.dispatcher| should have been closed. This is |DCHECK()|ed when | 1314 // |handle.dispatcher| should have been closed. This is |DCHECK()|ed when |
| 1315 // the |handle.dispatcher| is destroyed. | 1315 // the |handle.dispatcher| is destroyed. |
| 1316 EXPECT_TRUE(handle.dispatcher->HasOneRef()); | 1316 EXPECT_TRUE(handle.dispatcher->HasOneRef()); |
| 1317 handle.reset(); | 1317 handle.reset(); |
| 1318 } | 1318 } |
| 1319 | 1319 |
| 1320 // Wait. | 1320 // Wait. |
| 1321 EXPECT_EQ(MOJO_RESULT_OK, | 1321 EXPECT_EQ(MOJO_RESULT_OK, |
| 1322 waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context, nullptr)); | 1322 waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context, nullptr)); |
| 1323 EXPECT_EQ(456u, context); | 1323 EXPECT_EQ(456u, context); |
| 1324 hss = HandleSignalsState(); | 1324 hss = HandleSignalsState(); |
| 1325 mp0->RemoveAwakable(0, &waiter, &hss); | 1325 mp0->RemoveAwakable(0, false, &waiter, 0, &hss); |
| 1326 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, | 1326 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, |
| 1327 hss.satisfied_signals); | 1327 hss.satisfied_signals); |
| 1328 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE | | 1328 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE | |
| 1329 MOJO_HANDLE_SIGNAL_PEER_CLOSED, | 1329 MOJO_HANDLE_SIGNAL_PEER_CLOSED, |
| 1330 hss.satisfiable_signals); | 1330 hss.satisfiable_signals); |
| 1331 | 1331 |
| 1332 // Read from MP 0, port 0. | 1332 // Read from MP 0, port 0. |
| 1333 read_buffer_size = static_cast<uint32_t>(sizeof(read_buffer)); | 1333 read_buffer_size = static_cast<uint32_t>(sizeof(read_buffer)); |
| 1334 read_num_handles = 10; // Maximum to get. | 1334 read_num_handles = 10; // Maximum to get. |
| 1335 EXPECT_EQ(MOJO_RESULT_OK, | 1335 EXPECT_EQ(MOJO_RESULT_OK, |
| (...skipping 11 matching lines...) Expand all Loading... |
| 1347 read_handles[0].dispatcher->GetType()); | 1347 read_handles[0].dispatcher->GetType()); |
| 1348 EXPECT_EQ(MessagePipeDispatcher::kDefaultHandleRights, | 1348 EXPECT_EQ(MessagePipeDispatcher::kDefaultHandleRights, |
| 1349 read_handles[0].rights); | 1349 read_handles[0].rights); |
| 1350 dispatcher = RefPtr<MessagePipeDispatcher>( | 1350 dispatcher = RefPtr<MessagePipeDispatcher>( |
| 1351 static_cast<MessagePipeDispatcher*>(read_handles[0].dispatcher.get())); | 1351 static_cast<MessagePipeDispatcher*>(read_handles[0].dispatcher.get())); |
| 1352 read_handles.clear(); | 1352 read_handles.clear(); |
| 1353 | 1353 |
| 1354 // Add the waiter now, before it becomes readable to avoid a race. | 1354 // Add the waiter now, before it becomes readable to avoid a race. |
| 1355 waiter.Init(); | 1355 waiter.Init(); |
| 1356 ASSERT_EQ(MOJO_RESULT_OK, | 1356 ASSERT_EQ(MOJO_RESULT_OK, |
| 1357 dispatcher->AddAwakable(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 789, | 1357 dispatcher->AddAwakable(&waiter, 789, false, |
| 1358 nullptr)); | 1358 MOJO_HANDLE_SIGNAL_READABLE, nullptr)); |
| 1359 | 1359 |
| 1360 // Write to "local_mp", port 1. | 1360 // Write to "local_mp", port 1. |
| 1361 EXPECT_EQ( | 1361 EXPECT_EQ( |
| 1362 MOJO_RESULT_OK, | 1362 MOJO_RESULT_OK, |
| 1363 local_mp->WriteMessage(1, UserPointer<const void>(kHello), sizeof(kHello), | 1363 local_mp->WriteMessage(1, UserPointer<const void>(kHello), sizeof(kHello), |
| 1364 nullptr, MOJO_WRITE_MESSAGE_FLAG_NONE)); | 1364 nullptr, MOJO_WRITE_MESSAGE_FLAG_NONE)); |
| 1365 | 1365 |
| 1366 // Wait for the dispatcher to become readable. | 1366 // Wait for the dispatcher to become readable. |
| 1367 EXPECT_EQ(MOJO_RESULT_OK, | 1367 EXPECT_EQ(MOJO_RESULT_OK, |
| 1368 waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context, nullptr)); | 1368 waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context, nullptr)); |
| 1369 EXPECT_EQ(789u, context); | 1369 EXPECT_EQ(789u, context); |
| 1370 hss = HandleSignalsState(); | 1370 hss = HandleSignalsState(); |
| 1371 dispatcher->RemoveAwakable(&waiter, &hss); | 1371 dispatcher->RemoveAwakable(false, &waiter, 0, &hss); |
| 1372 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, | 1372 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, |
| 1373 hss.satisfied_signals); | 1373 hss.satisfied_signals); |
| 1374 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE | | 1374 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE | |
| 1375 MOJO_HANDLE_SIGNAL_PEER_CLOSED, | 1375 MOJO_HANDLE_SIGNAL_PEER_CLOSED, |
| 1376 hss.satisfiable_signals); | 1376 hss.satisfiable_signals); |
| 1377 | 1377 |
| 1378 // Read from the dispatcher. | 1378 // Read from the dispatcher. |
| 1379 memset(read_buffer, 0, sizeof(read_buffer)); | 1379 memset(read_buffer, 0, sizeof(read_buffer)); |
| 1380 read_buffer_size = static_cast<uint32_t>(sizeof(read_buffer)); | 1380 read_buffer_size = static_cast<uint32_t>(sizeof(read_buffer)); |
| 1381 EXPECT_EQ(MOJO_RESULT_OK, | 1381 EXPECT_EQ(MOJO_RESULT_OK, |
| 1382 dispatcher->ReadMessage(UserPointer<void>(read_buffer), | 1382 dispatcher->ReadMessage(UserPointer<void>(read_buffer), |
| 1383 MakeUserPointer(&read_buffer_size), 0, | 1383 MakeUserPointer(&read_buffer_size), 0, |
| 1384 nullptr, MOJO_READ_MESSAGE_FLAG_NONE)); | 1384 nullptr, MOJO_READ_MESSAGE_FLAG_NONE)); |
| 1385 EXPECT_EQ(sizeof(kHello), static_cast<size_t>(read_buffer_size)); | 1385 EXPECT_EQ(sizeof(kHello), static_cast<size_t>(read_buffer_size)); |
| 1386 EXPECT_STREQ(kHello, read_buffer); | 1386 EXPECT_STREQ(kHello, read_buffer); |
| 1387 | 1387 |
| 1388 // Prepare to wait on "local_mp", port 1. | 1388 // Prepare to wait on "local_mp", port 1. |
| 1389 waiter.Init(); | 1389 waiter.Init(); |
| 1390 ASSERT_EQ(MOJO_RESULT_OK, | 1390 ASSERT_EQ(MOJO_RESULT_OK, |
| 1391 local_mp->AddAwakable(1, &waiter, MOJO_HANDLE_SIGNAL_READABLE, | 1391 local_mp->AddAwakable(1, &waiter, 789, false, |
| 1392 false, 789, nullptr)); | 1392 MOJO_HANDLE_SIGNAL_READABLE, nullptr)); |
| 1393 | 1393 |
| 1394 // Write to the dispatcher. | 1394 // Write to the dispatcher. |
| 1395 EXPECT_EQ(MOJO_RESULT_OK, dispatcher->WriteMessage( | 1395 EXPECT_EQ(MOJO_RESULT_OK, dispatcher->WriteMessage( |
| 1396 UserPointer<const void>(kHello), sizeof(kHello), | 1396 UserPointer<const void>(kHello), sizeof(kHello), |
| 1397 nullptr, MOJO_WRITE_MESSAGE_FLAG_NONE)); | 1397 nullptr, MOJO_WRITE_MESSAGE_FLAG_NONE)); |
| 1398 | 1398 |
| 1399 // Wait. | 1399 // Wait. |
| 1400 EXPECT_EQ(MOJO_RESULT_OK, | 1400 EXPECT_EQ(MOJO_RESULT_OK, |
| 1401 waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context, nullptr)); | 1401 waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context, nullptr)); |
| 1402 EXPECT_EQ(789u, context); | 1402 EXPECT_EQ(789u, context); |
| 1403 hss = HandleSignalsState(); | 1403 hss = HandleSignalsState(); |
| 1404 local_mp->RemoveAwakable(1, &waiter, &hss); | 1404 local_mp->RemoveAwakable(1, false, &waiter, 0, &hss); |
| 1405 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, | 1405 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, |
| 1406 hss.satisfied_signals); | 1406 hss.satisfied_signals); |
| 1407 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE | | 1407 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE | |
| 1408 MOJO_HANDLE_SIGNAL_PEER_CLOSED, | 1408 MOJO_HANDLE_SIGNAL_PEER_CLOSED, |
| 1409 hss.satisfiable_signals); | 1409 hss.satisfiable_signals); |
| 1410 | 1410 |
| 1411 // Read from "local_mp", port 1. | 1411 // Read from "local_mp", port 1. |
| 1412 memset(read_buffer, 0, sizeof(read_buffer)); | 1412 memset(read_buffer, 0, sizeof(read_buffer)); |
| 1413 read_buffer_size = static_cast<uint32_t>(sizeof(read_buffer)); | 1413 read_buffer_size = static_cast<uint32_t>(sizeof(read_buffer)); |
| 1414 EXPECT_EQ(MOJO_RESULT_OK, | 1414 EXPECT_EQ(MOJO_RESULT_OK, |
| (...skipping 10 matching lines...) Expand all Loading... |
| 1425 mp0->Close(0); | 1425 mp0->Close(0); |
| 1426 mp1->Close(1); | 1426 mp1->Close(1); |
| 1427 EXPECT_EQ(MOJO_RESULT_OK, dispatcher->Close()); | 1427 EXPECT_EQ(MOJO_RESULT_OK, dispatcher->Close()); |
| 1428 // Note that |local_mp|'s port 0 belong to |dispatcher|, which was closed. | 1428 // Note that |local_mp|'s port 0 belong to |dispatcher|, which was closed. |
| 1429 local_mp->Close(1); | 1429 local_mp->Close(1); |
| 1430 } | 1430 } |
| 1431 | 1431 |
| 1432 } // namespace | 1432 } // namespace |
| 1433 } // namespace system | 1433 } // namespace system |
| 1434 } // namespace mojo | 1434 } // namespace mojo |
| OLD | NEW |