##// END OF EJS Templates
rust-update: make `update_from_null` respect `worker.numcpu` config option...
rust-update: make `update_from_null` respect `worker.numcpu` config option This was overlooked in the original series. This is important for tests (because we run many at once), and for the occasional end user that wants to keep their CPU usage in check. A future series should clean up this `worker` parameter tunelling business by rewriting the config in Rust, but doing so on stable would be a very bad idea.

File last commit:

r45488:ee5f27d7 default
r53083:e6a44bc9 stable
Show More
pyutil.cc
76 lines | 1.7 KiB | text/x-c | CppLexer
Augie Fackler
fuzz: extract Python initialization to utility package...
r41049 #include "pyutil.h"
Augie Fackler
fuzz: fix an unused result on getcwd() in pyutil...
r44259 #include <iostream>
Augie Fackler
fuzz: extract Python initialization to utility package...
r41049 #include <string>
namespace contrib
{
Augie Fackler
fuzz: add support for fuzzing under either Python 2 or 3...
r44311 #if PY_MAJOR_VERSION >= 3
#define HG_FUZZER_PY3 1
PyMODINIT_FUNC PyInit_parsers(void);
#else
PyMODINIT_FUNC initparsers(void);
#endif
Augie Fackler
fuzz: extract Python initialization to utility package...
r41049 static char cpypath[8192] = "\0";
static PyObject *mainmod;
static PyObject *globals;
void initpy(const char *cselfpath)
{
Augie Fackler
fuzz: add support for fuzzing under either Python 2 or 3...
r44311 #ifdef HG_FUZZER_PY3
Augie Fackler
pyutil: this has taken so long to fix, I'm using 3.8 now...
r45488 const std::string subdir = "/sanpy/lib/python3.8";
Augie Fackler
fuzz: add support for fuzzing under either Python 2 or 3...
r44311 #else
Augie Fackler
fuzz: extract Python initialization to utility package...
r41049 const std::string subdir = "/sanpy/lib/python2.7";
Augie Fackler
fuzz: add support for fuzzing under either Python 2 or 3...
r44311 #endif
Augie Fackler
fuzz: extract Python initialization to utility package...
r41049 /* HACK ALERT: we need a full Python installation built without
pymalloc and with ASAN, so we dump one in
$OUT/sanpy/lib/python2.7. This helps us wire that up. */
std::string selfpath(cselfpath);
std::string pypath;
auto pos = selfpath.rfind("/");
if (pos == std::string::npos) {
char wd[8192];
Augie Fackler
fuzz: fix an unused result on getcwd() in pyutil...
r44259 if (!getcwd(wd, 8192)) {
std::cerr << "Failed to call getcwd: errno " << errno
<< std::endl;
exit(1);
}
Augie Fackler
fuzz: extract Python initialization to utility package...
r41049 pypath = std::string(wd) + subdir;
} else {
pypath = selfpath.substr(0, pos) + subdir;
}
strncpy(cpypath, pypath.c_str(), pypath.size());
setenv("PYTHONPATH", cpypath, 1);
setenv("PYTHONNOUSERSITE", "1", 1);
/* prevent Python from looking up users in the fuzz environment */
setenv("PYTHONUSERBASE", cpypath, 1);
Augie Fackler
fuzz: add support for fuzzing under either Python 2 or 3...
r44311 #ifdef HG_FUZZER_PY3
std::wstring wcpypath(pypath.begin(), pypath.end());
Py_SetPythonHome(wcpypath.c_str());
#else
Augie Fackler
fuzz: extract Python initialization to utility package...
r41049 Py_SetPythonHome(cpypath);
Augie Fackler
fuzz: add support for fuzzing under either Python 2 or 3...
r44311 #endif
Augie Fackler
fuzz: extract Python initialization to utility package...
r41049 Py_InitializeEx(0);
mainmod = PyImport_AddModule("__main__");
globals = PyModule_GetDict(mainmod);
Augie Fackler
fuzz: add support for fuzzing under either Python 2 or 3...
r44311
#ifdef HG_FUZZER_PY3
PyObject *mod = PyInit_parsers();
#else
Augie Fackler
fuzz: extract Python initialization to utility package...
r41049 initparsers();
Augie Fackler
fuzz: add support for fuzzing under either Python 2 or 3...
r44311 PyObject *mod = PyImport_ImportModule("parsers");
#endif
PyDict_SetItemString(globals, "parsers", mod);
Augie Fackler
fuzz: extract Python initialization to utility package...
r41049 }
PyObject *pyglobals()
{
return globals;
}
} // namespace contrib