Problem with SIMPLEQ_INSERT_TAIL

Stephan <[email protected]>
Newsgroups gmane.os.netbsd.devel.kernel
Message-ID <CABZpUSVESkui3eOnQULjUqsJzaT=3C8exhV4A4hX3=gaMfROHQ@mail.gmail.com>
Hello,

I am working on the semaphore part of my Haiku compat layer. I took
uipc_sem.c as a reference, where control structures are organized in a
dynamically allocated array and not as part of a list.

However, I like to maintain a "free list" in the form of a SIMPLEQ, on
which unused semaphores are maintained for fast allocation.

There is an issue in the initialization function, where each structure
is inserted into the free queue. I spent some time on this, but have
been unable to find the cause. Maybe I am overlooking something
trivial or there is something special I just don´t know.

The compiler says:

In file included from /home/stephan/src/sys/sys/siginfo.h:38,
                 from /home/stephan/src/sys/sys/signal.h:112,
                 from ./machine/frame.h:75,
                 from ./x86/cpu.h:56,
                 from ./machine/cpu.h:42,
                 from ./machine/param.h:11,
                 from /home/stephan/src/sys/sys/param.h:142,
                 from /home/stephan/src/sys/kern/uipc_hsem.c:32:
/home/stephan/src/sys/kern/uipc_hsem.c: In function 'khsem_init':
/home/stephan/src/sys/sys/queue.h:347:19: error: assignment to 'struct
khsem **' from incompatible pointer type 'struct kshem **'
[-Werror=incompatible-pointer-types]
  347 |  (head)->sqh_last = &(elm)->field.sqe_next;   \
      |                   ^
/home/stephan/src/sys/kern/uipc_hsem.c:68:9: note: in expansion of
macro 'SIMPLEQ_INSERT_TAIL'
   68 |         SIMPLEQ_INSERT_TAIL(&khsem_freeq, &hsems[i], khs_entry);
      |         ^~~~~~~~~~~~~~~~~~~



The relevant code snippet is this:

const int khsem_max = 8192;

static kmutex_t                 khsem_mutex               __cacheline_aligned;
static struct khsem             *hsems                    __read_mostly;
static SIMPLEQ_HEAD(, khsem)    khsem_freeq;


int
khsem_init(void)
{
    int i, sz;

    SIMPLEQ_INIT(&khsem_freeq);
    mutex_init(&khsem_mutex, MUTEX_DEFAULT, IPL_NONE);

    sz = ALIGN(khsem_max * sizeof(struct khsem));
    sz = round_page(sz);

    // XXX allocate memory

    for (i = 0; i < khsem_max; i++) {
        hsems[i].khs_id = i;
        mutex_init(&hsems[i].khs_interlock, MUTEX_DEFAULT, IPL_NONE);
        cv_init(&hsems[i].khs_cv, "acquire_sem");

        SIMPLEQ_INSERT_TAIL(&khsem_freeq, &hsems[i], khs_entry); //
<<---- DOES NOT COMPILE
    }

}


The control structure looks like this:

struct khsem {
  sem_id                  khs_id;             /* id of this semaphore */
  SIMPLEQ_ENTRY(kshem)    khs_entry;          /* free list entry */
  kmutex_t                khs_interlock;      /* lock on this semaphore */
  kcondvar_t              khs_cv;             /* CV for wait events */
  pid_t                   khs_owner;          /* owning process */
  char                    *khs_name;          /* name of this semaphore */
  size_t                  khs_namelen;        /* length of name */
  int                     khs_state;          /* state of this port */
  int                     khs_waiters;
  int                     khs_count;          /* current count */
  lwpid_t                 khs_latest_holder;  /* latest holder LWP id */
  uid_t                   khs_uid;            /* creator uid */
  gid_t                   khs_gid;            /* creator gid */
};



Any help is appreciated ;)

Thanks,

Stephan
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.