Эффективное программирование TCP-IP




Система буферов в разделяемой памяти - часть 2


Начнем рассмотрение реализации с функций smballoc и smbfrее (листинг 3.28).

Листинг 3.28. Функции smballoc и smbfree

1    #include "etcp.h"

2    #define FREE_LIST  smbarray[ NSMB ].nexti

3    typedef  union

4    {

5    int nexti;

6    char buf[ SMBUFSZ ];

7    }smb_t;

8    smb_t *smbarray;

9    void *smballoc( void )

10   {

11   smb_t *bp;

12   lock_buf();

13   if ( FREE_LIST < 0 )

14   error( 1, 0, "больше нет буферов в разделяемой памяти\n" }

15   bр = smbarray + FREE_LIST;

16   FREE_LIST = bp->nexti;

17   unlock_buf ();

18   return bp;

19   }

20   void smbfree( void *b )

21   {

22   smb_t *bp;

23   bp = b;

24   lock_buf();

25   bp->nexti = FREE_LIST;

26   FREE_LIST  =  bp  -  smbarray;

27   unlock_buf();

28   }

Заголовок

2-8 Доступные буфера хранятся в списке свободных. При этом в первых sizeof( int ) байтах буфера хранится индекс следующего свободного буфера. Такая организация памяти отражена в объединении smb_t. В конце массива буферов есть одно целое число, которое содержит либо индекс первого буфера в списке свободных, либо -1, если этот список пуст. Доступ к этому числу вы получаете, адресуя его как smbarray [ NSMB ] . nexti. Для удобства это выражение инкапсулировано в мак­рос FREE_LIST. На сам массив буферов указывает переменная smbarray. Это, по сути, указатель на область разделяемой памяти, которую каж­дый процесс отображает на свое адресное пространство. В массиве ис­пользованы индексы, а не адреса элементов, так как в разных процес­сах эти адреса могут быть различны.

smballoc

12 Вызываем функцию lock_buf, чтобы другой процесс не мог обратиться к списку свободных. Реализация этой функции зависит от системы. В UNIX будут использованы семафоры, а в Windows - мыотексы.

13-16 Получаем буфер из списка свободных. Если больше буферов нет, то выводим диагностическое сообщение и завершаем сеанс. Вместо этого можно было бы вернуть NULL.

17-18 Открываем доступ к списку свободных и возвращаем указатель на буфер.




Содержание  Назад  Вперед