def _send_shmem(self, bytes):
# Use the outgoing stream and the outgoing shared memory.
stream = self._streams.outgoing
shared_memory = self._shared_memory.outgoing
index = 0
# Send bytes via circular buffer.
with self.Mutex(stream.mutex) as mutex:
while index < len(bytes):
while shared_memory.isFull:
if ctypes.windll.kernel32.ReleaseMutex(stream.mutex) == 0:
raise WindowsError("Could not release mutex")
self._wait_for_object(stream.hasSpace)
self._wait_for_object(stream.mutex)
fragment_start = shared_memory.writeOffset
max_length = (shared_memory.readOffset if fragment_start < shared_memory.readOffset else 5000)- fragment_start
fragment_length = min(max_length, len(bytes) - index)
ctypes.memmove(ctypes.addressof(shared_memory.buffer) + fragment_start, bytes[index:index+fragment_length], fragment_length)
shared_memory.writeOffset = (fragment_start + fragment_length) % 5000
index += fragment_length
shared_memory.isFull = (shared_memory.readOffset == shared_memory.writeOffset)
if ctypes.windll.kernel32.SetEvent(stream.hasData) == 0:
raise WindowsError("Could not set event")
评论列表
文章目录