Commit message (Collapse) | Author | Age | ||
---|---|---|---|---|
... | ||||
* | 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 | |
| | ||||
* | .editorconfig: minor adjustments | Egor Tensin | 2023-04-11 | |
| | ||||
* | .editorconfig: disable tab indentation for Python files | Egor Tensin | 2023-04-11 | |
| | ||||
* | actually create some tables in SQLite database | Egor Tensin | 2023-04-11 | |
| | ||||
* | add .editorconfig | Egor Tensin | 2023-03-04 | |
| | ||||
* | use `--progress plain` with docker-compose build | Egor Tensin | 2023-02-25 | |
| | ||||
* | use --quiet flags for installations | Egor Tensin | 2023-02-25 | |
| | ||||
* | make .gitattributes more consistent | Egor Tensin | 2022-12-03 | |
| | ||||
* | fix preludes in bash scripts | Egor Tensin | 2022-12-03 | |
| | ||||
* | README: update | Egor Tensin | 2022-12-02 | |
| | ||||
* | add copyright notices | Egor Tensin | 2022-12-02 | |
| | ||||
* | README: update | Egor Tensin | 2022-12-02 | |
| | ||||
* | docker: bump base image | 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 | |
| | ||||
* | add README.md | Egor Tensin | 2022-09-07 | |
| | ||||
* | add scripts (pre-commit hook, etc.) | Egor Tensin | 2022-09-07 | |
| | ||||
* | ci: set some environment variables | Egor Tensin | 2022-09-07 | |
| | ||||
* | doc: fix a typo | Egor Tensin | 2022-09-07 | |
| | ||||
* | add ci script | Egor Tensin | 2022-09-07 | |
| | ||||
* | docker: add bin to PATH | Egor Tensin | 2022-09-07 | |
| | ||||
* | add Makefile | 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 | |||
* | docker: add initial configuration | Egor Tensin | 2022-08-28 | |
| | ||||
* | 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 |