Hi,
I am working on a web server written in pure Forth and I am using
gforth
as the implementation I develop on. Serving multiple requests without
blocking requires me to venture into the realm of multi-threading and
gforth's experimental support for pthread has been a blessing. It may
be good for me to mention that I work on UNIX (OpenBSD).
Now instead of doing like in cilk.fs and spawning a few workers and
offloading requests to them, I prefer to create a separate thread each
time a request comes and this led me to notice that my server wasn't
able to serve more than ~3k requests before hanging and also the memory
usage of my process increased a lot with each new request comming in.
I
then proceeded to hunt down memory leaks due to the S" S\" and S+ words
with minimal impact. That is what lead me to realize that creating new
threads with the PASS word was creating non-detached thread which never
freed the memory once the thread exited.
I am attaching a patch for unix/pthread.fs which fixed the big memory
leak for me, my server is no able to server well above 3k requests
without hanging/crashing (I tested 10 without any issues).
Also optionally I am attaching another patch for cilk.fs just to
correctly get the number of cores on OpenBSD.
Thank you for the great work on gforth, I can't wait for the official
1.0 to release so that OpenBSD ports won't be stuck with 0.7.3 forever!
:D
Cheers,