Changeset 10 for trunk/samba-3.0.25pre1/source/tdb/common/open.c
- Timestamp:
- Mar 25, 2007, 1:33:05 PM (18 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/samba-3.0.25pre1/source/tdb/common/open.c
r1 r10 160 160 tdb->hash_fn = hash_fn ? hash_fn : default_tdb_hash; 161 161 162 #ifdef __OS2__ 163 if (!(tdb->flags & TDB_INTERNAL)) 164 { 165 char szSem[_MAX_PATH]; 166 char drive[_MAX_DRIVE], dir[_MAX_DIR]; 167 char fname[_MAX_FNAME], ext[_MAX_EXT]; 168 APIRET rc; 169 // extract path info 170 _splitpath( name, drive, dir, fname, ext); 171 sprintf( szSem, "\\SEM32\\TDB_GL_%s%s%s", dir, fname, ext); 172 rc = DosCreateMutexSem( szSem, &tdb->hGlobalLock, 0, FALSE); 173 if (rc == ERROR_DUPLICATE_NAME) 174 rc = DosOpenMutexSem( szSem, &tdb->hGlobalLock); 175 if (rc != NO_ERROR) { 176 printf( "cannot open %s %d\n", szSem, rc); 177 errno = EINVAL; 178 goto fail; 179 } 180 sprintf( szSem, "\\SEM32\\TDB_AL_%s%s%s", dir, fname, ext); 181 rc = DosCreateMutexSem( szSem, &tdb->hActiveLock, 0, FALSE); 182 if (rc == ERROR_DUPLICATE_NAME) 183 rc = DosOpenMutexSem( szSem, &tdb->hActiveLock); 184 if (rc != NO_ERROR) { 185 printf( "cannot open %s %d\n", szSem, rc); 186 errno = EINVAL; 187 goto fail; 188 } 189 sprintf( szSem, "\\SEM32\\TDB_TL_%s%s%s", dir, fname, ext); 190 rc = DosCreateMutexSem( szSem, &tdb->hTransactionLock, 0, FALSE); 191 if (rc == ERROR_DUPLICATE_NAME) 192 rc = DosOpenMutexSem( szSem, &tdb->hTransactionLock); 193 if (rc != NO_ERROR) { 194 printf( "cannot open %s %d\n", szSem, rc); 195 errno = EINVAL; 196 goto fail; 197 } 198 } 199 #endif 200 162 201 /* cache the page size */ 163 202 tdb->page_size = getpagesize(); … … 207 246 208 247 /* we need to zero database if we are the only one with it open */ 209 if ((tdb_flags & TDB_CLEAR_IF_FIRST) && 210 (locked = (tdb->methods->tdb_brlock(tdb, ACTIVE_LOCK, F_WRLCK, F_SETLK, 0, 1) == 0))) { 248 if ((tdb_flags & TDB_CLEAR_IF_FIRST) 249 #ifndef __OS2__ // we already have global lock 250 && (locked = (tdb->methods->tdb_brlock(tdb, ACTIVE_LOCK, F_WRLCK, F_SETLK, 0, 1) == 0)) 251 #endif 252 ) { 211 253 open_flags |= O_CREAT; 212 254 if (ftruncate(tdb->fd, 0) == -1) { … … 266 308 tdb_mmap(tdb); 267 309 if (locked) { 310 #ifndef __OS2__ 268 311 if (tdb->methods->tdb_brlock(tdb, ACTIVE_LOCK, F_UNLCK, F_SETLK, 0, 1) == -1) { 269 312 TDB_LOG((tdb, TDB_DEBUG_ERROR, "tdb_open_ex: " … … 272 315 goto fail; 273 316 } 274 317 #endif 275 318 } 276 319 … … 279 322 users know we're using it. */ 280 323 324 #ifndef __OS2__ 281 325 if (tdb_flags & TDB_CLEAR_IF_FIRST) { 282 326 /* leave this lock in place to indicate it's in use */ … … 284 328 goto fail; 285 329 } 330 #endif 286 331 287 332 /* if needed, run recovery */ … … 289 334 goto fail; 290 335 } 336 337 // YD internal databases do not get global lock! 338 if (tdb->methods->tdb_brlock(tdb, GLOBAL_LOCK, F_UNLCK, F_SETLKW, 0, 1) == -1) 339 goto fail; 291 340 292 341 internal: … … 294 343 * do with disk files, and resume here by releasing their 295 344 * global lock and hooking into the active list. */ 296 if (tdb->methods->tdb_brlock(tdb, GLOBAL_LOCK, F_UNLCK, F_SETLKW, 0, 1) == -1)297 goto fail;298 345 tdb->next = tdbs; 299 346 tdbs = tdb; … … 302 349 fail: 303 350 { int save_errno = errno; 351 tdb->methods->tdb_brlock(tdb, GLOBAL_LOCK, F_UNLCK, F_SETLKW, 0, 1); 304 352 305 353 if (!tdb) … … 313 361 } 314 362 SAFE_FREE(tdb->name); 363 #ifdef __OS2__ 364 DosCloseMutexSem( tdb->hGlobalLock); 365 DosCloseMutexSem( tdb->hActiveLock); 366 DosCloseMutexSem( tdb->hTransactionLock); 367 #endif 315 368 if (tdb->fd != -1) 316 369 if (close(tdb->fd) != 0) … … 343 396 } 344 397 SAFE_FREE(tdb->name); 398 tdb->methods->tdb_brlock(tdb, GLOBAL_LOCK, F_UNLCK, F_SETLK, 0, 1); 345 399 if (tdb->fd != -1) 346 400 ret = close(tdb->fd); 347 401 SAFE_FREE(tdb->lockrecs); 402 #ifdef __OS2__ 403 DosCloseMutexSem( tdb->hGlobalLock); 404 tdb->hGlobalLock = 0; 405 DosCloseMutexSem( tdb->hActiveLock); 406 tdb->hActiveLock = 0; 407 DosCloseMutexSem( tdb->hTransactionLock); 408 tdb->hTransactionLock = 0; 409 #endif 348 410 349 411 /* Remove from contexts list */
Note:
See TracChangeset
for help on using the changeset viewer.