diff --git a/examples/www_server.c b/examples/www_server.c index 0387db7..55c617f 100644 --- a/examples/www_server.c +++ b/examples/www_server.c @@ -246,7 +246,7 @@ static void generate_client_reply(int fd, const char *filename) { message->fd = fd; message->rfd = rfd; message->close_pending = 1; - message->buf[1024] = '\0'; + message->buf[sizeof(message->buf)-1] = '\0'; message_queue_write(&io_queue, message); wake_main_thread(); } @@ -265,11 +265,12 @@ static int copy_data(int rfd, int fd) { } message_queue_write(&io_queue, message); wake_main_thread(); + return 0; } static void service_io_message_queue() { struct io_op *message; - while(message = message_queue_tryread(&io_queue)) { + while((message = message_queue_tryread(&io_queue))) { client_data[message->fd].state = CLIENT_WRITING; client_data[message->fd].write_op = message; } @@ -329,7 +330,7 @@ int main(int argc, char *argv[]) { if(i != fd && FD_ISSET(i, &rfds)) { handle_client_data(i); } else if(i != fd && FD_ISSET(i, &wfds)) { - int r = write(i, client_data[i].write_op->buf+client_data[i].write_op->pos, client_data[i].write_op->len-client_data[i].write_op->pos); + r = write(i, client_data[i].write_op->buf+client_data[i].write_op->pos, client_data[i].write_op->len-client_data[i].write_op->pos); if(r >= 0) { client_data[i].write_op->pos += r; if(client_data[i].write_op->pos == client_data[i].write_op->len) { @@ -343,6 +344,7 @@ int main(int argc, char *argv[]) { message->fd = i; message->rfd = client_data[i].write_op->rfd; message_queue_write(&worker_queue, message); + message_queue_write(&worker_queue, message); } message_queue_message_free(&io_queue, client_data[i].write_op); } @@ -360,4 +362,6 @@ int main(int argc, char *argv[]) { } else { perror("Error listening on *:8080"); } + threadpool_destroy(); + return 0; } diff --git a/message_queue.c b/message_queue.c index bd0054b..50f3526 100644 --- a/message_queue.c +++ b/message_queue.c @@ -46,9 +46,9 @@ union padding { }; static inline int pad_size(int size) { - return size % sizeof(union padding) ? + return size % (sizeof(union padding) ? (size + (sizeof(union padding) - (size % sizeof(union padding)))) : - size; + size); } static inline uint32_t round_to_pow2(uint32_t x) { @@ -62,10 +62,6 @@ static inline uint32_t round_to_pow2(uint32_t x) { return x; } -static inline int max(int x, int y) { - return x > y ? x : y; -} - int message_queue_init(struct message_queue *queue, int message_size, int max_depth) { char sem_name[128]; queue->message_size = pad_size(message_size); @@ -77,7 +73,7 @@ int message_queue_init(struct message_queue *queue, int message_size, int max_de if(!queue->freelist) goto error_after_memory; for(int i=0;imax_depth;++i) { - queue->freelist[i] = queue->memory + (sizeof(void *) * i); + queue->freelist[i] = ((char *)queue->memory) + (message_size * i); } snprintf(sem_name, 128, "%d_%p", getpid(), &queue->allocator); sem_name[127] = '\0';