00001
00002
00003
00004
00005
00006
00007 #include "config.h"
00008
00009 #ifndef lint
00010 static const char revid[] = "$Id: mp__register_8c-source.html,v 1.1 2008/06/08 10:20:50 sebdiaz Exp $";
00011 #endif
00012
00013 #ifndef NO_SYSTEM_INCLUDES
00014 #include <sys/types.h>
00015 #endif
00016
00017 #ifdef HAVE_RPC
00018 #include "db_server.h"
00019 #endif
00020
00021 #include "db_int.h"
00022 #include "db_shash.h"
00023 #include "mp.h"
00024
00025 #ifdef HAVE_RPC
00026 #include "gen_client_ext.h"
00027 #include "rpc_client_ext.h"
00028 #endif
00029
00030
00031
00032
00033
00034 int
00035 CDB_memp_register(dbenv, ftype, pgin, pgout)
00036 DB_ENV *dbenv;
00037 int ftype;
00038 int (*pgin) __P((DB_ENV *, db_pgno_t, void *, DBT *));
00039 int (*pgout) __P((DB_ENV *, db_pgno_t, void *, DBT *));
00040 {
00041 DB_MPOOL *dbmp;
00042 DB_MPREG *mpreg;
00043 int ret;
00044
00045 #ifdef HAVE_RPC
00046 if (F_ISSET(dbenv, DB_ENV_RPCCLIENT))
00047 return (__dbcl_memp_register(dbenv, ftype, pgin, pgout));
00048 #endif
00049
00050 PANIC_CHECK(dbenv);
00051 ENV_REQUIRES_CONFIG(dbenv, dbenv->mp_handle, DB_INIT_MPOOL);
00052
00053 dbmp = dbenv->mp_handle;
00054
00055
00056
00057
00058
00059
00060 MUTEX_THREAD_LOCK(dbmp->mutexp);
00061 for (mpreg = LIST_FIRST(&dbmp->dbregq);
00062 mpreg != NULL; mpreg = LIST_NEXT(mpreg, q))
00063 if (mpreg->ftype == ftype) {
00064 mpreg->pgin = pgin;
00065 mpreg->pgout = pgout;
00066 break;
00067 }
00068 MUTEX_THREAD_UNLOCK(dbmp->mutexp);
00069 if (mpreg != NULL)
00070 return (0);
00071
00072
00073 if ((ret = CDB___os_malloc(dbenv, sizeof(DB_MPREG), NULL, &mpreg)) != 0)
00074 return (ret);
00075
00076 mpreg->ftype = ftype;
00077 mpreg->pgin = pgin;
00078 mpreg->pgout = pgout;
00079
00080 MUTEX_THREAD_LOCK(dbmp->mutexp);
00081 LIST_INSERT_HEAD(&dbmp->dbregq, mpreg, q);
00082 MUTEX_THREAD_UNLOCK(dbmp->mutexp);
00083
00084 return (0);
00085 }