@@ -19,58 +19,23 @@ std::map<std::string, const char *> SID_USRTAG;
19
19
20
20
PYBIND11_EMBEDDED_MODULE (aiges_embed, module ) {
21
21
module .def (" callback" , &callBack, py::return_value_policy::automatic_reference);
22
- py::class_<ResponseData> responseData (module , " ResponseData" , py::buffer_protocol () );
22
+ py::class_<ResponseData> responseData (module , " ResponseData" );
23
23
responseData.def (py::init<>())
24
24
.def (py::init<std::string, unsigned int , int , int >())
25
- .def (py::init ([](const py::buffer &b) {
26
- py::buffer_info info = b.request ();
27
- if (info.format != py::format_descriptor<unsigned char >::format () || info.ndim != 1 ) {
28
- throw std::runtime_error (" Incompatible buffer format! Please Pass Bytes..." );
29
- }
30
- auto *v = new ResponseData ();
31
- v->len = info.shape [0 ];
32
- v->data = info.ptr ;
33
- // memcpy( v->data, info.ptr, info.shape[0] );
34
- return (v);
35
- }))
36
- .def (" setData" , [](ResponseData &r, const py::buffer &b) {
37
- py::buffer_info info = b.request ();
38
- if (info.format != py::format_descriptor<unsigned char >::format () || info.ndim != 1 ) {
39
- throw std::runtime_error (" Incompatible buffer format! Please Pass Bytes.." );
40
- }
41
- // if (r.data == nullptr) {
42
- // void *p = malloc(info.shape[0]);
43
- // if (p == nullptr) {
44
- // throw std::runtime_error("Can't Allocate memory!");
45
- // }
46
- // r.data = p;
47
- // }
48
- r.len = info.shape [0 ];
49
- r.data = info.ptr ;
50
- // memcpy(r.data, info.ptr, info.shape[0]);
51
- })
52
- /* / Bare bones interface */
53
25
.def (" setDataType" ,
54
26
[](ResponseData &r, int i) {
55
27
r.type = i;
56
28
})
57
- /* / Provide buffer access */
58
- .def_buffer ([](ResponseData &r) -> py::buffer_info {
59
- return (py::buffer_info (
60
- r.data , /* Pointer to buffer */
61
- sizeof (unsigned char ), /* Size of one scalar */
62
- py::format_descriptor<unsigned char >::format (), /* Python struct-style format descriptor */
63
- 1 , /* Number of dimensions */
64
- {size_t (r.len )}, /* Buffer dimensions */
65
- { /* Strides (in bytes) for each index */
66
- sizeof (unsigned char )}
67
- ));
29
+ .def (" setData" , [](ResponseData &r, const py::bytes &b) {
30
+ r.data = b;
31
+ Py_ssize_t size = PyBytes_GET_SIZE (b.ptr ());
32
+ r.len = size;
33
+
68
34
})
69
35
.def_readwrite (" key" , &ResponseData::key, py::return_value_policy::automatic_reference)
70
- .def_property_readonly (" data" ,
71
- py::cpp_function (&ResponseData::get_data, py::return_value_policy::automatic_reference))
36
+ .def_readwrite (" data" , &ResponseData::data, py::return_value_policy::automatic_reference)
72
37
.def_readwrite (" status" , &ResponseData::status, py::return_value_policy::automatic_reference)
73
- .def_property_readonly (" len" , py::cpp_function ( &ResponseData::get_len , py::return_value_policy::automatic_reference) )
38
+ .def_readwrite (" len" , &ResponseData::len , py::return_value_policy::automatic_reference)
74
39
.def_readwrite (" type" , &ResponseData::type, py::return_value_policy::automatic_reference);
75
40
76
41
py::class_<Response> response (module , " Response" );
@@ -136,33 +101,27 @@ DataListNode *DataListCls::get(std::string key) {
136
101
PyWrapper::PyWrapper () {
137
102
// 仅仅为了 加载下python lib库使 其部分函数可被导出使用
138
103
// https://stackoverflow.com/questions/67891197/ctypes-cpython-39-x86-64-linux-gnu-so-undefined-symbol-pyfloat-type-in-embedd
139
- try {
140
- dlopen (PythonSo, RTLD_GLOBAL | RTLD_NOW);
104
+ dlopen (PythonSo, RTLD_GLOBAL | RTLD_NOW);
141
105
142
- // if (config.count(wrapperFileKey) == 0)
143
- py::gil_scoped_acquire acquire;
144
- _wrapper = py::module::import (WrapperFile);
145
- _obj = _wrapper.attr (WrapperClass)();
146
- _wrapper_abs = _wrapper.attr (" __file__" ).cast <std::string>(); // 获取加载的wrapper.py的绝对地址
106
+ // if (config.count(wrapperFileKey) == 0)
107
+ py::gil_scoped_acquire acquire;
108
+ _wrapper = py::module::import (WrapperFile);
109
+ _obj = _wrapper.attr (WrapperClass)();
110
+ _wrapper_abs = _wrapper.attr (" __file__" ).cast <std::string>(); // 获取加载的wrapper.py的绝对地址
147
111
148
- _wrapperInit = _obj.attr (" wrapperInit" );
149
- _wrapperFini = _obj.attr (" wrapperFini" );
150
- _wrapperOnceExec = _obj.attr (" wrapperOnceExec" );
151
- _wrapperOnceExecAsync = _obj.attr (" wrapperOnceExecAsync" );
152
- _wrapperError = _obj.attr (" wrapperError" );
153
- // stream support
154
- _wrapperCreate = _obj.attr (" wrapperCreate" );
155
- _wrapperWrite = _obj.attr (" wrapperWrite" );
156
- _wrapperRead = _obj.attr (" wrapperRead" );
157
- _wrapperTest = _obj.attr (" wrapperTestFunc" );
112
+ _wrapperInit = _obj.attr (" wrapperInit" );
113
+ _wrapperFini = _obj.attr (" wrapperFini" );
114
+ _wrapperOnceExec = _obj.attr (" wrapperOnceExec" );
115
+ _wrapperOnceExecAsync = _obj.attr (" wrapperOnceExecAsync" );
116
+ _wrapperError = _obj.attr (" wrapperError" );
117
+ // stream support
118
+ _wrapperCreate = _obj.attr (" wrapperCreate" );
119
+ _wrapperWrite = _obj.attr (" wrapperWrite" );
120
+ _wrapperRead = _obj.attr (" wrapperRead" );
121
+ _wrapperTest = _obj.attr (" wrapperTestFunc" );
158
122
159
- py::gil_scoped_release release;
160
- StartMonitorWrapperClass (_wrapper_abs);
161
- } catch (py::error_already_set &e) {
162
- spdlog::get (" stderr_console" )->error (" _wrapperInit error: {}" , e.what ());
163
- exit (-1 );
164
- return ;
165
- }
123
+ py::gil_scoped_release release;
124
+ StartMonitorWrapperClass (_wrapper_abs);
166
125
167
126
}
168
127
@@ -283,7 +242,7 @@ int PyWrapper::wrapperOnceExec(const char *usrTag, std::map <std::string, std::s
283
242
284
243
}
285
244
SetSidUsrTag (sid, usrTag);
286
- params[ " sid " ] = sid;
245
+
287
246
py::gil_scoped_acquire acquire;
288
247
// 执行python exec 推理
289
248
py::object r = _wrapperOnceExec (params, reqData);
@@ -315,20 +274,21 @@ int PyWrapper::wrapperOnceExec(const char *usrTag, std::map <std::string, std::s
315
274
tmpData->type = DataType (itemData.type );
316
275
tmpData->desc = nullptr ;
317
276
// 这里判断数据类型,todo 未来根据数据类型 决定是否拷贝,比如某些数据比较大,可以不拷贝
318
- // void *pr;
319
- // pr = malloc(itemData.len);
320
- // if (pr == nullptr) {
321
- // int ret = -1;
322
- // spdlog::get("stderr_console")->error("can't malloc memory for data, sid:{}", sid);
323
- // return ret;
324
- // }
325
- // ptr = PyBytes_AsString(itemData.data.ptr());
326
- // Py_ssize_t size = PyBytes_GET_SIZE(itemData.data.ptr());
327
- // printf("GetSIze data len: %d", itemData.len);
328
- // memcpy(pr, ptr, itemData.len);
277
+ void *pr;
278
+ pr = malloc (itemData.len );
279
+ if (pr == nullptr ) {
280
+ int ret = -1 ;
281
+ spdlog::get (" stderr_console" )->error (" can't malloc memory for data, sid:{}" , sid);
282
+ return ret;
283
+ }
284
+ ptr = PyBytes_AsString (itemData.data .ptr ());
285
+ Py_ssize_t size = PyBytes_GET_SIZE (itemData.data .ptr ());
286
+ // printf("GetSIze, %d", size);
287
+ // printf("item data len: %d", itemData.len);
288
+ memcpy (pr, ptr, itemData.len );
329
289
// char *data_ = new char[itemData.data.length()+1];
330
290
// strdup(.c_str());
331
- tmpData->data = itemData. data ;
291
+ tmpData->data = pr ;
332
292
tmpData->status = DataStatus (itemData.status );
333
293
if (idx == 0 ) {
334
294
headPtr = tmpData;
@@ -366,7 +326,7 @@ int PyWrapper::wrapperOnceExecAsync(const char *usrTag, std::map <std::string, s
366
326
}
367
327
int ret = 0 ;
368
328
SetSidUsrTag (sid, usrTag);
369
- params[ " sid " ] = sid;
329
+
370
330
py::gil_scoped_acquire acquire;
371
331
// 执行python exec 推理
372
332
py::object r = _wrapperOnceExecAsync (params, reqData, sid);
@@ -488,18 +448,18 @@ int PyWrapper::wrapperRead(char *handle, pDataList *respData, std::string sid) {
488
448
tmpData->len = itemData.len ;
489
449
tmpData->type = DataType (itemData.type );
490
450
tmpData->desc = nullptr ;
491
- // // 这里判断数据类型,todo 未来根据数据类型 决定是否拷贝,比如某些数据比较大,可以不拷贝
492
- // void *pr;
493
- // pr = malloc(itemData.len);
494
- // if (pr == nullptr) {
495
- // int ret = -1;
496
- // spdlog::get("stderr_console")->error("can't malloc memory for data, sid:{}", sid);
497
- // return ret;
498
- // }
499
- // memcpy(pr, (const void *) itemData.data.ptr(), itemData.len);
451
+ // 这里判断数据类型,todo 未来根据数据类型 决定是否拷贝,比如某些数据比较大,可以不拷贝
452
+ void *pr;
453
+ pr = malloc (itemData.len );
454
+ if (pr == nullptr ) {
455
+ int ret = -1 ;
456
+ spdlog::get (" stderr_console" )->error (" can't malloc memory for data, sid:{}" , sid);
457
+ return ret;
458
+ }
459
+ memcpy (pr, (const void *) itemData.data .ptr (), itemData.len );
500
460
// char *data_ = new char[itemData.data.length()+1];
501
461
// strdup(.c_str());
502
- tmpData->data = itemData. data ;
462
+ tmpData->data = pr ;
503
463
tmpData->status = DataStatus (itemData.status );
504
464
if (idx == 0 ) {
505
465
headPtr = tmpData;
@@ -608,20 +568,20 @@ int callBack(Response *resp, std::string sid) {
608
568
tmpData->type = DataType (itemData.type );
609
569
tmpData->desc = nullptr ;
610
570
// 这里判断数据类型,todo 未来根据数据类型 决定是否拷贝,比如某些数据比较大,可以不拷贝
611
- // void *pr;
612
- // pr = malloc(itemData.len);
613
- // if (pr == nullptr) {
614
- // int ret = -1;
615
- // spdlog::get("stderr_console")->error("can't malloc memory for data, sid:{}", sid);
616
- // return ret;
617
- // }
618
- // ptr = PyBytes_AsString(itemData.data.ptr());
619
- // Py_ssize_t size = PyBytes_GET_SIZE(itemData.data.ptr());
620
- // memcpy(pr, ptr, itemData.len);
571
+ void *pr;
572
+ pr = malloc (itemData.len );
573
+ if (pr == nullptr ) {
574
+ int ret = -1 ;
575
+ spdlog::get (" stderr_console" )->error (" can't malloc memory for data, sid:{}" , sid);
576
+ return ret;
577
+ }
578
+ ptr = PyBytes_AsString (itemData.data .ptr ());
579
+ Py_ssize_t size = PyBytes_GET_SIZE (itemData.data .ptr ());
580
+ memcpy (pr, ptr, itemData.len );
621
581
// 还是有问题::memcpy(pr, (const void *) itemData.data.ptr(), itemData.len);
622
582
// char *data_ = new char[itemData.data.length()+1];
623
583
// strdup(.c_str());
624
- tmpData->data = itemData. data ;
584
+ tmpData->data = pr ;
625
585
tmpData->status = DataStatus (itemData.status );
626
586
if (idx == 0 ) {
627
587
headPtr = tmpData;
0 commit comments