void socket_stub_input(int socket, void *buf_p, size_t size) { struct socket_t *socket_p; while (1) { socket_p = sockets[socket]; if (socket_p != NULL) { break; } thrd_sleep_ms(1); } /* Resume any polling thread. */ sys_lock(); if (chan_is_polled_isr(&socket_p->base)) { thrd_resume_isr(socket_p->base.reader_p, 0); socket_p->base.reader_p = NULL; } chan_write_isr(&qinput, &buf_p, sizeof(buf_p)); chan_write_isr(&qinput, &size, sizeof(size)); sys_unlock(); }
ssize_t event_write_isr(struct event_t *self_p, const void *buf_p, size_t size) { if (chan_is_polled_isr(&self_p->base)) { thrd_resume_isr(self_p->base.reader_p, 0); self_p->base.reader_p = NULL; } self_p->mask |= *(uint32_t *)buf_p; /* Resume waiting thread. */ if (self_p->base.reader_p != NULL) { thrd_resume_isr(self_p->base.reader_p, 0); self_p->base.reader_p = NULL; } return (size); }
static void resume_if_polled(struct socket_t *socket_p) { int polled; /* Resume any polling thread. */ sys_lock(); polled = chan_is_polled_isr(&socket_p->base); if (polled == 1) { thrd_resume_isr(socket_p->base.reader_p, 0); socket_p->base.reader_p = NULL; } sys_unlock(); #if defined(ARCH_ESP) || defined(ARCH_ESP32) if (polled == 1) { xSemaphoreGive(thrd_idle_sem); } #endif }
ssize_t queue_write_isr(struct queue_t *self_p, const void *buf_p, size_t size) { size_t n, left; size_t buffer_unused_until_end, buffer_unused; const char *cbuf_p; left = size; cbuf_p = buf_p; /* Resume any polling thread. */ if (chan_is_polled_isr(&self_p->base)) { thrd_resume_isr(self_p->base.reader_p, 0); self_p->base.reader_p = NULL; } /* Write is not possible to a stopped queue. */ if (self_p->state == QUEUE_STATE_STOPPED) { return (-1); } /* Copy data to the reader, if one is present. */ if (self_p->base.reader_p != NULL) { if (left < self_p->left) { n = left; } else { n = self_p->left; } memcpy(self_p->buf_p, cbuf_p, n); self_p->buf_p += n; self_p->left -= n; cbuf_p += n; left -= n; /* Read buffer full. */ if (self_p->left == 0) { /* Wake the reader. */ thrd_resume_isr(self_p->base.reader_p, self_p->size); self_p->base.reader_p = NULL; } } if ((left > 0) && (self_p->buffer.begin_p != NULL)) { buffer_unused = BUFFER_UNUSED(&self_p->buffer); if (left < buffer_unused) { n = left; } else { n = buffer_unused; } buffer_unused_until_end = BUFFER_UNUSED_UNTIL_END(&self_p->buffer); if (n <= buffer_unused_until_end) { /* Data fits before the end of the buffer. */ memcpy(self_p->buffer.write_p, cbuf_p, n); self_p->buffer.write_p += n; } else { /* The data does not fit begore the end of the * buffer. Write until end and then start from the * beginning. */ memcpy(self_p->buffer.write_p, cbuf_p, buffer_unused_until_end); memcpy(self_p->buffer.begin_p, cbuf_p + buffer_unused_until_end, (n - buffer_unused_until_end)); self_p->buffer.write_p = self_p->buffer.begin_p; self_p->buffer.write_p += (n - buffer_unused_until_end); } left -= n; } return (size - left); }