Anonymous | Login | 2024-11-21 15:30 UTC |
My View | View Issues | Change Log | Roadmap |
View Issue Details [ Jump to Notes ] | [ Issue History ] [ Print ] | ||||||||
ID | Project | Category | View Status | Date Submitted | Last Update | ||||
0001308 | VCMI | GUI - PreGame | public | 2013-06-08 08:21 | 2022-04-11 17:38 | ||||
Reporter | o01eg | ||||||||
Assigned To | Tow | ||||||||
Priority | normal | Severity | minor | Reproducibility | always | ||||
Status | closed | Resolution | fixed | ||||||
Platform | AMD64 | OS | Linux | OS Version | Gentoo | ||||
Product Version | 0.93 | ||||||||
Target Version | Fixed in Version | ||||||||
Summary | 0001308: Second client cannot get CMapInfo at the pregame. [r3406] | ||||||||
Description | The second client freezes after join but the first client shows that the second client "joins the game". | ||||||||
Steps To Reproduce | 1. Start first client. 2. New game -> Multiplayer -> Host. 3. Start second client. 4. New game -> Multiplayer -> Join. 5. Connect to the server. | ||||||||
Additional Information | Establishing connection... Found endpoints: 0: 127.0.0.1:3030 Trying connection to 127.0.0.1:3030 (0) Established connection with VCMI 0.93b (server) ... (gdb) thread 14 [Switching to thread 14 (Thread 0x7fffe4c98700 (LWP 18236))] #0 0x00007ffff689e96d in recvmsg () from /lib64/libpthread.so.0 (gdb) bt full #0 0x00007ffff689e96d in recvmsg () from /lib64/libpthread.so.0 No symbol table info available. #1 0x00007ffff798a1ee in recv (ec=..., flags=0, count=1, bufs=0x7fffe4c96f10, s=18) at /usr/include/boost-1_49/boost/asio/detail/impl/socket_ops.ipp:695 msg = {msg_name = 0x0, msg_namelen = 0, msg_iov = 0x7fffe4c96f10, msg_iovlen = 1, msg_control = 0x0, msg_controllen = 0, msg_flags = 0} result = <optimized out> 0000002 sync_recv (ec=..., all_empty=<optimized out>, flags=0, count=1, bufs=0x7fffe4c96f10, state=<optimized out>, s=18) at /usr/include/boost-1_49/boost/asio/detail/impl/socket_ops.ipp:722 bytes = <optimized out> 0000003 receive<boost::asio::detail::consuming_buffers<boost::asio::mutable_buffer, boost::asio::mutable_buffers_1> > (ec=..., flags=0, buffers=..., impl=..., this=<optimized out>) at /usr/include/boost-1_49/boost/asio/detail/reactive_socket_service_base.hpp:248 bufs = {<boost::asio::detail::buffer_sequence_adapter_base> = {<No data fields>}, buffers_ = {{iov_base = 0x7fffd8fee28d, iov_len = 64411}, { iov_base = 0x0, iov_len = 140737347363348}, { iov_base = 0x7fffd8000020, iov_len = 1}, { iov_base = 0x7fffe4c97380, iov_len = 140737031795632}, { iov_base = 0x2, iov_len = 140733193388048}, { iov_base = 0x7fffe4c974af, iov_len = 1}, {iov_base = 0x0, iov_len = 140737347363348}, {iov_base = 0x2, iov_len = 2}, { iov_base = 0x7fffe4c973d0, iov_len = 140737031795712}, { iov_base = 0x0, iov_len = 140733193388048}, { iov_base = 0x7fffe4c974ec, iov_len = 2}, { iov_base = 0x7fffe4c97400, iov_len = 140737031795760}, { iov_base = 0xe4c97430, iov_len = 140733193388048}, { iov_base = 0x7fffd8535e19, iov_len = 1}, { iov_base = 0x4fa890 <pthread_cancel@plt>, iov_len = 140736821735936}, {iov_base = 0x9b2eb0 <logNetwork>, iov_len = 0}, {iov_base = 0x7fffd8458b40, iov_len = 140736821735936}, {iov_base = 0x9b2eb0 <logNetwork>, iov_len = 0}, {iov_base = 0x7fffd8458b40, iov_len = 140737347330800}, {iov_base = 0x7ffff4760520, iov_len = 140737031794944}, {iov_base = 0x7fff00000000, iov_len = 140737031794912}, {iov_base = 0x7fffd8458cb0, iov_len = 140736821824656}, {iov_base = 0x12d841e878, iov_len = 140736821996112}, {iov_base = 0x20, iov_len = 25769803777}, {iov_base = 0x0, iov_len = 0}, { iov_base = 0x0, iov_len = 0}, {iov_base = 0xe9e938, iov_len = 140736822909416}, {iov_base = 0x100007fd60b0002, iov_len = 0}, {iov_base = 0x0, iov_len = 140733193388032}, { iov_base = 0x7fffd847a230, iov_len = 0}, {iov_base = 0x0, iov_len = 140737031795368}, {iov_base = 0x0, iov_len = 0}, { iov_base = 0x0, iov_len = 140737343954912}, {iov_base = 0x0, iov_len = 0}, {iov_base = 0x0, iov_len = 0}, { iov_base = 0x7fffd841e970, iov_len = 140736821824768}, { iov_base = 0x0, iov_len = 4360000}, {iov_base = 0x500000000, iov_len = 4294972177}, {iov_base = 0x7fffe4c972a0, iov_len = 140737354130688}, {iov_base = 0x9c84b0, iov_len = 3}, { iov_base = 0x1, iov_len = 1}, {iov_base = 0x7fffe4c9745f, iov_len = 1}, {iov_base = 0x1, iov_len = 140737031795807}, { iov_base = 0x1, iov_len = 140737031795120}, {iov_base = 0x10000, iov_len = 140737354129832}, {iov_base = 0x0, iov_len = 0}, { iov_base = 0x7fffe4c96d90, iov_len = 1}, {iov_base = 0x0, iov_len = 0}, {iov_base = 0x0, iov_len = 140737351925652}, { iov_base = 0x100ea0330, iov_len = 140737031795376}, { iov_base = 0x7fffe4c972a0, iov_len = 140736821824320}, { iov_base = 0x7fffd8443200, iov_len = 69575}, { iov_base = 0x7fffd8000020, iov_len = 69600}, {iov_base = 0x0, iov_len = 140736822729968}, {iov_base = 0x7fffe4c97bb0, iov_len = 140737283058884}, {iov_base = 0x10ff0, iov_len = 1}, { iov_base = 0x7fff00000000, iov_len = 140737338810520}, { iov_base = 0x7fffd8000088, iov_len = 140736817266808}, { iov_base = 0x7fffd8478260, iov_len = 6812369}, { iov_base = 0x10fe0, iov_len = 519695740614}, { iov_base = 0x10ff0, iov_len = 1087}, {iov_base = 0x11010, iov_len = 135}, {iov_base = 0x10, iov_len = 2}, {iov_base = 0x0, iov_len = 4874787885311}}, count_ = 1, total_buffer_size_ = 64411} 0000004 receive<boost::asio::detail::consuming_buffers<boost::asio::mutable_buffer, boost::asio::mutable_buffers_1> > (flags=0, impl=..., ec=..., buffers=..., this=<optimized out>) at /usr/include/boost-1_49/boost/asio/stream_socket_service.hpp:308 No locals. 0000005 read_some<boost::asio::detail::consuming_buffers<boost::asio::mutable_buffer, boost::asio::mutable_buffers_1> > (ec=..., buffers=..., this=0x7fffd8443200) at /usr/include/boost-1_49/boost/asio/basic_stream_socket.hpp:740 No locals. 0000006 boost::asio::read<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::stream_socket_service<boost::asio::ip::tcp> >, boost::asio::mutable_buffers_1, boost::asio::detail::transfer_all_t> (s=..., buffers=..., completion_condition=..., ec=...) at /usr/include/boost-1_49/boost/asio/impl/read.hpp:50 tmp = {buffers_ = {<boost::asio::mutable_buffer> = { data_ = 0x7fffd8fedd28, size_ = 65792}, <No data fields>}, at_end_ = false, first_ = {data_ = 0x7fffd8fee28d, size_ = 64411}, begin_remainder_ = 0x7fffe4c97330, max_size_ = 65536} total_transferred = <optimized out> 0000007 0x00007ffff797c1c4 in read<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::stream_socket_service<boost::asio::ip::tcp> >, boost::asio::mutable_buffers_1> (buffers=..., s=...) at /usr/include/boost-1_49/boost/asio/impl/read.hpp:63 ec = {m_val = 0, m_cat = 0x7ffff7162098} bytes_transferred = <optimized out> 0000008 CConnection::read (this=0x7fffd8458b40, data=<optimized out>, size=<optimized out>) at /mnt/another/tmp/vcmi/lib/Connection.cpp:164 ret = <optimized out> 0000009 0x00000000005d44c6 in CISer<CConnection>::loadSerializable ( this=0x7fffd8458b40, data= "\000\000\000\000\034\000\000\000\t\000\000\000Arrogance\334\000\000\000Once, centuries ago, the world was at peace. Four cultures lived in harmony and freely associated with each other. Then you came into power and realized things would be bette"...) at /mnt/another/tmp/vcmi/client/../lib/Connection.h:1180 length = 65792 0000010 0x0000000000683404 in invoke (data= "\000\000\000\000\034\000\000\000\t\000\000\000Arrogance\334\000\000\000Once, centuries ago, the world was at peace. Four cultures lived in harmony and freely associated with each other. Then you came into power and realized things would be bette"..., s=...) at /mnt/another/tmp/vcmi/client/../lib/Connection.h:230 No locals. 0000011 load<std::basic_string<char> > (data= "\000\000\000\000\034\000\000\000\t\000\000\000Arrogance\334\000\000\000Once, centuries ago, the world was at peace. Four cultures lived in harmony and freely associated with each other. Then you came into power and realized things would be bette"..., this=0x7fffd8458b40) at /mnt/another/tmp/vcmi/client/../lib/Connection.h:935 No locals. 0000012 operator>><std::basic_string<char> > (t= "\000\000\000\000\034\000\000\000\t\000\000\000Arrogance\334\000\000\000Once, centuries ago, the world was at peace. Four cultures lived in harmony and freely associated with each other. Then you came into power and realized things would be bette"..., this=0x7fffd8458b40) at /mnt/another/tmp/vcmi/client/../lib/Connection.h:890 No locals. 0000013 operator&<std::basic_string<char> > (t= "\000\000\000\000\034\000\000\000\t\000\000\000Arrogance\334\000\000\000Once, centuries ago, the world was at peace. Four cultures lived in harmony and freely associated with each other. Then you came into power and realized things would be bette"..., this=0x7fffd8458b40) at /mnt/another/tmp/vcmi/client/../lib/Connection.h:897 No locals. 0000014 serialize<CISer<CConnection> > (Version=<optimized out>, h=..., this=0x7fffd8478250) at /mnt/another/tmp/vcmi/client/../lib/mapping/CMapInfo.h:42 No locals. 0000015 loadSerializableBySerializeCall<CMapInfo const> (data=..., this=0x7fffd8458b40) at /mnt/another/tmp/vcmi/client/../lib/Connection.h:960 hlp = @0x7fffd8478250: {mapHeader = std::shared_ptr (empty) 0x0, campaignHeader = std::shared_ptr (empty) 0x0, scenarioOpts = 0x0, fileURI = "\000\000\000\000\034\000\000\000\t\000\000\000Arrogance\334\000\000\000Once, centuries ago, the world was at peace. Four cultures lived in harmony and freely associated with each other. Then you came into power and realized things would be bette"..., date = "", playerAmnt = 0, humanPlayers = 0, actualHumanPlayers = 0, isRandomMap = false} 0000016 loadSerializable<CMapInfo const> (data=..., this=0x7fffd8458b40) at /mnt/another/tmp/vcmi/client/../lib/Connection.h:967 No locals. 0000017 invoke (s=..., data=...) at /mnt/another/tmp/vcmi/client/../lib/Connection.h:230 No locals. 0000018 load<CMapInfo const> (data=..., this=0x7fffd8458b40) at /mnt/another/tmp/vcmi/client/../lib/Connection.h:935 No locals. 0000019 operator>><const CMapInfo> (t=..., this=0x7fffd8458b40) at /mnt/another/tmp/vcmi/client/../lib/Connection.h:890 No locals. 0000020 CISer<CConnection>::loadPointerHlp<CMapInfo const*> (this=0x7fffd8458b40, tid=0, data=@0x7fffe4c97b18: 0x7fffd8478250, pid=<optimized out>) at /mnt/another/tmp/vcmi/client/../lib/Connection.h:1041 No locals. 0000021 0x000000000068360e in CISer<CConnection>::loadPointer<CMapInfo const*> ( this=0x7fffd8458b40, data=@0x7fffe4c97b18: 0x7fffd8478250) at /mnt/another/tmp/vcmi/client/../lib/Connection.h:1028 hlp = 1 '\001' pid = 4294967295 tid = <optimized out> 0000022 0x000000000066853b in invoke (s=..., data=@0x7fffe4c97b18: 0x7fffd8478250) at /mnt/another/tmp/vcmi/client/../lib/Connection.h:206 No locals. 0000023 load<CMapInfo const*> (data=@0x7fffe4c97b18: 0x7fffd8478250, this=<optimized out>) at /mnt/another/tmp/vcmi/client/../lib/Connection.h:935 No locals. 0000024 operator>><const CMapInfo*> (t=@0x7fffe4c97b18: 0x7fffd8478250, this=<optimized out>) at /mnt/another/tmp/vcmi/client/../lib/Connection.h:890 No locals. 0000025 CSelectionScreen::CSelectionScreen (this=0x7fffd8535c80, Type=<optimized out>, MultiPlayer=<optimized out>, Names=<optimized out>, Address="127.0.0.1", Port="3030") at /mnt/another/tmp/vcmi/client/CPreGame.cpp:723 map = <optimized out> obj__i1 = {previousCapture = false, prevActions = 63 '?'} obj(int) = {myObj = 0x7fffd8535c80} backName = "SCNRBACK.DEF" network = <optimized out> sh = 0x0 0000026 0x0000000000668caa in CSimpleJoinScreen::enterSelectionScreen ( this=<optimized out>) at /mnt/another/tmp/vcmi/client/CPreGame.cpp:4187 textAddress = "127.0.0.1" textPort = "3030" 0000027 0x000000000055372b in operator() (this=0x7fffd85619a0) at /usr/include/boost-1_49/boost/function/function_template.hpp:760 No locals. 0000028 CFunctionList<void ()>::operator()() const (this=<optimized out>) at /mnt/another/tmp/vcmi/client/gui/../FunctionList.h:62 i = <optimized out> funcs2 = std::vector of length 1, capacity 1 = { {<boost::function0<void>> = {<boost::function_base> = { vtable = 0x72e5d1, functor = { obj_ptr = 0x668c40 <CSimpleJoinScreen::enterSelectionScreen()>, type = {type = 0x668c40 <CSimpleJoinScreen::enterSelectionScreen()>, const_qualified = false, volatile_qualified = false}, func_ptr = 0x668c40 <CSimpleJoinScreen::enterSelectionScreen()>, bound_memfunc_ptr = {memfunc_ptr = (void (boost::detail::function::X::*)( boost::detail::function::X * const, int)) 0x668c40 <CSimpleJoinScreen::enterSelectionScreen()>, obj_ptr = 0x7fffd85535a0}, obj_ref = { obj_ptr = 0x668c40 <CSimpleJoinScreen::enterSelectionScreen()>, is_const_qualified = false, is_volatile_qualified = false}, data = 64 '@'}}, static args = <optimized out>, static arity = <optimized out>}, <No data fields>}} 0000029 0x0000000000542234 in CGuiHandler::handleEvent (this=0x9b3ca0 <GH>, sEvent=0x7fffe4c97cc0) at /mnt/another/tmp/vcmi/client/gui/CGuiHandler.cpp:284 i = hlp = std::list = {[0] = 0x7fffd84d4030, [1] = 0x7fffd8539140, [2] = 0x7fffd856cd78, [3] = 0x7fffd8535d28} prev = true 0000030 0x0000000000542653 in CGuiHandler::handleEvents (this=0x9b3ca0 <GH>) at /mnt/another/tmp/vcmi/client/gui/CGuiHandler.cpp:177 ev = {type = 6 '\006', active = {type = 6 '\006', gain = 0 '\000', state = 1 '\001'}, key = {type = 6 '\006', which = 0 '\000', state = 1 '\001', keysym = {scancode = 191 '\277', sym = SDLK_UNKNOWN, mod = KMOD_NONE, unicode = 0}}, motion = { type = 6 '\006', which = 0 '\000', state = 1 '\001', x = 447, y = 431, xrel = 0, yrel = 0}, button = {type = 6 '\006', which = 0 '\000', button = 1 '\001', state = 0 '\000', x = 447, y = 431}, jaxis = {type = 6 '\006', which = 0 '\000', axis = 1 '\001', value = 447}, jball = {type = 6 '\006', which = 0 '\000', ball = 1 '\001', xrel = 447, yrel = 431}, jhat = {type = 6 '\006', which = 0 '\000', hat = 1 '\001', value = 0 '\000'}, jbutton = {type = 6 '\006', which = 0 '\000', button = 1 '\001', state = 0 '\000'}, resize = {type = 6 '\006', w = 28246463, h = 0}, expose = {type = 6 '\006'}, quit = { type = 6 '\006'}, user = {type = 6 '\006', code = 28246463, data1 = 0x0, data2 = 0x0}, syswm = {type = 6 '\006', msg = 0x0}} lock = {m = 0x9b3be0 <eventsM>, is_locked = true} 0000031 0x0000000000648527 in CGPreGame::update (this=0xf19a40) at /mnt/another/tmp/vcmi/client/CPreGame.cpp:521 lock = {m = 0x9e9ec0, is_locked = true} 0000032 0x00000000005414e9 in CGuiHandler::run (this=0x9b3ca0 <GH>) at /mnt/another/tmp/vcmi/client/gui/CGuiHandler.cpp:385 No locals. 0000033 0x00007ffff6d522a4 in ?? () from /usr/lib64/libboost_thread-mt-1_49.so.1.49.0 No symbol table info available. 0000034 0x00007ffff6896d96 in start_thread () from /lib64/libpthread.so.0 No symbol table info available. 0000035 0x00007ffff3ca546d in clone () from /lib64/libc.so.6 No symbol table info available. | ||||||||
Tags | No tags attached. | ||||||||
Attached Files | vcmi.zip [^] (3,126 bytes) 2013-06-08 08:21 | ||||||||
Notes | |
(0003724) o01eg (reporter) 2013-06-24 09:34 edited on: 2013-06-24 11:00 |
I separated lines in CMapInfo::serialize and found that the client stucks at fileURI; |
(0003725) o01eg (reporter) 2013-06-24 11:10 |
I breakpoint a client and server at "h & fileURI" so found that: client: Breakpoint 1, serialize<CISer<CConnection> > (Version=<optimized out>, h=..., this=0x7fffd84728c0) at /mnt/another/tmp/vcmi/client/../lib/mapping/CMapInfo.h:45 45 h & fileURI; (gdb) p fileURI $1 = "" (gdb) l 40 template <typename Handler> void serialize(Handler &h, const int Version) 41 { 42 h & mapHeader; 43 h & campaignHeader; 44 h & scenarioOpts; 45 h & fileURI; 46 h & date; 47 h & playerAmnt; 48 h & humanPlayers; 49 h & actualHumanPlayers & isRandomMap; (gdb) p mapHeader $2 = std::shared_ptr (empty) 0x0 (gdb) p campaignHeader $3 = std::shared_ptr (empty) 0x0 (gdb) p scenarioOpts $4 = (StartInfo *) 0x0 server: Breakpoint 1, serialize<COSer<CConnection> > (Version=741, h=..., this=0x7fc4a40009a0) at /mnt/another/tmp/vcmi/server/../lib/mapping/CMapInfo.h:45 45 h & fileURI; (gdb) p fileURI $1 = "MAPS/ARROGANCE" (gdb) l 40 template <typename Handler> void serialize(Handler &h, const int Version) 41 { 42 h & mapHeader; 43 h & campaignHeader; 44 h & scenarioOpts; 45 h & fileURI; 46 h & date; 47 h & playerAmnt; 48 h & humanPlayers; 49 h & actualHumanPlayers & isRandomMap; (gdb) p mapHeader $2 = std::shared_ptr (count 2) 0x7fc4a4000a20 (gdb) p campaignHeader $3 = std::shared_ptr (empty) 0x0 (gdb) p scenarioOpts $4 = (StartInfo *) 0x0 It looks like error at std::shared_ptr transferring. |
(0003726) o01eg (reporter) 2013-06-24 18:48 |
I've found source of the bug. There is difference between savePointer and loadPointer so client wait for 2 byte of tid at lib/Connection.h:1027 but server send 4 byte of pid at lib/Connection.h:638. smartPointerSerialization is false at client but is true at server. |
(0003727) Ivan (developer) 2013-06-24 20:02 |
^ on std::smart_ptr IIRC you can change code to use std::unique_ptr instead. Only reason why smart_ptr is in use here is due to gcc-4.5 bug. And this gcc version is unlikely to be supported for long. Don't know if smartPointerSerialization affects unique_ptr though. |
(0003728) o01eg (reporter) 2013-06-24 20:06 |
I've alredy fixed this bug. The client calls CConnecton::enterPregameConnectionMode before reading CMapInfo but the server does it after: Index: server/CVCMIServer.cpp =================================================================== --- server/CVCMIServer.cpp (revision 3423) +++ server/CVCMIServer.cpp (working copy) @@ -207,10 +207,10 @@ initConnection(pc); upcomingConnection = NULL; + startListeningThread(pc); + *pc << (ui8)pc->connectionID << curmap; - startListeningThread(pc); - announceTxt(pc->name + " joins the game"); PlayerJoined *pj = new PlayerJoined(); pj->playerName = pc->name; |
(0003729) o01eg (reporter) 2013-06-24 20:10 |
It doesn't depend on type of a pointer because data chooses at savePointer/loadPointer that use even for any type of pointer. |
(0003734) o01eg (reporter) 2013-07-04 06:54 |
Fixed at 3436 |
(0003735) Tow (developer) 2013-07-04 12:07 edited on: 2013-07-04 12:07 |
Right, thank you. One more note on the topic: smartPointerSerialization is not related to smart pointers (as in shared_ptr). It merely does that: //smartPointerSerialization is true A *a1 = new A(); A *a2 = a1; out << a1 << a2; //serializes object only for a1 serialization, a2 sends only info that it points to the same thing as a1 //on the other side of connection in >> a1 >> a2; //a1 deserialization allocates object and sets its fields, a2 is set to a1 When smartPointerSerialization is false, sending pointer always sends its full state and receiving pointer always allocates new object for it. |
Issue History | |||
Date Modified | Username | Field | Change |
2013-06-08 08:21 | o01eg | New Issue | |
2013-06-08 08:21 | o01eg | Status | new => assigned |
2013-06-08 08:21 | o01eg | Assigned To | => Tow |
2013-06-08 08:21 | o01eg | File Added: vcmi.zip | |
2013-06-24 09:34 | o01eg | Note Added: 0003724 | |
2013-06-24 11:00 | o01eg | Note Edited: 0003724 | View Revisions |
2013-06-24 11:10 | o01eg | Note Added: 0003725 | |
2013-06-24 18:48 | o01eg | Note Added: 0003726 | |
2013-06-24 20:02 | Ivan | Note Added: 0003727 | |
2013-06-24 20:06 | o01eg | Note Added: 0003728 | |
2013-06-24 20:10 | o01eg | Note Added: 0003729 | |
2013-07-04 06:54 | o01eg | Note Added: 0003734 | |
2013-07-04 06:54 | o01eg | Status | assigned => feedback |
2013-07-04 12:07 | Tow | Note Added: 0003735 | |
2013-07-04 12:07 | Tow | Status | feedback => resolved |
2013-07-04 12:07 | Tow | Resolution | open => fixed |
2013-07-04 12:07 | Tow | Note Edited: 0003735 | View Revisions |
2022-04-11 17:38 | Povelitel | Status | resolved => closed |
Copyright © 2000 - 2024 MantisBT Team |