Lines Matching refs:type

79 static void do_osd_del(u_int type, struct osd *osd, u_int slot,
96 osd_register(u_int type, osd_destructor_t destructor, osd_method_t *methods)
101 KASSERT(type >= OSD_FIRST && type <= OSD_LAST, ("Invalid type."));
110 sx_xlock(&osdm[type].osd_module_lock);
114 for (i = 0; i < osdm[type].osd_ntslots; i++) {
115 if (osdm[type].osd_destructors[i] == NULL) {
116 OSD_DEBUG("Unused slot found (type=%u, slot=%u).",
117 type, i);
124 if (i == osdm[type].osd_ntslots) {
125 osdm[type].osd_ntslots++;
126 if (osdm[type].osd_nmethods != 0)
127 osdm[type].osd_methods = realloc(osdm[type].osd_methods,
128 sizeof(osd_method_t) * osdm[type].osd_ntslots *
129 osdm[type].osd_nmethods, M_OSD, M_WAITOK);
131 osdm[type].osd_ntslots, M_OSD, M_WAITOK);
132 rm_wlock(&osdm[type].osd_object_lock);
133 bcopy(osdm[type].osd_destructors, newptr,
135 free(osdm[type].osd_destructors, M_OSD);
136 osdm[type].osd_destructors = newptr;
137 rm_wunlock(&osdm[type].osd_object_lock);
138 OSD_DEBUG("New slot allocated (type=%u, slot=%u).",
139 type, i + 1);
142 osdm[type].osd_destructors[i] = destructor;
143 if (osdm[type].osd_nmethods != 0) {
144 for (m = 0; m < osdm[type].osd_nmethods; m++)
145 osdm[type].osd_methods[i * osdm[type].osd_nmethods + m]
148 sx_xunlock(&osdm[type].osd_module_lock);
153 osd_deregister(u_int type, u_int slot)
157 KASSERT(type >= OSD_FIRST && type <= OSD_LAST, ("Invalid type."));
159 KASSERT(osdm[type].osd_destructors[slot - 1] != NULL, ("Unused slot."));
161 sx_xlock(&osdm[type].osd_module_lock);
162 rm_wlock(&osdm[type].osd_object_lock);
166 mtx_lock(&osdm[type].osd_list_lock);
167 LIST_FOREACH_SAFE(osd, &osdm[type].osd_list, osd_next, tosd)
168 do_osd_del(type, osd, slot, 1);
169 mtx_unlock(&osdm[type].osd_list_lock);
173 osdm[type].osd_destructors[slot - 1] = NULL;
174 if (slot == osdm[type].osd_ntslots) {
175 osdm[type].osd_ntslots--;
176 osdm[type].osd_destructors = realloc(osdm[type].osd_destructors,
177 sizeof(osd_destructor_t) * osdm[type].osd_ntslots, M_OSD,
179 if (osdm[type].osd_nmethods != 0)
180 osdm[type].osd_methods = realloc(osdm[type].osd_methods,
181 sizeof(osd_method_t) * osdm[type].osd_ntslots *
182 osdm[type].osd_nmethods, M_OSD, M_NOWAIT | M_ZERO);
187 KASSERT(osdm[type].osd_destructors != NULL &&
188 (osdm[type].osd_nmethods == 0 ||
189 osdm[type].osd_methods != NULL), ("realloc() failed"));
190 OSD_DEBUG("Deregistration of the last slot (type=%u, slot=%u).",
191 type, slot);
193 OSD_DEBUG("Slot deregistration (type=%u, slot=%u).",
194 type, slot);
196 rm_wunlock(&osdm[type].osd_object_lock);
197 sx_xunlock(&osdm[type].osd_module_lock);
201 osd_set(u_int type, struct osd *osd, u_int slot, void *value)
204 return (osd_set_reserved(type, osd, slot, NULL, value));
218 osd_set_reserved(u_int type, struct osd *osd, u_int slot, void **rsv,
223 KASSERT(type >= OSD_FIRST && type <= OSD_LAST, ("Invalid type."));
225 KASSERT(osdm[type].osd_destructors[slot - 1] != NULL, ("Unused slot."));
227 rm_rlock(&osdm[type].osd_object_lock, &tracker);
233 "Not allocating null slot (type=%u, slot=%u).",
234 type, slot);
235 rm_runlock(&osdm[type].osd_object_lock, &tracker);
260 rm_runlock(&osdm[type].osd_object_lock,
270 mtx_lock(&osdm[type].osd_list_lock);
271 LIST_INSERT_HEAD(&osdm[type].osd_list, osd, osd_next);
272 mtx_unlock(&osdm[type].osd_list_lock);
273 OSD_DEBUG("Setting first slot (type=%u).", type);
275 OSD_DEBUG("Growing slots array (type=%u).", type);
280 OSD_DEBUG("Setting slot value (type=%u, slot=%u, value=%p).", type,
283 rm_runlock(&osdm[type].osd_object_lock, &tracker);
296 osd_get(u_int type, struct osd *osd, u_int slot)
301 KASSERT(type >= OSD_FIRST && type <= OSD_LAST, ("Invalid type."));
303 KASSERT(osdm[type].osd_destructors[slot - 1] != NULL, ("Unused slot."));
305 rm_rlock(&osdm[type].osd_object_lock, &tracker);
308 OSD_DEBUG("Slot doesn't exist (type=%u, slot=%u).", type, slot);
311 OSD_DEBUG("Returning slot value (type=%u, slot=%u, value=%p).",
312 type, slot, value);
314 rm_runlock(&osdm[type].osd_object_lock, &tracker);
319 osd_del(u_int type, struct osd *osd, u_int slot)
323 rm_rlock(&osdm[type].osd_object_lock, &tracker);
324 do_osd_del(type, osd, slot, 0);
325 rm_runlock(&osdm[type].osd_object_lock, &tracker);
329 do_osd_del(u_int type, struct osd *osd, u_int slot, int list_locked)
333 KASSERT(type >= OSD_FIRST && type <= OSD_LAST, ("Invalid type."));
335 KASSERT(osdm[type].osd_destructors[slot - 1] != NULL, ("Unused slot."));
337 OSD_DEBUG("Deleting slot (type=%u, slot=%u).", type, slot);
340 OSD_DEBUG("Slot doesn't exist (type=%u, slot=%u).", type, slot);
344 osdm[type].osd_destructors[slot - 1](osd->osd_slots[slot - 1]);
349 OSD_DEBUG("Slot still has a value (type=%u, slot=%u).",
350 type, i + 1);
356 OSD_DEBUG("No more slots left (type=%u).", type);
358 mtx_lock(&osdm[type].osd_list_lock);
361 mtx_unlock(&osdm[type].osd_list_lock);
375 OSD_DEBUG("Reducing slots array to %u (type=%u).",
376 osd->osd_nslots, type);
381 osd_call(u_int type, u_int method, void *obj, void *data)
386 KASSERT(type >= OSD_FIRST && type <= OSD_LAST, ("Invalid type."));
387 KASSERT(method < osdm[type].osd_nmethods, ("Invalid method."));
394 sx_slock(&osdm[type].osd_module_lock);
395 for (i = 0; i < osdm[type].osd_ntslots; i++) {
396 methodfun = osdm[type].osd_methods[i * osdm[type].osd_nmethods +
401 sx_sunlock(&osdm[type].osd_module_lock);
406 osd_exit(u_int type, struct osd *osd)
411 KASSERT(type >= OSD_FIRST && type <= OSD_LAST, ("Invalid type."));
419 rm_rlock(&osdm[type].osd_object_lock, &tracker);
421 if (osdm[type].osd_destructors[i - 1] != NULL)
422 do_osd_del(type, osd, i, 0);
424 OSD_DEBUG("Unused slot (type=%u, slot=%u).", type, i);
426 rm_runlock(&osdm[type].osd_object_lock, &tracker);
427 OSD_DEBUG("Object exit (type=%u).", type);