[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