Skip to content

Commit d2bd485

Browse files
committed
Improve error handling when sleeping
1 parent c3683aa commit d2bd485

1 file changed

Lines changed: 35 additions & 14 deletions

File tree

src/sonyflake_turbo/sonyflake.c

Lines changed: 35 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
180213
PyObject *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

340367
static 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

364385
PyDoc_STRVAR(sonyflake_doc,

0 commit comments

Comments
 (0)