@@ -177,6 +177,43 @@ 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 ) {
186+ return obj ;
187+ }
188+
189+ if (to_nanosleep -> tv_sec == 0 && to_nanosleep -> tv_nsec == 0 ) {
190+ return obj ;
191+ }
192+
193+ int ret = 0 ;
194+
195+ Py_BEGIN_ALLOW_THREADS ;
196+ ret = thrd_sleep (to_nanosleep , NULL );
197+ Py_END_ALLOW_THREADS ;
198+
199+ if (ret == 0 ) {
200+ return obj ;
201+ }
202+
203+ if (ret == -1 ) {
204+ if (PyErr_CheckSignals ()) {
205+ goto err ;
206+ }
207+
208+ return obj ;
209+ }
210+
211+ PyErr_SetFromErrno (PyExc_OSError );
212+ err :
213+ Py_DECREF (obj );
214+ return NULL ;
215+ }
216+
180217PyObject * sonyflake_next (struct sonyflake_state * self , struct timespec * to_nanosleep ) {
181218 struct timespec now , future ;
182219 sonyflake_time current ;
@@ -328,13 +365,7 @@ static PyObject *sonyflake_iternext(struct sonyflake_state *self) {
328365 struct timespec to_nanosleep = { 0 , 0 };
329366 PyObject * sonyflake_id = sonyflake_next (self , & to_nanosleep );
330367
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 ;
368+ return sonyflake_sleep (sonyflake_id , & to_nanosleep );
338369}
339370
340371static PyObject * sonyflake_call (struct sonyflake_state * self , PyObject * args ) {
@@ -352,13 +383,7 @@ static PyObject *sonyflake_call(struct sonyflake_state *self, PyObject *args) {
352383 struct timespec to_nanosleep = { 0 , 0 };
353384 PyObject * sonyflake_ids = sonyflake_next_n (self , n , & to_nanosleep );
354385
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 ;
386+ return sonyflake_sleep (sonyflake_ids , & to_nanosleep );
362387}
363388
364389PyDoc_STRVAR (sonyflake_doc ,
0 commit comments