d_groupCreationQueue
d_groupCreationQueueNew(
    d_admin admin)
{
    d_groupCreationQueue queue;
    os_result osr;
    os_threadAttr attr;

    assert(admin);

    queue = d_groupCreationQueue(os_malloc(C_SIZEOF(d_groupCreationQueue)));

    if(queue) {
        d_lockInit(d_lock(queue), D_GROUP_CREATION_QUEUE, d_groupCreationQueueDeinit);

        if(queue) {
            queue->groups                   = c_iterNew(NULL);
            queue->terminate                = FALSE;
            queue->admin                    = admin;
            queue->groupsToCreateVolatile   = 0;
            queue->groupsToCreateTransient  = 0;
            queue->groupsToCreatePersistent = 0;

            osr                             = os_threadAttrInit(&attr);

            if(osr == os_resultSuccess) {
                osr = os_threadCreate(&queue->actionThread, "groupCreationThread",
                                      &attr, (void*(*)(void*))d_groupCreationQueueRun,
                                      (void*)queue);

                if(osr != os_resultSuccess) {
                    d_groupCreationQueueFree(queue);
                    queue = NULL;
                }
            } else {
                d_groupCreationQueueFree(queue);
                queue = NULL;
            }
        }
    }
    return queue;
}
c_bool
d_groupRemoteListenerStop(
    d_groupRemoteListener listener)
{
    c_bool result;

    result = d_readerListenerStop(d_readerListener(listener));
    d_groupCreationQueueFree(listener->groupCreationQueue);

    return result;
}