Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(233)

Side by Side Diff: mojo/edk/system/core_unittest.cc

Issue 2042363003: Allow data pipe producer/consumer handles to be transferred during two-phase operations. (Closed) Base URL: https://github.com/domokit/mojo.git@work790_dp_cancel_two_phase
Patch Set: Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | mojo/edk/system/handle_table.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
OLDNEW
« no previous file with comments | « no previous file | mojo/edk/system/handle_table.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698