sys / queue.h: использование LIST_REMOVE - PullRequest
1 голос
/ 21 февраля 2012

Я пытаюсь использовать файл sys/queue.h из OpenBSD для управления связанным списком.

Я пишу механизм кэширования для небольшого микроконтроллера.Страницы сохраняются в кеше, когда они используются, и удаляются, когда для других целей, таких как malloc, требуется память.

Для этой задачи необходимо найти страницу с минимальным количеством обращений (страница с наименьшим числом обращений - этонаименее вероятно использовать) и освободить его.Однако я сталкиваюсь с довольно простой ошибкой.

Это моя функция на данный момент:

void _fmem_cache_malloc_purge(int requested_size)
{
    int n = ((requested_size / FMEM_SECTOR_SIZE) + 1) * FMEM_SECTOR_SIZE;
    struct s_fmem_cache_entry *entry, *lowentry;
    long int lowhits;   
    fmem_acquire();
    for(; n > 0; n--)
    {
        // Traverse the cache table. Find an entry with a minimum number of hits.
        lowhits = -1;
        LIST_FOREACH(entry, &fmem_cache, entry_ptr)
        {
            if(lowhits == -1 || lowhits > entry->hits)
            {
                lowentry = entry;
                lowhits = entry->hits;
            }
        }
        // Free the minimum entry.
        assert(lowhits > 0);
        LIST_REMOVE(lowentry, entry_ptr);    <-- error occurs here (line 170)
        mmgr_free(lowentry->data);
        mmgr_free(lowentry);
        fmem_cache_size--;
    }
    fmem_release();
}

Определения (в верхней части того же файла):

struct s_fmem_cache_entry {
        fAddr addr;
        char data[FMEM_SECTOR_SIZE];
        long int hits, ctime;
        LIST_ENTRY(fmem_cache_entry) entry_ptr;
    };

LIST_HEAD(s_fmem_cache_head, s_fmem_cache_entry) fmem_cache;

Я получаю ошибку:

flashmem.c: In function '_fmem_cache_malloc_purge':
flashmem.c:160: warning: assignment from incompatible pointer type
flashmem.c:170: error: dereferencing pointer to incomplete type

Я чувствую, что это простая ошибка, но C для меня нов.

Ответы [ 3 ]

2 голосов
/ 22 февраля 2012

Проблема в определении struct s_fmem_cache_entry в LIST_ENTRY(fmem_cache_entry) entry_ptr

Из queue.h мы видим, что

#define LIST_ENTRY(type)                                                \
struct {                                                                \
         struct type *le_next;   /* next element */                      \
         struct type **le_prev;  /* address of previous next element */  \
}

, поэтому, когда вы используете LIST_ENTRY, это в основном становитсябезымянная структура, как показано ниже.Вот почему компилятор выдает ошибку.

struct {
    struct fmem_cache_entry *le_next;
    struct fmem_cache_entry **le_prev;
} entry_ptr;

Вы можете легко избежать этого, не используя LIST_ENTRY и объявив struct entry_ptr самостоятельно.Я не уверен в каких-либо альтернативных решениях для этого.

2 голосов
/ 22 февраля 2012
LIST_ENTRY(fmem_cache_entry) entry_ptr;

должно быть

LIST_ENTRY(s_fmem_cache_entry) entry_ptr;
0 голосов
/ 21 февраля 2012

Вы должны проверить типы, которые вы используете, с помощью LIST_FOREACH (я думаю, это строка 160) и LIST_REMOVE (через 10 строк, поэтому должно быть 170).
Определения fmem_cache и entry_ptr отсутствуют в вашем сообщении, поэтому я не могу сказать, что это за ошибка.

Я предлагаю вам внимательно прочитать документацию по списку макросов, которые вы использовали, и проверить правильность типов всего, что вы используете с ними.

Также кажется, что struct s_fmem_cache_entry не определен в вашем коде (или заголовок, в котором он определен, не включен).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...