@@ -177,6 +177,39 @@ static void sonyflake_dealloc(struct sonyflake_state *self) {
177177 Py_DECREF (tp );
178178}
179179
180+ static PyObject * sonyflake_sleep (PyObject * obj , struct timespec * to_nanosleep ) {
181+ if (!obj ) {
182+ return NULL ;
183+ }
184+
185+ if (to_nanosleep -> tv_sec == 0 && to_nanosleep -> tv_nsec == 0 ) {
186+ return obj ;
187+ }
188+
189+ int ret = 0 ;
190+
191+ Py_BEGIN_ALLOW_THREADS ;
192+ ret = thrd_sleep (to_nanosleep , NULL );
193+ Py_END_ALLOW_THREADS ;
194+
195+ if (ret == 0 ) {
196+ return obj ;
197+ }
198+
199+ if (ret == -1 ) {
200+ if (PyErr_CheckSignals ()) {
201+ goto err ;
202+ }
203+
204+ return obj ;
205+ }
206+
207+ PyErr_SetFromErrno (PyExc_OSError );
208+ err :
209+ Py_DECREF (obj );
210+ return NULL ;
211+ }
212+
180213PyObject * sonyflake_next (struct sonyflake_state * self , struct timespec * to_nanosleep ) {
181214 struct timespec now , future ;
182215 sonyflake_time current ;
@@ -328,13 +361,7 @@ static PyObject *sonyflake_iternext(struct sonyflake_state *self) {
328361 struct timespec to_nanosleep = { 0 , 0 };
329362 PyObject * sonyflake_id = sonyflake_next (self , & to_nanosleep );
330363
331- if (sonyflake_id && to_nanosleep .tv_sec == 0 && to_nanosleep .tv_nsec == 0 ) {
332- Py_BEGIN_ALLOW_THREADS ;
333- thrd_sleep (& to_nanosleep , NULL );
334- Py_END_ALLOW_THREADS ;
335- }
336-
337- return sonyflake_id ;
364+ return sonyflake_sleep (sonyflake_id , & to_nanosleep );
338365}
339366
340367static PyObject * sonyflake_call (struct sonyflake_state * self , PyObject * args ) {
@@ -352,13 +379,7 @@ static PyObject *sonyflake_call(struct sonyflake_state *self, PyObject *args) {
352379 struct timespec to_nanosleep = { 0 , 0 };
353380 PyObject * sonyflake_ids = sonyflake_next_n (self , n , & to_nanosleep );
354381
355- if (sonyflake_ids && to_nanosleep .tv_sec == 0 && to_nanosleep .tv_nsec == 0 ) {
356- Py_BEGIN_ALLOW_THREADS ;
357- thrd_sleep (& to_nanosleep , NULL );
358- Py_END_ALLOW_THREADS ;
359- }
360-
361- return sonyflake_ids ;
382+ return sonyflake_sleep (sonyflake_ids , & to_nanosleep );
362383}
363384
364385PyDoc_STRVAR (sonyflake_doc ,
0 commit comments