Commit message (Collapse) | Author | Age | ||
---|---|---|---|---|
... | ||||
* | add a cimple-valgrind executable | Egor Tensin | 2023-05-06 | |
| | ||||
* | add a TODO note | Egor Tensin | 2023-05-06 | |
| | ||||
* | shut down server/workers gracefully on SIGTERM | Egor Tensin | 2023-05-06 | |
| | ||||
* | get rid of __attribute__((constructor)) | Egor Tensin | 2023-05-06 | |
| | | | | Explicit is better than implicit. | |||
* | add a default SQLite database path | Egor Tensin | 2023-04-29 | |
| | ||||
* | cmd_line: read executable name from /proc/self/exe | Egor Tensin | 2023-04-29 | |
| | ||||
* | dedupe command line routines | Egor Tensin | 2023-04-29 | |
| | ||||
* | make struct storage_settings_sqlite opaque | Egor Tensin | 2023-04-29 | |
| | ||||
* | make struct ci_queue_entry opaque | Egor Tensin | 2023-04-29 | |
| | ||||
* | net: use size instead of length for variable names | Egor Tensin | 2023-04-29 | |
| | ||||
* | net: add struct buf | Egor Tensin | 2023-04-29 | |
| | ||||
* | make struct client opaque | Egor Tensin | 2023-04-29 | |
| | ||||
* | make struct worker opaque | Egor Tensin | 2023-04-29 | |
| | ||||
* | make struct server opaque | Egor Tensin | 2023-04-29 | |
| | ||||
* | make struct tcp_server opaque | Egor Tensin | 2023-04-29 | |
| | ||||
* | fix a typo | Egor Tensin | 2023-04-27 | |
| | ||||
* | rename commands | Egor Tensin | 2023-04-27 | |
| | ||||
* | sqlite: fix error handling | Egor Tensin | 2023-04-11 | |
| | ||||
* | put SQL headers to a separate directory | Egor Tensin | 2023-04-11 | |
| | ||||
* | sqlite: create indices | Egor Tensin | 2023-04-11 | |
| | ||||
* | actually create some tables in SQLite database | Egor Tensin | 2023-04-11 | |
| | ||||
* | add copyright notices | Egor Tensin | 2022-12-02 | |
| | ||||
* | create SQLite database on startup | Egor Tensin | 2022-09-11 | |
| | ||||
* | log: refactoring | Egor Tensin | 2022-09-08 | |
| | ||||
* | log: prepend timestamps | Egor Tensin | 2022-09-08 | |
| | ||||
* | sanitize #include-s | Egor Tensin | 2022-09-08 | |
| | ||||
* | ci: set some environment variables | Egor Tensin | 2022-09-07 | |
| | ||||
* | net: removed unused API | Egor Tensin | 2022-08-30 | |
| | ||||
* | net: error out unless net_recv_all receives all bytes | Egor Tensin | 2022-08-30 | |
| | ||||
* | net: more portable | Egor Tensin | 2022-08-30 | |
| | | | | Use a predefined byte order, integers with fixed width, etc. | |||
* | net: bind to IPv6 | Egor Tensin | 2022-08-30 | |
| | | | | | This makes sure we use the dual-stack feature to support both IPv4 and IPv6. | |||
* | update command names | Egor Tensin | 2022-08-28 | |
| | ||||
* | docker: shorten command values | Egor Tensin | 2022-08-28 | |
| | ||||
* | server: notify workers about requeued jobs | Egor Tensin | 2022-08-28 | |
| | | | | This allows free workers to pick up jobs after dead workers. | |||
* | worker: fix a crash | Egor Tensin | 2022-08-28 | |
| | | | | Found when running in Docker. | |||
* | server: notify all threads about shutting down | Egor Tensin | 2022-08-28 | |
| | | | | | | | The problem is pthread_cond_destroy is unsafe to call if there're threads waiting in pthread_cond_wait. I'm not sure this fix is enough: what if the "broadcast" doesn't reach the threads until we call pthread_cond_destroy? Does it even work that way? Idk | |||
* | make proper "error" messages | Egor Tensin | 2022-08-28 | |
| | | | | | Previously, the client had no way to distinguish errors from succesful calls. | |||
* | fix Alpine builds | Egor Tensin | 2022-08-28 | |
| | ||||
* | don't use the latest glibc features | Egor Tensin | 2022-08-28 | |
| | | | | | pthread_attr_setsigmask_np is only available since 2.32, which is too modern. | |||
* | add missing #include | Egor Tensin | 2022-08-28 | |
| | ||||
* | cmake: add install() rules | Egor Tensin | 2022-08-28 | |
| | ||||
* | make compilers happier | Egor Tensin | 2022-08-28 | |
| | ||||
* | server: more logging | Egor Tensin | 2022-08-28 | |
| | ||||
* | msg: fix a buffer overflow | Egor Tensin | 2022-08-28 | |
| | | | | Thanks, Valgrind! | |||
* | holy crap, it actually kinda works now | Egor Tensin | 2022-08-28 | |
| | | | | | | | | | | | | | | | | | | | | | | | Previously, I had a stupid system where I would create a thread after every accept(), and put worker descriptors in a queue. A special "scheduler" thread would then pick them out, and give out jobs to complete. The problem was, of course, I couldn't conveniently poll job status from workers. I thought about using poll(), but that turned out to be a horribly complicated API. How do I deal with partial reads, for example? I don't honestly know. Then it hit me that I could just use the threads that handle accept()ed connections as "worker threads", which would synchronously schedule jobs and wait for them to complete. This solves every problem and removes the need for a lot of inter-thread synchronization magic. It even works now, holy crap! You can launch and terminate workers at will, and they will pick up new jobs automatically. As a side not, msg_recv_and_handle turned out to be too limiting and complicated for me, so I got rid of that, and do normal msg_recv/msg_send calls. | |||
* | net: use MSG_NOSIGNAL | Egor Tensin | 2022-08-28 | |
| | | | | | Apparently, if you try to write() into a socket with the other party already gone, your process receives a SIGPIPE. Wtf? | |||
* | server: shutting down more gracefully | Egor Tensin | 2022-08-28 | |
| | ||||
* | came up with a new name: cimple | Egor Tensin | 2022-08-26 | |
| | ||||
* | add check_errno macro | Egor Tensin | 2022-08-26 | |
| | ||||
* | fix macros | Egor Tensin | 2022-08-26 | |
| | | | | | | do { ... } while (0) is objectively better: https://stackoverflow.com/q/1067226/514684 |