LibIPC -- библиотека межпотокового взаимодействия
=================================================


Интерфейс
---------

**LibIPC** будет предоставлять следующие функции:

int **IPCInit**\(void);
  Инициализация IPC. При этом должна быть инициализирована куча для динамического
  выделения памяти под буфер. Возвращает 0 = **SUCCESS** в случае удачи, в противном
  случае код ошибки:

  - **NO_MEMORY** (=1) -- невозможно получить память
  - **CANNOT_SET_MASK** (=2) -- невозможно установить маску событий
  - *n* + 2 -- системная функция завершилась с ошибкой *n*

int **IPCSend**\(int *tid*, void *\*message*, int *length*);
  Послать сообщение. Если произошла системная ошибка 2 или 3, будут произведены
  дополнительные попытки (не больше какой-то константы). В случае успеха
  возвращает 0, коды ошибок:

  - **IPC_NO_AREA** (=1) --  поток не определил область IPC
  - **IPC_BUFFER_LOCKED** (=2) -- были ошибки 2 и 3, при последней попытке -- ошибка 2 (поток заблокировал буфер)
  - **IPC_OVERFLOW** (=3) -- то же, что и 2, только последняя ошибка 3 (переполнение буфера)
  - **IPC_NO_TID** (=4) -- единственная или последняя ошибка была 4, т.е. отсутствие потока с заданным TID

bool **IPCCheck**\(void);
  Проверить, не пришло ли новое сообщение.

Message \*\ **IPCGetNextMessage**\(void);
  Получить следующее сообщение. То же самое, что **IPCWaitMessage**\(0).

Message \*\ **IPCWaitMessage**\(int *time*);
  Ждать сообщения не больше time миллисекунд (-1 = ждать вечно). При этом
  сообщение удаляется из буфера и копируется в динамически выделяемую область
  памяти. Если сообщения нет (или произошла ошибка выделения памяти),
  возвращается **NULL**, если есть -- адрес на структуру Message::

    typedef struct Message {
      int tid;
      int length;
      //void msg;
    } Message;

void **IPCLock**\(void);
  Функция ручной блокировки буфера (в большинстве случаев не нужна, т.к.
  библиотека сама блокирует буфер в нужных случаях).

void **IPCUnclock**\(void);
  Функция, обратная **IPCLock**\();


Форма реализации
----------------

- Язык: **C**
- Формат: .o -- поддержка C, asm и т.д. Динамичность библиотеки в данном случае бессмысленна.