aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/src (follow)
Commit message (Collapse)AuthorAge
* make compilers happierEgor Tensin2022-08-28
|
* server: more loggingEgor Tensin2022-08-28
|
* msg: fix a buffer overflowEgor Tensin2022-08-28
| | | | Thanks, Valgrind!
* holy crap, it actually kinda works nowEgor Tensin2022-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_NOSIGNALEgor Tensin2022-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 gracefullyEgor Tensin2022-08-28
|
* came up with a new name: cimpleEgor Tensin2022-08-26
|
* add check_errno macroEgor Tensin2022-08-26
|
* fix macrosEgor Tensin2022-08-26
| | | | | | do { ... } while (0) is objectively better: https://stackoverflow.com/q/1067226/514684
* fix pthread error handlingEgor Tensin2022-08-26
| | | | pthread functions return positive error codes.
* worker: allow graceful shutdownsEgor Tensin2022-08-26
| | | | | | | | | | Well, maybe "graceful" is a strong word, but now you _can_ do ./server & ./worker & ./client ci_run URL REV && kill "$( pidof worker )" and the worker will wait for the CI run to complete.
* worker: capture process outputEgor Tensin2022-08-26
|
* add some more codeEgor Tensin2022-08-26
| | | | | | | | | | | | | | | | This adds a basic "worker" program. You can now do something like ./server & ./worker & ./client ci_run URL REV and the server should pass a message to worker, after which it should clone the repository at URL, checkout REV, and try to run the CI script. It's extremely unfinished: I need to sort out the graceful shutdown, how the server manages workers, etc.
* cmake: ignore unused parameters for nowEgor Tensin2022-08-25
| | | | This is a dumb warning.
* msg: add msg_copy, refactoringEgor Tensin2022-08-25
|
* msg: refactoringEgor Tensin2022-08-25
|
* net: rework APIEgor Tensin2022-08-25
| | | | | | | | | | First, rename all API functions so that they start with net_. Second, abstract the basic TCP server functionality into tcp_server.c. This includes reworking net_accept so that it's a simple blocking operation, and putting the callback stuff to tcp_server.c. Also, the server now uses detached threads instead of fork(), since I want connection handlers to share memory.
* msg: add msg_dump_unknownEgor Tensin2022-08-25
|
* log: add print_log macroEgor Tensin2022-08-25
|
* cmd -> msgEgor Tensin2022-08-23
| | | | This I feel better conveys the meaning.
* remove redundant codeEgor Tensin2022-08-23
|
* cmd: add cmd_from_argvEgor Tensin2022-08-23
|
* net: use CLOEXECEgor Tensin2022-08-23
| | | | I've only recently learned about this flag, seems generally useful.
* net: fix recv_allEgor Tensin2022-08-23
| | | | Make sure we handle read() returning 0, this is a valid use-case.
* add some codeEgor Tensin2022-08-23
A basic client-server app, the client sends commands as an array of strings. Hopefully I didn't mess up, and hopefully it'll be useful.