Closed usagi closed 10 years ago
テスト用に問題の発生部分付近のみを小さくまとめたコードです。
#include <string>
#include <boost/array.hpp>
#include <boost/asio.hpp>
namespace arisin
{
namespace etupirka
{
struct configuration_t final
{
struct udp_sender_configuration_t
{
std::string address;
int port;
} udp_sender;
};
union key_signal_t
{
struct code_state_t
{
uint32_t code;
uint8_t state;
} code_state;
std::array<char, sizeof(code_state_t)> char_array;
explicit key_signal_t(decltype(code_state_t::code) code_ = -1, decltype(code_state_t::state) state_ = -1)
: code_state({code_, uint8_t(state_)})
{ }
};
class udp_sender_t final
{
void initialize();
boost::asio::io_service io_service;
boost::asio::ip::udp::resolver resolver;
boost::asio::ip::udp::resolver::query query;
boost::asio::ip::udp::endpoint endpoint;
boost::asio::ip::udp::socket socket;
std::string address_;
int port_;
public:
udp_sender_t(const configuration_t& conf);
void operator()(const key_signal_t& key_signal);
const std::string& address() const;
const int port() const;
};
udp_sender_t::udp_sender_t(const configuration_t& conf)
: resolver(io_service)
, query(boost::asio::ip::udp::v4(), conf.udp_sender.address, std::to_string(conf.udp_sender.port).data())
, endpoint(*resolver.resolve(query))
, socket(io_service)
, address_(conf.udp_sender.address)
, port_(conf.udp_sender.port)
{
std::cerr << "resolver, query, endpoint, socket are initialized\n";
std::cerr << "address(" << address_ << ") port(" << port_ << ")\n" ;
socket.open(boost::asio::ip::udp::v4());
std::cerr << "socket opened\n";
}
void udp_sender_t::operator()(const key_signal_t& key_signal)
{
std::cerr << "key_signal code, state: " << key_signal.code_state.code << "," << key_signal.code_state.state << "\n";
using buffer_t = boost::array<decltype(key_signal.char_array)::value_type, sizeof(key_signal.char_array) / sizeof(decltype(key_signal.char_array)::value_type)>;
const buffer_t& buffer( *reinterpret_cast<const buffer_t*>( key_signal.char_array.data()) );
#ifndef NDEBUG
auto n =
#endif
socket.send_to(boost::asio::buffer(buffer), endpoint);
#ifndef NDEBUG
std::cerr << "message sent [bytes]: " << n << "\n";
#endif
}
const std::string& udp_sender_t::address() const
{ return address_; }
const int udp_sender_t::port() const
{ return port_; }
}
}
#include <memory>
int main()
{
using namespace arisin::etupirka;
configuration_t c;
c.udp_sender.address = "localhost";
c.udp_sender.port = 32100;
std::unique_ptr<udp_sender_t> s;
s.reset(new udp_sender_t(c));
}
これを a.cxx
とか適当な場所に保存してclang++ a.cxx -boost_system -lpthread
としてビルドし、./a.out
とか実行して見てくれますか?
@arisin お時間とれたときにおねがいします。
※Mint16では問題のフリーズはetupirka、このサンプル、ともに発生を観測できません。
こちらでもエラーが。調査します。
<< clang++ a.cxx -boost_system -lpthread [master]
clang: error: unsupported option '-b oost_system'
↑ -boost_system じゃなくて -lboost_system で、そうすると -l オプションが libboost_system.dylib (.so, .dll)をライブラリー検索パスから探してくれます。
実機レンタル中だし、こちらの問題も可能な限り対応します。
よろしくお願いします
↑の dd64c79 の修正でudp-senderがetupirka.confのaddressを読み取る際に、もしアドレスがIPで与えられていればリゾルバー(DNS)を使わない様に修正しました。
@arisin 余裕があればOSXでetupirka.confの下の方にある[udp_sender]
セクションのaddress
を、
[udp_sender]
address=127.0.0.1
の様に、IPアドレスに書き換えて実行してみて下さい。もしかしたらsocket openで固まらなくなるかもしれません。(相変わらず固まるかもしれません。)
↑効果なかったらしい
udp-sender
周りのログとった。
I0129 02:52:00.743643 2009187088 etupirka.cxx:275] to initialize udp_sender
I0129 02:52:00.743692 2009187088 udp-sender.cxx:12] address(127.0.0.1) port(30000), socket initialized
I0129 02:52:00.743705 2009187088 udp-sender.cxx:17] try generate endpoint without resolver
I0129 02:52:00.743724 2009187088 udp-sender.cxx:28] endpoint generated
I0129 02:52:00.743896 2009187088 udp-sender.cxx:31] socket opened
I0129 02:52:00.743921 2009187088 etupirka.cxx:308] done initialize all submodules
I0129 02:52:00.743933 2009187088 etupirka.cxx:310] 0x7fae92d39e90
I0129 02:52:00.743947 2009187088 etupirka.cxx:311] 0x7fae92d3b1f0
I0129 02:52:00.743957 2009187088 etupirka.cxx:312] 0x7fae92d3b2c0
I0129 02:52:00.743968 2009187088 etupirka.cxx:313] 0x7fae92d39df0
I0129 02:52:00.743976 2009187088 etupirka.cxx:314] 0x7fae92d3b390
I0129 02:52:00.743986 2009187088 etupirka.cxx:315] 0x7fae92e02dd0
I0129 02:52:00.743996 2009187088 etupirka.cxx:316] 0x0
I0129 02:52:00.744005 2009187088 etupirka.cxx:317] 0x0
I0129 02:52:00.744015 2009187088 etupirka.cxx:99] run main mode main loop
ログを見るに、固まって無い。
そもそも固まるのは-G
のせいで、固まる場所もudp-senderサブモジュールでは無い可能性を指摘したい。
-G
付きの同じあたりのログ。
I0129 03:03:07.414067 2009187088 etupirka.cxx:275] to initialize udp_sender
I0129 03:03:07.414119 2009187088 udp-sender.cxx:12] address(127.0.0.1) port(30000), socket initialized
I0129 03:03:07.414134 2009187088 udp-sender.cxx:17] try generate endpoint without resolver
I0129 03:03:07.414160 2009187088 udp-sender.cxx:28] endpoint generated
I0129 03:03:07.414333 2009187088 udp-sender.cxx:31] socket opened
I0129 03:03:33.863064 2009187088 etupirka.cxx:308] done initialize all submodules
I0129 03:03:33.863104 2009187088 etupirka.cxx:310] 0x7ffc93e00340
I0129 03:03:33.863136 2009187088 etupirka.cxx:311] 0x7ffc93d3b010
I0129 03:03:33.863152 2009187088 etupirka.cxx:312] 0x7ffc93d3b0e0
I0129 03:03:33.863164 2009187088 etupirka.cxx:313] 0x7ffc93d39f20
I0129 03:03:33.863174 2009187088 etupirka.cxx:314] 0x7ffc93d3b1b0
I0129 03:03:33.863184 2009187088 etupirka.cxx:315] 0x7ffc93d3d5b0
I0129 03:03:33.863193 2009187088 etupirka.cxx:316] 0x0
I0129 03:03:33.863204 2009187088 etupirka.cxx:317] 0x0
I0129 03:03:33.863214 2009187088 etupirka.cxx:99] run main mode main loop
GUIモジュールが原因だと思う。
改めて #74 を発行しました。こちらはClose。
from: https://github.com/usagi/virtual-keyboard-prototype-1/issues/46#issuecomment-32883499