It's not very effective.
XRX2WNKZLKKPPBDBBXAJDD5QYKKBAC4OGTUD7R23MBWUQCBAVT6QC ALU52WZJLRFVE3V7SLKBM2ENA6CO6LU2MDNUVGPTWXO7ZCXDV2WAC CYVWW32QHVPOSZWEIJ53235TMH64EVXNAX2JHVBRIR6M3HGXW2YAC VMZDEQQ5Z3UY7YUR3DOCBYZ3U5GMNX7OODGB55DGZS7PVGIKXKLQC CXKN2W4BUREOIATFL5KYH7KMJWP2R3IG4V5GDQMOPPUKXUF2GOYAC YRXR3WDPUCCRY26ABDYTNNYTOQYYAPLW7MB4TSM3EYPXGQT7MQPQC 7YCFGMZBCWDOOO3DHSJ3ZWPUWFMEO6OLQGDZWLULAPER3YZOYUJAC KD5237CUR4X3VRUD46H3CVU22NYS7LOPF3WXENWHNSF7GKEIQZ6QC 4N5APGRGHTKFMEJ7THSJX6TSYYAP3BUZQG73AJBKCQLXOOEHPATQC DPYJFBXU55M7PFYHARO5FSZ4GFNZQQI4GYV5YTIXC77FUCVUU3PAC 5X6FHW3SHOE5R37WJPLKNVJM6VWFT6SNRMC5OFFCCW3IGC4ORY2QC HVXL2XUZTOWJPESBHBFD74B4QXNMG5SX4LOXDLPJ7732IU4SUYWQC 5MP35ORVVILU3GXYITYXD754QFZCOZ3X45QO54K2GW5UKNHX66SAC AEKIREIHNEHL4CQEHRZJGRWMCV2XO6ICZK2OM342IKAJV6MUMDOAC 4LWGZL33NOCTVZXUZZM5P6BRBHDUMEAJPVPNB52PN3UZVC7DMSZAC L4LBF7UFTG7SVPSZNHINTDQRXEOW7IX4AUASALYHDGMMAWRX6U7QC I2HYJBMLEXCUGUWZML5LVR2SR6TI3XAS4MSCRYOK6T44M4MYTDCAC VTNP5KDOVQPWGRARMFJJ3MTU7IAZT4NP7ZFY4HJYT3KYJUSAZEZAC ZVSHXE3KY43J5BBDGERORR2FAVDG4ARANUUSGIYDHUN767SQ4GAQC L4GM4MA6AURPIAZHKPHLM7KJCQ3MRKULSD2O4U5YW7JEDBT4GYHQC SM5M2J3AGBS4IHD7TBFBVNMXTUBVA5OIFIIJJDAU6KUCPRU4S74AC 7GKAIP3VYKM4MGGHOGBB3DR2M6B6SENBR5IZQVJYO65AWT4BW7LAC STZE4KKRL2AGCPP2FOMBNZHJTRTKJQZSEKALWEV6FK5BII6H7EDAC VTMBJVIS6JEZVGC3QHM45LVJDSEOSSTOXSYEBDZE3BK3SHOM2TUQC FGLKIVYSAUOB3FP33SQCPXP3ZZLSDDV2SS2NEP6L6TQVRYQU4ETQC FUB37KFUYUROEDXICXDZJTQCE6K5GOTRMSWZHIVDRPUYJR2MMO5QC 3PNG7NIBQQURUUPRVQXYL342OT7JUUYOMY2JJNP6YDX7SYJDZMYAC POPU2ATH2HHBTGHKRAV3EY2K55P664IARI3YJGLDKVJ6PQPXBQ4AC 77VF5TC64OAL6CNIDZL7RO3UAAB4Y7CIMWBZGDKL7Z3AGI4DRGGAC DKJFD6JNNK5LJMRGQABMJZKMFZLGY3ADKJWF6J4BBHEUPY3NB67QC MIC2O6ZFPPBE77F527U7ZEA5Y4SAG53CUX2ZZA76DGV64D5N2GRAC FHXU6346V2UFSLCIVXTPRJUBBACOACJ7LFD432IVALTYYHEE4DEQC JQ5VHWRBIXLGE5QVLEIACGKEYHFBJKWJREJIQN2SXTEV6UR2H7MAC HP5WJLQUNP7PXGVBYOMWRCZ4QKDECULS2EAFX2FPHRUXV2CMMYCAC YNGIYQRFBKRKSRPSYSIG3R3U73ANOO5MC6C7VO4XOTDNBQHCKL3AC IMQRX4MPANNOXDP6THT2FA4576CDFY44LGNCS74BHV6DWLOCXQOQC BGMBEXS6DE4ITS76GOC2ELLAKF7NDCQFUIN3KFDLCZGQHTDQRLKAC }static std::string lastAttrPath;static bool comma = false;static size_t maxHeapSize;struct BailOut { };bool lte(const std::string & s1, const std::string & s2){size_t p1 = 0, p2 = 0;while (true) {if (p1 == s1.size()) return p2 == s2.size();if (p2 == s2.size()) return true;auto d1 = s1.find('.', p1);auto d2 = s2.find('.', p2);auto c = s1.compare(p1, d1 - p1, s2, p2, d2 - p2);if (c < 0) return true;if (c > 0) return false;p1 = d1 == std::string::npos ? s1.size() : d1 + 1;p2 = d2 == std::string::npos ? s2.size() : d2 + 1;}
GC_prof_stats_s gc;GC_get_prof_stats(&gc, sizeof(gc));if (gc.heapsize_full > maxHeapSize) {printInfo("restarting hydra-eval-jobs after job '%s' because heap size is at %d bytes", attrPath, gc.heapsize_full);lastAttrPath = attrPath;throw BailOut();}
assert(lte("abc", "def"));assert(lte("abc", "def.foo"));assert(!lte("def", "abc"));assert(lte("nixpkgs.hello", "nixpkgs"));assert(lte("nixpkgs.hello", "nixpkgs.hellooo"));assert(lte("gitAndTools.git-annex.x86_64-darwin", "gitAndTools.git-annex.x86_64-linux"));assert(lte("gitAndTools.git-annex.x86_64-linux", "gitAndTools.git-annex-remote-b2.aarch64-linux"));
/* Read the current heap size, which is the initial heap size. */GC_prof_stats_s gc;GC_get_prof_stats(&gc, sizeof(gc));auto initialHeapSizeInt = gc.heapsize_full;/* Then make sure the maximum heap size will be bigger than the initial heap size. */if (initialHeapSizeInt > maxHeapSize) {printInfo("warning: evaluator_initial_heap_size (%d) bigger than evaluator_max_heap_size (%d).", initialHeapSizeInt, maxHeapSize);maxHeapSize = initialHeapSizeInt * 1.1;printInfo(" evaluator_max_heap_size now set to %d.", maxHeapSize);}
do {Pipe pipe;pipe.create();ProcessOptions options;options.allowVfork = false;GC_atfork_prepare();auto pid = startProcess([&]() {pipe.readSide = -1;GC_atfork_child();GC_start_mark_threads();if (lastAttrPath != "") debug("resuming from '%s'", lastAttrPath);/* FIXME: The build hook in conjunction with import-from-derivation is causing "unexpected EOF" during eval */settings.builders = "";/* Prevent access to paths outside of the Nix search path andto the environment. */evalSettings.restrictEval = true;if (releaseExpr == "") throw UsageError("no expression specified");if (gcRootsDir == "") printMsg(lvlError, "warning: `--gc-roots-dir' not specified");EvalState state(myArgs.searchPath, openStore());Bindings & autoArgs = *myArgs.getAutoArgs(state);Value v;state.evalFile(lookupFileArg(state, releaseExpr), v);
try {findJobs(state, json, autoArgs, v, "");lastAttrPath = "";} catch (BailOut &) { }writeFull(pipe.writeSide.get(), lastAttrPath);
/* Prevent access to paths outside of the Nix search path andto the environment. */evalSettings.restrictEval = true;