xref: /haiku/src/libs/compat/freebsd_iflib/kobj.c (revision fd41233b076b95615c5a10af3026c24ae605af11)
1*fd41233bSAugustin Cavalier /*
2*fd41233bSAugustin Cavalier  * Copyright 2018-2019, Haiku, Inc. All rights reserved.
3*fd41233bSAugustin Cavalier  * Distributed under the terms of the MIT License.
4*fd41233bSAugustin Cavalier  */
5*fd41233bSAugustin Cavalier 
6*fd41233bSAugustin Cavalier #include <sys/cdefs.h>
7*fd41233bSAugustin Cavalier #include <sys/param.h>
8*fd41233bSAugustin Cavalier #include <sys/kernel.h>
9*fd41233bSAugustin Cavalier #include <sys/kobj.h>
10*fd41233bSAugustin Cavalier #include <sys/lock.h>
11*fd41233bSAugustin Cavalier #include <sys/mutex.h>
12*fd41233bSAugustin Cavalier 
13*fd41233bSAugustin Cavalier 
14*fd41233bSAugustin Cavalier static kobj_method_t kobj_default_method = {
15*fd41233bSAugustin Cavalier 	"kobj_default_method", 0, (kobjop_t)kobj_error_method
16*fd41233bSAugustin Cavalier };
17*fd41233bSAugustin Cavalier 
18*fd41233bSAugustin Cavalier 
19*fd41233bSAugustin Cavalier void
kobj_init(kobj_t obj,kobj_class_t cls)20*fd41233bSAugustin Cavalier kobj_init(kobj_t obj, kobj_class_t cls)
21*fd41233bSAugustin Cavalier {
22*fd41233bSAugustin Cavalier 	obj->ops.cls = cls;
23*fd41233bSAugustin Cavalier }
24*fd41233bSAugustin Cavalier 
25*fd41233bSAugustin Cavalier 
26*fd41233bSAugustin Cavalier kobj_method_t*
kobj_lookup_method(kobj_class_t class,kobj_method_t ** cep,kobjop_desc_t desc)27*fd41233bSAugustin Cavalier kobj_lookup_method(kobj_class_t class, kobj_method_t** cep,
28*fd41233bSAugustin Cavalier 	kobjop_desc_t desc)
29*fd41233bSAugustin Cavalier {
30*fd41233bSAugustin Cavalier 	int32 i, id;
31*fd41233bSAugustin Cavalier 	kobj_method_t* ret = NULL;
32*fd41233bSAugustin Cavalier 
33*fd41233bSAugustin Cavalier 	id = desc->id;
34*fd41233bSAugustin Cavalier 	if (id == 0)
35*fd41233bSAugustin Cavalier 		id = desc->deflt.id;
36*fd41233bSAugustin Cavalier 
37*fd41233bSAugustin Cavalier 	for (i = 0; class->methods[i].name != NULL; i++) {
38*fd41233bSAugustin Cavalier 		kobj_method_t* mth = &class->methods[i];
39*fd41233bSAugustin Cavalier 		if (mth->id != id)
40*fd41233bSAugustin Cavalier 			continue;
41*fd41233bSAugustin Cavalier 
42*fd41233bSAugustin Cavalier 		ret = mth;
43*fd41233bSAugustin Cavalier 		break;
44*fd41233bSAugustin Cavalier 	}
45*fd41233bSAugustin Cavalier 	if (ret == NULL || ret->method == NULL)
46*fd41233bSAugustin Cavalier 		ret = &desc->deflt;
47*fd41233bSAugustin Cavalier 	if (ret == NULL || ret->method == NULL)
48*fd41233bSAugustin Cavalier 		ret = &kobj_default_method;
49*fd41233bSAugustin Cavalier 
50*fd41233bSAugustin Cavalier 	if (cep != NULL)
51*fd41233bSAugustin Cavalier 		*cep = ret;
52*fd41233bSAugustin Cavalier 	return ret;
53*fd41233bSAugustin Cavalier }
54*fd41233bSAugustin Cavalier 
55*fd41233bSAugustin Cavalier 
56*fd41233bSAugustin Cavalier int
kobj_error_method(void)57*fd41233bSAugustin Cavalier kobj_error_method(void)
58*fd41233bSAugustin Cavalier {
59*fd41233bSAugustin Cavalier 	return ENXIO;
60*fd41233bSAugustin Cavalier }
61