From: Daniele Varrazzo Date: Sun, 11 Dec 2022 19:48:32 +0000 (+0000) Subject: perf(c): small optimization tweaks to wait_c X-Git-Tag: 3.1.5~7^2~2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b013687d7d7aed70559244ce721021da1e435958;p=thirdparty%2Fpsycopg.git perf(c): small optimization tweaks to wait_c --- diff --git a/psycopg_c/psycopg_c/_psycopg/generators.pyx b/psycopg_c/psycopg_c/_psycopg/generators.pyx index 29f6fb40e..9ce9e54f7 100644 --- a/psycopg_c/psycopg_c/_psycopg/generators.pyx +++ b/psycopg_c/psycopg_c/_psycopg/generators.pyx @@ -18,8 +18,12 @@ from psycopg._encodings import conninfo_encoding cdef object WAIT_W = Wait.W cdef object WAIT_R = Wait.R cdef object WAIT_RW = Wait.RW +cdef object PY_READY_R = Ready.R +cdef object PY_READY_W = Ready.W +cdef object PY_READY_RW = Ready.RW cdef int READY_R = Ready.R cdef int READY_W = Ready.W +cdef int READY_RW = Ready.RW def connect(conninfo: str) -> PQGenConn[abc.PGconn]: """ diff --git a/psycopg_c/psycopg_c/_psycopg/waiting.pyx b/psycopg_c/psycopg_c/_psycopg/waiting.pyx index bdecfda72..0af6c57c1 100644 --- a/psycopg_c/psycopg_c/_psycopg/waiting.pyx +++ b/psycopg_c/psycopg_c/_psycopg/waiting.pyx @@ -4,6 +4,8 @@ C implementation of waiting functions # Copyright (C) 2022 The Psycopg Team +from cpython.object cimport PyObject_CallFunctionObjArgs + cdef extern from *: """ #if defined(HAVE_POLL) && !defined(HAVE_BROKEN_POLL) @@ -152,8 +154,6 @@ finally: } """ - const int SELECT_EV_READ - const int SELECT_EV_WRITE cdef int wait_c_impl(int fileno, int wait, float timeout) except -1 @@ -163,11 +163,16 @@ def wait_c(gen: PQGen[RV], int fileno, timeout = None) -> RV: """ cdef float ctimeout cdef int wait, ready + cdef PyObject *pyready - if timeout is None or timeout < 0: + if timeout is None: ctimeout = -1.0 else: ctimeout = float(timeout) + if ctimeout < 0.0: + ctimeout = -1.0 + + send = gen.send try: wait = next(gen) @@ -176,8 +181,16 @@ def wait_c(gen: PQGen[RV], int fileno, timeout = None) -> RV: ready = wait_c_impl(fileno, wait, ctimeout) if ready == 0: continue - - wait = gen.send(ready) + elif ready == READY_R: + pyready = PY_READY_R + elif ready == READY_RW: + pyready = PY_READY_RW + elif ready == READY_W: + pyready = PY_READY_W + else: + raise AssertionError(f"unexpected ready value: {ready}") + + wait = PyObject_CallFunctionObjArgs(send, pyready, NULL) except StopIteration as ex: rv: RV = ex.args[0] if ex.args else None