Skip to content

Commit 74731be

Browse files
committed
Simplify buffered double-linked list types.
1 parent c6c1bbd commit 74731be

File tree

1 file changed

+19
-21
lines changed

1 file changed

+19
-21
lines changed

Modules/_io/bufferedio.c

Lines changed: 19 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -196,11 +196,7 @@ bufferediobase_write(PyObject *self, PyObject *args)
196196
}
197197

198198

199-
struct doubly_linked_s {
200-
struct doubly_linked_s *prev, *next;
201-
};
202-
203-
typedef struct {
199+
typedef struct _buffered {
204200
PyObject_HEAD
205201

206202
PyObject *raw;
@@ -247,11 +243,14 @@ typedef struct {
247243

248244
/* a doubly-linked chained list of "buffered" objects that need to
249245
be flushed when the process exits */
250-
struct doubly_linked_s buffered_writers_list;
246+
struct _buffered *next, *prev;
251247
} buffered;
252248

253-
static struct doubly_linked_s doubly_linked_end = {
254-
&doubly_linked_end, &doubly_linked_end };
249+
/* the actual list of buffered objects */
250+
static buffered buffer_list_end = {
251+
.next = &buffer_list_end,
252+
.prev = &buffer_list_end
253+
};
255254

256255
/*
257256
Implementation notes:
@@ -400,10 +399,10 @@ _enter_buffered_busy(buffered *self)
400399
static void
401400
remove_from_linked_list(buffered *self)
402401
{
403-
self->buffered_writers_list.next->prev = self->buffered_writers_list.prev;
404-
self->buffered_writers_list.prev->next = self->buffered_writers_list.next;
405-
self->buffered_writers_list.prev = NULL;
406-
self->buffered_writers_list.next = NULL;
402+
self->next->prev = self->prev;
403+
self->prev->next = self->next;
404+
self->prev = NULL;
405+
self->next = NULL;
407406
}
408407

409408
static void
@@ -414,7 +413,7 @@ buffered_dealloc(buffered *self)
414413
return;
415414
_PyObject_GC_UNTRACK(self);
416415
self->ok = 0;
417-
if (self->buffered_writers_list.next != NULL)
416+
if (self->next != NULL)
418417
remove_from_linked_list(self);
419418
if (self->weakreflist != NULL)
420419
PyObject_ClearWeakRefs((PyObject *)self);
@@ -1839,11 +1838,11 @@ _io_BufferedWriter___init___impl(buffered *self, PyObject *raw,
18391838
self->fast_closed_checks = (Py_TYPE(self) == &PyBufferedWriter_Type &&
18401839
Py_TYPE(raw) == &PyFileIO_Type);
18411840

1842-
if (self->buffered_writers_list.next == NULL) {
1843-
self->buffered_writers_list.prev = &doubly_linked_end;
1844-
self->buffered_writers_list.next = doubly_linked_end.next;
1845-
doubly_linked_end.next->prev = &self->buffered_writers_list;
1846-
doubly_linked_end.next = &self->buffered_writers_list;
1841+
if (self->next == NULL) {
1842+
self->prev = &buffer_list_end;
1843+
self->next = buffer_list_end.next;
1844+
buffer_list_end.next->prev = self;
1845+
buffer_list_end.next = self;
18471846
}
18481847

18491848
self->ok = 1;
@@ -1858,9 +1857,8 @@ _io_BufferedWriter___init___impl(buffered *self, PyObject *raw,
18581857
*/
18591858
void _PyIO_atexit_flush(void)
18601859
{
1861-
while (doubly_linked_end.next != &doubly_linked_end) {
1862-
buffered *buf = (buffered *)(((char *)doubly_linked_end.next) -
1863-
offsetof(buffered, buffered_writers_list));
1860+
while (buffer_list_end.next != &buffer_list_end) {
1861+
buffered *buf = buffer_list_end.next;
18641862
remove_from_linked_list(buf);
18651863
buffered_flush(buf, NULL);
18661864
PyErr_Clear();

0 commit comments

Comments
 (0)