1 1.21 oster /* $NetBSD: rf_shutdown.c,v 1.21 2021/07/21 23:10:12 oster Exp $ */ 2 1.1 oster /* 3 1.1 oster * rf_shutdown.c 4 1.1 oster */ 5 1.1 oster /* 6 1.1 oster * Copyright (c) 1996 Carnegie-Mellon University. 7 1.1 oster * All rights reserved. 8 1.1 oster * 9 1.1 oster * Author: Jim Zelenka 10 1.1 oster * 11 1.1 oster * Permission to use, copy, modify and distribute this software and 12 1.1 oster * its documentation is hereby granted, provided that both the copyright 13 1.1 oster * notice and this permission notice appear in all copies of the 14 1.1 oster * software, derivative works or modified versions, and any portions 15 1.1 oster * thereof, and that both notices appear in supporting documentation. 16 1.1 oster * 17 1.1 oster * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" 18 1.1 oster * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND 19 1.1 oster * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. 20 1.1 oster * 21 1.1 oster * Carnegie Mellon requests users of this software to return to 22 1.1 oster * 23 1.1 oster * Software Distribution Coordinator or Software.Distribution (at) CS.CMU.EDU 24 1.1 oster * School of Computer Science 25 1.1 oster * Carnegie Mellon University 26 1.1 oster * Pittsburgh PA 15213-3890 27 1.1 oster * 28 1.1 oster * any improvements or extensions that they make and grant Carnegie the 29 1.1 oster * rights to redistribute these changes. 30 1.1 oster */ 31 1.1 oster /* 32 1.1 oster * Maintain lists of cleanup functions. Also, mechanisms for coordinating 33 1.1 oster * thread startup and shutdown. 34 1.1 oster */ 35 1.9 lukem 36 1.9 lukem #include <sys/cdefs.h> 37 1.21 oster __KERNEL_RCSID(0, "$NetBSD: rf_shutdown.c,v 1.21 2021/07/21 23:10:12 oster Exp $"); 38 1.1 oster 39 1.8 oster #include <dev/raidframe/raidframevar.h> 40 1.8 oster 41 1.7 oster #include "rf_archs.h" 42 1.1 oster #include "rf_shutdown.h" 43 1.14 oster #include "rf_debugMem.h" 44 1.1 oster 45 1.12 oster 46 1.12 oster #ifndef RF_DEBUG_SHUTDOWN 47 1.12 oster #define RF_DEBUG_SHUTDOWN 0 48 1.12 oster #endif 49 1.12 oster 50 1.13 oster static void rf_FreeShutdownEnt(RF_ShutdownList_t *); 51 1.13 oster 52 1.18 perry static void 53 1.15 oster rf_FreeShutdownEnt(RF_ShutdownList_t *ent) 54 1.1 oster { 55 1.20 cegger free(ent, M_RAIDFRAME); 56 1.1 oster } 57 1.1 oster 58 1.17 oster #if RF_DEBUG_SHUTDOWN 59 1.16 oster void 60 1.15 oster _rf_ShutdownCreate(RF_ShutdownList_t **listp, void (*cleanup)(void *arg), 61 1.15 oster void *arg, char *file, int line) 62 1.17 oster #else 63 1.17 oster void 64 1.17 oster _rf_ShutdownCreate(RF_ShutdownList_t **listp, void (*cleanup)(void *arg), 65 1.17 oster void *arg) 66 1.17 oster #endif 67 1.1 oster { 68 1.4 oster RF_ShutdownList_t *ent; 69 1.1 oster 70 1.4 oster /* 71 1.4 oster * Have to directly allocate memory here, since we start up before 72 1.4 oster * and shutdown after RAIDframe internal allocation system. 73 1.4 oster */ 74 1.18 perry ent = (RF_ShutdownList_t *) malloc(sizeof(RF_ShutdownList_t), 75 1.16 oster M_RAIDFRAME, M_WAITOK); 76 1.4 oster ent->cleanup = cleanup; 77 1.4 oster ent->arg = arg; 78 1.17 oster #if RF_DEBUG_SHUTDOWN 79 1.4 oster ent->file = file; 80 1.4 oster ent->line = line; 81 1.17 oster #endif 82 1.4 oster ent->next = *listp; 83 1.4 oster *listp = ent; 84 1.1 oster } 85 1.1 oster 86 1.17 oster void 87 1.15 oster rf_ShutdownList(RF_ShutdownList_t **list) 88 1.1 oster { 89 1.4 oster RF_ShutdownList_t *r, *next; 90 1.13 oster #if RF_DEBUG_SHUTDOWN 91 1.4 oster char *file; 92 1.4 oster int line; 93 1.13 oster #endif 94 1.4 oster 95 1.4 oster for (r = *list; r; r = next) { 96 1.4 oster next = r->next; 97 1.13 oster #if RF_DEBUG_SHUTDOWN 98 1.4 oster file = r->file; 99 1.4 oster line = r->line; 100 1.4 oster 101 1.4 oster if (rf_shutdownDebug) { 102 1.5 oster printf("call shutdown, created %s:%d\n", file, line); 103 1.4 oster } 104 1.12 oster #endif 105 1.4 oster r->cleanup(r->arg); 106 1.12 oster #if RF_DEBUG_SHUTDOWN 107 1.4 oster if (rf_shutdownDebug) { 108 1.5 oster printf("completed shutdown, created %s:%d\n", file, line); 109 1.4 oster } 110 1.12 oster #endif 111 1.4 oster rf_FreeShutdownEnt(r); 112 1.4 oster } 113 1.4 oster *list = NULL; 114 1.1 oster } 115