CoreEntry *core_entry_alloc(int th, int tsk) { size_t sz; CoreEntry *core = NULL; void *m; sz = sizeof(CoreEntry); if (tsk) { sz += sizeof(TaskCoreEntry) + TASK_COMM_LEN; if (th) { sz += sizeof(TaskRlimitsEntry); sz += RLIM_NLIMITS * sizeof(RlimitEntry *); sz += RLIM_NLIMITS * sizeof(RlimitEntry); sz += sizeof(TaskTimersEntry); sz += 3 * sizeof(ItimerEntry); /* 3 for real, virt and prof */ } } if (th) sz += sizeof(ThreadCoreEntry) + sizeof(ThreadSasEntry); m = xmalloc(sz); if (m) { core = xptr_pull(&m, CoreEntry); core_entry__init(core); core->mtype = CORE_ENTRY__MARCH; if (tsk) { core->tc = xptr_pull(&m, TaskCoreEntry); task_core_entry__init(core->tc); core->tc->comm = xptr_pull_s(&m, TASK_COMM_LEN); memzero(core->tc->comm, TASK_COMM_LEN); if (th) { TaskRlimitsEntry *rls; TaskTimersEntry *tte; int i; rls = core->tc->rlimits = xptr_pull(&m, TaskRlimitsEntry); task_rlimits_entry__init(rls); rls->n_rlimits = RLIM_NLIMITS; rls->rlimits = xptr_pull_s(&m, sizeof(RlimitEntry *) * RLIM_NLIMITS); for (i = 0; i < RLIM_NLIMITS; i++) { rls->rlimits[i] = xptr_pull(&m, RlimitEntry); rlimit_entry__init(rls->rlimits[i]); } tte = core->tc->timers = xptr_pull(&m, TaskTimersEntry); task_timers_entry__init(tte); tte->real = xptr_pull(&m, ItimerEntry); itimer_entry__init(tte->real); tte->virt = xptr_pull(&m, ItimerEntry); itimer_entry__init(tte->virt); tte->prof = xptr_pull(&m, ItimerEntry); itimer_entry__init(tte->prof); } } if (th) { core->thread_core = xptr_pull(&m, ThreadCoreEntry); thread_core_entry__init(core->thread_core); core->thread_core->sas = xptr_pull(&m, ThreadSasEntry); thread_sas_entry__init(core->thread_core->sas); if (arch_alloc_thread_info(core)) { xfree(core); core = NULL; } } } return core; }
CoreEntry *core_entry_alloc(int th, int tsk) { size_t sz; CoreEntry *core = NULL; void *m; sz = sizeof(CoreEntry); if (tsk) { sz += sizeof(TaskCoreEntry) + TASK_COMM_LEN; if (th) { sz += sizeof(TaskRlimitsEntry); sz += RLIM_NLIMITS * sizeof(RlimitEntry *); sz += RLIM_NLIMITS * sizeof(RlimitEntry); sz += sizeof(TaskTimersEntry); sz += 3 * sizeof(ItimerEntry); /* 3 for real, virt and prof */ } } if (th) { CredsEntry *ce = NULL; sz += sizeof(ThreadCoreEntry) + sizeof(ThreadSasEntry) + sizeof(CredsEntry); sz += CR_CAP_SIZE * sizeof(ce->cap_inh[0]); sz += CR_CAP_SIZE * sizeof(ce->cap_prm[0]); sz += CR_CAP_SIZE * sizeof(ce->cap_eff[0]); sz += CR_CAP_SIZE * sizeof(ce->cap_bnd[0]); /* * @groups are dynamic and allocated * on demand. */ } m = xmalloc(sz); if (m) { core = xptr_pull(&m, CoreEntry); core_entry__init(core); core->mtype = CORE_ENTRY__MARCH; if (tsk) { core->tc = xptr_pull(&m, TaskCoreEntry); task_core_entry__init(core->tc); core->tc->comm = xptr_pull_s(&m, TASK_COMM_LEN); memzero(core->tc->comm, TASK_COMM_LEN); if (th) { TaskRlimitsEntry *rls; TaskTimersEntry *tte; int i; rls = core->tc->rlimits = xptr_pull(&m, TaskRlimitsEntry); task_rlimits_entry__init(rls); rls->n_rlimits = RLIM_NLIMITS; rls->rlimits = xptr_pull_s(&m, sizeof(RlimitEntry *) * RLIM_NLIMITS); for (i = 0; i < RLIM_NLIMITS; i++) { rls->rlimits[i] = xptr_pull(&m, RlimitEntry); rlimit_entry__init(rls->rlimits[i]); } tte = core->tc->timers = xptr_pull(&m, TaskTimersEntry); task_timers_entry__init(tte); tte->real = xptr_pull(&m, ItimerEntry); itimer_entry__init(tte->real); tte->virt = xptr_pull(&m, ItimerEntry); itimer_entry__init(tte->virt); tte->prof = xptr_pull(&m, ItimerEntry); itimer_entry__init(tte->prof); } } if (th) { CredsEntry *ce; core->thread_core = xptr_pull(&m, ThreadCoreEntry); thread_core_entry__init(core->thread_core); core->thread_core->sas = xptr_pull(&m, ThreadSasEntry); thread_sas_entry__init(core->thread_core->sas); ce = core->thread_core->creds = xptr_pull(&m, CredsEntry); creds_entry__init(ce); ce->n_cap_inh = CR_CAP_SIZE; ce->n_cap_prm = CR_CAP_SIZE; ce->n_cap_eff = CR_CAP_SIZE; ce->n_cap_bnd = CR_CAP_SIZE; ce->cap_inh = xptr_pull_s(&m, CR_CAP_SIZE * sizeof(ce->cap_inh[0])); ce->cap_prm = xptr_pull_s(&m, CR_CAP_SIZE * sizeof(ce->cap_prm[0])); ce->cap_eff = xptr_pull_s(&m, CR_CAP_SIZE * sizeof(ce->cap_eff[0])); ce->cap_bnd = xptr_pull_s(&m, CR_CAP_SIZE * sizeof(ce->cap_bnd[0])); if (arch_alloc_thread_info(core)) { xfree(core); core = NULL; } } } return core; }