Skip to content

Commit eb926c7

Browse files
committed
fix: gil fault
1 parent 8178c15 commit eb926c7

2 files changed

Lines changed: 23 additions & 47 deletions

File tree

pyWrapper.cpp

Lines changed: 15 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -34,35 +34,35 @@ PYBIND11_EMBEDDED_MODULE(aiges_embed, module) {
3434
r.len = size;
3535

3636
})
37-
.def_readwrite("key", &ResponseData::key, py::return_value_policy::copy)
38-
.def_readwrite("data", &ResponseData::data, py::return_value_policy::copy)
39-
.def_readwrite("status", &ResponseData::status, py::return_value_policy::copy)
40-
.def_readwrite("len", &ResponseData::len, py::return_value_policy::copy)
41-
.def_readwrite("type", &ResponseData::type, py::return_value_policy::copy);
37+
.def_readwrite("key", &ResponseData::key, py::return_value_policy::automatic_reference)
38+
.def_readwrite("data", &ResponseData::data, py::return_value_policy::automatic_reference)
39+
.def_readwrite("status", &ResponseData::status, py::return_value_policy::automatic_reference)
40+
.def_readwrite("len", &ResponseData::len, py::return_value_policy::automatic_reference)
41+
.def_readwrite("type", &ResponseData::type, py::return_value_policy::automatic_reference);
4242

4343
py::class_<Response> response(module, "Response");
4444
response.def(py::init<>())
45-
.def_readwrite("list", &Response::list, py::return_value_policy::copy)
46-
.def_readwrite("error_code", &Response::errCode, py::return_value_policy::copy)
47-
.def("response_err", &Response::responseErr, py::return_value_policy::copy);
45+
.def_readwrite("list", &Response::list, py::return_value_policy::automatic_reference)
46+
.def_readwrite("error_code", &Response::errCode, py::return_value_policy::automatic_reference)
47+
.def("response_err", &Response::responseErr, py::return_value_policy::automatic_reference);
4848

4949
py::class_<DataListNode> dataListNode(module, "DataListNode");
5050
dataListNode.def(py::init<>())
51-
.def_property_readonly("key", &DataListNode::get_key, py::return_value_policy::reference)
52-
.def_property_readonly("data", &DataListNode::get_data, py::return_value_policy::reference)
53-
.def_property_readonly("len", &DataListNode::get_len, py::return_value_policy::reference)
54-
.def_property_readonly("status", &DataListNode::get_status, py::return_value_policy::reference)
55-
.def_property_readonly("type", &DataListNode::get_type, py::return_value_policy::reference)
51+
.def_readwrite("key", &DataListNode::key, py::return_value_policy::automatic_reference)
52+
.def_readwrite("data", &DataListNode::data, py::return_value_policy::automatic_reference)
53+
.def_readwrite("len", &DataListNode::len, py::return_value_policy::automatic_reference)
54+
.def_readwrite("status", &DataListNode::status, py::return_value_policy::automatic_reference)
55+
.def_readwrite("type", &DataListNode::type, py::return_value_policy::automatic_reference)
5656
.def("get_data", &DataListNode::get_data, py::return_value_policy::reference);
5757

5858
py::class_<DataListCls> dataListCls(module, "DataListCls");
5959
dataListCls.def(py::init<>())
60-
.def_property_readonly("list", &DataListCls::get_list, py::return_value_policy::reference)
60+
.def_readwrite("list", &DataListCls::list, py::return_value_policy::automatic_reference)
6161
.def("get", &DataListCls::get, py::return_value_policy::reference);
6262

6363
py::class_<SessionCreateResponse> sessionCreateResponse(module, "SessionCreateResponse");
6464
sessionCreateResponse.def(py::init<>())
65-
.def_readwrite("handle", &SessionCreateResponse::handle, py::return_value_policy::copy)
65+
.def_readwrite("handle", &SessionCreateResponse::handle, py::return_value_policy::automatic_reference)
6666
.def_readwrite("error_code", &SessionCreateResponse::errCode, py::return_value_policy::reference);
6767
}
6868

@@ -90,21 +90,6 @@ py::bytes DataListNode::get_data() {
9090
return data;
9191
}
9292

