Exemple #1
0
void
msginit(void)
{
	int i;

	/*
	 * msginfo.msgssz should be a power of two for efficiency reasons.
	 * It is also pretty silly if msginfo.msgssz is less than 8
	 * or greater than about 256 so ...
	 */

	i = 8;
	while (i < 1024 && i != msginfo.msgssz)
		i <<= 1;

    	if (i != msginfo.msgssz)
		panic("msginfo.msgssz %d not a small power of 2",
		    msginfo.msgssz);

	if (msginfo.msgseg > 32767)
		panic("msginfo.msgseg %d > 32767", msginfo.msgseg);

	if (msgmaps == NULL)
		panic("msgmaps is NULL");

	for (i = 0; i < msginfo.msgseg; i++) {
		if (i > 0)
			msgmaps[i-1].next = i;
		msgmaps[i].next = -1;	/* implies entry is available */
	}

	free_msgmaps = 0;
	nfree_msgmaps = msginfo.msgseg;

	if (msghdrs == NULL)
		panic("msghdrs is NULL");

	for (i = 0; i < msginfo.msgtql; i++) {
		msghdrs[i].msg_type = 0;
		if (i > 0)
			msghdrs[i-1].msg_next = &msghdrs[i];
		msghdrs[i].msg_next = NULL;
#ifdef MAC
		mac_sysvmsg_init(&msghdrs[i]);
#endif
    	}

	free_msghdrs = &msghdrs[0];

	if (msqids == NULL)
		panic("msqids is NULL");

	for (i = 0; i < msginfo.msgmni; i++) {
		msqids[i].u.msg_qbytes = 0;	/* implies entry is available */
		msqids[i].u.msg_perm.seq = 0;	/* reset to a known value */
#ifdef MAC
		mac_sysvmsq_init(&msqids[i]);
#endif
	}
}
Exemple #2
0
static int
msginit()
{
    int i, error;

    TUNABLE_INT_FETCH("kern.ipc.msgseg", &msginfo.msgseg);
    TUNABLE_INT_FETCH("kern.ipc.msgssz", &msginfo.msgssz);
    msginfo.msgmax = msginfo.msgseg * msginfo.msgssz;
    TUNABLE_INT_FETCH("kern.ipc.msgmni", &msginfo.msgmni);
    TUNABLE_INT_FETCH("kern.ipc.msgmnb", &msginfo.msgmnb);
    TUNABLE_INT_FETCH("kern.ipc.msgtql", &msginfo.msgtql);

    msgpool = malloc(msginfo.msgmax, M_MSG, M_WAITOK);
    msgmaps = malloc(sizeof(struct msgmap) * msginfo.msgseg, M_MSG, M_WAITOK);
    msghdrs = malloc(sizeof(struct msg) * msginfo.msgtql, M_MSG, M_WAITOK);
    msqids = malloc(sizeof(struct msqid_kernel) * msginfo.msgmni, M_MSG,
                    M_WAITOK);

    /*
     * msginfo.msgssz should be a power of two for efficiency reasons.
     * It is also pretty silly if msginfo.msgssz is less than 8
     * or greater than about 256 so ...
     */

    i = 8;
    while (i < 1024 && i != msginfo.msgssz)
        i <<= 1;
    if (i != msginfo.msgssz) {
        DPRINTF(("msginfo.msgssz=%d (0x%x)\n", msginfo.msgssz,
                 msginfo.msgssz));
        panic("msginfo.msgssz not a small power of 2");
    }

    if (msginfo.msgseg > 32767) {
        DPRINTF(("msginfo.msgseg=%d\n", msginfo.msgseg));
        panic("msginfo.msgseg > 32767");
    }

    for (i = 0; i < msginfo.msgseg; i++) {
        if (i > 0)
            msgmaps[i-1].next = i;
        msgmaps[i].next = -1;	/* implies entry is available */
    }
    free_msgmaps = 0;
    nfree_msgmaps = msginfo.msgseg;

    for (i = 0; i < msginfo.msgtql; i++) {
        msghdrs[i].msg_type = 0;
        if (i > 0)
            msghdrs[i-1].msg_next = &msghdrs[i];
        msghdrs[i].msg_next = NULL;
#ifdef MAC
        mac_sysvmsg_init(&msghdrs[i]);
#endif
    }
    free_msghdrs = &msghdrs[0];

    for (i = 0; i < msginfo.msgmni; i++) {
        msqids[i].u.msg_qbytes = 0;	/* implies entry is available */
        msqids[i].u.msg_perm.seq = 0;	/* reset to a known value */
        msqids[i].u.msg_perm.mode = 0;
#ifdef MAC
        mac_sysvmsq_init(&msqids[i]);
#endif
    }
    mtx_init(&msq_mtx, "msq", NULL, MTX_DEF);

    error = syscall_helper_register(msg_syscalls);
    if (error != 0)
        return (error);
#ifdef COMPAT_FREEBSD32
    error = syscall32_helper_register(msg32_syscalls);
    if (error != 0)
        return (error);
#endif
    return (0);
}