Lines Matching refs:list

11  *    notice, this list of conditions and the following disclaimer.
13 * notice, this list of conditions and the following disclaimer in the
55 * Initialize the eventhandler mutex and list.
70 struct eventhandler_list *list, *new_list;
72 /* look for a matching, existing list */
73 list = _eventhandler_find_list(name);
75 /* Do we need to create the list? */
76 if (list == NULL) {
84 list = _eventhandler_find_list(name);
85 if (list != NULL) {
88 CTR2(KTR_EVH, "%s: creating list \"%s\"", __func__, name);
89 list = new_list;
90 TAILQ_INIT(&list->el_entries);
91 list->el_name = (char *)(list + 1);
92 strcpy(list->el_name, name);
93 mtx_init(&list->el_lock, list->el_name, "eventhandler list",
95 TAILQ_INSERT_HEAD(&eventhandler_lists, list, el_link);
98 return (list);
106 eventhandler_register_internal(struct eventhandler_list *list,
114 /* Do we need to find/create the list? */
115 if (list == NULL) {
117 list = eventhandler_find_or_create_list(name);
124 /* sort it into the list */
127 EHL_LOCK(list);
128 TAILQ_FOREACH(ep, &list->el_entries, ee_link) {
136 TAILQ_INSERT_TAIL(&list->el_entries, epn, ee_link);
137 EHL_UNLOCK(list);
142 eventhandler_register(struct eventhandler_list *list, const char *name,
154 return (eventhandler_register_internal(list, name, &eg->ee));
166 vimage_eventhandler_register(struct eventhandler_list *list, const char *name,
180 return (eventhandler_register_internal(list, name, &eg->ee));
185 _eventhandler_deregister(struct eventhandler_list *list, eventhandler_tag tag,
190 EHL_LOCK_ASSERT(list, MA_OWNED);
193 if (list->el_runcount == 0) {
195 list->el_name);
196 TAILQ_REMOVE(&list->el_entries, ep, ee_link);
200 ep, list->el_name);
204 /* remove entire list */
205 if (list->el_runcount == 0) {
207 list->el_name);
208 while (!TAILQ_EMPTY(&list->el_entries)) {
209 ep = TAILQ_FIRST(&list->el_entries);
210 TAILQ_REMOVE(&list->el_entries, ep, ee_link);
215 __func__, list->el_name);
216 TAILQ_FOREACH(ep, &list->el_entries, ee_link)
220 while (wait && list->el_runcount > 0)
221 mtx_sleep(list, &list->el_lock, 0, "evhrm", 0);
222 EHL_UNLOCK(list);
226 eventhandler_deregister(struct eventhandler_list *list, eventhandler_tag tag)
229 _eventhandler_deregister(list, tag, true);
233 eventhandler_deregister_nowait(struct eventhandler_list *list,
237 _eventhandler_deregister(list, tag, false);
241 * Internal version for use when eventhandler list is already locked.
246 struct eventhandler_list *list;
249 TAILQ_FOREACH(list, &eventhandler_lists, el_link) {
250 if (!strcmp(name, list->el_name))
253 return (list);
257 * Lookup a "slow" list by name. Returns with the list locked.
262 struct eventhandler_list *list;
267 /* scan looking for the requested list */
269 list = _eventhandler_find_list(name);
270 if (list != NULL)
271 EHL_LOCK(list);
274 return(list);
278 * Prune "dead" entries from an eventhandler list.
281 eventhandler_prune_list(struct eventhandler_list *list)
286 CTR2(KTR_EVH, "%s: pruning list \"%s\"", __func__, list->el_name);
287 EHL_LOCK_ASSERT(list, MA_OWNED);
288 TAILQ_FOREACH_SAFE(ep, &list->el_entries, ee_link, en) {
290 TAILQ_REMOVE(&list->el_entries, ep, ee_link);
296 wakeup(list);
300 * Create (or get the existing) list so the pointer can be stored by
306 struct eventhandler_list *list;
309 ("eventhandler list created too early"));
312 list = eventhandler_find_or_create_list(name);
315 return (list);