[Nice] API thoughts

Dafydd Harries dafydd.harries at collabora.co.uk
Tue Apr 22 11:12:50 PDT 2008


Ar 22/04/2008 am 14:06, ysgrifennodd Olivier Crête:
> On Tue, 2008-04-22 at 18:48 +0100, Dafydd Harries wrote:
> > Ar 17/04/2008 am 09:30, ysgrifennodd Olivier Crête:
> > > 
> > > On Thu, 2008-04-17 at 09:53 +0300, Kai.Vehmanen at nokia.com wrote:
> > > > Hi,
> > > > 
> > > > On 15 April 2008,  Dafydd Harries wrote:
> > > > >> Could we somehow support both models? Or is there a way to run a set 
> > > > >> of GMainContexts in a single GMainloop (without writing a custom 
> > > > >
> > > > >Oh, perhaps I wasn't clear. I absolutely want to have a good 
> > > > >API for single-threaded applications too.
> > > > 
> > > > aa, ok, then we are on the same page! :)
> > > > 
> > > > >> Hmm, yes, this should be doable. Although the locking has to be done 
> > > > >> very carefully (inbound STUN messages affect agent-wide state 
> > > > >> in many ways, see conncheck.c:conn_check_handle_inbound_stun()).
> > > > >
> > > > >Well, I was thinking that the initial approach could just be 
> > > > >to make any handling of inbound STUN packets mutually 
> > > > >exclusive. We can make the locking finer later, or perhaps 
> > > > >look at using some kind of lock-free update algorithm.
> > > > 
> > > > Yes, but you also need to lock the state in all public API 
> > > > functions (e.g. in case remote peer restarts the ICE
> > > > negotiation), plus in the timer callbacks (which are running
> > > > in the "shared context"). But agreed, still very much doable.
> > > 
> > > Youness already did a branch to do that, its on the monkey.
> > 
> > Some comments:
> 
> > Or even:
> > 
> >   #define WITH_LOCK(function, t, params, args) \
> >       t nice_agent_##function (params) \
> >       { \
> >           t ret; \
> >           \
> >           g_mutex_lock (agent->mutex); \
> >           ret = function (args); \
> >           g_mutex_unlock (agent->mutex);\
> >           return ret; \
> >       }
> 
> Eurk macro...

Well, my motivation is to reduce bugs by making it impossible to forget an
unlock call.

> > I think the first is probably nicer though.
> > 
> > "Detach" has only one "t". :)
> > 
> > Could you add a NICE_COMPATIBILITY_LAST = NICE_COMPATIBILITY_MSN, and use that
>       * in the compatibility property declaration? This will make it
>         easier to add
>       * other modes later.
>       * 
>       * I don't understand the changes that look like this:
>       * 
> >        res = priv_conn_check_tick_unlocked ((gpointer) agent);
> >    
> >        /* step: schedule timer if not running yet */
> >   -    if (res && agent->conncheck_timer_id == 0) 
> >   -      agent->conncheck_timer_id = 
> >   -»·······g_timeout_add (agent->timer_ta, priv_conn_check_tick, agent);
> >   +    if (res && agent->conncheck_timer_id == 0) {
> >   +      GSource *source = g_timeout_source_new (agent->timer_ta);
> >   +      g_source_set_callback (source, priv_conn_check_tick, agent, NULL);
> >   +      agent->conncheck_timer_id = g_source_attach (source, agent->main_context);
> >   +      g_source_unref (source);
> >   +    }
> > 
> > Could you explain why they're necessary?
> 
> What if you use it with a Qt app or a TCL app, anything used in a gst
> element should not rely on the presence or usefulness of the default
> main context. 

Oh, right, it's just changing the code to create a timeout for the non-default
main context.

Given that this seems to be done in at least three different places, please
factor this code out into a separate function (timeout_add_with_context?)>

> > I'm not sure we should add the main context and the compatibility as
> > parameters to nice_agent_new. In fact, I'm not sure we should have a
> > nice_agent_new at all; it should default to creating a sane socket factory if
> > you didn't give it one, to using ID19 compatibility, and to using NULL for the
> > main context (i.e. the default main context). I.e. you can just call
> > g_object_new (NICE_TYPE_AGENT, NULL) in most cases.
> 
> I think you need the maincontext if to start the timers and stuff.. and
> you probably have to know about the compatibility too to know how to
> start stuff and which candidates to provide?

If you are running a mainloop, you need to know which context to start it
with, so you need to think about it anyway.

I don't understand what you mean by "how to start stuff and which candidates
to provide">

Regardless, I don't think nice_agent_new makes the API any nicer to use, just
bigger.

-- 
Dafydd


More information about the Nice mailing list