Beispiel #1
0
static void
ksem_module_destroy(void)
{

#ifdef COMPAT_FREEBSD32
	syscall32_helper_unregister(ksem32_syscalls);
#endif
	syscall_helper_unregister(ksem_syscalls);

	hashdestroy(ksem_dictionary, M_KSEM, ksem_hash);
	sx_destroy(&ksem_dict_lock);
	mtx_destroy(&ksem_count_lock);
	mtx_destroy(&sem_lock);
	p31b_unsetcfg(CTL_P1003_1B_SEM_VALUE_MAX);
	p31b_unsetcfg(CTL_P1003_1B_SEM_NSEMS_MAX);
}
Beispiel #2
0
static int
msgunload()
{
    struct msqid_kernel *msqkptr;
    int msqid;
#ifdef MAC
    int i;
#endif

    syscall_helper_unregister(msg_syscalls);
#ifdef COMPAT_FREEBSD32
    syscall32_helper_unregister(msg32_syscalls);
#endif

    for (msqid = 0; msqid < msginfo.msgmni; msqid++) {
        /*
         * Look for an unallocated and unlocked msqid_ds.
         * msqid_ds's can be locked by msgsnd or msgrcv while
         * they are copying the message in/out.  We can't
         * re-use the entry until they release it.
         */
        msqkptr = &msqids[msqid];
        if (msqkptr->u.msg_qbytes != 0 ||
                (msqkptr->u.msg_perm.mode & MSG_LOCKED) != 0)
            break;
    }
    if (msqid != msginfo.msgmni)
        return (EBUSY);

#ifdef MAC
    for (i = 0; i < msginfo.msgtql; i++)
        mac_sysvmsg_destroy(&msghdrs[i]);
    for (msqid = 0; msqid < msginfo.msgmni; msqid++)
        mac_sysvmsq_destroy(&msqids[msqid]);
#endif
    free(msgpool, M_MSG);
    free(msgmaps, M_MSG);
    free(msghdrs, M_MSG);
    free(msqids, M_MSG);
    mtx_destroy(&msq_mtx);
    return (0);
}