Updates referencesource to .NET 4.7
[mono.git] / mcs / class / referencesource / System.Data / System / Data / Odbc / OdbcEnvironment.cs
1 //------------------------------------------------------------------------------
2 // <copyright file="OdbcEnvironment.cs" company="Microsoft">
3 //      Copyright (c) Microsoft Corporation.  All rights reserved.
4 // </copyright>
5 // <owner current="true" primary="true">Microsoft</owner>
6 // <owner current="true" primary="false">Microsoft</owner>
7 //------------------------------------------------------------------------------
8
9 using System;
10 using System.Data;
11 using System.Data.Common;
12 using System.Threading;
13
14
15 namespace System.Data.Odbc {
16     sealed internal class OdbcEnvironment {
17         static private object _globalEnvironmentHandle;
18         static private object _globalEnvironmentHandleLock = new object();
19
20         private OdbcEnvironment () {}  // default const.
21         
22         static internal OdbcEnvironmentHandle GetGlobalEnvironmentHandle() {
23             OdbcEnvironmentHandle globalEnvironmentHandle = _globalEnvironmentHandle as OdbcEnvironmentHandle;
24             if(null == globalEnvironmentHandle) {
25                 ADP.CheckVersionMDAC(true);
26                 
27                 lock(_globalEnvironmentHandleLock) {
28                     globalEnvironmentHandle = _globalEnvironmentHandle as OdbcEnvironmentHandle;
29                     if(null == globalEnvironmentHandle) {
30                         globalEnvironmentHandle = new OdbcEnvironmentHandle();
31                         _globalEnvironmentHandle = globalEnvironmentHandle;
32                     }
33                 }
34             }
35             return globalEnvironmentHandle;
36         }
37
38         static internal void ReleaseObjectPool() {
39             object globalEnvironmentHandle = Interlocked.Exchange(ref _globalEnvironmentHandle, null);
40             if(null != globalEnvironmentHandle) {
41                 (globalEnvironmentHandle as OdbcEnvironmentHandle).Dispose(); // internally refcounted so will happen correctly
42             }
43         }
44     }
45 }
46