0

を使用してアイドル ループを実行しようとしていますlibmpdclientが、既に最初のアイドル コールで、明らかに回復不能なエラー状態になります。

のパラメーターに渡しfalseているので、ループを外部から停止して (バックグラウンド スレッドで実行されます)、クリーンなシャットダウン手順を確実に実行できます。disable_timeoutmpd_recv_idle

ここに私のテストコードがあります:

#include <string>
#include <stdexcept>
#include <memory>

#include <mpd/client.h>

typedef std::unique_ptr<mpd_connection, decltype(&mpd_connection_free)>
mpd_connection_ptr;

void
check_error (const mpd_connection_ptr &c, const std::string &s)
{
  if (mpd_connection_get_error (c.get ()) != MPD_ERROR_SUCCESS)
    {
      throw std::runtime_error (s);
    }
}

int
main (void)
{
  const std::string host = "127.0.0.1";
  const uint16_t port = 7701;
  const int timeout = 1 * 1000;
  mpd_connection_ptr c {mpd_connection_new (host.c_str (), port, timeout),
                        &mpd_connection_free
                       };
  if (c == nullptr)
    {
      throw std::runtime_error ("connection_new returned nullptr");
    }
  if (!mpd_send_idle (c.get ()))
    {
      throw std::runtime_error ("mpd_send_idle returned false");
    }
  check_error (c, "mpd_send_idle caused error status");
  auto idle = mpd_recv_idle (c.get (), false);
  if (idle == 0)
    {
      if (mpd_connection_get_error (c.get ()) == MPD_ERROR_TIMEOUT)
        {
          if (!mpd_connection_clear_error (c.get ()))
            {
              throw std::runtime_error ("mpd_connection_clear_error returned false");
            }
        }
      else
        {
          check_error (c, "mpd_recv_idle caused error status");
        }
    }
  return 0;
}

このコードを実行すると (mpd は 127.0.0.1:7701 で実行されています。 で確認しましたnetstat)、次の結果が得られます。

terminate called after throwing an instance of 'std::runtime_error'
  what():  mpd_connection_clear_error returned false

ここでタイムアウトエラーをクリアできないのはなぜですか?回復可能な状況のように見えますか?

4

1 に答える 1