xref: /onnv-gate/usr/src/cmd/cmd-inet/usr.lib/dsvclockd/datastore.h (revision 0:68f95e015346)
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License, Version 1.0 only
6  * (the "License").  You may not use this file except in compliance
7  * with the License.
8  *
9  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10  * or http://www.opensolaris.org/os/licensing.
11  * See the License for the specific language governing permissions
12  * and limitations under the License.
13  *
14  * When distributing Covered Code, include this CDDL HEADER in each
15  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16  * If applicable, add the following below this CDDL HEADER, with the
17  * fields enclosed by brackets "[]" replaced with your own identifying
18  * information: Portions Copyright [yyyy] [name of copyright owner]
19  *
20  * CDDL HEADER END
21  */
22 /*
23  * Copyright (c) 2000 by Sun Microsystems, Inc.
24  * All rights reserved.
25  */
26 
27 #ifndef	DSVCD_DATASTORE_H
28 #define	DSVCD_DATASTORE_H
29 
30 #pragma ident	"%Z%%M%	%I%	%E% SMI"
31 
32 #include <sys/types.h>
33 #include <synch.h>
34 #include <door.h>
35 
36 #include "container.h"
37 
38 /*
39  * Datastore-related data structures, functions and constants.  See
40  * comments in datastore.c for a description of how to use the exported
41  * functions.
42  */
43 
44 #ifdef	__cplusplus
45 extern "C" {
46 #endif
47 
48 #define	DSVCD_DS_HASH_SIZE	100
49 
50 /*
51  * A linked list of dsvcd_container_t structures.  Contains a lock,
52  * `cl_lock', which is used for controlling manipulation of `cl_head'.
53  */
54 typedef struct {
55 	mutex_t			cl_lock;	/* protects the list */
56 	dsvcd_container_t	*cl_head;	/* linked list of containers */
57 	uint8_t			cl_pad[8];	/* prevent false sharing */
58 } dsvcd_container_list_t;
59 
60 /*
61  * Describes the underlying datastore itself.  There is exactly one
62  * dsvcd_datastore_t per datastore using doors (so currently, there are
63  * two: one for `ds_files' and one for `ds_data').  Contains per-datastore
64  * information, like the door descriptor being used by dsvclockd to listen
65  * to requests for this datastore, the datastore name, and a list of all
66  * open containers for this datastore.  Instances of this data structure
67  * are allocated when dsvclockd is started.
68  */
69 typedef struct dsvcd_datastore {
70 	char			*ds_name;	/* datastore name */
71 	int			ds_doorfd;	/* datastore door */
72 
73 	/*
74 	 * This hash is used to speed up the open() routine so that a given
75 	 * container can be located quicker.  Hash based on the filename,
76 	 * and use it as an index into the array..
77 	 */
78 	dsvcd_container_list_t	ds_hash[DSVCD_DS_HASH_SIZE];
79 } dsvcd_datastore_t;
80 
81 typedef void dsvcd_svc_t(void *, dsvcd_request_t *, size_t, door_desc_t *,
82 	uint_t);
83 
84 extern dsvcd_datastore_t *ds_create(const char *, dsvcd_svc_t *);
85 extern void ds_destroy(dsvcd_datastore_t *);
86 extern unsigned int ds_reap_containers(dsvcd_datastore_t *, unsigned int);
87 extern void ds_release_container(dsvcd_datastore_t *, dsvcd_container_t *);
88 extern dsvcd_container_t *ds_get_container(dsvcd_datastore_t *, const char *,
89     boolean_t);
90 
91 #ifdef	__cplusplus
92 }
93 #endif
94 
95 #endif	/* DSVCD_DATASTORE_H */
96