MCPcopy Create free account
hub / github.com/F-Stack/f-stack / seminit

Function seminit

freebsd/kern/sysv_sem.c:269–344  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

267#endif
268
269static int
270seminit(void)
271{
272 struct prison *pr;
273 void **rsv;
274 int i, error;
275 osd_method_t methods[PR_MAXMETHOD] = {
276 [PR_METHOD_CHECK] = sem_prison_check,
277 [PR_METHOD_SET] = sem_prison_set,
278 [PR_METHOD_GET] = sem_prison_get,
279 [PR_METHOD_REMOVE] = sem_prison_remove,
280 };
281
282 sem = malloc(sizeof(struct sem) * seminfo.semmns, M_SEM, M_WAITOK);
283 sema = malloc(sizeof(struct semid_kernel) * seminfo.semmni, M_SEM,
284 M_WAITOK | M_ZERO);
285 sema_mtx = malloc(sizeof(struct mtx) * seminfo.semmni, M_SEM,
286 M_WAITOK | M_ZERO);
287 seminfo.semusz = SEMUSZ(seminfo.semume);
288 semu = malloc(seminfo.semmnu * seminfo.semusz, M_SEM, M_WAITOK);
289
290 for (i = 0; i < seminfo.semmni; i++) {
291 sema[i].u.__sem_base = 0;
292 sema[i].u.sem_perm.mode = 0;
293 sema[i].u.sem_perm.seq = 0;
294#ifdef MAC
295 mac_sysvsem_init(&sema[i]);
296#endif
297 }
298 for (i = 0; i < seminfo.semmni; i++)
299 mtx_init(&sema_mtx[i], "semid", NULL, MTX_DEF);
300 LIST_INIT(&semu_free_list);
301 for (i = 0; i < seminfo.semmnu; i++) {
302 struct sem_undo *suptr = SEMU(i);
303 suptr->un_proc = NULL;
304 LIST_INSERT_HEAD(&semu_free_list, suptr, un_next);
305 }
306 LIST_INIT(&semu_list);
307 mtx_init(&sem_mtx, "sem", NULL, MTX_DEF);
308 mtx_init(&sem_undo_mtx, "semu", NULL, MTX_DEF);
309 semexit_tag = EVENTHANDLER_REGISTER(process_exit, semexit_myhook, NULL,
310 EVENTHANDLER_PRI_ANY);
311
312 /* Set current prisons according to their allow.sysvipc. */
313 sem_prison_slot = osd_jail_register(NULL, methods);
314 rsv = osd_reserve(sem_prison_slot);
315 prison_lock(&prison0);
316 (void)osd_jail_set_reserved(&prison0, sem_prison_slot, rsv, &prison0);
317 prison_unlock(&prison0);
318 rsv = NULL;
319 sx_slock(&allprison_lock);
320 TAILQ_FOREACH(pr, &allprison, pr_list) {
321 if (rsv == NULL)
322 rsv = osd_reserve(sem_prison_slot);
323 prison_lock(pr);
324 if (prison_isvalid(pr) && (pr->pr_allow & PR_ALLOW_SYSVIPC)) {
325 (void)osd_jail_set_reserved(pr, sem_prison_slot, rsv,
326 &prison0);

Callers 1

sysvsem_modloadFunction · 0.85

Calls 9

mallocFunction · 0.85
mac_sysvsem_initFunction · 0.85
mtx_initFunction · 0.85
osd_reserveFunction · 0.85
prison_lockFunction · 0.85
prison_unlockFunction · 0.85
prison_isvalidFunction · 0.85
osd_free_reservedFunction · 0.85
syscall_helper_registerFunction · 0.85

Tested by

no test coverage detected