Title: mq_list / mq_freelist / mq_init() / mq_get() / mq_free()
Messages that the network service receives from the other services (file system, memory manager, etc.) and the kernel are placed into a linked list. This linked list is formed with the following struct:
typedef struct mq
and is initialized by mq_init(). After initialization, the linked list is as follows:
struct mq *mq_next;
As messages are received, mq_get() is called to acquire the element of mq_list pointed to by mq_freelist. This element holds the message until the message is processed. mq_allocated for this element is set to 1 and mq_freelist is advanced to point to the next element.
After the message is processed, mq_free() places the element back onto mq_freelist and sets mq_allocated back to 0.
As with other queues within the network service, the memory for the message queue comes from an array with a limited number of elements. This must be done because memory within Minix is scarce (for one reason, Minix does not have virtual memory).
Click here for a description of the different types of messages.