1.1 --- a/lemon/cplex.cc Wed May 06 11:31:43 2015 +0200
1.2 +++ b/lemon/cplex.cc Thu May 07 11:42:19 2015 +0200
1.3 @@ -37,37 +37,54 @@
1.4 }
1.5 }
1.6
1.7 + void CplexEnv::incCnt()
1.8 + {
1.9 + _cnt_lock->lock();
1.10 + ++(*_cnt);
1.11 + _cnt_lock->unlock();
1.12 + }
1.13 +
1.14 + void CplexEnv::decCnt()
1.15 + {
1.16 + _cnt_lock->lock();
1.17 + --(*_cnt);
1.18 + if (*_cnt == 0) {
1.19 + delete _cnt;
1.20 + _cnt_lock->unlock();
1.21 + delete _cnt_lock;
1.22 + CPXcloseCPLEX(&_env);
1.23 + }
1.24 + else _cnt_lock->unlock();
1.25 + }
1.26 +
1.27 CplexEnv::CplexEnv() {
1.28 int status;
1.29 + _env = CPXopenCPLEX(&status);
1.30 + if (_env == 0)
1.31 + throw LicenseError(status);
1.32 _cnt = new int;
1.33 (*_cnt) = 1;
1.34 - _env = CPXopenCPLEX(&status);
1.35 - if (_env == 0) {
1.36 - delete _cnt;
1.37 - _cnt = 0;
1.38 - throw LicenseError(status);
1.39 - }
1.40 + _cnt_lock = new bits::Lock;
1.41 }
1.42
1.43 CplexEnv::CplexEnv(const CplexEnv& other) {
1.44 _env = other._env;
1.45 _cnt = other._cnt;
1.46 - ++(*_cnt);
1.47 + _cnt_lock = other._cnt_lock;
1.48 + incCnt();
1.49 }
1.50
1.51 CplexEnv& CplexEnv::operator=(const CplexEnv& other) {
1.52 + decCnt();
1.53 _env = other._env;
1.54 _cnt = other._cnt;
1.55 - ++(*_cnt);
1.56 + _cnt_lock = other._cnt_lock;
1.57 + incCnt();
1.58 return *this;
1.59 }
1.60
1.61 CplexEnv::~CplexEnv() {
1.62 - --(*_cnt);
1.63 - if (*_cnt == 0) {
1.64 - delete _cnt;
1.65 - CPXcloseCPLEX(&_env);
1.66 - }
1.67 + decCnt();
1.68 }
1.69
1.70 CplexBase::CplexBase() : LpBase() {