@@ -196,11 +196,7 @@ bufferediobase_write(PyObject *self, PyObject *args)
196
196
}
197
197
198
198
199
- struct doubly_linked_s {
200
- struct doubly_linked_s * prev , * next ;
201
- };
202
-
203
- typedef struct {
199
+ typedef struct _buffered {
204
200
PyObject_HEAD
205
201
206
202
PyObject * raw ;
@@ -247,11 +243,14 @@ typedef struct {
247
243
248
244
/* a doubly-linked chained list of "buffered" objects that need to
249
245
be flushed when the process exits */
250
- struct doubly_linked_s buffered_writers_list ;
246
+ struct _buffered * next , * prev ;
251
247
} buffered ;
252
248
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
+ };
255
254
256
255
/*
257
256
Implementation notes:
@@ -400,10 +399,10 @@ _enter_buffered_busy(buffered *self)
400
399
static void
401
400
remove_from_linked_list (buffered * self )
402
401
{
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 ;
407
406
}
408
407
409
408
static void
@@ -414,7 +413,7 @@ buffered_dealloc(buffered *self)
414
413
return ;
415
414
_PyObject_GC_UNTRACK (self );
416
415
self -> ok = 0 ;
417
- if (self -> buffered_writers_list . next != NULL )
416
+ if (self -> next != NULL )
418
417
remove_from_linked_list (self );
419
418
if (self -> weakreflist != NULL )
420
419
PyObject_ClearWeakRefs ((PyObject * )self );
@@ -1839,11 +1838,11 @@ _io_BufferedWriter___init___impl(buffered *self, PyObject *raw,
1839
1838
self -> fast_closed_checks = (Py_TYPE (self ) == & PyBufferedWriter_Type &&
1840
1839
Py_TYPE (raw ) == & PyFileIO_Type );
1841
1840
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 ;
1847
1846
}
1848
1847
1849
1848
self -> ok = 1 ;
@@ -1858,9 +1857,8 @@ _io_BufferedWriter___init___impl(buffered *self, PyObject *raw,
1858
1857
*/
1859
1858
void _PyIO_atexit_flush (void )
1860
1859
{
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 ;
1864
1862
remove_from_linked_list (buf );
1865
1863
buffered_flush (buf , NULL );
1866
1864
PyErr_Clear ();
0 commit comments