Good question...

I am also not 100% familiar with that code.
The only thing I can see right away is to use channels.
Each reactor has 1023 channels, so I would advise to spread-m like that.

So you can either assign a specific message to a channel, and assume reception if the number of dispatches equals the number of received notifications, or simply add 1 to the channels each time, or maintain a channel free list.

hth
Niels

Sorin Otescu wrote:
Thanks. That makes sense, although the code is a little hard to follow.
Now, a second question: how do you know for which message you have received the notification (assuming multiple messages are sent in sequence, possibly from different threads) ?

Sorin

On 11/10/2009 11:30 PM, Niels Roest wrote:
I'll try to explain..
A "dispatch" will dispatch a certain message to all receivers. This is what the fusionee_send_message below is doing.

You have the option to receive a single message when all these messages have been processed. If you use this option, "dispatch" will be unequal 0, and dispatch->count will contain the number of non-handled messages. If this is 0, the single message will obviously be send off right away: this is the fusion_call_execute you see below. Otherwise, dispatch_callback is called for each completed message, and when dispatch->count is 0 the final single message is send from this callback.

hth
Niels

Sorin Otescu wrote:
Hi,

I'm having trouble understanding when a dispatch callback is called. It should be called after all fusionees have received the message, but this code in reactor.c:

if (dispatch) {
dispatch->count++;

ret =
fusionee_send_message(dev, fusionee,
node->fusion_id, FMT_REACTOR,
reactor->entry.id, channel,
msg_size, msg_data,
dispatch_callback, dispatch,
reactor->entry.id);
} else
ret =
fusionee_send_message(dev, fusionee,
node->fusion_id, FMT_REACTOR,
reactor->entry.id, channel,
msg_size, msg_data, NULL,
NULL, 0);

which is called for every eligible fusionee, and this code:

if (dispatch && !dispatch->count) {
FusionCallExecute execute;

execute.call_id = dispatch->call_id;
execute.call_arg = dispatch->call_arg;
execute.call_ptr = dispatch->call_ptr;

fusion_call_execute(dev, NULL, &execute);

kfree(dispatch);
}

which should theoretically call the dispatch callback. The problem is that the callback is executed only when dispatch->count is 0 (no fusionees exist) ! My understanding is that it should be the other way around. Am I missing something?

Sorin
_______________________________________________
directfb-dev mailing list
directfb-dev@directfb.org
http://mail.directfb.org/cgi-bin/mailman/listinfo/directfb-dev




_______________________________________________
directfb-dev mailing list
directfb-dev@directfb.org
http://mail.directfb.org/cgi-bin/mailman/listinfo/directfb-dev



--

.------------------------------------------.
| DirectFB - Hardware accelerated graphics |
| http://www.directfb.org/                 |
"------------------------------------------"
_______________________________________________
directfb-dev mailing list
directfb-dev@directfb.org
http://mail.directfb.org/cgi-bin/mailman/listinfo/directfb-dev

Reply via email to