1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
|
/*-
* See the file LICENSE for redistribution information.
*
* Copyright (c) 1996, 1997, 1998, 1999
* Sleepycat Software. All rights reserved.
*/
#include "db_config.h"
#ifndef lint
static const char sccsid[] = "@(#)mp_register.c 11.2 (Sleepycat) 9/16/99";
#endif /* not lint */
#ifndef NO_SYSTEM_INCLUDES
#include <sys/types.h>
#endif
#include "db_int.h"
#include "db_shash.h"
#include "mp.h"
/*
* CDB_memp_register --
* Register a file type's pgin, pgout routines.
*/
int
CDB_memp_register(dbenv, ftype, pgin, pgout)
DB_ENV *dbenv;
int ftype;
int (*pgin) __P((db_pgno_t, void *, DBT *));
int (*pgout) __P((db_pgno_t, void *, DBT *));
{
DB_MPOOL *dbmp;
DB_MPREG *mpreg;
int ret;
PANIC_CHECK(dbenv);
ENV_REQUIRES_CONFIG(dbenv, dbenv->mp_handle, DB_INIT_MPOOL);
dbmp = dbenv->mp_handle;
/*
* Chances are good that the item has already been registered, as the
* DB access methods are the folks that call this routine. If already
* registered, just update the entry, although it's probably unchanged.
*/
MUTEX_THREAD_LOCK(dbmp->mutexp);
for (mpreg = LIST_FIRST(&dbmp->dbregq);
mpreg != NULL; mpreg = LIST_NEXT(mpreg, q))
if (mpreg->ftype == ftype) {
mpreg->pgin = pgin;
mpreg->pgout = pgout;
break;
}
MUTEX_THREAD_UNLOCK(dbmp->mutexp);
if (mpreg != NULL)
return (0);
/* New entry. */
if ((ret = CDB___os_malloc(sizeof(DB_MPREG), NULL, &mpreg)) != 0)
return (ret);
mpreg->ftype = ftype;
mpreg->pgin = pgin;
mpreg->pgout = pgout;
MUTEX_THREAD_LOCK(dbmp->mutexp);
LIST_INSERT_HEAD(&dbmp->dbregq, mpreg, q);
MUTEX_THREAD_UNLOCK(dbmp->mutexp);
return (0);
}
|