======================
  POSIX対応_構造概要
======================

POSIX 対応部分の構造概要を説明します。

■ファイル構成

  ファイル構成は下記の三層構造にしています。

    I/F 層： posix4.h              / posix4.cpp                ※ POSIX レイヤー
             peripheral_io.h                                   ※ ペリフェラル入出力 I/F
    補助層： posix4_aux.h          / posix4_target.h           ※ 各 platform 専用ヘッダに分岐
    実装層： posix4mbed.h          / posix4mbed.cpp            ※ mbed-os 用 POSIX レイヤー
             peripheral_io_4mbed.h / peripheral_io_4mbed.cpp   ※ mbed-os 用 ペリフェラル入出力
             primitives.h          / primitives.cpp            ※ mbed-os 用 プリミティブ群

[I/F 層]

・posix4.h (外部公開用ヘッダファイル)
    今回対応の POSIX I/F です。iotjs で必要なもののみとなります。
    このファイルを編集することは基本的にありません。

・posix4.cpp
    POSIX I/F と対象 platform 向けの実装とのブリッジです。
    このファイルを編集することは基本的にありません。

・peripheral_io.h (外部公開用ヘッダファイル)
    ペリフェラル入出力の I/F です。iotjs で必要なもののみとなります。
    環境に強く依存するため、platform 環境に合わせたファイルをインクルードします。
    このファイルを編集することは基本的にありません。


[補助層]

・posix4_aux.h (I/F 外向き)
    POSIX I/F のための補助ファイルです。
    platform 環境に合わせたファイルをインクルードします。
    インクルード先のファイル内に platform で不足している構造体などを定義します。
    例えば、対象 platform によっては signal.h や sys/time.h などが
    無いかもしれません。
    もし posix4.h 内に直接 #include <〜.h> を記述していたとすると、
    対象 platform が増えるごとに、その周辺を #ifdef/#endif で囲っていく
    ことになり、本来の目的である I/F の部分がだんだんぼやけていってしまいます。
    そこでメインヘッダである posix4.h を直接編集して拡張していくのではなく、
    この補助ファイルから各 platform 専用ヘッダをインクルードし、そこに差分のみ
    を記述して拡張していく方式としています。
    ちなみに mbed-os の場合は、次のようになっています。

            #if defined(__MBED_OS__)
                #include "platform/mbedos5/posix4mbed_aux.h"
            #endif  // #if defined(__MBED_OS__)

・posix4_target.h (I/F 内向き)
    対象 platform の選択を行うファイルです。
    基本的には対象 platform 用に実装したファイルをインクルードするのみです。
    将来対象 platform が増える場合は、インクルード先のファイル内に差分のみを記述
    して拡張していきます。
    ちなみに mbed-os の場合は、次のようになっています。

            #if defined(__MBED_OS__)
                #include "./platform/mbedos5/posix4mbed.h"
            #endif  // #if defined(__MBED_OS__)


[mbed-os 用実装層]

・posix4mbed.h
・posix4mbed.cpp
    mbed-os 向けの実装ファイルです。

・peripheral_io_4mbed.h
・peripheral_io_4mbed.cpp
    mbed-os 用のペリフェラル入出力実装ファイルです。

・primitives.h
・primitives.cpp
    上記を実装するためのプリミティブ群を実装したファイルです。


■実装層の名前空間

  実装部分はファイルローカルな helper 名前空間を除き、すべて mbed 名前空間に
属しています。
  以下はそれぞれの名前空間の概要です。

    mbed::                              - mbed-os
    mbed::debug::                       - デバッグ関連
    mbed::posix::                       - POSIX レイヤー
    mbed::posix::obsolete::             - 非推奨な関数
    mbed::posix::clock::                - 時計関連
    mbed::posix::pthread::              - pthread 関連
    mbed::posix::pthread::attr::        - pthread 属性
    mbed::posix::pthread::cond::        - pthread 条件変数
    mbed::posix::pthread::condattr::    - pthread 条件変数属性
    mbed::posix::pthread::mutex::       - pthread ミューテックス
    mbed::posix::pthread::rwlock::      - pthread 読み書き制御
    mbed::posix::sock::                 - socket 関連
    mbed::posix::sys::                  - system 関連
    mbed::linux::                       - linux レイヤー
    mbed::linux::epoll::                - epoll 機構
    mbed::linux::sock::                 - socket 関連
    mbed::linux::sys::                  - system 関連
    mbed::linux::debug::                - デバッグ関連
    mbed::overridden::                  - 置き換え関連
    mbed::nic::                         - NIC 関連

    mbed::video::                       - カメラ制御関連
    mbed::lcd::                         - LCD制御関連
    mbed::jpeg::                        - JPEG変換関連
    mbed::graphics::                    - グラフィックス描画関連

    mbed::primitives::                  - プリミティブな部品関連

    helper::                            - ヘルパ (ファイルローカル)
    mbed::bugfix::                      - 不具合吸収関連


■その他特記事項

  posix4.h をインクルードすることで OVRDN_API に属する関数は自動で置き換える
ことができます。

  ただし gettimeofday() 関数は LIBC を直接置き換えて対応しています。
  これは下記ファイルに変更を加えたくなかったためです。
    iotjs / deps / jerry / jerry-port / default / default-date.c

  また、tcp_write() 関数は linker オプションで lwip の関数をラップしています。
  これは mbed-os の TCPSocket クラスに FIN パケットを送信するメソッドが無いためです。
  送信データが疑似的な FIN パケットなら、そのデータを送信する代わりに tcp_send_fin()
関数を呼び出すようにしています。

    mbed-os / features / FEATURE_LWIP / lwip-interface / lwip / src / core / lwip_tcp_out.c


                                                                        以上
