| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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 "mojo/edk/system/core.h" | 5 #include "mojo/edk/system/core.h" |
| 6 | 6 |
| 7 #include <stdint.h> | 7 #include <stdint.h> |
| 8 | 8 |
| 9 #include <limits> | 9 #include <limits> |
| 10 | 10 |
| (...skipping 1624 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1635 MakeUserPointer(&num_bytes), | 1635 MakeUserPointer(&num_bytes), |
| 1636 MOJO_READ_MESSAGE_FLAG_NONE)); | 1636 MOJO_READ_MESSAGE_FLAG_NONE)); |
| 1637 EXPECT_EQ(kHelloSize, num_bytes); | 1637 EXPECT_EQ(kHelloSize, num_bytes); |
| 1638 EXPECT_STREQ(kHello, buffer); | 1638 EXPECT_STREQ(kHello, buffer); |
| 1639 | 1639 |
| 1640 ph = ph_received; | 1640 ph = ph_received; |
| 1641 ph_received = MOJO_HANDLE_INVALID; | 1641 ph_received = MOJO_HANDLE_INVALID; |
| 1642 ch = ch_received; | 1642 ch = ch_received; |
| 1643 ch_received = MOJO_HANDLE_INVALID; | 1643 ch_received = MOJO_HANDLE_INVALID; |
| 1644 | 1644 |
| 1645 // Make sure that |ph| can't be sent if it's in a two-phase write. | 1645 // Sending |ph| during a two-phase write cancels the two-phase write. |
| 1646 void* write_ptr = nullptr; | 1646 void* write_ptr = nullptr; |
| 1647 num_bytes = 0; | 1647 num_bytes = 0; |
| 1648 ASSERT_EQ(MOJO_RESULT_OK, | 1648 ASSERT_EQ(MOJO_RESULT_OK, |
| 1649 core()->BeginWriteData(ph, MakeUserPointer(&write_ptr), | 1649 core()->BeginWriteData(ph, MakeUserPointer(&write_ptr), |
| 1650 MakeUserPointer(&num_bytes), | 1650 MakeUserPointer(&num_bytes), |
| 1651 MOJO_WRITE_DATA_FLAG_NONE)); | 1651 MOJO_WRITE_DATA_FLAG_NONE)); |
| 1652 ASSERT_TRUE(write_ptr); |
| 1652 ASSERT_GE(num_bytes, 1u); | 1653 ASSERT_GE(num_bytes, 1u); |
| 1653 EXPECT_EQ(MOJO_RESULT_BUSY, | 1654 EXPECT_EQ(MOJO_RESULT_OK, |
| 1654 core()->WriteMessage(h_passing[0], UserPointer<const void>(kHello), | 1655 core()->WriteMessage(h_passing[0], UserPointer<const void>(kHello), |
| 1655 kHelloSize, MakeUserPointer(&ph), 1, | 1656 kHelloSize, MakeUserPointer(&ph), 1, |
| 1656 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 1657 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
| 1658 ph = MOJO_HANDLE_INVALID; |
| 1659 EXPECT_EQ(MOJO_RESULT_OK, |
| 1660 core()->Wait(h_passing[1], MOJO_HANDLE_SIGNAL_READABLE, 1000000000, |
| 1661 NullUserPointer())); |
| 1662 num_bytes = kBufferSize; |
| 1663 num_handles = MOJO_ARRAYSIZE(handles); |
| 1664 EXPECT_EQ(MOJO_RESULT_OK, |
| 1665 core()->ReadMessage( |
| 1666 h_passing[1], UserPointer<void>(buffer), |
| 1667 MakeUserPointer(&num_bytes), MakeUserPointer(handles), |
| 1668 MakeUserPointer(&num_handles), MOJO_READ_MESSAGE_FLAG_NONE)); |
| 1669 EXPECT_EQ(kHelloSize, num_bytes); |
| 1670 EXPECT_STREQ(kHello, buffer); |
| 1671 EXPECT_EQ(1u, num_handles); |
| 1672 ph = handles[0]; |
| 1673 EXPECT_NE(ph, MOJO_HANDLE_INVALID); |
| 1674 // The two-phase write is over, so trying to complete it will fail. |
| 1675 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, core()->EndWriteData(ph, 0)); |
| 1676 // And we can begin a two-phase write on the new handle. |
| 1677 write_ptr = nullptr; |
| 1678 num_bytes = 0; |
| 1679 ASSERT_EQ(MOJO_RESULT_OK, |
| 1680 core()->BeginWriteData(ph, MakeUserPointer(&write_ptr), |
| 1681 MakeUserPointer(&num_bytes), |
| 1682 MOJO_WRITE_DATA_FLAG_NONE)); |
| 1683 ASSERT_TRUE(write_ptr); |
| 1684 ASSERT_GE(num_bytes, 1u); |
| 1657 | 1685 |
| 1658 // But |ch| can, even if |ph| is in a two-phase write. | 1686 // |ch| can be sent, even if |ph| is in a two-phase write. |
| 1659 EXPECT_EQ(MOJO_RESULT_OK, | 1687 EXPECT_EQ(MOJO_RESULT_OK, |
| 1660 core()->WriteMessage(h_passing[0], UserPointer<const void>(kHello), | 1688 core()->WriteMessage(h_passing[0], UserPointer<const void>(kHello), |
| 1661 kHelloSize, MakeUserPointer(&ch), 1, | 1689 kHelloSize, MakeUserPointer(&ch), 1, |
| 1662 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 1690 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
| 1663 ch = MOJO_HANDLE_INVALID; | 1691 ch = MOJO_HANDLE_INVALID; |
| 1664 EXPECT_EQ(MOJO_RESULT_OK, | 1692 EXPECT_EQ(MOJO_RESULT_OK, |
| 1665 core()->Wait(h_passing[1], MOJO_HANDLE_SIGNAL_READABLE, 1000000000, | 1693 core()->Wait(h_passing[1], MOJO_HANDLE_SIGNAL_READABLE, 1000000000, |
| 1666 NullUserPointer())); | 1694 NullUserPointer())); |
| 1667 num_bytes = kBufferSize; | 1695 num_bytes = kBufferSize; |
| 1668 num_handles = MOJO_ARRAYSIZE(handles); | 1696 num_handles = MOJO_ARRAYSIZE(handles); |
| (...skipping 15 matching lines...) Expand all Loading... |
| 1684 // Wait for |ch| to be readable. | 1712 // Wait for |ch| to be readable. |
| 1685 hss = kEmptyMojoHandleSignalsState; | 1713 hss = kEmptyMojoHandleSignalsState; |
| 1686 EXPECT_EQ(MOJO_RESULT_OK, core()->Wait(ch, MOJO_HANDLE_SIGNAL_READABLE, | 1714 EXPECT_EQ(MOJO_RESULT_OK, core()->Wait(ch, MOJO_HANDLE_SIGNAL_READABLE, |
| 1687 1000000000, MakeUserPointer(&hss))); | 1715 1000000000, MakeUserPointer(&hss))); |
| 1688 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_READ_THRESHOLD, | 1716 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_READ_THRESHOLD, |
| 1689 hss.satisfied_signals); | 1717 hss.satisfied_signals); |
| 1690 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED | | 1718 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED | |
| 1691 MOJO_HANDLE_SIGNAL_READ_THRESHOLD, | 1719 MOJO_HANDLE_SIGNAL_READ_THRESHOLD, |
| 1692 hss.satisfiable_signals); | 1720 hss.satisfiable_signals); |
| 1693 | 1721 |
| 1694 // Make sure that |ch| can't be sent if it's in a two-phase read. | 1722 // Sending |ch| during a two-phase read cancels the two-phase read. |
| 1695 const void* read_ptr = nullptr; | 1723 const void* read_ptr = nullptr; |
| 1696 num_bytes = 1; | 1724 num_bytes = 0; |
| 1697 ASSERT_EQ(MOJO_RESULT_OK, | 1725 ASSERT_EQ(MOJO_RESULT_OK, |
| 1698 core()->BeginReadData(ch, MakeUserPointer(&read_ptr), | 1726 core()->BeginReadData(ch, MakeUserPointer(&read_ptr), |
| 1699 MakeUserPointer(&num_bytes), | 1727 MakeUserPointer(&num_bytes), |
| 1700 MOJO_READ_DATA_FLAG_NONE)); | 1728 MOJO_READ_DATA_FLAG_NONE)); |
| 1701 EXPECT_EQ(MOJO_RESULT_BUSY, | 1729 ASSERT_TRUE(read_ptr); |
| 1730 EXPECT_EQ(1u, num_bytes); |
| 1731 EXPECT_EQ(MOJO_RESULT_OK, |
| 1702 core()->WriteMessage(h_passing[0], UserPointer<const void>(kHello), | 1732 core()->WriteMessage(h_passing[0], UserPointer<const void>(kHello), |
| 1703 kHelloSize, MakeUserPointer(&ch), 1, | 1733 kHelloSize, MakeUserPointer(&ch), 1, |
| 1704 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 1734 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
| 1735 ch = MOJO_HANDLE_INVALID; |
| 1736 EXPECT_EQ(MOJO_RESULT_OK, |
| 1737 core()->Wait(h_passing[1], MOJO_HANDLE_SIGNAL_READABLE, 1000000000, |
| 1738 NullUserPointer())); |
| 1739 num_bytes = kBufferSize; |
| 1740 num_handles = MOJO_ARRAYSIZE(handles); |
| 1741 EXPECT_EQ(MOJO_RESULT_OK, |
| 1742 core()->ReadMessage( |
| 1743 h_passing[1], UserPointer<void>(buffer), |
| 1744 MakeUserPointer(&num_bytes), MakeUserPointer(handles), |
| 1745 MakeUserPointer(&num_handles), MOJO_READ_MESSAGE_FLAG_NONE)); |
| 1746 EXPECT_EQ(kHelloSize, num_bytes); |
| 1747 EXPECT_STREQ(kHello, buffer); |
| 1748 EXPECT_EQ(1u, num_handles); |
| 1749 ch = handles[0]; |
| 1750 EXPECT_NE(ch, MOJO_HANDLE_INVALID); |
| 1751 // The two-phase read is over, so trying to complete it will fail. |
| 1752 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, core()->EndReadData(ch, 1)); |
| 1753 // And we can begin a two-phase read on the new handle. |
| 1754 read_ptr = nullptr; |
| 1755 num_bytes = 0; |
| 1756 ASSERT_EQ(MOJO_RESULT_OK, |
| 1757 core()->BeginReadData(ch, MakeUserPointer(&read_ptr), |
| 1758 MakeUserPointer(&num_bytes), |
| 1759 MOJO_READ_DATA_FLAG_NONE)); |
| 1760 ASSERT_TRUE(read_ptr); |
| 1761 EXPECT_EQ(1u, num_bytes); |
| 1705 | 1762 |
| 1706 // But |ph| can, even if |ch| is in a two-phase read. | 1763 // |ph| can be sent, even if |ch| is in a two-phase write. |
| 1707 EXPECT_EQ(MOJO_RESULT_OK, | 1764 EXPECT_EQ(MOJO_RESULT_OK, |
| 1708 core()->WriteMessage(h_passing[0], UserPointer<const void>(kWorld), | 1765 core()->WriteMessage(h_passing[0], UserPointer<const void>(kWorld), |
| 1709 kWorldSize, MakeUserPointer(&ph), 1, | 1766 kWorldSize, MakeUserPointer(&ph), 1, |
| 1710 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 1767 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
| 1711 ph = MOJO_HANDLE_INVALID; | 1768 ph = MOJO_HANDLE_INVALID; |
| 1712 hss = kEmptyMojoHandleSignalsState; | 1769 hss = kEmptyMojoHandleSignalsState; |
| 1713 EXPECT_EQ(MOJO_RESULT_OK, | 1770 EXPECT_EQ(MOJO_RESULT_OK, |
| 1714 core()->Wait(h_passing[1], MOJO_HANDLE_SIGNAL_READABLE, 1000000000, | 1771 core()->Wait(h_passing[1], MOJO_HANDLE_SIGNAL_READABLE, 1000000000, |
| 1715 MakeUserPointer(&hss))); | 1772 MakeUserPointer(&hss))); |
| 1716 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, | 1773 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, |
| (...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1857 | 1914 |
| 1858 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h)); | 1915 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h)); |
| 1859 } | 1916 } |
| 1860 | 1917 |
| 1861 // TODO(vtl): Test |CreateSharedBuffer()|, |DuplicateBufferHandle()|, and | 1918 // TODO(vtl): Test |CreateSharedBuffer()|, |DuplicateBufferHandle()|, and |
| 1862 // |MapBuffer()|. | 1919 // |MapBuffer()|. |
| 1863 | 1920 |
| 1864 } // namespace | 1921 } // namespace |
| 1865 } // namespace system | 1922 } // namespace system |
| 1866 } // namespace mojo | 1923 } // namespace mojo |
| OLD | NEW |