Chiharu の日記

絵描き C/C++ プログラマーの日記です。

Linux 環境にポーティング 〜プログラミングメモ

先日の日記の続き。
『Parallel force - パラレル・フォース』を X-Window 環境へ移植しています。子供の相手をしながらなので休日の割に歩みが遅いですが、ぼちぼちやってます。

タイマー処理

やりたいことは ms 精度のスリープと、ms 精度の時間カウンタ取得だけですので、簡単に下記のようにまとめました。

inline void sleep(const std::uint32_t iTime)
{
 const auto aSec = iTime / 1000;
 const auto aMsec = iTime - aSec * 1000;

 timeval aTime;
 aTime.tv_sec = aSec;
 aTime.tv_usec = aMsec * 1000;
 select(0, nullptr, nullptr, nullptr, &aTime);
}

inline const std::uint32_t getTime()
{
 timeval aTime;
 gettimeofday(&aTime, nullptr);

 return aTime.tv_sec * 1000 + aTime.tv_usec / 1000;
}

でもなんだろう。動かしてみると、Win32API の timeGetTime API と比べてちょっとタイマー精度があまりよろしくないような。んー。気のせいで済ませていいレベルか?後で詰めよう。

プロセッサ情報の取得

並列処理に際してプロセッサ数を取得する必要があり、下記のようにプロセッサ情報を標準出力するワンライナーをパイプでつなげることで対処しました。

inline const std::uint32_t getProcessors()
{
 auto aProcessors = 0;

 // プロセッサ数取得
 if (auto aPipe = popen("egrep -c \"^processor\\s:\\s[0-9]+$\" /proc/cpuinfo", "r")) {
  char aStr[512];
  if (std::fgets(aStr, sizeof(aStr), aPipe)) {
   aProcessors = std::atoi(aStr);
  }
  pclose(aPipe); 
 }

 // エラー処理
 if (aProcessors == 0) {
  aProcessors = 1;
 }

 return aProcessors;
}

ここまでの対応で Cygwin/X 環境であればとりあえず動いています。Linux 動作に向けた対応は、残すところフォント処理だけとなりました。ちょっとハードルがありそうな気がしていますが、んー。FreeType 2 を調べてみるか。
―――ソース公開も検討した方が良いかなぁ。と、ちょっと考えてます。一人でこつこつやるのも良いけれど、別の道を模索することも必要かな。とか。