Skip to content

Commit 10cf8ef

Browse files
committed
more copies to appease the gil
1 parent 3a7e064 commit 10cf8ef

File tree

1 file changed

+26
-16
lines changed

1 file changed

+26
-16
lines changed

src/python_bindings/fastvdf.cpp

+26-16
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,14 @@ PYBIND11_MODULE(chiavdf, m) {
2525
const string& x_s, const string& y_s,
2626
const string& proof_s,
2727
uint64_t num_iterations) {
28-
py::gil_scoped_release release;
2928
integer D(discriminant);
30-
form x = DeserializeForm(D, (const uint8_t *)x_s.data(), x_s.size());
31-
form y = DeserializeForm(D, (const uint8_t *)y_s.data(), y_s.size());
32-
form proof = DeserializeForm(D, (const uint8_t *)proof_s.data(), proof_s.size());
29+
std::string x_s_copy(x_s);
30+
std::string y_s_copy(y_s);
31+
std::string proof_s_copy(proof_s);
32+
py::gil_scoped_release release;
33+
form x = DeserializeForm(D, (const uint8_t *)x_s_copy.data(), x_s_copy.size());
34+
form y = DeserializeForm(D, (const uint8_t *)y_s_copy.data(), y_s_copy.size());
35+
form proof = DeserializeForm(D, (const uint8_t *)proof_s_copy.data(), proof_s_copy.size());
3336

3437
bool is_valid = false;
3538
VerifyWesolowskiProof(D, x, y, proof, num_iterations, is_valid);
@@ -41,12 +44,14 @@ PYBIND11_MODULE(chiavdf, m) {
4144
const string& x_s,
4245
const string& proof_blob,
4346
const uint64_t num_iterations, const uint64_t disc_size_bits, const uint64_t recursion) {
47+
std::string discriminant_copy(discriminant);
48+
std::string x_s_copy(x_s);
49+
std::string proof_blob_copy(proof_blob);
4450
py::gil_scoped_release release;
45-
std::string proof_blob_str(proof_blob);
46-
uint8_t *proof_blob_ptr = reinterpret_cast<uint8_t *>(proof_blob_str.data());
47-
int proof_blob_size = proof_blob.size();
51+
uint8_t *proof_blob_ptr = reinterpret_cast<uint8_t *>(proof_blob_copy.data());
52+
int proof_blob_size = proof_blob_copy.size();
4853

49-
return CheckProofOfTimeNWesolowski(integer(discriminant), (const uint8_t *)x_s.data(), proof_blob_ptr, proof_blob_size, num_iterations, disc_size_bits, recursion);
54+
return CheckProofOfTimeNWesolowski(integer(discriminant_copy), (const uint8_t *)x_s_copy.data(), proof_blob_ptr, proof_blob_size, num_iterations, disc_size_bits, recursion);
5055
});
5156

5257
m.def("prove", [] (const py::bytes& challenge_hash, const string& x_s, int discriminant_size_bits, uint64_t num_iterations) {
@@ -75,11 +80,14 @@ PYBIND11_MODULE(chiavdf, m) {
7580
const uint64_t num_iterations, const uint64_t recursion) {
7681
std::pair<bool, std::vector<uint8_t>> result;
7782
{
83+
std::string discriminant_copy(discriminant);
84+
std::string B_copy(B);
85+
std::string x_s_copy(x_s);
86+
std::string proof_blob_copy(proof_blob);
7887
py::gil_scoped_release release;
79-
std::string proof_blob_str(proof_blob);
80-
uint8_t *proof_blob_ptr = reinterpret_cast<uint8_t *>(proof_blob_str.data());
81-
int proof_blob_size = proof_blob.size();
82-
result = CheckProofOfTimeNWesolowskiWithB(integer(discriminant), integer(B), (const uint8_t *)x_s.data(), proof_blob_ptr, proof_blob_size, num_iterations, recursion);
88+
uint8_t *proof_blob_ptr = reinterpret_cast<uint8_t *>(proof_blob_copy.data());
89+
int proof_blob_size = proof_blob_copy.size();
90+
result = CheckProofOfTimeNWesolowskiWithB(integer(discriminant_copy), integer(B_copy), (const uint8_t *)x_s_copy.data(), proof_blob_ptr, proof_blob_size, num_iterations, recursion);
8391
}
8492
py::bytes res_bytes = py::bytes(reinterpret_cast<char*>(result.second.data()), result.second.size());
8593
py::tuple res_tuple = py::make_tuple(result.first, res_bytes);
@@ -90,11 +98,13 @@ PYBIND11_MODULE(chiavdf, m) {
9098
const string& x_s,
9199
const string& proof_blob,
92100
const uint64_t num_iterations, const uint64_t recursion) {
101+
std::string discriminant_copy(discriminant);
102+
std::string x_s_copy(x_s);
103+
std::string proof_blob_copy(proof_blob);
93104
py::gil_scoped_release release;
94-
std::string proof_blob_str(proof_blob);
95-
uint8_t *proof_blob_ptr = reinterpret_cast<uint8_t *>(proof_blob_str.data());
96-
int proof_blob_size = proof_blob.size();
97-
integer B = GetBFromProof(integer(discriminant), (const uint8_t *)x_s.data(), proof_blob_ptr, proof_blob_size, num_iterations, recursion);
105+
uint8_t *proof_blob_ptr = reinterpret_cast<uint8_t *>(proof_blob_copy.data());
106+
int proof_blob_size = proof_blob_copy.size();
107+
integer B = GetBFromProof(integer(discriminant_copy), (const uint8_t *)x_s_copy.data(), proof_blob_ptr, proof_blob_size, num_iterations, recursion);
98108
return B.to_string();
99109
});
100110
}

0 commit comments

Comments
 (0)