1 //------------------------------------------------------------------------------
2 // <copyright file="OdbcEnvironment.cs" company="Microsoft">
3 // Copyright (c) Microsoft Corporation. All rights reserved.
5 // <owner current="true" primary="true">Microsoft</owner>
6 // <owner current="true" primary="false">Microsoft</owner>
7 //------------------------------------------------------------------------------
11 using System.Data.Common;
12 using System.Threading;
15 namespace System.Data.Odbc {
16 sealed internal class OdbcEnvironment {
17 static private object _globalEnvironmentHandle;
18 static private object _globalEnvironmentHandleLock = new object();
20 private OdbcEnvironment () {} // default const.
22 static internal OdbcEnvironmentHandle GetGlobalEnvironmentHandle() {
23 OdbcEnvironmentHandle globalEnvironmentHandle = _globalEnvironmentHandle as OdbcEnvironmentHandle;
24 if(null == globalEnvironmentHandle) {
25 ADP.CheckVersionMDAC(true);
27 lock(_globalEnvironmentHandleLock) {
28 globalEnvironmentHandle = _globalEnvironmentHandle as OdbcEnvironmentHandle;
29 if(null == globalEnvironmentHandle) {
30 globalEnvironmentHandle = new OdbcEnvironmentHandle();
31 _globalEnvironmentHandle = globalEnvironmentHandle;
35 return globalEnvironmentHandle;
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