diff options
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/agentx.c | 10 | ||||
| -rw-r--r-- | lib/command.c | 5 | ||||
| -rw-r--r-- | lib/sigevent.c | 11 | ||||
| -rw-r--r-- | lib/smux.c | 11 | ||||
| -rw-r--r-- | lib/spf_backoff.c | 16 | ||||
| -rw-r--r-- | lib/systemd.c | 4 | ||||
| -rw-r--r-- | lib/thread.c | 126 | ||||
| -rw-r--r-- | lib/thread.h | 117 | ||||
| -rw-r--r-- | lib/vty.c | 28 | ||||
| -rw-r--r-- | lib/wheel.c | 15 | ||||
| -rw-r--r-- | lib/workqueue.c | 5 | ||||
| -rw-r--r-- | lib/zclient.c | 25 |
12 files changed, 198 insertions, 175 deletions
diff --git a/lib/agentx.c b/lib/agentx.c index e1d8b54043..5deb8f1e06 100644 --- a/lib/agentx.c +++ b/lib/agentx.c @@ -85,8 +85,11 @@ agentx_events_update(void) FD_ZERO (&fds); snmp_select_info (&maxfd, &fds, &timeout, &block); - if (!block) - timeout_thr = thread_add_timer_tv (agentx_tm, agentx_timeout, NULL, &timeout); + if (!block) { + timeout_thr = NULL; + thread_add_timer_tv(agentx_tm, agentx_timeout, NULL, &timeout, + &timeout_thr); + } ln = listhead (events); thr = ln ? listgetdata (ln) : NULL; @@ -114,7 +117,8 @@ agentx_events_update(void) else if (FD_ISSET (fd, &fds)) { struct listnode *newln; - thr = thread_add_read (agentx_tm, agentx_read, NULL, fd); + thr = NULL; + thread_add_read(agentx_tm, agentx_read, NULL, fd, &thr); newln = listnode_add_before (events, ln, thr); thr->arg = newln; } diff --git a/lib/command.c b/lib/command.c index 11c9a0968b..03092ed184 100644 --- a/lib/command.c +++ b/lib/command.c @@ -1623,8 +1623,11 @@ permute (struct graph_node *start, struct vty *vty) bool skip = false; if (stok->type == FORK_TKN && tok->type != FORK_TKN) for (ALL_LIST_ELEMENTS_RO (position, ln, gnn)) - if (gnn == gn && (skip = true)) + if (gnn == gn) + { + skip = true; break; + } if (!skip) permute (gn, vty); } diff --git a/lib/sigevent.c b/lib/sigevent.c index b2059a17bf..a34fd4946e 100644 --- a/lib/sigevent.c +++ b/lib/sigevent.c @@ -132,8 +132,9 @@ quagga_signal_timer (struct thread *t) int i; sigm = THREAD_ARG (t); - sigm->t = thread_add_timer (sigm->t->master, quagga_signal_timer, &sigmaster, - QUAGGA_SIGNAL_TIMER_INTERVAL); + sigm->t = NULL; + thread_add_timer(sigm->t->master, quagga_signal_timer, &sigmaster, QUAGGA_SIGNAL_TIMER_INTERVAL, + &sigm->t); return quagga_sigevent_process (); } #endif /* SIGEVENT_SCHEDULE_THREAD */ @@ -378,8 +379,8 @@ signal_init (struct thread_master *m, int sigc, sigmaster.signals = signals; #ifdef SIGEVENT_SCHEDULE_THREAD - sigmaster.t = - thread_add_timer (m, quagga_signal_timer, &sigmaster, - QUAGGA_SIGNAL_TIMER_INTERVAL); + sigmaster.t = NULL; + thread_add_timer(m, quagga_signal_timer, &sigmaster, QUAGGA_SIGNAL_TIMER_INTERVAL, + &sigmaster.t); #endif /* SIGEVENT_SCHEDULE_THREAD */ } diff --git a/lib/smux.c b/lib/smux.c index 370b8f138e..6e53061d45 100644 --- a/lib/smux.c +++ b/lib/smux.c @@ -1197,13 +1197,18 @@ smux_event (enum smux_event event, int sock) switch (event) { case SMUX_SCHEDULE: - smux_connect_thread = thread_add_event (smux_master, smux_connect, NULL, 0); + smux_connect_thread = NULL; + thread_add_event(smux_master, smux_connect, NULL, 0, + &smux_connect_thread); break; case SMUX_CONNECT: - smux_connect_thread = thread_add_timer (smux_master, smux_connect, NULL, 10); + smux_connect_thread = NULL; + thread_add_timer(smux_master, smux_connect, NULL, 10, + &smux_connect_thread); break; case SMUX_READ: - smux_read_thread = thread_add_read (smux_master, smux_read, NULL, sock); + smux_read_thread = NULL; + thread_add_read(smux_master, smux_read, NULL, sock, &smux_read_thread); break; default: break; diff --git a/lib/spf_backoff.c b/lib/spf_backoff.c index e923f232b8..9a9af8db20 100644 --- a/lib/spf_backoff.c +++ b/lib/spf_backoff.c @@ -169,21 +169,19 @@ long spf_backoff_schedule(struct spf_backoff *backoff) { case SPF_BACKOFF_QUIET: backoff->state = SPF_BACKOFF_SHORT_WAIT; - THREAD_TIMER_MSEC_ON(backoff->m, backoff->t_timetolearn, - spf_backoff_timetolearn_elapsed, backoff, - backoff->timetolearn); - THREAD_TIMER_MSEC_ON(backoff->m, backoff->t_holddown, - spf_backoff_holddown_elapsed, backoff, - backoff->holddown); + thread_add_timer_msec(backoff->m, spf_backoff_timetolearn_elapsed, + backoff, backoff->timetolearn, + &backoff->t_timetolearn); + thread_add_timer_msec(backoff->m, spf_backoff_holddown_elapsed, backoff, + backoff->holddown, &backoff->t_holddown); backoff->first_event_time = now; rv = backoff->init_delay; break; case SPF_BACKOFF_SHORT_WAIT: case SPF_BACKOFF_LONG_WAIT: THREAD_TIMER_OFF(backoff->t_holddown); - THREAD_TIMER_MSEC_ON(backoff->m, backoff->t_holddown, - spf_backoff_holddown_elapsed, backoff, - backoff->holddown); + thread_add_timer_msec(backoff->m, spf_backoff_holddown_elapsed, backoff, + backoff->holddown, &backoff->t_holddown); if (backoff->state == SPF_BACKOFF_SHORT_WAIT) rv = backoff->short_delay; else diff --git a/lib/systemd.c b/lib/systemd.c index 4c78cf328c..e2329af93a 100644 --- a/lib/systemd.c +++ b/lib/systemd.c @@ -104,7 +104,7 @@ systemd_send_watchdog (struct thread *t) { systemd_send_information ("WATCHDOG=1"); - thread_add_timer (systemd_master, systemd_send_watchdog, NULL, wsecs); + thread_add_timer(systemd_master, systemd_send_watchdog, NULL, wsecs, NULL); return 1; } @@ -119,5 +119,5 @@ systemd_send_started (struct thread_master *m, int the_process) systemd_send_information ("READY=1"); if (wsecs != 0) - thread_add_timer (m, systemd_send_watchdog, m, wsecs); + thread_add_timer(m, systemd_send_watchdog, m, wsecs, NULL); } diff --git a/lib/thread.c b/lib/thread.c index 3fb28bce26..e4dbebe1c4 100644 --- a/lib/thread.c +++ b/lib/thread.c @@ -454,6 +454,7 @@ thread_add_unuse (struct thread_master *m, struct thread *thread) assert (m != NULL && thread != NULL); assert (thread->next == NULL); assert (thread->prev == NULL); + thread->ref = NULL; thread->type = THREAD_UNUSED; thread->hist->total_active--; @@ -725,6 +726,7 @@ fd_select (struct thread_master *m, int size, thread_fd_set *read, thread_fd_set num = poll (m->handler.pfds, m->handler.pfdcount + m->handler.pfdcountsnmp, timeout); #else struct timeval timeout; + if (m->selectpoll_timeout > 0) // use the user's timeout { timeout.tv_sec = m->selectpoll_timeout / 1000; @@ -774,15 +776,21 @@ fd_clear_read_write (struct thread *thread) } /* Add new read thread. */ -struct thread * +void funcname_thread_add_read_write (int dir, struct thread_master *m, - int (*func) (struct thread *), void *arg, int fd, - debugargdef) + int (*func) (struct thread *), void *arg, int fd, struct thread **t_ptr, + debugargdef) { struct thread *thread = NULL; pthread_mutex_lock (&m->mtx); { + if (t_ptr && *t_ptr) // thread is already scheduled; don't reschedule + { + pthread_mutex_unlock (&m->mtx); + return; + } + #if defined (HAVE_POLL_CALL) thread = generic_thread_add(m, func, arg, fd, dir, debugargpass); #else @@ -822,19 +830,20 @@ funcname_thread_add_read_write (int dir, struct thread_master *m, } pthread_mutex_unlock (&thread->mtx); } + + if (t_ptr) + { + *t_ptr = thread; + thread->ref = t_ptr; + } } pthread_mutex_unlock (&m->mtx); - - return thread; } -static struct thread * +static void funcname_thread_add_timer_timeval (struct thread_master *m, - int (*func) (struct thread *), - int type, - void *arg, - struct timeval *time_relative, - debugargdef) + int (*func) (struct thread *), int type, void *arg, + struct timeval *time_relative, struct thread **t_ptr, debugargdef) { struct thread *thread; struct pqueue *queue; @@ -846,6 +855,12 @@ funcname_thread_add_timer_timeval (struct thread_master *m, pthread_mutex_lock (&m->mtx); { + if (t_ptr && *t_ptr) // thread is already scheduled; don't reschedule + { + pthread_mutex_unlock (&m->mtx); + return; + } + queue = ((type == THREAD_TIMER) ? m->timer : m->background); thread = thread_get (m, type, func, arg, debugargpass); @@ -856,19 +871,22 @@ funcname_thread_add_timer_timeval (struct thread_master *m, pqueue_enqueue(thread, queue); } pthread_mutex_unlock (&thread->mtx); + + if (t_ptr) + { + *t_ptr = thread; + thread->ref = t_ptr; + } } pthread_mutex_unlock (&m->mtx); - - return thread; } /* Add timer event thread. */ -struct thread * +void funcname_thread_add_timer (struct thread_master *m, - int (*func) (struct thread *), - void *arg, long timer, - debugargdef) + int (*func) (struct thread *), void *arg, long timer, + struct thread **t_ptr, debugargdef) { struct timeval trel; @@ -877,16 +895,15 @@ funcname_thread_add_timer (struct thread_master *m, trel.tv_sec = timer; trel.tv_usec = 0; - return funcname_thread_add_timer_timeval (m, func, THREAD_TIMER, arg, - &trel, debugargpass); + return funcname_thread_add_timer_timeval (m, func, THREAD_TIMER, arg, &trel, + t_ptr, debugargpass); } /* Add timer event thread with "millisecond" resolution */ -struct thread * +void funcname_thread_add_timer_msec (struct thread_master *m, - int (*func) (struct thread *), - void *arg, long timer, - debugargdef) + int (*func) (struct thread *), void *arg, long timer, + struct thread **t_ptr, debugargdef) { struct timeval trel; @@ -895,27 +912,25 @@ funcname_thread_add_timer_msec (struct thread_master *m, trel.tv_sec = timer / 1000; trel.tv_usec = 1000*(timer % 1000); - return funcname_thread_add_timer_timeval (m, func, THREAD_TIMER, - arg, &trel, debugargpass); + funcname_thread_add_timer_timeval (m, func, THREAD_TIMER, arg, &trel, + t_ptr, debugargpass); } /* Add timer event thread with "millisecond" resolution */ -struct thread * +void funcname_thread_add_timer_tv (struct thread_master *m, - int (*func) (struct thread *), - void *arg, struct timeval *tv, - debugargdef) + int (*func) (struct thread *), void *arg, struct timeval *tv, + struct thread **t_ptr, debugargdef) { - return funcname_thread_add_timer_timeval (m, func, THREAD_TIMER, - arg, tv, debugargpass); + funcname_thread_add_timer_timeval (m, func, THREAD_TIMER, arg, tv, t_ptr, + debugargpass); } /* Add a background thread, with an optional millisec delay */ -struct thread * +void funcname_thread_add_background (struct thread_master *m, - int (*func) (struct thread *), - void *arg, long delay, - debugargdef) + int (*func) (struct thread *), void *arg, long delay, + struct thread **t_ptr, debugargdef) { struct timeval trel; @@ -932,15 +947,15 @@ funcname_thread_add_background (struct thread_master *m, trel.tv_usec = 0; } - return funcname_thread_add_timer_timeval (m, func, THREAD_BACKGROUND, - arg, &trel, debugargpass); + funcname_thread_add_timer_timeval (m, func, THREAD_BACKGROUND, arg, &trel, + t_ptr, debugargpass); } /* Add simple event thread. */ -struct thread * +void funcname_thread_add_event (struct thread_master *m, - int (*func) (struct thread *), void *arg, int val, - debugargdef) + int (*func) (struct thread *), void *arg, int val, + struct thread **t_ptr, debugargdef) { struct thread *thread; @@ -948,6 +963,12 @@ funcname_thread_add_event (struct thread_master *m, pthread_mutex_lock (&m->mtx); { + if (t_ptr && *t_ptr) // thread is already scheduled; don't reschedule + { + pthread_mutex_unlock (&m->mtx); + return; + } + thread = thread_get (m, THREAD_EVENT, func, arg, debugargpass); pthread_mutex_lock (&thread->mtx); { @@ -955,10 +976,14 @@ funcname_thread_add_event (struct thread_master *m, thread_list_add (&m->event, thread); } pthread_mutex_unlock (&thread->mtx); + + if (t_ptr) + { + *t_ptr = thread; + thread->ref = t_ptr; + } } pthread_mutex_unlock (&m->mtx); - - return thread; } static void @@ -1056,6 +1081,9 @@ thread_cancel (struct thread *thread) assert(!"Thread should be either in queue or list or array!"); } + if (thread->ref) + *thread->ref = NULL; + thread_add_unuse (thread->master, thread); done: @@ -1085,6 +1113,8 @@ thread_cancel_event (struct thread_master *m, void *arg) { ret++; thread_list_delete (&m->event, t); + if (t->ref) + *t->ref = NULL; thread_add_unuse (m, t); } } @@ -1104,6 +1134,8 @@ thread_cancel_event (struct thread_master *m, void *arg) { ret++; thread_list_delete (&m->ready, t); + if (t->ref) + *t->ref = NULL; thread_add_unuse (m, t); } } @@ -1285,6 +1317,8 @@ thread_fetch (struct thread_master *m, struct thread *fetch) if ((thread = thread_trim_head (&m->ready)) != NULL) { fetch = thread_run (m, thread, fetch); + if (fetch->ref) + *fetch->ref = NULL; pthread_mutex_unlock (&m->mtx); return fetch; } @@ -1354,6 +1388,8 @@ thread_fetch (struct thread_master *m, struct thread *fetch) if ((thread = thread_trim_head (&m->ready)) != NULL) { fetch = thread_run (m, thread, fetch); + if (fetch->ref) + *fetch->ref = NULL; pthread_mutex_unlock (&m->mtx); return fetch; } @@ -1365,6 +1401,8 @@ thread_fetch (struct thread_master *m, struct thread *fetch) if ((thread = thread_trim_head (&m->ready)) != NULL) { fetch = thread_run (m, thread, fetch); + if (fetch->ref) + *fetch->ref = NULL; pthread_mutex_unlock (&m->mtx); return fetch; } @@ -1472,7 +1510,7 @@ thread_call (struct thread *thread) } /* Execute thread */ -struct thread * +void funcname_thread_execute (struct thread_master *m, int (*func)(struct thread *), void *arg, @@ -1504,6 +1542,4 @@ funcname_thread_execute (struct thread_master *m, dummy.schedfrom_line = fromln; thread_call (&dummy); - - return NULL; } diff --git a/lib/thread.h b/lib/thread.h index 6fb6ad7c9d..3eaae8883b 100644 --- a/lib/thread.h +++ b/lib/thread.h @@ -96,26 +96,27 @@ typedef unsigned char thread_type; /* Thread itself. */ struct thread { - thread_type type; /* thread type */ - thread_type add_type; /* thread type */ - struct thread *next; /* next pointer of the thread */ - struct thread *prev; /* previous pointer of the thread */ - struct thread_master *master; /* pointer to the struct thread_master. */ - int (*func) (struct thread *); /* event function */ - void *arg; /* event argument */ + thread_type type; /* thread type */ + thread_type add_type; /* thread type */ + struct thread *next; /* next pointer of the thread */ + struct thread *prev; /* previous pointer of the thread */ + struct thread **ref; /* external reference (if given) */ + struct thread_master *master; /* pointer to the struct thread_master */ + int (*func) (struct thread *); /* event function */ + void *arg; /* event argument */ union { - int val; /* second argument of the event. */ - int fd; /* file descriptor in case of read/write. */ - struct timeval sands; /* rest of time sands value. */ + int val; /* second argument of the event. */ + int fd; /* file descriptor in case of r/w */ + struct timeval sands; /* rest of time sands value. */ } u; - int index; /* used for timers to store position in queue */ + int index; /* queue position for timers */ struct timeval real; - struct cpu_thread_history *hist; /* cache pointer to cpu_history */ - unsigned long yield; /* yield time in us */ - const char *funcname; - const char *schedfrom; - int schedfrom_line; - pthread_mutex_t mtx; + struct cpu_thread_history *hist; /* cache pointer to cpu_history */ + unsigned long yield; /* yield time in microseconds */ + const char *funcname; /* name of thread function */ + const char *schedfrom; /* source file thread was scheduled from */ + int schedfrom_line; /* line number of source file */ + pthread_mutex_t mtx; /* mutex for thread.c functions */ }; struct cpu_thread_history @@ -153,30 +154,6 @@ struct cpu_thread_history #define THREAD_FD(X) ((X)->u.fd) #define THREAD_VAL(X) ((X)->u.val) -#define THREAD_READ_ON(master,thread,func,arg,sock) \ - do { \ - if (! thread) \ - thread = thread_add_read (master, func, arg, sock); \ - } while (0) - -#define THREAD_WRITE_ON(master,thread,func,arg,sock) \ - do { \ - if (! thread) \ - thread = thread_add_write (master, func, arg, sock); \ - } while (0) - -#define THREAD_TIMER_ON(master,thread,func,arg,time) \ - do { \ - if (! thread) \ - thread = thread_add_timer (master, func, arg, time); \ - } while (0) - -#define THREAD_TIMER_MSEC_ON(master,thread,func,arg,time) \ - do { \ - if (! thread) \ - thread = thread_add_timer_msec (master, func, arg, time); \ - } while (0) - #define THREAD_OFF(thread) \ do { \ if (thread) \ @@ -192,46 +169,42 @@ struct cpu_thread_history #define debugargdef const char *funcname, const char *schedfrom, int fromln -#define thread_add_read(m,f,a,v) funcname_thread_add_read_write(THREAD_READ,m,f,a,v,#f,__FILE__,__LINE__) -#define thread_add_write(m,f,a,v) funcname_thread_add_read_write(THREAD_WRITE,m,f,a,v,#f,__FILE__,__LINE__) -#define thread_add_timer(m,f,a,v) funcname_thread_add_timer(m,f,a,v,#f,__FILE__,__LINE__) -#define thread_add_timer_msec(m,f,a,v) funcname_thread_add_timer_msec(m,f,a,v,#f,__FILE__,__LINE__) -#define thread_add_timer_tv(m,f,a,v) funcname_thread_add_timer_tv(m,f,a,v,#f,__FILE__,__LINE__) -#define thread_add_event(m,f,a,v) funcname_thread_add_event(m,f,a,v,#f,__FILE__,__LINE__) +#define thread_add_read(m,f,a,v,t) funcname_thread_add_read_write(THREAD_READ,m,f,a,v,t,#f,__FILE__,__LINE__) +#define thread_add_write(m,f,a,v,t) funcname_thread_add_read_write(THREAD_WRITE,m,f,a,v,t,#f,__FILE__,__LINE__) +#define thread_add_timer(m,f,a,v,t) funcname_thread_add_timer(m,f,a,v,t,#f,__FILE__,__LINE__) +#define thread_add_timer_msec(m,f,a,v,t) funcname_thread_add_timer_msec(m,f,a,v,t,#f,__FILE__,__LINE__) +#define thread_add_timer_tv(m,f,a,v,t) funcname_thread_add_timer_tv(m,f,a,v,t,#f,__FILE__,__LINE__) +#define thread_add_event(m,f,a,v,t) funcname_thread_add_event(m,f,a,v,t,#f,__FILE__,__LINE__) #define thread_execute(m,f,a,v) funcname_thread_execute(m,f,a,v,#f,__FILE__,__LINE__) /* The 4th arg to thread_add_background is the # of milliseconds to delay. */ -#define thread_add_background(m,f,a,v) funcname_thread_add_background(m,f,a,v,#f,__FILE__,__LINE__) +#define thread_add_background(m,f,a,v,t) funcname_thread_add_background(m,f,a,v,t,#f,__FILE__,__LINE__) /* Prototypes. */ extern struct thread_master *thread_master_create (void); extern void thread_master_free (struct thread_master *); extern void thread_master_free_unused(struct thread_master *); -extern struct thread *funcname_thread_add_read_write (int dir, struct thread_master *, - int (*)(struct thread *), - void *, int, debugargdef); -extern struct thread *funcname_thread_add_timer (struct thread_master *, - int (*)(struct thread *), - void *, long, debugargdef); -extern struct thread *funcname_thread_add_timer_msec (struct thread_master *, - int (*)(struct thread *), - void *, long, debugargdef); -extern struct thread *funcname_thread_add_timer_tv (struct thread_master *, - int (*)(struct thread *), - void *, struct timeval *, - debugargdef); -extern struct thread *funcname_thread_add_event (struct thread_master *, - int (*)(struct thread *), - void *, int, debugargdef); -extern struct thread *funcname_thread_add_background (struct thread_master *, - int (*func)(struct thread *), - void *arg, - long milliseconds_to_delay, - debugargdef); -extern struct thread *funcname_thread_execute (struct thread_master *, - int (*)(struct thread *), - void *, int, debugargdef); +extern void funcname_thread_add_read_write (int dir, struct thread_master *, + int (*)(struct thread *), void *, int, struct thread **, debugargdef); + +extern void funcname_thread_add_timer (struct thread_master *, + int (*)(struct thread *), void *, long, struct thread **, debugargdef); + +extern void funcname_thread_add_timer_msec (struct thread_master *, + int (*)(struct thread *), void *, long, struct thread **, debugargdef); + +extern void funcname_thread_add_timer_tv (struct thread_master *, + int (*)(struct thread *), void *, struct timeval *, struct thread **, debugargdef); + +extern void funcname_thread_add_event (struct thread_master *, + int (*)(struct thread *), void *, int, struct thread **, debugargdef); + +extern void funcname_thread_add_background (struct thread_master *, + int (*)(struct thread *), void *, long, struct thread **, debugargdef); + +extern void funcname_thread_execute (struct thread_master *, + int (*)(struct thread *), void *, int, debugargdef); #undef debugargdef extern void thread_cancel (struct thread *); @@ -2618,36 +2618,41 @@ vty_event (enum event event, int sock, struct vty *vty) switch (event) { case VTY_SERV: - vty_serv_thread = thread_add_read (vty_master, vty_accept, vty, sock); + vty_serv_thread = NULL; + thread_add_read(vty_master, vty_accept, vty, sock, &vty_serv_thread); vector_set_index (Vvty_serv_thread, sock, vty_serv_thread); break; #ifdef VTYSH case VTYSH_SERV: - vty_serv_thread = thread_add_read (vty_master, vtysh_accept, vty, sock); + vty_serv_thread = NULL; + thread_add_read(vty_master, vtysh_accept, vty, sock, &vty_serv_thread); vector_set_index (Vvty_serv_thread, sock, vty_serv_thread); break; case VTYSH_READ: - vty->t_read = thread_add_read (vty_master, vtysh_read, vty, sock); + vty->t_read = NULL; + thread_add_read(vty_master, vtysh_read, vty, sock, &vty->t_read); break; case VTYSH_WRITE: - vty->t_write = thread_add_write (vty_master, vtysh_write, vty, sock); + vty->t_write = NULL; + thread_add_write(vty_master, vtysh_write, vty, sock, &vty->t_write); break; #endif /* VTYSH */ case VTY_READ: - vty->t_read = thread_add_read (vty_master, vty_read, vty, sock); + vty->t_read = NULL; + thread_add_read(vty_master, vty_read, vty, sock, &vty->t_read); /* Time out treatment. */ if (vty->v_timeout) { if (vty->t_timeout) thread_cancel (vty->t_timeout); - vty->t_timeout = - thread_add_timer (vty_master, vty_timeout, vty, vty->v_timeout); + vty->t_timeout = NULL; + thread_add_timer(vty_master, vty_timeout, vty, vty->v_timeout, + &vty->t_timeout); } break; case VTY_WRITE: - if (! vty->t_write) - vty->t_write = thread_add_write (vty_master, vty_flush, vty, sock); + thread_add_write(vty_master, vty_flush, vty, sock, &vty->t_write); break; case VTY_TIMEOUT_RESET: if (vty->t_timeout) @@ -2657,8 +2662,9 @@ vty_event (enum event event, int sock, struct vty *vty) } if (vty->v_timeout) { - vty->t_timeout = - thread_add_timer (vty_master, vty_timeout, vty, vty->v_timeout); + vty->t_timeout = NULL; + thread_add_timer(vty_master, vty_timeout, vty, vty->v_timeout, + &vty->t_timeout); } break; } diff --git a/lib/wheel.c b/lib/wheel.c index fe53dea299..9bcb1b8743 100644 --- a/lib/wheel.c +++ b/lib/wheel.c @@ -60,9 +60,8 @@ wheel_timer_thread (struct thread *t) slots_to_skip++; wheel->slots_to_skip = slots_to_skip; - THREAD_TIMER_MSEC_ON (wheel->master, wheel->timer, - wheel_timer_thread, wheel, - wheel->nexttime * slots_to_skip); + thread_add_timer_msec(wheel->master, wheel_timer_thread, wheel, + wheel->nexttime * slots_to_skip, &wheel->timer); return 0; } @@ -91,9 +90,8 @@ wheel_init (struct thread_master *master, int period, size_t slots, for (i = 0; i < slots; i++) wheel->wheel_slot_lists[i] = list_new (); - THREAD_TIMER_MSEC_ON (wheel->master, wheel->timer, - wheel_timer_thread, wheel, - wheel->nexttime); + thread_add_timer_msec(wheel->master, wheel_timer_thread, wheel, + wheel->nexttime, &wheel->timer); return wheel; } @@ -124,9 +122,8 @@ int wheel_start (struct timer_wheel *wheel) { if (!wheel->timer) - THREAD_TIMER_MSEC_ON (wheel->master, wheel->timer, - wheel_timer_thread, wheel, - wheel->nexttime); + thread_add_timer_msec(wheel->master, wheel_timer_thread, wheel, + wheel->nexttime, &wheel->timer); return 0; } diff --git a/lib/workqueue.c b/lib/workqueue.c index 51017b34ea..e997e61b32 100644 --- a/lib/workqueue.c +++ b/lib/workqueue.c @@ -126,8 +126,9 @@ work_queue_schedule (struct work_queue *wq, unsigned int delay) && (wq->thread == NULL) && (listcount (wq->items) > 0) ) { - wq->thread = thread_add_background (wq->master, work_queue_run, - wq, delay); + wq->thread = NULL; + thread_add_background(wq->master, work_queue_run, wq, delay, + &wq->thread); /* set thread yield time, if needed */ if (wq->thread && wq->spec.yield != THREAD_YIELD_TIME_SLOT) thread_set_yield_time (wq->thread, wq->spec.yield); diff --git a/lib/zclient.c b/lib/zclient.c index e3eadf22a4..1d3c93d85d 100644 --- a/lib/zclient.c +++ b/lib/zclient.c @@ -310,8 +310,9 @@ zclient_flush_data(struct thread *thread) return zclient_failed(zclient); break; case BUFFER_PENDING: - zclient->t_write = thread_add_write(zclient->master, zclient_flush_data, - zclient, zclient->sock); + zclient->t_write = NULL; + thread_add_write(zclient->master, zclient_flush_data, zclient, zclient->sock, + &zclient->t_write); break; case BUFFER_EMPTY: break; @@ -336,8 +337,8 @@ zclient_send_message(struct zclient *zclient) THREAD_OFF(zclient->t_write); break; case BUFFER_PENDING: - THREAD_WRITE_ON(zclient->master, zclient->t_write, - zclient_flush_data, zclient, zclient->sock); + thread_add_write(zclient->master, zclient_flush_data, zclient, + zclient->sock, &zclient->t_write); break; } return 0; @@ -2012,22 +2013,20 @@ zclient_event (enum event event, struct zclient *zclient) switch (event) { case ZCLIENT_SCHEDULE: - if (! zclient->t_connect) - zclient->t_connect = - thread_add_event (zclient->master, zclient_connect, zclient, 0); + thread_add_event(zclient->master, zclient_connect, zclient, 0, + &zclient->t_connect); break; case ZCLIENT_CONNECT: if (zclient_debug) zlog_debug ("zclient connect failures: %d schedule interval is now %d", zclient->fail, zclient->fail < 3 ? 10 : 60); - if (! zclient->t_connect) - zclient->t_connect = - thread_add_timer (zclient->master, zclient_connect, zclient, - zclient->fail < 3 ? 10 : 60); + thread_add_timer(zclient->master, zclient_connect, zclient, + zclient->fail < 3 ? 10 : 60, &zclient->t_connect); break; case ZCLIENT_READ: - zclient->t_read = - thread_add_read (zclient->master, zclient_read, zclient, zclient->sock); + zclient->t_read = NULL; + thread_add_read(zclient->master, zclient_read, zclient, zclient->sock, + &zclient->t_read); break; } } |
