| 753 | } |
| 754 | |
| 755 | kvdb::KVDBResponse |
| 756 | kvdbRequest(DmtcpMessage const& msg, |
| 757 | string const& key, |
| 758 | string const& val, |
| 759 | string *oldVal) |
| 760 | { |
| 761 | int sock = coordinatorSocket; |
| 762 | |
| 763 | if (dmtcp_is_running_state() && |
| 764 | dmtcp_is_ckpt_thread /* weak symbol */ && |
| 765 | !dmtcp_is_ckpt_thread()) { |
| 766 | if (nsSock == -1) { |
| 767 | nsSock = createNewSocketToCoordinator(COORD_ANY); |
| 768 | JASSERT(nsSock != -1); |
| 769 | nsSock = Util::changeFd(nsSock, PROTECTED_NS_FD); |
| 770 | sock = nsSock; |
| 771 | DmtcpMessage m(DMT_NAME_SERVICE_WORKER); |
| 772 | JASSERT(Util::writeAll(sock, &m, sizeof(m)) == sizeof(m)); |
| 773 | } |
| 774 | sock = nsSock; |
| 775 | } |
| 776 | |
| 777 | JASSERT(Util::writeAll(sock, &msg, sizeof(msg)) == sizeof(msg)); |
| 778 | JASSERT(Util::writeAll(sock, key.data(), msg.keyLen) == |
| 779 | (ssize_t)msg.keyLen); |
| 780 | JASSERT(Util::writeAll(sock, val.data(), msg.valLen) == |
| 781 | (ssize_t)msg.valLen); |
| 782 | |
| 783 | DmtcpMessage reply; |
| 784 | reply.poison(); |
| 785 | JASSERT(Util::readAll(sock, &reply, sizeof(reply)) == sizeof(reply)); |
| 786 | reply.assertValid(); |
| 787 | JASSERT(reply.type == DMT_KVDB_RESPONSE); |
| 788 | |
| 789 | if (reply.extraBytes != 0) { |
| 790 | char valBuf[reply.extraBytes]; |
| 791 | JASSERT(Util::readAll(sock, valBuf, reply.valLen) == |
| 792 | (ssize_t)reply.valLen); |
| 793 | if (oldVal != nullptr) { |
| 794 | *oldVal = valBuf; |
| 795 | } |
| 796 | } |
| 797 | |
| 798 | return reply.kvdbResponse; |
| 799 | } |
| 800 | } // namespace CoordinatorAPI { |
| 801 | } // namespace dmtcp { |
no test coverage detected