]> git.sur5r.net Git - openldap/blob - servers/slapd/back-bdb2/porter.c
Server timing as a private feature of the bdb2 backend.
[openldap] / servers / slapd / back-bdb2 / porter.c
1 /* porter.c - port functions of the bdb2 backend */
2
3 #include "portable.h"
4
5 #include <stdio.h>
6 #include <errno.h>
7
8 #include <ac/string.h>
9
10 #include "slap.h"
11 #include "back-bdb2.h"
12
13 #define  PORTER_OBJ   "bdb2_backend"
14
15
16 static int
17 bdb2i_enter_backend( DB_ENV *dbEnv, DB_LOCK *lock, int writer )
18 {
19         u_int32_t      locker;
20         db_lockmode_t  lock_type;
21         DBT            lock_dbt;
22         int            ret = 0;
23
24         switch ( slapMode ) {
25
26                 case SLAP_SERVER_MODE:
27                 case SLAP_TIMEDSERVER_MODE:
28                 case SLAP_TOOL_MODE:
29                         if ( ( ret = lock_id( dbEnv->lk_info, &locker )) != 0 ) {
30
31                                 Debug( LDAP_DEBUG_ANY,
32                                         "bdb2i_enter_backend(): unable to get locker id -- %s\n",
33                                         strerror( ret ), 0, 0 );
34                                 return( ret );
35
36                         }
37
38                         lock_type     = writer ? DB_LOCK_WRITE : DB_LOCK_READ;
39                         lock_dbt.data = PORTER_OBJ;
40                         lock_dbt.size = strlen( PORTER_OBJ );
41
42                         switch ( ( ret = lock_get( dbEnv->lk_info, locker, 0, &lock_dbt,
43                                                         lock_type, lock ))) {
44
45                                 case 0:
46                                         Debug( LDAP_DEBUG_TRACE,
47                                                 "bdb2i_enter_backend() -- %s lock granted\n",
48                                                 writer ? "write" : "read", 0, 0 );
49                                         break;
50
51                                 case DB_LOCK_NOTGRANTED:
52                                         Debug( LDAP_DEBUG_ANY,
53                                                 "bdb2i_enter_backend() -- %s lock NOT granted\n",
54                                                 writer ? "write" : "read", 0, 0 );
55                                         break;
56
57                                 case DB_LOCK_DEADLOCK:
58                                         Debug( LDAP_DEBUG_ANY,
59                                                 "bdb2i_enter_backend() -- %s lock returned DEADLOCK\n",
60                                                 writer ? "write" : "read", 0, 0 );
61                                         break;
62
63                                 default:
64                                         Debug( LDAP_DEBUG_ANY,
65                                                 "bdb2i_enter_backend() -- %s lock returned ERROR: %s\n",
66                                                 writer ? "write" : "read", strerror( errno ), 0 );
67                                         ret = errno;
68                                         break;
69
70                         }
71                         break;
72         }
73
74         return( ret );
75 }
76
77
78 int
79 bdb2i_enter_backend_r( DB_ENV *dbEnv, DB_LOCK *lock )
80 {
81         return( bdb2i_enter_backend( dbEnv, lock, 0 ));
82 }
83
84
85 int
86 bdb2i_enter_backend_w( DB_ENV *dbEnv, DB_LOCK *lock )
87 {
88         return( bdb2i_enter_backend( dbEnv, lock, 1 ));
89 }
90
91
92 int
93 bdb2i_leave_backend( DB_ENV *dbEnv, DB_LOCK lock )
94 {
95         int   ret = 0;
96
97         switch ( slapMode ) {
98
99                 case SLAP_SERVER_MODE:
100                 case SLAP_TIMEDSERVER_MODE:
101                 case SLAP_TOOL_MODE:
102                         switch( ( ret = lock_put( dbEnv->lk_info, lock ))) {
103
104                                 case 0:
105                                         Debug( LDAP_DEBUG_TRACE,
106                                                 "bdb2i_leave_backend() -- lock released\n",
107                                                 0, 0, 0 );
108                                         break;
109
110                                 case DB_LOCK_NOTHELD:
111                                         Debug( LDAP_DEBUG_ANY,
112                                                 "bdb2i_leave_backend() -- lock NOT held\n",
113                                                 0, 0, 0 );
114                                         break;
115
116                                 case DB_LOCK_DEADLOCK:
117                                         Debug( LDAP_DEBUG_ANY,
118                                                 "bdb2i_leave_backend() -- lock returned DEADLOCK\n",
119                                                 0, 0, 0 );
120                                         break;
121
122                                 default:
123                                         Debug( LDAP_DEBUG_ANY,
124                                                 "bdb2i_leave_backend() -- lock returned ERROR: %s\n",
125                                                 strerror( errno ), 0, 0 );
126                                         ret = errno;
127                                         break;
128                         
129                         }
130                         break;
131         }
132
133         return( ret );
134
135 }
136
137