Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | More refinements to disposal locking semantics on the .NET Compact Framework. |
---|---|
Downloads: | Tarball | ZIP archive | SQL archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA1: |
ac5f4cc084177836839c1c3c737925ec |
User & Date: | mistachkin 2012-10-05 00:17:57 |
Context
2012-10-06
| ||
04:38 | Implement column name/index caching in the SQLiteDataReader class. check-in: bdd8e44fd0 user: mistachkin tags: trunk | |
2012-10-05
| ||
00:17 | More refinements to disposal locking semantics on the .NET Compact Framework. check-in: ac5f4cc084 user: mistachkin tags: trunk | |
2012-10-04
| ||
11:21 | Add custom locking semantics for the CriticalHandle derived classes when compiled for the .NET Compact Framework. check-in: b8212344a0 user: mistachkin tags: trunk | |
Changes
Changes to System.Data.SQLite/SQLiteBase.cs.
︙ | ︙ | |||
468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 | } internal static string GetLastError(SQLiteConnectionHandle hdl, IntPtr db) { if ((hdl == null) || (db == IntPtr.Zero)) return "null connection or database handle"; lock (hdl) { if (hdl.IsClosed || hdl.IsInvalid) return "closed or invalid connection handle"; #if !SQLITE_STANDARD int len; return UTF8ToString(UnsafeNativeMethods.sqlite3_errmsg_interop(db, out len), len); #else return UTF8ToString(UnsafeNativeMethods.sqlite3_errmsg(db), -1); #endif } #pragma warning disable 162 GC.KeepAlive(hdl); /* NOTE: Unreachable code. */ #pragma warning restore 162 } internal static void FinishBackup(SQLiteConnectionHandle hdl, IntPtr backup) { if ((hdl == null) || (backup == IntPtr.Zero)) return; lock (hdl) { SQLiteErrorCode n = UnsafeNativeMethods.sqlite3_backup_finish(backup); if (n != SQLiteErrorCode.Ok) throw new SQLiteException(n, null); } } internal static void FinalizeStatement(SQLiteConnectionHandle hdl, IntPtr stmt) { if ((hdl == null) || (stmt == IntPtr.Zero)) return; lock (hdl) { #if !SQLITE_STANDARD SQLiteErrorCode n = UnsafeNativeMethods.sqlite3_finalize_interop(stmt); #else SQLiteErrorCode n = UnsafeNativeMethods.sqlite3_finalize(stmt); #endif if (n != SQLiteErrorCode.Ok) throw new SQLiteException(n, null); } } internal static void CloseConnection(SQLiteConnectionHandle hdl, IntPtr db) { if ((hdl == null) || (db == IntPtr.Zero)) return; lock (hdl) { #if !SQLITE_STANDARD SQLiteErrorCode n = UnsafeNativeMethods.sqlite3_close_interop(db); #else ResetConnection(hdl, db); SQLiteErrorCode n; | > > > > > > > > > > > > > > > > | 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 | } internal static string GetLastError(SQLiteConnectionHandle hdl, IntPtr db) { if ((hdl == null) || (db == IntPtr.Zero)) return "null connection or database handle"; #if PLATFORM_COMPACTFRAMEWORK lock (hdl.syncRoot) #else lock (hdl) #endif { if (hdl.IsClosed || hdl.IsInvalid) return "closed or invalid connection handle"; #if !SQLITE_STANDARD int len; return UTF8ToString(UnsafeNativeMethods.sqlite3_errmsg_interop(db, out len), len); #else return UTF8ToString(UnsafeNativeMethods.sqlite3_errmsg(db), -1); #endif } #pragma warning disable 162 GC.KeepAlive(hdl); /* NOTE: Unreachable code. */ #pragma warning restore 162 } internal static void FinishBackup(SQLiteConnectionHandle hdl, IntPtr backup) { if ((hdl == null) || (backup == IntPtr.Zero)) return; #if PLATFORM_COMPACTFRAMEWORK lock (hdl.syncRoot) #else lock (hdl) #endif { SQLiteErrorCode n = UnsafeNativeMethods.sqlite3_backup_finish(backup); if (n != SQLiteErrorCode.Ok) throw new SQLiteException(n, null); } } internal static void FinalizeStatement(SQLiteConnectionHandle hdl, IntPtr stmt) { if ((hdl == null) || (stmt == IntPtr.Zero)) return; #if PLATFORM_COMPACTFRAMEWORK lock (hdl.syncRoot) #else lock (hdl) #endif { #if !SQLITE_STANDARD SQLiteErrorCode n = UnsafeNativeMethods.sqlite3_finalize_interop(stmt); #else SQLiteErrorCode n = UnsafeNativeMethods.sqlite3_finalize(stmt); #endif if (n != SQLiteErrorCode.Ok) throw new SQLiteException(n, null); } } internal static void CloseConnection(SQLiteConnectionHandle hdl, IntPtr db) { if ((hdl == null) || (db == IntPtr.Zero)) return; #if PLATFORM_COMPACTFRAMEWORK lock (hdl.syncRoot) #else lock (hdl) #endif { #if !SQLITE_STANDARD SQLiteErrorCode n = UnsafeNativeMethods.sqlite3_close_interop(db); #else ResetConnection(hdl, db); SQLiteErrorCode n; |
︙ | ︙ | |||
539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 | } } internal static void ResetConnection(SQLiteConnectionHandle hdl, IntPtr db) { if ((hdl == null) || (db == IntPtr.Zero)) return; if (hdl.IsClosed || hdl.IsInvalid) return; lock (hdl) { IntPtr stmt = IntPtr.Zero; SQLiteErrorCode n; do { stmt = UnsafeNativeMethods.sqlite3_next_stmt(db, stmt); if (stmt != IntPtr.Zero) | > > > > | 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 | } } internal static void ResetConnection(SQLiteConnectionHandle hdl, IntPtr db) { if ((hdl == null) || (db == IntPtr.Zero)) return; if (hdl.IsClosed || hdl.IsInvalid) return; #if PLATFORM_COMPACTFRAMEWORK lock (hdl.syncRoot) #else lock (hdl) #endif { IntPtr stmt = IntPtr.Zero; SQLiteErrorCode n; do { stmt = UnsafeNativeMethods.sqlite3_next_stmt(db, stmt); if (stmt != IntPtr.Zero) |
︙ | ︙ | |||
569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 | GC.KeepAlive(hdl); } internal static bool IsAutocommit(SQLiteConnectionHandle hdl, IntPtr db) { if (db == IntPtr.Zero) return false; if (hdl.IsClosed || hdl.IsInvalid) return false; lock (hdl) { return (UnsafeNativeMethods.sqlite3_get_autocommit(db) == 1); } #pragma warning disable 162 GC.KeepAlive(hdl); /* NOTE: Unreachable code. */ #pragma warning restore 162 } | > > > > | 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 | GC.KeepAlive(hdl); } internal static bool IsAutocommit(SQLiteConnectionHandle hdl, IntPtr db) { if (db == IntPtr.Zero) return false; if (hdl.IsClosed || hdl.IsInvalid) return false; #if PLATFORM_COMPACTFRAMEWORK lock (hdl.syncRoot) #else lock (hdl) #endif { return (UnsafeNativeMethods.sqlite3_get_autocommit(db) == 1); } #pragma warning disable 162 GC.KeepAlive(hdl); /* NOTE: Unreachable code. */ #pragma warning restore 162 } |
︙ | ︙ |
Changes to System.Data.SQLite/UnsafeNativeMethods.cs.
︙ | ︙ | |||
1447 1448 1449 1450 1451 1452 1453 | #region SQLiteConnectionHandle Class // Handles the unmanaged database pointer, and provides finalization // support for it. internal class SQLiteConnectionHandle : CriticalHandle { #if PLATFORM_COMPACTFRAMEWORK | | | 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 | #region SQLiteConnectionHandle Class // Handles the unmanaged database pointer, and provides finalization // support for it. internal class SQLiteConnectionHandle : CriticalHandle { #if PLATFORM_COMPACTFRAMEWORK internal readonly object syncRoot = new object(); #endif /////////////////////////////////////////////////////////////////////// public static implicit operator IntPtr(SQLiteConnectionHandle db) { if (db != null) |
︙ | ︙ | |||
1595 1596 1597 1598 1599 1600 1601 | /////////////////////////////////////////////////////////////////////////// #region SQLiteStatementHandle Class // Provides finalization support for unmanaged SQLite statements. internal class SQLiteStatementHandle : CriticalHandle { #if PLATFORM_COMPACTFRAMEWORK | | | 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 | /////////////////////////////////////////////////////////////////////////// #region SQLiteStatementHandle Class // Provides finalization support for unmanaged SQLite statements. internal class SQLiteStatementHandle : CriticalHandle { #if PLATFORM_COMPACTFRAMEWORK internal readonly object syncRoot = new object(); #endif /////////////////////////////////////////////////////////////////////// private SQLiteConnectionHandle cnn; /////////////////////////////////////////////////////////////////////// |
︙ | ︙ | |||
1748 1749 1750 1751 1752 1753 1754 | /////////////////////////////////////////////////////////////////////////// #region SQLiteBackupHandle Class // Provides finalization support for unmanaged SQLite backup objects. internal class SQLiteBackupHandle : CriticalHandle { #if PLATFORM_COMPACTFRAMEWORK | | | 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 | /////////////////////////////////////////////////////////////////////////// #region SQLiteBackupHandle Class // Provides finalization support for unmanaged SQLite backup objects. internal class SQLiteBackupHandle : CriticalHandle { #if PLATFORM_COMPACTFRAMEWORK internal readonly object syncRoot = new object(); #endif /////////////////////////////////////////////////////////////////////// private SQLiteConnectionHandle cnn; /////////////////////////////////////////////////////////////////////// |
︙ | ︙ |