TError TCgroup::Remove() const { struct stat st; TError error; if (Secondary()) return TError(EError::Unknown, "Cannot create secondary cgroup " + Type()); L_ACT() << "Remove cgroup " << *this << std::endl; error = Path().Rmdir(); /* workaround for bad synchronization */ if (error && error.GetErrno() == EBUSY && !Path().StatStrict(st) && st.st_nlink == 2) { for (int i = 0; i < 100; i++) { usleep(config().daemon().cgroup_remove_timeout_s() * 10000); error = Path().Rmdir(); if (!error || error.GetErrno() != EBUSY) break; } } if (error && (error.GetErrno() != ENOENT || Exists())) L_ERR() << "Cannot remove cgroup " << *this << " : " << error << std::endl; return error; }
TError TCgroup::Attach(pid_t pid) const { if (Secondary()) return TError(EError::Unknown, "Cannot attach to secondary cgroup " + Type()); L_ACT() << "Attach process " << pid << " to " << *this << std::endl; TError error = Knob("cgroup.procs").WriteAll(std::to_string(pid)); if (error) L_ERR() << "Cannot attach process " << pid << " to " << *this << " : " << error << std::endl; return error; }
TError TCgroup::Create() const { TError error; if (Secondary()) return TError(EError::Unknown, "Cannot create secondary cgroup " + Type()); L_ACT() << "Create cgroup " << *this << std::endl; error = Path().Mkdir(0755); if (error) L_ERR() << "Cannot create cgroup " << *this << " : " << error << std::endl; return error; }
/** Create a null secondary ID in the rare case that having one * is not applicable. */ static inline Secondary null() { return Secondary(0); }
Skill::SecSkills::SecSkills(u8 race) { reserve(HEROESMAXSKILL); if(race & Race::ALL) { const skillstats_t* ptr = GetSkillStats(race); if(ptr) { if(ptr->initial_secondary.archery) push_back(Secondary(Secondary::ARCHERY, ptr->initial_secondary.archery)); if(ptr->initial_secondary.ballistics) push_back(Secondary(Secondary::BALLISTICS, ptr->initial_secondary.ballistics)); if(ptr->initial_secondary.diplomacy) push_back(Secondary(Secondary::DIPLOMACY, ptr->initial_secondary.diplomacy)); if(ptr->initial_secondary.eagleeye) push_back(Secondary(Secondary::EAGLEEYE, ptr->initial_secondary.eagleeye)); if(ptr->initial_secondary.estates) push_back(Secondary(Secondary::ESTATES, ptr->initial_secondary.estates)); if(ptr->initial_secondary.leadership) push_back(Secondary(Secondary::LEADERSHIP, ptr->initial_secondary.leadership)); if(ptr->initial_secondary.logistics) push_back(Secondary(Secondary::LOGISTICS, ptr->initial_secondary.logistics)); if(ptr->initial_secondary.luck) push_back(Secondary(Secondary::LUCK, ptr->initial_secondary.luck)); if(ptr->initial_secondary.mysticism) push_back(Secondary(Secondary::MYSTICISM, ptr->initial_secondary.mysticism)); if(ptr->initial_secondary.navigation) push_back(Secondary(Secondary::NAVIGATION, ptr->initial_secondary.navigation)); if(ptr->initial_secondary.necromancy) push_back(Secondary(Secondary::NECROMANCY, ptr->initial_secondary.necromancy)); if(ptr->initial_secondary.pathfinding) push_back(Secondary(Secondary::PATHFINDING, ptr->initial_secondary.pathfinding)); if(ptr->initial_secondary.scouting) push_back(Secondary(Secondary::SCOUTING, ptr->initial_secondary.scouting)); if(ptr->initial_secondary.wisdom) push_back(Secondary(Secondary::WISDOM, ptr->initial_secondary.wisdom)); } } }