
Mill: Go-style concurrency in C - rumcajz
http://millc.org/
======
skj
Finally, something that purports to have Go-style concurrency that actually
provides the equivalent of select{}!

Lots of things just provide chans, which are fancy thread-safe queues and are
fairly easy to implement. Getting select{} right is the tricky (and powerful)
part.

~~~
technomancy
Is this specific to what Go offers, or is it just a CSP implementation? I
can't tell from a glance at the page, but let's give credit where credit is
due if it's coming from Hoare's ideas.

~~~
rumcajz
it's CSP as extended by golang, i.e. with channels rather than named
processes.

~~~
eternalban
Is this how the term OO got degenerated?

In Communicating Sequential Processes, you only communicate via messages (C) &
the processes (P) sequentially (S) run to completion.

Go is not CSP. It is fair to say it was inspired by CSP. Go has a preemptive
scheduler, and passing shared memory references is idiomatic and at times
unavoidable.

~~~
skj
Go-the-language does not have a preemptive scheduler, just guarantees about
how various means of synchronization interact.

In fact, Go-the-implementation is only partially preemptive, I believe: in
addition to calls into the runtime, calling any function can now be a
scheduling event. But if you have a tight loop with no function calls (just
arithmetic, perhaps), that goroutine will not yield control. A true preemptive
scheduler would be able to take control from that goroutine.

~~~
eternalban
Not so.
[http://golang.org/doc/go1.2#preemption](http://golang.org/doc/go1.2#preemption)

[edit: hmm. Possibly I've mis-parsed that.]

~~~
skj
I'm pretty sure you parsed that wrong :)

~~~
eternalban
Yes, you're right. But original . re CSP stands :)

~~~
skj
Sure. I don't really know much about CSP.

------
r0nin
The name clash with the CPU architecture[1] is by accident?

[1] -
[https://en.wikipedia.org/wiki/Mill_CPU_Architecture](https://en.wikipedia.org/wiki/Mill_CPU_Architecture)

------
loonattic
Would this be sort of like libthread on Plan 9/plan9port? But a bit nicer?
Anyway, really cool project.

Though I'm kind of bummed that libthread is as obscure as it is...

~~~
marktangotango
>> Though I'm kind of bummed that libthread is as obscure as it is...

I am as well. That's the coolest thing about Go imo, Go basically distills
down a lot of the coolest stuff from Plan 9, and took it to the 'masses'.
Edit; that just my impression, I'm not a Go user.

It would be very useful to have syntactic sugar over coroutines and channels
in C. There are quiet a few coroutine libs around, but having it in the
language would be compelling.

~~~
vezzy-fnord
_Edit; that just my impression, I 'm not a Go user._

Basically it, I think. Go is the logical evolution of the Limbo language used
to write native applications for the Inferno OS, itself evolving from Rob
Pike's research with Alef and Newsqueak. The direct heritage spans at least a
couple of decades, intermingled with the Plan 9 toolchain and interfaces.

------
verandaguy
Anyone else getting a malware warning from the site's icon.ico file? Avast's
not letting me access it on mac; could someone post a mirror that would get
around the issue?

Alternatively, can someone confirm/disconfirm that the ico's bad news?

~~~
TehCorwiz
Kaspersky just blocked the whole site for me.

EDIT: Looks like it doesn't like
[http://millc.org/main.css](http://millc.org/main.css) which is innocuous.
>>shrugs<< looks like a false positive.

~~~
rumcajz
Weird. It's a totally plain CSS file.

------
plg

      $ gcc -o test test.c mill.c
      mill.c:221:13: error: conflicting types for 'wait'
       static void wait(int fd, short events) {
                   ^
      In file included from /usr/include/stdlib.h:65:0,
                       from mill.c:33:
      /usr/include/sys/wait.h:248:7: note: previous declaration of 'wait' was here
       pid_t wait(int *) __DARWIN_ALIAS_C(wait);
             ^

~~~
mborsuk
Are you on OS X? he says it's only expected to work on linux...

~~~
plg
ah thank you

------
IonoclastBrig
I suppose "choose" was used for multiplexing channel reads to avoid clashing
with select(2) (<sys/select.h>) on BSD/POSIX systems..?

~~~
rumcajz
Yep. Same way "case" and "default" cannot be used because they clash with C
keywords. I was thinking of using "elect" initially, but that looks too much
like a typo.

------
glittershark
I bet this is an absolute nightmare to step through with gdb

------
davidw
How's it work under the hood?

~~~
smegel
Getcontext/setcontext has always allowed for coroutines in C. This just adds a
sugar layer of nonblocking functions that allows a runtime layer to switch
between contexts (coroutines), just like Go.

~~~
octetta
The ucontext stuff is nice but why was it deprecated?

It's generally not a problem on x86, but in my experience for other platforms,
it gets messy quickly.

It would be nice if a replacement or a "de-deprecated" was around.

~~~
Blackthorn
That question has seriously bothered me too. OS threads are _not_ a
replacement as they are preemptive. The deprecation was way premature.