93-
std::string DataListNode::get_key() {
94-
return key;
95-
}
96-
97-
unsigned int DataListNode::get_len() {
98-
return len;
99-
}
100-
101-
int DataListNode::get_status() {
102-
return status;
103-
}
104-
105-
int DataListNode::get_type() {
106-
return type;
107-
}
10893
DataListNode *DataListCls::get(std::string key) {
10994
for (int idx = 0; idx < list.size(); idx++) {
11095
DataListNode *node = &list[idx];
@@ -114,10 +99,6 @@ DataListNode *DataListCls::get(std::string key) {
11499
}
115100
return nullptr;
116101
}
117-
std::vector <DataListNode> DataListCls::get_list() {
118-
return list;
119-
}
120-
121102

122103
PyWrapper::PyWrapper() {
123104
// 仅仅为了 加载下python lib库使 其部分函数可被导出使用

wrapper.cpp

Lines changed: 8 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -220,7 +220,6 @@ int WrapperAPI wrapperWrite(const void *handle, pDataList reqData) {
220220

221221
int WrapperAPI wrapperRead(const void *handle, pDataList *respData) {
222222
int ret = 0;
223-
py::gil_scoped_acquire acquire;
224223
std::string sid = GetHandleSid((char *) handle);
225224
// 构造响应数据
226225
printf("start read...sid %s\n", sid.c_str());
@@ -249,8 +248,6 @@ wrapperExec(const char *usrTag, pParamList params, pDataList reqData, pDataList
249248
int psrCnt) {
250249
int ret = 0;
251250
std::string sid = "";
252-
py::gil_scoped_acquire acquire;
253-
254251
for (pParamList sidP = params; sidP != NULL; sidP = sidP->next) {
255252
if (NULL == sidP->key) {
256253
continue;
@@ -278,17 +275,17 @@ wrapperExec(const char *usrTag, pParamList params, pDataList reqData, pDataList
278275
}
279276
spdlog::debug("call wrapper exec: building req data, data num:{},sid:{}", dataNum, sid);
280277

281-
DataListCls *req = new DataListCls();
278+
DataListCls req;
282279
pDataList p = reqData;
283280
if (dataNum > 0) {
284281
for (int tmpIdx = 0; tmpIdx < dataNum; tmpIdx++) {
285282

286-
DataListNode *item = DataListNode();
287-
item->key = p->key;
283+
DataListNode item;
284+
item.key = p->key;
288285

289286
// 直接拷贝
290287
size_t len = static_cast<size_t>(p->len);
291-
item->data = py::bytes((char *) (p->data), len);
288+
item.data = py::bytes((char *) (p->data), len);
292289
//
293290
// 写法2:
294291
// Py_ssize_t len = static_cast<Py_ssize_t>(p->len);
@@ -301,11 +298,11 @@ wrapperExec(const char *usrTag, pParamList params, pDataList reqData, pDataList
301298
// item.data = py::bytes(data);
302299
// todo 有无0拷贝方法?
303300

304-
item->len = p->len;
301+
item.len = p->len;
305302
char t = static_cast<int>(p->type);
306-
item->type = p->type;
303+
item.type = p->type;
307304
spdlog::debug("reqDatatype :{},sid:{}", p->type, sid);
308-
req->list.push_back(item);
305+
req.list.push_back(item);
309306
p = p->next;
310307
}
311308
}
@@ -342,7 +339,7 @@ int WrapperAPI wrapperExecFree(const char *usrTag, pDataList *respData) {
342339
pDataList ptr = *respData;
343340
while (ptr != NULL) {
344341
if (ptr->len > 0) {
345-
free(ptr->data);
342+
// free(ptr->data);
346343
ptr->data = NULL;
347344
}
348345
if (strlen(ptr->key) > 0) {
@@ -373,8 +370,6 @@ wrapperExecAsync(const char *usrTag, pParamList params, pDataList reqData, wrapp
373370
unsigned int psrIds[], int psrCnt) {
374371
int ret = 0;
375372
std::string sid = "";
376-
py::gil_scoped_acquire acquire;
377-
378373
for (pParamList sidP = params; sidP != NULL; sidP = sidP->next) {
379374
if (NULL == sidP->key) {
380375
continue;

0 commit comments

Comments
 (0)