> > +static void add_group(sched_group_t *sched_group, int thr, int group)
> > +{
> > +   int num;
> > +   uint32_t gen_cnt;
> > +   thr_group_t *thr_group = &sched_group->s.thr[thr];
> > +
> > +   num = thr_group->num_group;
> > +   thr_group->group[num] = group;
> > +   thr_group->num_group  = num + 1;
> > +   gen_cnt = odp_atomic_load_u32(&thr_group->gen_cnt);
> > +   odp_atomic_store_u32(&thr_group->gen_cnt, gen_cnt + 1);
> 
> 
> odp_atomic_inc_u32()

Atomic, in-memory increment would be waste here since this operation is done 
while holding a lock. The variable is atomic since it's checked with load_acq 
in sched_cmd() (when not holding a lock).


> 
> 
> > +}
> > +
> > +static void remove_group(sched_group_t *sched_group, int thr, int
> group)
> > +{
> > +   int i, num;
> > +   int found = 0;
> > +   thr_group_t *thr_group = &sched_group->s.thr[thr];
> > +
> > +   num = thr_group->num_group;
> > +
> > +   for (i = 0; i < num; i++) {
> > +           if (thr_group->group[i] == group) {
> > +                   found = 1;
> > +
> > +                   for (; i < num - 1; i++)
> > +                           thr_group->group[i] = thr_group->group[i + 1];
> > +
> > +                   break;
> > +           }
> > +   }
> > +
> > +   if (found) {
> > +           uint32_t gen_cnt;
> > +
> > +           thr_group->num_group = num - 1;
> > +           gen_cnt = odp_atomic_load_u32(&thr_group->gen_cnt);
> > +           odp_atomic_store_u32(&thr_group->gen_cnt, gen_cnt + 1);
> 
> odp_atomic_inc_u32()
> 
> and you can remove if found by placing inc and break above. That should
> fit in 80 characters.


Same thing here. Load + store is more performant than an unnecessary atomic, 
in-memory inc.

-Petri


Reply via email to