blog for the day
This commit is contained in:
parent
8bdb331b60
commit
2a079a9d37
1 changed files with 34 additions and 0 deletions
34
doc/design/assistant/blog/day_13__kqueue_continued.mdwn
Normal file
34
doc/design/assistant/blog/day_13__kqueue_continued.mdwn
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
Good news! My beta testers report that the new kqueue code works on OSX.
|
||||||
|
At least "works" as well as it does on Debian kFreeBSD. My crazy
|
||||||
|
development strategy of developing on Debian kFreeBSD while targeting Mac
|
||||||
|
OSX is vindicated. ;-)
|
||||||
|
|
||||||
|
So, I've been beating the kqueue code into shape for the last 12 hours,
|
||||||
|
minus a few hours sleep.
|
||||||
|
|
||||||
|
First, I noticed it was seeming to starve the other threads. I'm using
|
||||||
|
Haskell's non-threaded runtime, which does cooperative multitasking between
|
||||||
|
threads, and my C code was never returning to let the other threads run.
|
||||||
|
Changed that around, so the C code runs until SIGALARMed, and then that
|
||||||
|
thread calls `yield` before looping back into the C code. Wow, cooperative
|
||||||
|
multitasking.. I last dealt with that when programming for Windows 3.1!
|
||||||
|
(Should try to use Haskell's -threaded runtime sometime, but git-annex
|
||||||
|
doesn't work under it, and I have not tried to figure out why not.)
|
||||||
|
|
||||||
|
Then I made a [single commit](http://source.git-annex.branchable.com/?p=source.git;a=commitdiff;h=2bfcc0b09c5dd37c5e0ab65cb089232bfcc31934),
|
||||||
|
with no testing, in which I made the kqueue code maintain a cache of what
|
||||||
|
it expects in the directory tree, and use that to determine what files
|
||||||
|
changed how when a change is detected. Serious code. It worked on the
|
||||||
|
first go. If you were wondering why I'm writing in Haskell ... yeah,
|
||||||
|
that's why.
|
||||||
|
|
||||||
|
And I've continued to hammer on the kqueue code, making lots of little
|
||||||
|
fixes, and at this point it seems *almost* able to handle the changes I
|
||||||
|
throw at it. It does have one big remaining problem; kqueue doesn't tell me
|
||||||
|
when a writer closes a file, so it will sometimes miss adding files. To fix
|
||||||
|
this, I'm going to need to make it maintain a queue of new files, and
|
||||||
|
periodically check them, with `lsof`, to see when they're done being
|
||||||
|
written to, and add them to the annex. So while a file is being written
|
||||||
|
to, `git annex watch` will have to wake up every second or so, and run
|
||||||
|
`lsof` ... and it'll take it at least 1 second to notice a file's complete.
|
||||||
|
Not ideal, but the best that can be managed with kqueue.
|
Loading…
Add table
Add a link
Reference in a new issue