usagi / virtual-keyboard-prototype-1

仮想キーボード試作1型
3 stars 0 forks source link

OSXでudp_senderがsocketのopenでしばらく固まる問題 #47

Closed usagi closed 10 years ago

usagi commented 10 years ago

from: https://github.com/usagi/virtual-keyboard-prototype-1/issues/46#issuecomment-32883499

ただ、socket openでしばらく固まります。その後、カメラの映像が出て、と動き出します。

usagi commented 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、このサンプル、ともに発生を観測できません。

arisin commented 10 years ago

こちらでもエラーが。調査します。

  << clang++ a.cxx -boost_system -lpthread                                                        [master]
clang: error: unsupported option '-b oost_system'
usagi commented 10 years ago

↑ -boost_system じゃなくて -lboost_system で、そうすると -l オプションが libboost_system.dylib (.so, .dll)をライブラリー検索パスから探してくれます。

実機レンタル中だし、こちらの問題も可能な限り対応します。

arisin commented 10 years ago

よろしくお願いします

usagi commented 10 years ago

↑の 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で固まらなくなるかもしれません。(相変わらず固まるかもしれません。)

usagi commented 10 years ago

↑効果なかったらしい

usagi commented 10 years ago

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サブモジュールでは無い可能性を指摘したい。

usagi commented 10 years ago

-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モジュールが原因だと思う。

usagi commented 10 years ago

改めて #74 を発行しました。こちらはClose。