On Thu, Nov 29, 2018 at 10:07:11PM +0000, Christos Zoulas wrote:
> >The pool is just called three times, so it's not a big deal.
> 
> I don't know, from reading the manual page using the pool_cache_ api seems
> to be the preferred way... Plus I don't think that a language deficiency
> should be visible in many places in the code (these memsets appear
> unnecessary) and if we do them using the pool_cache code we pay the cost
> once (at construction), not every use (however minor that cost is).

But it comes at a cost (the per-CPU cache) - how often is this code run?

Does using compound literals clear the gaps? Example of what I mean
below (incomplete, just for clarification)

Martin


Index: kern_time.c
===================================================================
RCS file: /cvsroot/src/sys/kern/kern_time.c,v
retrieving revision 1.192
diff -u -p -r1.192 kern_time.c
--- kern_time.c 28 Nov 2018 15:10:40 -0000      1.192
+++ kern_time.c 30 Nov 2018 08:03:52 -0000
@@ -593,6 +593,7 @@ timer_create1(timer_t *tid, clockid_t id
        struct ptimers *pts;
        struct ptimer *pt;
        struct proc *p;
+       struct sigevent ev;
 
        p = l->l_proc;
 
@@ -602,20 +603,19 @@ timer_create1(timer_t *tid, clockid_t id
        if ((pts = p->p_timers) == NULL)
                pts = timers_alloc(p);
 
-       pt = pool_get(&ptimer_pool, PR_WAITOK);
-       memset(pt, 0, sizeof(*pt));
        if (evp != NULL) {
                if (((error =
-                   (*fetch_event)(evp, &pt->pt_ev, sizeof(pt->pt_ev))) != 0) ||
-                   ((pt->pt_ev.sigev_notify < SIGEV_NONE) ||
-                       (pt->pt_ev.sigev_notify > SIGEV_SA)) ||
-                       (pt->pt_ev.sigev_notify == SIGEV_SIGNAL &&
-                        (pt->pt_ev.sigev_signo <= 0 ||
-                         pt->pt_ev.sigev_signo >= NSIG))) {
-                       pool_put(&ptimer_pool, pt);
+                   (*fetch_event)(evp, &ev, sizeof(ev))) != 0) ||
+                   ((ev.sigev_notify < SIGEV_NONE) ||
+                       (ev.sigev_notify > SIGEV_SA)) ||
+                       (ev.sigev_notify == SIGEV_SIGNAL &&
+                        (ev.sigev_signo <= 0 ||
+                         ev.sigev_signo >= NSIG))) {
                        return (error ? error : EINVAL);
                }
        }
+       pt = pool_get(&ptimer_pool, PR_WAITOK);
+       *pt = (struct ptimer) { .pt_ev = ev, };
 
        /* Find a free timer slot, skipping those reserved for setitimer(). */
        mutex_spin_enter(&timer_lock);

Reply via email to