Move GLOCK initialisation to platform directories
[openafs.git] / src / afs / afs_exporter.c
1 /*
2  * Copyright 2000, International Business Machines Corporation and others.
3  * All Rights Reserved.
4  * 
5  * This software has been released under the terms of the IBM Public
6  * License.  For details, see the LICENSE file in the top-level source
7  * directory or online at http://www.openafs.org/dl/license10.html
8  */
9
10 #include <afsconfig.h>
11 #include "afs/param.h"
12
13
14 #include "afs/sysincludes.h"    /* Standard vendor system headers */
15 #include "afsincludes.h"        /* Afs-based standard headers */
16 #include "afs/afs_stats.h"      /* statistics gathering code */
17
18 struct afs_exporter *root_exported = 0; /* Head of "exporters" link list */
19 afs_lock_t afs_xexp;
20
21
22 /* Add a new "afs exporter" entry to the table of exporters. The default initial values of the entry are passed in as parameters. */
23 static afs_int32 init_xexported = 0;
24
25 struct afs_exporter *
26 exporter_add(afs_int32 size, struct exporterops *ops, afs_int32 state,
27              afs_int32 type, char *data)
28 {
29     struct afs_exporter *ex, *op;
30     afs_int32 length;
31
32     AFS_STATCNT(exporter_add);
33     if (!init_xexported) {
34         init_xexported = 1;
35         LOCK_INIT(&afs_xexp, "afs_xexp");
36     }
37     length = (size ? size : sizeof(struct afs_exporter));
38     ex = (struct afs_exporter *)afs_osi_Alloc(length);
39     memset(ex, 0, length);
40     ObtainWriteLock(&afs_xexp, 308);
41     for (op = root_exported; op; op = op->exp_next) {
42         if (!op->exp_next)
43             break;
44     }
45     if (op)
46         op->exp_next = ex;
47     else
48         root_exported = ex;
49     ReleaseWriteLock(&afs_xexp);
50     ex->exp_next = 0;
51     ex->exp_op = ops;
52     ex->exp_states = state;
53     ex->exp_data = data;
54     ex->exp_type = type;
55     return ex;
56 }
57
58
59 /* Returns the "afs exporter" structure of type, "type". NULL is returned if not found */
60 struct afs_exporter *
61 exporter_find(int type)
62 {
63     struct afs_exporter *op;
64
65     AFS_STATCNT(exporter_add);
66     ObtainReadLock(&afs_xexp);
67     for (op = root_exported; op; op = op->exp_next) {
68         if (op->exp_type == type) {
69             ReleaseReadLock(&afs_xexp);
70             return op;
71         }
72     }
73     ReleaseReadLock(&afs_xexp);
74     return (struct afs_exporter *)0;
75 }
76
77
78 void
79 shutdown_exporter(void)
80 {
81     struct afs_exporter *ex, *op;
82
83     for (op = root_exported; op; op = ex) {
84         ex = op->exp_next;
85         afs_osi_Free(op, sizeof(struct afs_exporter));
86     }
87     init_xexported = 0;
88 }