> On Oct 12, 2017, at 4:52 PM, Pierre Habouzit via swift-corelibs-dev 
> <swift-corelibs-dev@swift.org> wrote:
> 
>> On Oct 12, 2017, at 7:48 AM, Rogiel Sulzbach <rog...@rogiel.com 
>> <mailto:rog...@rogiel.com>> wrote:
>> 
>> I am trying to get libdispatch working on FreeBSD but I am hitting a wall: I 
>> cannot get my head around how the runloop implementation dispatches a event 
>> to the kqueue once a new job is submitted. So far I was able to get the 
>> library to fully compile but most tests are timing out due to a issue 
>> getting the kqueue event handler to awake when the poke method is called.
>> Looking at the Linux implementation 
>> (https://github.com/apple/swift-corelibs-libdispatch/blob/master/src/queue.c#L6119)
>>  
>> <https://github.com/apple/swift-corelibs-libdispatch/blob/master/src/queue.c#L6119)>
>>  it appears to be creating a new eventfd descriptor and calls eventfd_write 
>> on the poke method. A eventfd_read call is only made in the event_epoll.c 
>> implementation file BUT I am unable to find where the specific fd (created 
>> in queue.c) is forwarded to the epool handler. In other words, how is the 
>> event queue implementation informed of that file descriptor?
>> On the Darwin side of things, it appears to use a mix of kqueue (on the 
>> event handling side) and mach ports (on the signaling side), but i still 
>> cannot understand how the event_kevent.c implementation becomes aware of 
>> that port allocated on queue.c.
>> In order do get dispatch working on FreeBSD I need to be able to understand 
>> the flow that happens between _dispatch_runloop_queue_class_poke and a event 
>> getting fired in the kqueue implementation (which I believe should be 
>> happening in _dispatch_kq_poll).
>> 
>> Pierre Habouzit replied to me on the bug tracker:
>> The equivalent of the eventfd on kevent systems is to use an EVFILT_USER. It 
>> is very likely that the current implementation using kevent is badly broken 
>> on FreeBSD it has never run for a very long time. I have no access to 
>> FreeBSD at this time to help though but I can help with questions on the 
>> list.
>> Indeed, the entire library needed changes in 39 files to get compiling, let 
>> alone working! But I am getting there!
> 
> 39 seems a bit excessive so I'd encourage you when you submit this awesome 
> porting effort to try to check in individual "porting fixes" in separate 
> branches.
> 
> You should also try to get it working at the C level before you try to 
> integrate with Swift, runloop queues are not required to get the basic 
> library working
> 
>> 
>> If i am understanding it correctly, I must send a EVFILT_USER and upon 
>> receiving that event I get the corresponding unote and call dux_merge_evt. 
>> Right?
> 
> Hmm actually when answering on Jira I had missed that you were talking about 
> runllops. However, the equivalent of eventfd on kevent will be EVFILT_USER.
> 
> You will need to first work on the implementation of CFRunloop itself to 
> understand how it "blocks". It will likely park in kevent() with a kqueue fd.
> 
> The CFRunloop in question will prepare an EVFILT USER that represents 
> "availability" of dispatch items to drain in the runloop queue. the 
> difficulty is that unlike epoll of portsets on the Mac, the runloop queue has 
> to know your kqueue fd. So you need to devise a way to pass it down.
> 
> Once you have done that _dispatch_runloop_queue_class_poke() on FreeBSD will 
> issue a NOTE_TRIGGER of the EVFILT_USER which will break the CFRunloo parked 
> in kqueue() out, and this will recognize the EVFILT_USER as being the hint 
> that you need to drain it.
> 
> I would suggest that on FreeBSD you add a 
> _dispatch_runloop_queue_set_kqueue() which you will store where the fd/mach 
> port is stored on other platforms.

it also means that you likely need to export some function shared between Swift 
& Dispatch to "recognize" the knote in question, you'll need to pick an ident 
and a udata field. You probably want to have defines in <dispatch/private.h> 
when on FreeBSD for this purpose, since both dispatch & CF/Swift will need to 
know how to form the knote in question.

-Pierre
_______________________________________________
swift-corelibs-dev mailing list
swift-corelibs-dev@swift.org
https://lists.swift.org/mailman/listinfo/swift-corelibs-dev

Reply via email to