Skip to content

Commit 7071236

Browse files
committed
Improve error handling when sleeping
1 parent 0d48a14 commit 7071236

1 file changed

Lines changed: 39 additions & 14 deletions

File tree

src/sonyflake_turbo/sonyflake.c

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

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

364389
PyDoc_STRVAR(sonyflake_doc,

0 commit comments

Comments
 (0)