I'd just send both commands regardless and only ever look at pendingFlow again 
in the barrier and error handlers.  I think that sidesteps the need to worry 
about synchronization.

At any rate, good luck. :)

-- Murphy

On Sep 12, 2011, at 10:44 PM, Zoltán Lajos Kis wrote:

> I could do that, but it probably gets me into the territory of volatiles - 
> and perhaps locks:
>  
> ...
> pendingFlow = new PendingFlow(mod->header->xid, barrier->xid);
> send_openflow_command(datapath_id, &mod->header, true);
> if (pendingFlow != NULL) {
>     send_openflow_command(datapath_id, barrier, true);
> }
> ...
>  
> Anyway, thanks for the confirmation.
>  
> Regards,
> Zoltan.
>  
> 
> From: Murphy McCauley [mailto:jam...@nau.edu] 
> Sent: Monday, September 12, 2011 8:42 PM
> To: Zoltán Lajos Kis
> Cc: nox-dev@noxrepo.org
> Subject: Re: [nox-dev] Cooperative threading vs. blocking send
> 
> I'd have to look into it to be sure, but I think the scenario you describe 
> may well be possible.
> 
> However... couldn't you just put the creation/registration of the PendingFlow 
> *before* sending either of the commands?
> 
> -- Murphy
> 
> On Sep 12, 2011, at 7:10 AM, Zoltán Lajos Kis wrote:
> 
>> Hi,
>>  
>> In my C++ NOX (Zaku) app I would like to make sure that a flow is installed 
>> on the switch. Having no better solution, I send a barrier request right 
>> after the flow_mod, and then wait for either an error, or a barrier reply.
>> For this I register the flow_mod's and barrier's xids, and then compare 
>> incoming events against those. See the pseudoish code below for an example.
>>  
>> Could someone familiar with the cooperative thread implementation in NOX 
>> tell me, whether it is possible that a blocking send_openflow_command() 
>> result in the current thread actually blocking and yielding to another one?
>> Particularly in this code, can it happen that sending the flow_mod 
>> completes, but then the second call to send blocks, yielding to another 
>> thread. Then on this other thread the incoming error message is received and 
>> dispatched to the handler method? Resulting in the error being discarded as 
>> at that time the PendingFlow was not even registered…
>>  
>> And if so, is there a way to temporarily disable this yielding, or do I 
>> better start making the code more complex?
>>  
>> Thank you,
>> Zoltan.
>>  
>>  
>> ------------------------------
>>  
>>  
>> struct PendingFlow {
>>   uint32_t modXid;
>>   uint32_t barrierXid;
>>   ...
>> }
>>  
>> class Example {
>>  
>>   PendingFlow *pendingFlow;
>>   ...
>>  
>>   void
>>   Example::install_flow(ofp_flow_mod *mod) {
>>      ofp_header *barrier = make_barrier();
>>  
>>     mod->header->xid = generate_xid();
>>     barrier->xid = generate_xid();
>>  
>>     send_openflow_command(pi.datapath_id, &mod->header, true);
>>     send_openflow_command(pi.datapath_id, barrier, true);
>>  
>>     pendingFlow = new PendingFlow(mod->header->xid, barrier->xid);
>>     ...
>>   }
>>  
>>  
>>   Disposition
>>   Example::handleError(const Event &e) {
>>     const Error_event& err = assert_cast<const Error_event&>(e);
>>  
>>     if (pendingFlow != NULL && pendingFlow.modXid == getErrorXid(err)) {
>>       delete pendingFlow; pendingFlow = NULL;
>>       // Process error
>>     }
>>    …
>>     return CONTINUE;
>>   }
>>  
>>   Disposition
>>   Example::handleBarrier(const Event &e) {
>>     const Barrier_reply_event& barrier = assert_cast<const 
>> Barrier_reply_event>(e);
>>  
>>     if (pendingFlow != NULL && pendingFlow.barrierXid == 
>> getBarrierXid(barrier)) {
>>       delete pendingFlow; pendingFlow = NULL;
>>       // Process completion
>>     }
>>     ..
>>     return CONTINUE;
>>   }
>>  
>>   …
>> }
>>  
>> _______________________________________________
>> nox-dev mailing list
>> nox-dev@noxrepo.org
>> http://noxrepo.org/mailman/listinfo/nox-dev
> 

_______________________________________________
nox-dev mailing list
nox-dev@noxrepo.org
http://noxrepo.org/mailman/listinfo/nox-dev

Reply via email to