[cdev] ������_6. �� 135
Grigoriy A. Sitkarev
sitkarev �� komitex.ru
�� ��� 20 08:21:31 MSK 2010
���-�� ������������ ����������. � ��������.
��� ��� �� ��� ������� ��������, �� ����� � public �������� ��������
����� ������ ���:
struct prioq_head *
prioq_get(struct prioq *queue)
{
struct prioq_head *head;
struct user_data *ptr;
unsigned int used;
return_val_if_fail(queue != NULL, NULL);
...
��� � ��� ������ ���� ������� ���-�� ����������. ���� �� ������ ��
����������, �� ������������ ������ return_if_fail.
void
prioq_free(struct prioq **queue)
{
return_if_fail(queue != NULL);
return_if_fail(*queue != NULL);
...
��� �������� ���������, ������� ���������� �������� ������ �������,
������ ������ assert(3). �� �� �������� ������ ���� ����. �� ��������
�������� ������ SIGABRT ����� abort(3), ����� ������� ���� ���������
���� �������� ��� ����������� ���������, ��� ����������� � ��� �����
�������� assert-�� �� ������.
���� �ݣ ���� �����, ������� ������ ���� �� ������ ����.
��������, � ������� prioq_get() � ���� �ģ� �������� ���������� �����
�������:
if (queue == NULL || queue->used == 0) {
fprintf(stderr, "prioq_get: Can't extract "
"head from queue\n");
return NULL;
}
� ��������� ��������� queue �ӣ �������, � ��� ���������, ���� ���
���������, ������ ��� �����������-������������ ����� ���������� ���
��������� ������ � �������� ���� NULL ��� �� ������� ���� ���������,
������� ��� ����̣� ��� (�������� prioq_free()), ������ ��� ���� ��
������ � ��������� � ���������� �������, ������� ��� �� ����������.
��, ��� �������� ��������� ��������, �ޣ����� ��������� � �������, �����
��������� ������ ���, �� ���� ������ ��������������. ���� � ��� ���
���������, ��� ������� � ������� ��� ���������, �� �������� �������.
���� ���-�� ��������� ������� �� ������ ������� �������, �� ������ ���,
������ �� ���������� NULL, ������������ ��������� ������ ������ݣ����
��������, � ���� �������� �� ����, �� ������ � ��� �� ������. � ���� ��
���������� ��� ��������� (queue->used == 0) �������������� ��� ������
������������, ������ ��� �� ����������� ����� ������ �� ���������
��������� � ��� ��� ���������� ������� ������� �� �������.
���������� ������� ��� �� �����:
if (queue == NULL) {
fprintf(stderr, "prioq_get: Can't extract "
"head from queue\n");
return NULL;
}
if (queue->used == 0)
return NULL;
�� ��� � �������������� �������:
return_val_if_fail(queue != NULL, NULL);
if (queue->used == 0)
return NULL;
������� �� ������ ������ �������� �� (queue->used == 0) �� ����, ��� ��
�������� ��� ��������� queue. ������ ��� queue ����� ���� NULL � �� ���
� �������� ������ �������������� ``(->used'', �.�. ������ �� �������� ��
������ queue (�� ����) � ���� used, ��� ���������� �����ģ� � ������
����������� � ���� �������� �������� ������ SIGSEGV.
������ ��������� ��� ����� � ����� ������.
struct prioq *q;
q = ((struct prioq *)(NULL))->used;
� NULL ��� ���������, ������̣���� ���-�� � ���������� �������� ���:
#define NULL ((void *)(0))
����� ������, ����������� �������� ����� � ��������� �������� ������
���� � ���������, � ������. ���� � ������ ����� 0 � ��������� ��� ���
��������� �� ���������, � ����� ������ ��� �����... �� ��� ��� ���������
��������.
unsigned long offset;
offset = &((struct prioq *)(NULL))->used;
� offset �� ������� �������� � ������ ������ ��� �������� ���� used
������������ ���������� ������ ��������� prioq.
� �� � ��������� ���������������� ����� ��������� ��� ��� ����� ����
��������� �� ���� ��������� �������� ��������� �� ţ ������. �����
������ �������� ����� ������:
#define CONTAINER_OF(ptr, type, field) \
((type *)((unsigned long)(ptr) - (unsigned long)(&((type *)(0))->field)))
�����, ��������, ���� ��������� (�����) ������ ���� ������ ��������� ��
�� ����� �������� ��������� �� ���������� ���������. � ������ ����
containter.c ��� ��� ������������������ �� ������� �������. �����
������� ����� �������������� ����� ������� ������������. �� ������������
����������� ������ ������ ������� ��� ������ � ������������ ������
������, �� ����������� � �����-�� ���������� ��������� ������������.
����� ��� ������ � containter.c �ӣ ���������.
--
�.�.
> ���� ����� �������� � ���-�� ��������� �������� ������� ����������.
> ���ӣ� ��������� ������� ����. ����� �� ������ ��������� ���������?
> ����� �� ��� ������ ������ �� ���� ��������, � ���� �� �� ����, �� �����
> � �����?
>
> ����� ����� ����������������� ����� ������������ ��������. ��������
> ���������� �� �� ���������� (������� ���������, ����� �� �������
> �������� � �.�.) ������� ������ � ��������, ������� ��������� � public
> ���������� ����������, �.�. �� ���� ��������, ������� ����� ����
> �������� ������� �������������. ��� ������ ���, ��� �������, ��
> ���������� �������� ����� �������� ������ ��� �� ����� �.�. �� �� ���
> ������� ������, � ��� ������ ����� ����������� ������� public �������.
>
> ��� �� ������ ��� ��������?
----------- �������� ����� -----------
A non-text attachment was scrubbed...
Name: container.c
Type: text/x-csrc
Size: 1205 bytes
Desc: �����������
URL: <http://amplab.syktsu.ru/pipermail/cdev/attachments/20100920/c79a28bd/attachment.c>
��������� ���������� � ������ �������� cdev