From d60994abb59acc0753cc5c118c368e82eb2612c4 Mon Sep 17 00:00:00 2001 From: Erik Karlsson Date: Thu, 14 Mar 2019 08:37:02 +0100 Subject: [PATCH 1/4] add python sendto recvfrom abstract socket support --- src/python.c | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/src/python.c b/src/python.c index c63c2cb..f97285f 100644 --- a/src/python.c +++ b/src/python.c @@ -2267,6 +2267,26 @@ pysocket_async_recv(struct pysocket_op *op) return (NULL); break; case AF_UNIX: + if (socklen < sizeof(sa_family_t)) { + if ((tuple = Py_BuildValue("(ON)", + Py_None, bytes)) == NULL) + return (NULL); + break; + } + + if (socklen > sizeof(struct sockaddr_un)) { + PyErr_SetString(PyExc_RuntimeError, + "Socklen longer than sockaddr_un"); + return (NULL); + } + +#if defined(__linux__) + if (op->sendaddr.sun.sun_path[0] == '\0') { + op->sendaddr.sun.sun_path[0] = '@'; + op->sendaddr.sun.sun_path[socklen - sizeof(sa_family_t)] = '\0'; + } +#endif + if ((tuple = Py_BuildValue("(sN)", op->sendaddr.sun.sun_path, bytes)) == NULL) return (NULL); @@ -2313,6 +2333,14 @@ pysocket_async_send(struct pysocket_op *op) break; case AF_UNIX: socklen = sizeof(op->sendaddr.sun); +#if defined(__linux__) + if (op->sendaddr.sun.sun_path[0] == '@') { + socklen = sizeof(sa_family_t) + + strlen(op->sendaddr.sun.sun_path); + op->sendaddr.sun.sun_path[0] = '\0'; + } +#endif + break; default: fatal("non AF_INET/AF_UNIX in %s", __func__); From 681a88d535035392d82210c752d0d17e7f1cad0b Mon Sep 17 00:00:00 2001 From: Joris Vink Date: Tue, 19 Mar 2019 13:27:50 +0100 Subject: [PATCH 2/4] simplify af_unix recvfrom/sendto support. --- src/python.c | 26 +++++++++++--------------- 1 file changed, 11 insertions(+), 15 deletions(-) diff --git a/src/python.c b/src/python.c index f97285f..2c0e646 100644 --- a/src/python.c +++ b/src/python.c @@ -2190,6 +2190,7 @@ static PyObject * pysocket_async_recv(struct pysocket_op *op) { ssize_t ret; + size_t len; u_int16_t port; socklen_t socklen; struct sockaddr *sendaddr; @@ -2217,6 +2218,7 @@ pysocket_async_recv(struct pysocket_op *op) fatal("non AF_INET/AF_UNIX in %s", __func__); } + memset(sendaddr, 0, socklen); ret = recvfrom(op->socket->fd, op->buffer.data, op->buffer.length, 0, sendaddr, &socklen); } @@ -2267,26 +2269,21 @@ pysocket_async_recv(struct pysocket_op *op) return (NULL); break; case AF_UNIX: - if (socklen < sizeof(sa_family_t)) { + len = strlen(op->sendaddr.sun.sun_path); +#if defined(__linux__) + if (len == 0 && socklen > 0) { + len = socklen - sizeof(sa_family_t); + op->sendaddr.sun.sun_path[0] = '@'; + op->sendaddr.sun.sun_path[len] = '\0'; + } +#endif + if (len == 0) { if ((tuple = Py_BuildValue("(ON)", Py_None, bytes)) == NULL) return (NULL); break; } - if (socklen > sizeof(struct sockaddr_un)) { - PyErr_SetString(PyExc_RuntimeError, - "Socklen longer than sockaddr_un"); - return (NULL); - } - -#if defined(__linux__) - if (op->sendaddr.sun.sun_path[0] == '\0') { - op->sendaddr.sun.sun_path[0] = '@'; - op->sendaddr.sun.sun_path[socklen - sizeof(sa_family_t)] = '\0'; - } -#endif - if ((tuple = Py_BuildValue("(sN)", op->sendaddr.sun.sun_path, bytes)) == NULL) return (NULL); @@ -2340,7 +2337,6 @@ pysocket_async_send(struct pysocket_op *op) op->sendaddr.sun.sun_path[0] = '\0'; } #endif - break; default: fatal("non AF_INET/AF_UNIX in %s", __func__); From 8afaac9fde0ff91ed08831081cc41b5fc1732924 Mon Sep 17 00:00:00 2001 From: Joris Vink Date: Tue, 19 Mar 2019 13:42:22 +0100 Subject: [PATCH 3/4] log pid number of worker upon start. --- src/worker.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/worker.c b/src/worker.c index 956bb45..6a30e57 100644 --- a/src/worker.c +++ b/src/worker.c @@ -382,7 +382,8 @@ kore_worker_entry(struct kore_worker *kw) if (!kore_quiet) { kore_log(LOG_NOTICE, - "worker %d started (cpu#%d)", kw->id, kw->cpu); + "worker %d started (cpu#%d, pid#%d)", + kw->id, kw->cpu, kw->pid); } rcall = kore_runtime_getcall("kore_worker_configure"); From d371454dad11b6e9de53cb3747c1cf25b3bb6d9f Mon Sep 17 00:00:00 2001 From: Joris Vink Date: Tue, 19 Mar 2019 13:58:00 +0100 Subject: [PATCH 4/4] do not grab the result if it was in a gatherop --- src/python.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/python.c b/src/python.c index 2c0e646..67bf7a6 100644 --- a/src/python.c +++ b/src/python.c @@ -542,7 +542,7 @@ python_coro_run(struct python_coro *coro) item = _PyGen_Send((PyGenObject *)coro->obj, NULL); if (item == NULL) { - if (PyErr_Occurred() && + if (coro->gatherop == NULL && PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) { PyErr_Fetch(&type, &coro->result, &traceback); Py_DECREF(type);