Lines Matching refs:self
75 def __init__(self, name=None, create=False, size=0):
79 self._flags = _O_CREX | os.O_RDWR
82 if name is None and not self._flags & os.O_EXCL:
93 self._fd = _posixshmem.shm_open(
95 self._flags,
96 mode=self._mode
100 self._name = name
103 name = "/" + name if self._prepend_leading_slash else name
104 self._fd = _posixshmem.shm_open(
106 self._flags,
107 mode=self._mode
109 self._name = name
112 os.ftruncate(self._fd, size)
113 stats = os.fstat(self._fd)
115 self._mmap = mmap.mmap(self._fd, size)
117 self.unlink()
120 resource_tracker.register(self._name, "shared_memory")
151 self._mmap = mmap.mmap(-1, size, tagname=temp_name)
154 self._name = temp_name
158 self._name = name
180 self._mmap = mmap.mmap(-1, size, tagname=name)
182 self._size = size
183 self._buf = memoryview(self._mmap)
185 def __del__(self):
187 self.close()
191 def __reduce__(self):
193 self.__class__,
195 self.name,
197 self.size,
201 def __repr__(self):
202 return f'{self.__class__.__name__}({self.name!r}, size={self.size})'
205 def buf(self):
207 return self._buf
210 def name(self):
212 reported_name = self._name
213 if _USE_POSIX and self._prepend_leading_slash:
214 if self._name.startswith("/"):
215 reported_name = self._name[1:]
219 def size(self):
221 return self._size
223 def close(self):
226 if self._buf is not None:
227 self._buf.release()
228 self._buf = None
229 if self._mmap is not None:
230 self._mmap.close()
231 self._mmap = None
232 if _USE_POSIX and self._fd >= 0:
233 os.close(self._fd)
234 self._fd = -1
236 def unlink(self):
242 if _USE_POSIX and self._name:
243 _posixshmem.shm_unlink(self._name)
244 resource_tracker.unregister(self._name, "shared_memory")
298 def __init__(self, sequence=None, *, name=None):
302 self._types_mapping[type(item)]
304 else self._types_mapping[type(item)] % (
305 self._alignment * (len(item) // self._alignment + 1),
309 self._list_len = len(_formats)
310 assert sum(len(fmt) <= 8 for fmt in _formats) == self._list_len
315 self._allocated_offsets = [0]
317 offset += self._alignment if fmt[-1] != "s" else int(fmt[:-1])
318 self._allocated_offsets.append(offset)
320 self._extract_recreation_code(item) for item in sequence
323 "q" + self._format_size_metainfo +
325 self._format_packing_metainfo +
326 self._format_back_transform_codes
329 self.shm = SharedMemory(name, create=True, size=requested_size)
331 self.shm = SharedMemory(name)
336 "q" + self._format_size_metainfo,
337 self.shm.buf,
339 self._list_len,
340 *(self._allocated_offsets)
344 self.shm.buf,
345 self._offset_data_start,
349 self._format_packing_metainfo,
350 self.shm.buf,
351 self._offset_packing_formats,
355 self._format_back_transform_codes,
356 self.shm.buf,
357 self._offset_back_transform_codes,
362 self._list_len = len(self) # Obtains size from offset 0 in buffer.
363 self._allocated_offsets = list(
365 self._format_size_metainfo,
366 self.shm.buf,
371 def _get_packing_format(self, position):
373 position = position if position >= 0 else position + self._list_len
374 if (position >= self._list_len) or (self._list_len < 0):
379 self.shm.buf,
380 self._offset_packing_formats + position * 8
387 def _get_back_transform(self, position):
390 if (position >= self._list_len) or (self._list_len < 0):
395 self.shm.buf,
396 self._offset_back_transform_codes + position
398 transform_function = self._back_transforms_mapping[transform_code]
402 def _set_packing_format_and_transform(self, position, fmt_as_str, value):
406 if (position >= self._list_len) or (self._list_len < 0):
411 self.shm.buf,
412 self._offset_packing_formats + position * 8,
416 transform_code = self._extract_recreation_code(value)
419 self.shm.buf,
420 self._offset_back_transform_codes + position,
424 def __getitem__(self, position):
425 position = position if position >= 0 else position + self._list_len
427 offset = self._offset_data_start + self._allocated_offsets[position]
429 self._get_packing_format(position),
430 self.shm.buf,
436 back_transform = self._get_back_transform(position)
441 def __setitem__(self, position, value):
442 position = position if position >= 0 else position + self._list_len
444 item_offset = self._allocated_offsets[position]
445 offset = self._offset_data_start + item_offset
446 current_format = self._get_packing_format(position)
451 new_format = self._types_mapping[type(value)]
454 allocated_length = self._allocated_offsets[position + 1] - item_offset
463 new_format = self._types_mapping[str] % (
467 self._set_packing_format_and_transform(
472 struct.pack_into(new_format, self.shm.buf, offset, encoded_value)
474 def __reduce__(self):
475 return partial(self.__class__, name=self.shm.name), ()
477 def __len__(self):
478 return struct.unpack_from("q", self.shm.buf, 0)[0]
480 def __repr__(self):
481 return f'{self.__class__.__name__}({list(self)}, name={self.shm.name!r})'
484 def format(self):
487 self._get_packing_format(i) for i in range(self._list_len)
491 def _format_size_metainfo(self):
493 return "q" * (self._list_len + 1)
496 def _format_packing_metainfo(self):
498 return "8s" * self._list_len
501 def _format_back_transform_codes(self):
503 return "b" * self._list_len
506 def _offset_data_start(self):
509 return (self._list_len + 2) * 8
512 def _offset_packing_formats(self):
513 return self._offset_data_start + self._allocated_offsets[-1]
516 def _offset_back_transform_codes(self):
517 return self._offset_packing_formats + self._list_len * 8
519 def count(self, value):
522 return sum(value == entry for entry in self)
524 def index(self, value):
528 for position, entry in enumerate(self):