mirror of
https://github.com/wassname/ray.git
synced 2026-06-28 04:07:01 +08:00
fc6259a656
* Cross language serialization for Java and Python * Use strict types when Python serializing * Handle recursive objects in Python; Pin msgpack >= 0.6.0, < 1.0.0 * Disable gc for optimizing msgpack loads * Fix merge bug * Java call Python use returnType; Fix ClassLoaderTest * Fix RayMethodsTest * Fix checkstyle * Fix lint * prepare_args raises exception if try to transfer a non-deserializable object to another language * Fix CrossLanguageInvocationTest.java, Python msgpack treat float as double * Minor fixes * Fix compile error on linux * Fix lint in java/BUILD.bazel * Fix test_failure * Fix lint * Class<?> to Class<T>; Refine metadata bytes. * Rename FST to Fst; sort java dependencies * Change Class<?>[] to Optional<Class<?>>; sort requirements in setup.py * Improve CrossLanguageInvocationTest * Refactor MessagePackSerializer.java * Refactor MessagePackSerializer.java; Refine CrossLanguageInvocationTest.java * Remove unnecessary dependencies for Java; Add getReturnType() for RayFunction in Java * Fix bug * Remove custom cross language type support * Replace Serializer.Meta with MutableBoolean * Remove @SuppressWarnings support from checkstyle.xml; Add null test in CrossLanguageInvocationTest.java * Refine MessagePackSerializer.pack * Ray.get support RayObject as input * Improve comments and error info * Remove classLoader argument from serializer * Separate msgpack from pickle5 in Python * Pair<byte[], MutableBoolean> to Pair<byte[], Boolean> * Remove public static <T> T get(RayObject<T> object), use RayObject.get() instead * Refine test * small fixes Co-authored-by: 刘宝 <po.lb@antfin.com> Co-authored-by: Hao Chen <chenh1024@gmail.com>
75 lines
2.2 KiB
Cython
75 lines
2.2 KiB
Cython
from cpython cimport Py_buffer, PyBytes_FromStringAndSize
|
|
from libc.stdint cimport int64_t, uintptr_t
|
|
from libc.stdio cimport printf
|
|
from libcpp.memory cimport shared_ptr
|
|
|
|
from ray.includes.common cimport CBuffer
|
|
|
|
|
|
cdef class Buffer:
|
|
"""Cython wrapper class of C++ `ray::Buffer`.
|
|
|
|
This class implements the Python 'buffer protocol', which allows
|
|
us to use it for calls into Python libraries without having to
|
|
copy the data.
|
|
|
|
See https://docs.python.org/3/c-api/buffer.html for details.
|
|
"""
|
|
@staticmethod
|
|
cdef make(const shared_ptr[CBuffer]& buffer):
|
|
cdef Buffer self = Buffer.__new__(Buffer)
|
|
self.buffer = buffer
|
|
self.shape = <Py_ssize_t>self.size
|
|
self.strides = <Py_ssize_t>(1)
|
|
return self
|
|
|
|
def __len__(self):
|
|
return self.size
|
|
|
|
@property
|
|
def size(self):
|
|
"""
|
|
The buffer size in bytes.
|
|
"""
|
|
return self.buffer.get().Size()
|
|
|
|
def to_pybytes(self):
|
|
"""
|
|
Return this buffer as a Python bytes object. Memory is copied.
|
|
"""
|
|
return PyBytes_FromStringAndSize(
|
|
<const char*>self.buffer.get().Data(),
|
|
self.buffer.get().Size())
|
|
|
|
def __getbuffer__(self, Py_buffer* buffer, int flags):
|
|
buffer.readonly = 0
|
|
buffer.buf = <char *>self.buffer.get().Data()
|
|
buffer.format = 'B'
|
|
buffer.internal = NULL
|
|
buffer.itemsize = 1
|
|
buffer.len = self.size
|
|
buffer.ndim = 1
|
|
buffer.obj = self
|
|
buffer.shape = &self.shape
|
|
buffer.strides = &self.strides
|
|
buffer.suboffsets = NULL
|
|
|
|
def __getsegcount__(self, Py_ssize_t *len_out):
|
|
if len_out != NULL:
|
|
len_out[0] = <Py_ssize_t>self.size
|
|
return 1
|
|
|
|
def __getreadbuffer__(self, Py_ssize_t idx, void **p):
|
|
if idx != 0:
|
|
raise SystemError("accessing non-existent buffer segment")
|
|
if p != NULL:
|
|
p[0] = <void*> self.buffer.get().Data()
|
|
return self.size
|
|
|
|
def __getwritebuffer__(self, Py_ssize_t idx, void **p):
|
|
if idx != 0:
|
|
raise SystemError("accessing non-existent buffer segment")
|
|
if p != NULL:
|
|
p[0] = <void*> self.buffer.get().Data()
|
|
return self.size
|