| 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 177 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 188 auto mp0 = MessagePipe::CreateLocalProxy(&ep0); | 188 auto mp0 = MessagePipe::CreateLocalProxy(&ep0); |
| 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( | 198 ASSERT_EQ(MOJO_RESULT_OK, |
| 199 MOJO_RESULT_OK, | 199 mp1->AddAwakable(1, &waiter, MOJO_HANDLE_SIGNAL_READABLE, false, |
| 200 mp1->AddAwakable(1, &waiter, MOJO_HANDLE_SIGNAL_READABLE, 123, nullptr)); | 200 123, 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, waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context)); | 209 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context)); |
| 210 EXPECT_EQ(123u, context); | 210 EXPECT_EQ(123u, context); |
| 211 hss = HandleSignalsState(); | 211 hss = HandleSignalsState(); |
| 212 mp1->RemoveAwakable(1, &waiter, &hss); | 212 mp1->RemoveAwakable(1, &waiter, &hss); |
| 213 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, | 213 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, |
| 214 hss.satisfied_signals); | 214 hss.satisfied_signals); |
| 215 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE | | 215 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE | |
| 216 MOJO_HANDLE_SIGNAL_PEER_CLOSED, | 216 MOJO_HANDLE_SIGNAL_PEER_CLOSED, |
| 217 hss.satisfiable_signals); | 217 hss.satisfiable_signals); |
| 218 | 218 |
| 219 // Read from MP 1, port 1. | 219 // Read from MP 1, port 1. |
| 220 EXPECT_EQ(MOJO_RESULT_OK, | 220 EXPECT_EQ(MOJO_RESULT_OK, |
| 221 mp1->ReadMessage(1, UserPointer<void>(buffer), | 221 mp1->ReadMessage(1, UserPointer<void>(buffer), |
| 222 MakeUserPointer(&buffer_size), nullptr, nullptr, | 222 MakeUserPointer(&buffer_size), nullptr, nullptr, |
| 223 MOJO_READ_MESSAGE_FLAG_NONE)); | 223 MOJO_READ_MESSAGE_FLAG_NONE)); |
| 224 EXPECT_EQ(sizeof(kHello), static_cast<size_t>(buffer_size)); | 224 EXPECT_EQ(sizeof(kHello), static_cast<size_t>(buffer_size)); |
| 225 EXPECT_STREQ(kHello, buffer); | 225 EXPECT_STREQ(kHello, buffer); |
| 226 | 226 |
| 227 // Write in the other direction: MP 1, port 1 -> ... -> MP 0, port 0. | 227 // Write in the other direction: MP 1, port 1 -> ... -> MP 0, port 0. |
| 228 | 228 |
| 229 waiter.Init(); | 229 waiter.Init(); |
| 230 ASSERT_EQ( | 230 ASSERT_EQ(MOJO_RESULT_OK, |
| 231 MOJO_RESULT_OK, | 231 mp0->AddAwakable(0, &waiter, MOJO_HANDLE_SIGNAL_READABLE, false, |
| 232 mp0->AddAwakable(0, &waiter, MOJO_HANDLE_SIGNAL_READABLE, 456, nullptr)); | 232 456, nullptr)); |
| 233 | 233 |
| 234 EXPECT_EQ( | 234 EXPECT_EQ( |
| 235 MOJO_RESULT_OK, | 235 MOJO_RESULT_OK, |
| 236 mp1->WriteMessage(1, UserPointer<const void>(kWorld), sizeof(kWorld), | 236 mp1->WriteMessage(1, UserPointer<const void>(kWorld), sizeof(kWorld), |
| 237 nullptr, MOJO_WRITE_MESSAGE_FLAG_NONE)); | 237 nullptr, MOJO_WRITE_MESSAGE_FLAG_NONE)); |
| 238 | 238 |
| 239 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context)); | 239 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context)); |
| 240 EXPECT_EQ(456u, context); | 240 EXPECT_EQ(456u, context); |
| 241 hss = HandleSignalsState(); | 241 hss = HandleSignalsState(); |
| 242 mp0->RemoveAwakable(0, &waiter, &hss); | 242 mp0->RemoveAwakable(0, &waiter, &hss); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 255 EXPECT_STREQ(kWorld, buffer); | 255 EXPECT_STREQ(kWorld, buffer); |
| 256 | 256 |
| 257 // Close MP 0, port 0. | 257 // Close MP 0, port 0. |
| 258 mp0->Close(0); | 258 mp0->Close(0); |
| 259 | 259 |
| 260 // Try to wait for MP 1, port 1 to become readable. This will eventually fail | 260 // Try to wait for MP 1, port 1 to become readable. This will eventually fail |
| 261 // when it realizes that MP 0, port 0 has been closed. (It may also fail | 261 // when it realizes that MP 0, port 0 has been closed. (It may also fail |
| 262 // immediately.) | 262 // immediately.) |
| 263 waiter.Init(); | 263 waiter.Init(); |
| 264 hss = HandleSignalsState(); | 264 hss = HandleSignalsState(); |
| 265 MojoResult result = | 265 MojoResult result = mp1->AddAwakable(1, &waiter, MOJO_HANDLE_SIGNAL_READABLE, |
| 266 mp1->AddAwakable(1, &waiter, MOJO_HANDLE_SIGNAL_READABLE, 789, &hss); | 266 false, 789, &hss); |
| 267 if (result == MOJO_RESULT_OK) { | 267 if (result == MOJO_RESULT_OK) { |
| 268 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, | 268 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
| 269 waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context)); | 269 waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context)); |
| 270 EXPECT_EQ(789u, context); | 270 EXPECT_EQ(789u, context); |
| 271 hss = HandleSignalsState(); | 271 hss = HandleSignalsState(); |
| 272 mp1->RemoveAwakable(1, &waiter, &hss); | 272 mp1->RemoveAwakable(1, &waiter, &hss); |
| 273 } | 273 } |
| 274 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfied_signals); | 274 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfied_signals); |
| 275 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfiable_signals); | 275 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfiable_signals); |
| 276 | 276 |
| (...skipping 15 matching lines...) Expand all Loading... |
| 292 RefPtr<ChannelEndpoint> ep1; | 292 RefPtr<ChannelEndpoint> ep1; |
| 293 auto mp1 = MessagePipe::CreateProxyLocal(&ep1); | 293 auto mp1 = MessagePipe::CreateProxyLocal(&ep1); |
| 294 BootstrapChannelEndpoints(std::move(ep0), std::move(ep1)); | 294 BootstrapChannelEndpoints(std::move(ep0), std::move(ep1)); |
| 295 | 295 |
| 296 // Close MP 0, port 0. | 296 // Close MP 0, port 0. |
| 297 mp0->Close(0); | 297 mp0->Close(0); |
| 298 | 298 |
| 299 // Try to wait for MP 1, port 1 to be signaled with peer closed. | 299 // Try to wait for MP 1, port 1 to be signaled with peer closed. |
| 300 waiter.Init(); | 300 waiter.Init(); |
| 301 hss = HandleSignalsState(); | 301 hss = HandleSignalsState(); |
| 302 MojoResult result = | 302 MojoResult result = mp1->AddAwakable( |
| 303 mp1->AddAwakable(1, &waiter, MOJO_HANDLE_SIGNAL_PEER_CLOSED, 101, &hss); | 303 1, &waiter, MOJO_HANDLE_SIGNAL_PEER_CLOSED, false, 101, &hss); |
| 304 if (result == MOJO_RESULT_OK) { | 304 if (result == MOJO_RESULT_OK) { |
| 305 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context)); | 305 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context)); |
| 306 EXPECT_EQ(101u, context); | 306 EXPECT_EQ(101u, context); |
| 307 hss = HandleSignalsState(); | 307 hss = HandleSignalsState(); |
| 308 mp1->RemoveAwakable(1, &waiter, &hss); | 308 mp1->RemoveAwakable(1, &waiter, &hss); |
| 309 } | 309 } |
| 310 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfied_signals); | 310 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfied_signals); |
| 311 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfiable_signals); | 311 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfiable_signals); |
| 312 | 312 |
| 313 // And MP 1, port 1. | 313 // And MP 1, port 1. |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 346 &max_platform_handle_count); | 346 &max_platform_handle_count); |
| 347 EXPECT_GT(max_endpoint_info_size, 0u); | 347 EXPECT_GT(max_endpoint_info_size, 0u); |
| 348 ASSERT_EQ(0u, max_platform_handle_count); | 348 ASSERT_EQ(0u, max_platform_handle_count); |
| 349 std::unique_ptr<char[]> endpoint_info(new char[max_endpoint_info_size]); | 349 std::unique_ptr<char[]> endpoint_info(new char[max_endpoint_info_size]); |
| 350 size_t endpoint_info_size; | 350 size_t endpoint_info_size; |
| 351 mp2->EndSerialize(1, channels(0), endpoint_info.get(), &endpoint_info_size, | 351 mp2->EndSerialize(1, channels(0), endpoint_info.get(), &endpoint_info_size, |
| 352 nullptr); | 352 nullptr); |
| 353 EXPECT_EQ(max_endpoint_info_size, endpoint_info_size); | 353 EXPECT_EQ(max_endpoint_info_size, endpoint_info_size); |
| 354 | 354 |
| 355 waiter.Init(); | 355 waiter.Init(); |
| 356 ASSERT_EQ( | 356 ASSERT_EQ(MOJO_RESULT_OK, |
| 357 MOJO_RESULT_OK, | 357 mp1->AddAwakable(1, &waiter, MOJO_HANDLE_SIGNAL_READABLE, false, |
| 358 mp1->AddAwakable(1, &waiter, MOJO_HANDLE_SIGNAL_READABLE, 123, nullptr)); | 358 123, nullptr)); |
| 359 | 359 |
| 360 EXPECT_EQ(MOJO_RESULT_OK, | 360 EXPECT_EQ(MOJO_RESULT_OK, |
| 361 mp0->WriteMessage(0, UserPointer<const void>(endpoint_info.get()), | 361 mp0->WriteMessage(0, UserPointer<const void>(endpoint_info.get()), |
| 362 static_cast<uint32_t>(endpoint_info_size), | 362 static_cast<uint32_t>(endpoint_info_size), |
| 363 nullptr, MOJO_WRITE_MESSAGE_FLAG_NONE)); | 363 nullptr, MOJO_WRITE_MESSAGE_FLAG_NONE)); |
| 364 | 364 |
| 365 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context)); | 365 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context)); |
| 366 EXPECT_EQ(123u, context); | 366 EXPECT_EQ(123u, context); |
| 367 hss = HandleSignalsState(); | 367 hss = HandleSignalsState(); |
| 368 mp1->RemoveAwakable(1, &waiter, &hss); | 368 mp1->RemoveAwakable(1, &waiter, &hss); |
| (...skipping 17 matching lines...) Expand all Loading... |
| 386 // Warning: The local side of mp3 is port 0, not port 1. | 386 // Warning: The local side of mp3 is port 0, not port 1. |
| 387 RefPtr<IncomingEndpoint> incoming_endpoint = | 387 RefPtr<IncomingEndpoint> incoming_endpoint = |
| 388 channels(1)->DeserializeEndpoint(received_endpoint_info.get()); | 388 channels(1)->DeserializeEndpoint(received_endpoint_info.get()); |
| 389 ASSERT_TRUE(incoming_endpoint); | 389 ASSERT_TRUE(incoming_endpoint); |
| 390 RefPtr<MessagePipe> mp3 = incoming_endpoint->ConvertToMessagePipe(); | 390 RefPtr<MessagePipe> mp3 = incoming_endpoint->ConvertToMessagePipe(); |
| 391 ASSERT_TRUE(mp3); | 391 ASSERT_TRUE(mp3); |
| 392 | 392 |
| 393 // Write: MP 2, port 0 -> MP 3, port 1. | 393 // Write: MP 2, port 0 -> MP 3, port 1. |
| 394 | 394 |
| 395 waiter.Init(); | 395 waiter.Init(); |
| 396 ASSERT_EQ( | 396 ASSERT_EQ(MOJO_RESULT_OK, |
| 397 MOJO_RESULT_OK, | 397 mp3->AddAwakable(0, &waiter, MOJO_HANDLE_SIGNAL_READABLE, false, |
| 398 mp3->AddAwakable(0, &waiter, MOJO_HANDLE_SIGNAL_READABLE, 789, nullptr)); | 398 789, nullptr)); |
| 399 | 399 |
| 400 EXPECT_EQ( | 400 EXPECT_EQ( |
| 401 MOJO_RESULT_OK, | 401 MOJO_RESULT_OK, |
| 402 mp2->WriteMessage(0, UserPointer<const void>(kHello), sizeof(kHello), | 402 mp2->WriteMessage(0, UserPointer<const void>(kHello), sizeof(kHello), |
| 403 nullptr, MOJO_WRITE_MESSAGE_FLAG_NONE)); | 403 nullptr, MOJO_WRITE_MESSAGE_FLAG_NONE)); |
| 404 | 404 |
| 405 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context)); | 405 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context)); |
| 406 EXPECT_EQ(789u, context); | 406 EXPECT_EQ(789u, context); |
| 407 hss = HandleSignalsState(); | 407 hss = HandleSignalsState(); |
| 408 mp3->RemoveAwakable(0, &waiter, &hss); | 408 mp3->RemoveAwakable(0, &waiter, &hss); |
| (...skipping 25 matching lines...) Expand all Loading... |
| 434 EXPECT_EQ(MOJO_RESULT_OK, | 434 EXPECT_EQ(MOJO_RESULT_OK, |
| 435 mp3->ReadMessage(0, UserPointer<void>(buffer), | 435 mp3->ReadMessage(0, UserPointer<void>(buffer), |
| 436 MakeUserPointer(&buffer_size), nullptr, nullptr, | 436 MakeUserPointer(&buffer_size), nullptr, nullptr, |
| 437 MOJO_READ_MESSAGE_FLAG_NONE)); | 437 MOJO_READ_MESSAGE_FLAG_NONE)); |
| 438 EXPECT_EQ(sizeof(kHello), static_cast<size_t>(buffer_size)); | 438 EXPECT_EQ(sizeof(kHello), static_cast<size_t>(buffer_size)); |
| 439 EXPECT_STREQ(kHello, buffer); | 439 EXPECT_STREQ(kHello, buffer); |
| 440 | 440 |
| 441 // Write: MP 0, port 0 -> MP 1, port 1 again. | 441 // Write: MP 0, port 0 -> MP 1, port 1 again. |
| 442 | 442 |
| 443 waiter.Init(); | 443 waiter.Init(); |
| 444 ASSERT_EQ( | 444 ASSERT_EQ(MOJO_RESULT_OK, |
| 445 MOJO_RESULT_OK, | 445 mp1->AddAwakable(1, &waiter, MOJO_HANDLE_SIGNAL_READABLE, false, |
| 446 mp1->AddAwakable(1, &waiter, MOJO_HANDLE_SIGNAL_READABLE, 123, nullptr)); | 446 123, nullptr)); |
| 447 | 447 |
| 448 EXPECT_EQ( | 448 EXPECT_EQ( |
| 449 MOJO_RESULT_OK, | 449 MOJO_RESULT_OK, |
| 450 mp0->WriteMessage(0, UserPointer<const void>(kWorld), sizeof(kWorld), | 450 mp0->WriteMessage(0, UserPointer<const void>(kWorld), sizeof(kWorld), |
| 451 nullptr, MOJO_WRITE_MESSAGE_FLAG_NONE)); | 451 nullptr, MOJO_WRITE_MESSAGE_FLAG_NONE)); |
| 452 | 452 |
| 453 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context)); | 453 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context)); |
| 454 EXPECT_EQ(123u, context); | 454 EXPECT_EQ(123u, context); |
| 455 hss = HandleSignalsState(); | 455 hss = HandleSignalsState(); |
| 456 mp1->RemoveAwakable(1, &waiter, &hss); | 456 mp1->RemoveAwakable(1, &waiter, &hss); |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 516 mp0->Close(0); | 516 mp0->Close(0); |
| 517 | 517 |
| 518 BootstrapChannelEndpointNoWait(0, std::move(ep0)); | 518 BootstrapChannelEndpointNoWait(0, std::move(ep0)); |
| 519 | 519 |
| 520 RefPtr<ChannelEndpoint> ep1; | 520 RefPtr<ChannelEndpoint> ep1; |
| 521 auto mp1 = MessagePipe::CreateProxyLocal(&ep1); | 521 auto mp1 = MessagePipe::CreateProxyLocal(&ep1); |
| 522 | 522 |
| 523 // Prepare to wait on MP 1, port 1. (Add the waiter now. Otherwise, if we do | 523 // Prepare to wait on MP 1, port 1. (Add the waiter now. Otherwise, if we do |
| 524 // it later, it might already be readable.) | 524 // it later, it might already be readable.) |
| 525 waiter.Init(); | 525 waiter.Init(); |
| 526 ASSERT_EQ( | 526 ASSERT_EQ(MOJO_RESULT_OK, |
| 527 MOJO_RESULT_OK, | 527 mp1->AddAwakable(1, &waiter, MOJO_HANDLE_SIGNAL_READABLE, false, |
| 528 mp1->AddAwakable(1, &waiter, MOJO_HANDLE_SIGNAL_READABLE, 123, nullptr)); | 528 123, nullptr)); |
| 529 | 529 |
| 530 BootstrapChannelEndpointNoWait(1, std::move(ep1)); | 530 BootstrapChannelEndpointNoWait(1, std::move(ep1)); |
| 531 | 531 |
| 532 // Wait. | 532 // Wait. |
| 533 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context)); | 533 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context)); |
| 534 EXPECT_EQ(123u, context); | 534 EXPECT_EQ(123u, context); |
| 535 hss = HandleSignalsState(); | 535 hss = HandleSignalsState(); |
| 536 // Note: MP 1, port 1 should definitely should be readable, but it may or may | 536 // Note: MP 1, port 1 should definitely should be readable, but it may or may |
| 537 // not appear as writable (there's a race, and it may not have noticed that | 537 // not appear as writable (there's a race, and it may not have noticed that |
| 538 // the other side was closed yet -- e.g., inserting a sleep here would make it | 538 // the other side was closed yet -- e.g., inserting a sleep here would make it |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 578 | 578 |
| 579 // Close MP 0, port 0 before channel 1 is even connected. | 579 // Close MP 0, port 0 before channel 1 is even connected. |
| 580 mp0->Close(0); | 580 mp0->Close(0); |
| 581 | 581 |
| 582 RefPtr<ChannelEndpoint> ep1; | 582 RefPtr<ChannelEndpoint> ep1; |
| 583 auto mp1 = MessagePipe::CreateProxyLocal(&ep1); | 583 auto mp1 = MessagePipe::CreateProxyLocal(&ep1); |
| 584 | 584 |
| 585 // Prepare to wait on MP 1, port 1. (Add the waiter now. Otherwise, if we do | 585 // Prepare to wait on MP 1, port 1. (Add the waiter now. Otherwise, if we do |
| 586 // it later, it might already be readable.) | 586 // it later, it might already be readable.) |
| 587 waiter.Init(); | 587 waiter.Init(); |
| 588 ASSERT_EQ( | 588 ASSERT_EQ(MOJO_RESULT_OK, |
| 589 MOJO_RESULT_OK, | 589 mp1->AddAwakable(1, &waiter, MOJO_HANDLE_SIGNAL_READABLE, false, |
| 590 mp1->AddAwakable(1, &waiter, MOJO_HANDLE_SIGNAL_READABLE, 123, nullptr)); | 590 123, nullptr)); |
| 591 | 591 |
| 592 BootstrapChannelEndpointNoWait(1, std::move(ep1)); | 592 BootstrapChannelEndpointNoWait(1, std::move(ep1)); |
| 593 | 593 |
| 594 // Wait. | 594 // Wait. |
| 595 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context)); | 595 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context)); |
| 596 EXPECT_EQ(123u, context); | 596 EXPECT_EQ(123u, context); |
| 597 hss = HandleSignalsState(); | 597 hss = HandleSignalsState(); |
| 598 // Note: MP 1, port 1 should definitely should be readable, but it may or may | 598 // Note: MP 1, port 1 should definitely should be readable, but it may or may |
| 599 // not appear as writable (there's a race, and it may not have noticed that | 599 // not appear as writable (there's a race, and it may not have noticed that |
| 600 // the other side was closed yet -- e.g., inserting a sleep here would make it | 600 // the other side was closed yet -- e.g., inserting a sleep here would make it |
| (...skipping 30 matching lines...) Expand all Loading... |
| 631 auto dispatcher = MessagePipeDispatcher::Create( | 631 auto dispatcher = MessagePipeDispatcher::Create( |
| 632 MessagePipeDispatcher::kDefaultCreateOptions); | 632 MessagePipeDispatcher::kDefaultCreateOptions); |
| 633 auto local_mp = MessagePipe::CreateLocalLocal(); | 633 auto local_mp = MessagePipe::CreateLocalLocal(); |
| 634 dispatcher->Init(local_mp.Clone(), 0); | 634 dispatcher->Init(local_mp.Clone(), 0); |
| 635 Handle handle(std::move(dispatcher), | 635 Handle handle(std::move(dispatcher), |
| 636 MessagePipeDispatcher::kDefaultHandleRights); | 636 MessagePipeDispatcher::kDefaultHandleRights); |
| 637 | 637 |
| 638 // Prepare to wait on MP 1, port 1. (Add the waiter now. Otherwise, if we do | 638 // Prepare to wait on MP 1, port 1. (Add the waiter now. Otherwise, if we do |
| 639 // it later, it might already be readable.) | 639 // it later, it might already be readable.) |
| 640 waiter.Init(); | 640 waiter.Init(); |
| 641 ASSERT_EQ( | 641 ASSERT_EQ(MOJO_RESULT_OK, |
| 642 MOJO_RESULT_OK, | 642 mp1->AddAwakable(1, &waiter, MOJO_HANDLE_SIGNAL_READABLE, false, |
| 643 mp1->AddAwakable(1, &waiter, MOJO_HANDLE_SIGNAL_READABLE, 123, nullptr)); | 643 123, nullptr)); |
| 644 | 644 |
| 645 // Write to MP 0, port 0. | 645 // Write to MP 0, port 0. |
| 646 { | 646 { |
| 647 HandleTransport transport(test::HandleTryStartTransport(handle)); | 647 HandleTransport transport(test::HandleTryStartTransport(handle)); |
| 648 EXPECT_TRUE(transport.is_valid()); | 648 EXPECT_TRUE(transport.is_valid()); |
| 649 | 649 |
| 650 std::vector<HandleTransport> transports; | 650 std::vector<HandleTransport> transports; |
| 651 transports.push_back(transport); | 651 transports.push_back(transport); |
| 652 EXPECT_EQ( | 652 EXPECT_EQ( |
| 653 MOJO_RESULT_OK, | 653 MOJO_RESULT_OK, |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 727 EXPECT_EQ(MOJO_RESULT_OK, | 727 EXPECT_EQ(MOJO_RESULT_OK, |
| 728 dispatcher->ReadMessage(UserPointer<void>(read_buffer), | 728 dispatcher->ReadMessage(UserPointer<void>(read_buffer), |
| 729 MakeUserPointer(&read_buffer_size), 0, | 729 MakeUserPointer(&read_buffer_size), 0, |
| 730 nullptr, MOJO_READ_MESSAGE_FLAG_NONE)); | 730 nullptr, MOJO_READ_MESSAGE_FLAG_NONE)); |
| 731 EXPECT_EQ(sizeof(kHello), static_cast<size_t>(read_buffer_size)); | 731 EXPECT_EQ(sizeof(kHello), static_cast<size_t>(read_buffer_size)); |
| 732 EXPECT_STREQ(kHello, read_buffer); | 732 EXPECT_STREQ(kHello, read_buffer); |
| 733 | 733 |
| 734 // Prepare to wait on "local_mp", port 1. | 734 // Prepare to wait on "local_mp", port 1. |
| 735 waiter.Init(); | 735 waiter.Init(); |
| 736 ASSERT_EQ(MOJO_RESULT_OK, | 736 ASSERT_EQ(MOJO_RESULT_OK, |
| 737 local_mp->AddAwakable(1, &waiter, MOJO_HANDLE_SIGNAL_READABLE, 789, | 737 local_mp->AddAwakable(1, &waiter, MOJO_HANDLE_SIGNAL_READABLE, |
| 738 nullptr)); | 738 false, 789, nullptr)); |
| 739 | 739 |
| 740 // Write to the dispatcher. | 740 // Write to the dispatcher. |
| 741 EXPECT_EQ(MOJO_RESULT_OK, dispatcher->WriteMessage( | 741 EXPECT_EQ(MOJO_RESULT_OK, dispatcher->WriteMessage( |
| 742 UserPointer<const void>(kHello), sizeof(kHello), | 742 UserPointer<const void>(kHello), sizeof(kHello), |
| 743 nullptr, MOJO_WRITE_MESSAGE_FLAG_NONE)); | 743 nullptr, MOJO_WRITE_MESSAGE_FLAG_NONE)); |
| 744 | 744 |
| 745 // Wait. | 745 // Wait. |
| 746 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context)); | 746 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context)); |
| 747 EXPECT_EQ(789u, context); | 747 EXPECT_EQ(789u, context); |
| 748 hss = HandleSignalsState(); | 748 hss = HandleSignalsState(); |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 821 | 821 |
| 822 RefPtr<ChannelEndpoint> ep0; | 822 RefPtr<ChannelEndpoint> ep0; |
| 823 auto mp0 = MessagePipe::CreateLocalProxy(&ep0); | 823 auto mp0 = MessagePipe::CreateLocalProxy(&ep0); |
| 824 RefPtr<ChannelEndpoint> ep1; | 824 RefPtr<ChannelEndpoint> ep1; |
| 825 auto mp1 = MessagePipe::CreateProxyLocal(&ep1); | 825 auto mp1 = MessagePipe::CreateProxyLocal(&ep1); |
| 826 BootstrapChannelEndpoints(std::move(ep0), std::move(ep1)); | 826 BootstrapChannelEndpoints(std::move(ep0), std::move(ep1)); |
| 827 | 827 |
| 828 // Prepare to wait on MP 1, port 1. (Add the waiter now. Otherwise, if we do | 828 // Prepare to wait on MP 1, port 1. (Add the waiter now. Otherwise, if we do |
| 829 // it later, it might already be readable.) | 829 // it later, it might already be readable.) |
| 830 waiter.Init(); | 830 waiter.Init(); |
| 831 ASSERT_EQ( | 831 ASSERT_EQ(MOJO_RESULT_OK, |
| 832 MOJO_RESULT_OK, | 832 mp1->AddAwakable(1, &waiter, MOJO_HANDLE_SIGNAL_READABLE, false, |
| 833 mp1->AddAwakable(1, &waiter, MOJO_HANDLE_SIGNAL_READABLE, 123, nullptr)); | 833 123, nullptr)); |
| 834 | 834 |
| 835 // Write to MP 0, port 0. | 835 // Write to MP 0, port 0. |
| 836 { | 836 { |
| 837 HandleTransport transport(test::HandleTryStartTransport(handle)); | 837 HandleTransport transport(test::HandleTryStartTransport(handle)); |
| 838 EXPECT_TRUE(transport.is_valid()); | 838 EXPECT_TRUE(transport.is_valid()); |
| 839 | 839 |
| 840 std::vector<HandleTransport> transports; | 840 std::vector<HandleTransport> transports; |
| 841 transports.push_back(transport); | 841 transports.push_back(transport); |
| 842 EXPECT_EQ( | 842 EXPECT_EQ( |
| 843 MOJO_RESULT_OK, | 843 MOJO_RESULT_OK, |
| (...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 955 ASSERT_TRUE(mapping0); | 955 ASSERT_TRUE(mapping0); |
| 956 ASSERT_TRUE(mapping0->GetBase()); | 956 ASSERT_TRUE(mapping0->GetBase()); |
| 957 ASSERT_EQ(100u, mapping0->GetLength()); | 957 ASSERT_EQ(100u, mapping0->GetLength()); |
| 958 static_cast<char*>(mapping0->GetBase())[0] = 'A'; | 958 static_cast<char*>(mapping0->GetBase())[0] = 'A'; |
| 959 static_cast<char*>(mapping0->GetBase())[50] = 'B'; | 959 static_cast<char*>(mapping0->GetBase())[50] = 'B'; |
| 960 static_cast<char*>(mapping0->GetBase())[99] = 'C'; | 960 static_cast<char*>(mapping0->GetBase())[99] = 'C'; |
| 961 | 961 |
| 962 // Prepare to wait on MP 1, port 1. (Add the waiter now. Otherwise, if we do | 962 // Prepare to wait on MP 1, port 1. (Add the waiter now. Otherwise, if we do |
| 963 // it later, it might already be readable.) | 963 // it later, it might already be readable.) |
| 964 waiter.Init(); | 964 waiter.Init(); |
| 965 ASSERT_EQ( | 965 ASSERT_EQ(MOJO_RESULT_OK, |
| 966 MOJO_RESULT_OK, | 966 mp1->AddAwakable(1, &waiter, MOJO_HANDLE_SIGNAL_READABLE, false, |
| 967 mp1->AddAwakable(1, &waiter, MOJO_HANDLE_SIGNAL_READABLE, 123, nullptr)); | 967 123, nullptr)); |
| 968 | 968 |
| 969 // Write to MP 0, port 0. | 969 // Write to MP 0, port 0. |
| 970 { | 970 { |
| 971 HandleTransport transport(test::HandleTryStartTransport(handle)); | 971 HandleTransport transport(test::HandleTryStartTransport(handle)); |
| 972 EXPECT_TRUE(transport.is_valid()); | 972 EXPECT_TRUE(transport.is_valid()); |
| 973 | 973 |
| 974 std::vector<HandleTransport> transports; | 974 std::vector<HandleTransport> transports; |
| 975 transports.push_back(transport); | 975 transports.push_back(transport); |
| 976 EXPECT_EQ( | 976 EXPECT_EQ( |
| 977 MOJO_RESULT_OK, | 977 MOJO_RESULT_OK, |
| (...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1070 // We'll try to pass this dispatcher, which will cause a |PlatformHandle| to | 1070 // We'll try to pass this dispatcher, which will cause a |PlatformHandle| to |
| 1071 // be passed. | 1071 // be passed. |
| 1072 auto dispatcher = | 1072 auto dispatcher = |
| 1073 PlatformHandleDispatcher::Create(PlatformHandleFromFILE(std::move(fp))); | 1073 PlatformHandleDispatcher::Create(PlatformHandleFromFILE(std::move(fp))); |
| 1074 Handle handle(std::move(dispatcher), | 1074 Handle handle(std::move(dispatcher), |
| 1075 PlatformHandleDispatcher::kDefaultHandleRights); | 1075 PlatformHandleDispatcher::kDefaultHandleRights); |
| 1076 | 1076 |
| 1077 // Prepare to wait on MP 1, port 1. (Add the waiter now. Otherwise, if we do | 1077 // Prepare to wait on MP 1, port 1. (Add the waiter now. Otherwise, if we do |
| 1078 // it later, it might already be readable.) | 1078 // it later, it might already be readable.) |
| 1079 waiter.Init(); | 1079 waiter.Init(); |
| 1080 ASSERT_EQ( | 1080 ASSERT_EQ(MOJO_RESULT_OK, |
| 1081 MOJO_RESULT_OK, | 1081 mp1->AddAwakable(1, &waiter, MOJO_HANDLE_SIGNAL_READABLE, false, |
| 1082 mp1->AddAwakable(1, &waiter, MOJO_HANDLE_SIGNAL_READABLE, 123, nullptr)); | 1082 123, nullptr)); |
| 1083 | 1083 |
| 1084 // Write to MP 0, port 0. | 1084 // Write to MP 0, port 0. |
| 1085 { | 1085 { |
| 1086 HandleTransport transport(test::HandleTryStartTransport(handle)); | 1086 HandleTransport transport(test::HandleTryStartTransport(handle)); |
| 1087 EXPECT_TRUE(transport.is_valid()); | 1087 EXPECT_TRUE(transport.is_valid()); |
| 1088 | 1088 |
| 1089 std::vector<HandleTransport> transports; | 1089 std::vector<HandleTransport> transports; |
| 1090 transports.push_back(transport); | 1090 transports.push_back(transport); |
| 1091 EXPECT_EQ( | 1091 EXPECT_EQ( |
| 1092 MOJO_RESULT_OK, | 1092 MOJO_RESULT_OK, |
| (...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1210 auto dispatcher = MessagePipeDispatcher::Create( | 1210 auto dispatcher = MessagePipeDispatcher::Create( |
| 1211 MessagePipeDispatcher::kDefaultCreateOptions); | 1211 MessagePipeDispatcher::kDefaultCreateOptions); |
| 1212 auto local_mp = MessagePipe::CreateLocalLocal(); | 1212 auto local_mp = MessagePipe::CreateLocalLocal(); |
| 1213 dispatcher->Init(local_mp.Clone(), 0); | 1213 dispatcher->Init(local_mp.Clone(), 0); |
| 1214 Handle handle(std::move(dispatcher), | 1214 Handle handle(std::move(dispatcher), |
| 1215 MessagePipeDispatcher::kDefaultHandleRights); | 1215 MessagePipeDispatcher::kDefaultHandleRights); |
| 1216 | 1216 |
| 1217 // Prepare to wait on MP 1, port 1. (Add the waiter now. Otherwise, if we do | 1217 // Prepare to wait on MP 1, port 1. (Add the waiter now. Otherwise, if we do |
| 1218 // it later, it might already be readable.) | 1218 // it later, it might already be readable.) |
| 1219 waiter.Init(); | 1219 waiter.Init(); |
| 1220 ASSERT_EQ( | 1220 ASSERT_EQ(MOJO_RESULT_OK, |
| 1221 MOJO_RESULT_OK, | 1221 mp1->AddAwakable(1, &waiter, MOJO_HANDLE_SIGNAL_READABLE, false, |
| 1222 mp1->AddAwakable(1, &waiter, MOJO_HANDLE_SIGNAL_READABLE, 123, nullptr)); | 1222 123, nullptr)); |
| 1223 | 1223 |
| 1224 // Write to MP 0, port 0. | 1224 // Write to MP 0, port 0. |
| 1225 { | 1225 { |
| 1226 HandleTransport transport(test::HandleTryStartTransport(handle)); | 1226 HandleTransport transport(test::HandleTryStartTransport(handle)); |
| 1227 EXPECT_TRUE(transport.is_valid()); | 1227 EXPECT_TRUE(transport.is_valid()); |
| 1228 | 1228 |
| 1229 std::vector<HandleTransport> transports; | 1229 std::vector<HandleTransport> transports; |
| 1230 transports.push_back(transport); | 1230 transports.push_back(transport); |
| 1231 EXPECT_EQ( | 1231 EXPECT_EQ( |
| 1232 MOJO_RESULT_OK, | 1232 MOJO_RESULT_OK, |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1272 EXPECT_EQ(MessagePipeDispatcher::kDefaultHandleRights, | 1272 EXPECT_EQ(MessagePipeDispatcher::kDefaultHandleRights, |
| 1273 read_handles[0].rights); | 1273 read_handles[0].rights); |
| 1274 handle = std::move(read_handles[0]); | 1274 handle = std::move(read_handles[0]); |
| 1275 read_handles.clear(); | 1275 read_handles.clear(); |
| 1276 | 1276 |
| 1277 // Now pass it back. | 1277 // Now pass it back. |
| 1278 | 1278 |
| 1279 // Prepare to wait on MP 0, port 0. (Add the waiter now. Otherwise, if we do | 1279 // Prepare to wait on MP 0, port 0. (Add the waiter now. Otherwise, if we do |
| 1280 // it later, it might already be readable.) | 1280 // it later, it might already be readable.) |
| 1281 waiter.Init(); | 1281 waiter.Init(); |
| 1282 ASSERT_EQ( | 1282 ASSERT_EQ(MOJO_RESULT_OK, |
| 1283 MOJO_RESULT_OK, | 1283 mp0->AddAwakable(0, &waiter, MOJO_HANDLE_SIGNAL_READABLE, false, |
| 1284 mp0->AddAwakable(0, &waiter, MOJO_HANDLE_SIGNAL_READABLE, 456, nullptr)); | 1284 456, nullptr)); |
| 1285 | 1285 |
| 1286 // Write to MP 1, port 1. | 1286 // Write to MP 1, port 1. |
| 1287 { | 1287 { |
| 1288 HandleTransport transport(test::HandleTryStartTransport(handle)); | 1288 HandleTransport transport(test::HandleTryStartTransport(handle)); |
| 1289 EXPECT_TRUE(transport.is_valid()); | 1289 EXPECT_TRUE(transport.is_valid()); |
| 1290 | 1290 |
| 1291 std::vector<HandleTransport> transports; | 1291 std::vector<HandleTransport> transports; |
| 1292 transports.push_back(transport); | 1292 transports.push_back(transport); |
| 1293 EXPECT_EQ( | 1293 EXPECT_EQ( |
| 1294 MOJO_RESULT_OK, | 1294 MOJO_RESULT_OK, |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1364 EXPECT_EQ(MOJO_RESULT_OK, | 1364 EXPECT_EQ(MOJO_RESULT_OK, |
| 1365 dispatcher->ReadMessage(UserPointer<void>(read_buffer), | 1365 dispatcher->ReadMessage(UserPointer<void>(read_buffer), |
| 1366 MakeUserPointer(&read_buffer_size), 0, | 1366 MakeUserPointer(&read_buffer_size), 0, |
| 1367 nullptr, MOJO_READ_MESSAGE_FLAG_NONE)); | 1367 nullptr, MOJO_READ_MESSAGE_FLAG_NONE)); |
| 1368 EXPECT_EQ(sizeof(kHello), static_cast<size_t>(read_buffer_size)); | 1368 EXPECT_EQ(sizeof(kHello), static_cast<size_t>(read_buffer_size)); |
| 1369 EXPECT_STREQ(kHello, read_buffer); | 1369 EXPECT_STREQ(kHello, read_buffer); |
| 1370 | 1370 |
| 1371 // Prepare to wait on "local_mp", port 1. | 1371 // Prepare to wait on "local_mp", port 1. |
| 1372 waiter.Init(); | 1372 waiter.Init(); |
| 1373 ASSERT_EQ(MOJO_RESULT_OK, | 1373 ASSERT_EQ(MOJO_RESULT_OK, |
| 1374 local_mp->AddAwakable(1, &waiter, MOJO_HANDLE_SIGNAL_READABLE, 789, | 1374 local_mp->AddAwakable(1, &waiter, MOJO_HANDLE_SIGNAL_READABLE, |
| 1375 nullptr)); | 1375 false, 789, nullptr)); |
| 1376 | 1376 |
| 1377 // Write to the dispatcher. | 1377 // Write to the dispatcher. |
| 1378 EXPECT_EQ(MOJO_RESULT_OK, dispatcher->WriteMessage( | 1378 EXPECT_EQ(MOJO_RESULT_OK, dispatcher->WriteMessage( |
| 1379 UserPointer<const void>(kHello), sizeof(kHello), | 1379 UserPointer<const void>(kHello), sizeof(kHello), |
| 1380 nullptr, MOJO_WRITE_MESSAGE_FLAG_NONE)); | 1380 nullptr, MOJO_WRITE_MESSAGE_FLAG_NONE)); |
| 1381 | 1381 |
| 1382 // Wait. | 1382 // Wait. |
| 1383 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context)); | 1383 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context)); |
| 1384 EXPECT_EQ(789u, context); | 1384 EXPECT_EQ(789u, context); |
| 1385 hss = HandleSignalsState(); | 1385 hss = HandleSignalsState(); |
| (...skipping 21 matching lines...) Expand all Loading... |
| 1407 mp0->Close(0); | 1407 mp0->Close(0); |
| 1408 mp1->Close(1); | 1408 mp1->Close(1); |
| 1409 EXPECT_EQ(MOJO_RESULT_OK, dispatcher->Close()); | 1409 EXPECT_EQ(MOJO_RESULT_OK, dispatcher->Close()); |
| 1410 // Note that |local_mp|'s port 0 belong to |dispatcher|, which was closed. | 1410 // Note that |local_mp|'s port 0 belong to |dispatcher|, which was closed. |
| 1411 local_mp->Close(1); | 1411 local_mp->Close(1); |
| 1412 } | 1412 } |
| 1413 | 1413 |
| 1414 } // namespace | 1414 } // namespace |
| 1415 } // namespace system | 1415 } // namespace system |
| 1416 } // namespace mojo | 1416 } // namespace mojo |
| OLD | NEW |