void LocalFiberRef::send(const PendingEvent& pendingEvent) { boost::shared_lock<boost::upgrade_mutex> shared_lock(block->mutex); block->mailbox->enqueue(pendingEvent); if (block->status == Suspended) { boost::upgrade_lock<boost::upgrade_mutex> upgrade_lock(std::move(shared_lock), boost::try_to_lock); if (upgrade_lock.owns_lock()) { boost::unique_lock<boost::upgrade_mutex> unique_lock(std::move(upgrade_lock)); system->schedule(block, std::move(unique_lock)); } } }
SQLiteDBPtr SQLite::open(const String& name) { UpgradeLock upgrade_lock(mDBMutex); // First get the thread local storage for this database DBMap::iterator it = mDBs.find(name); if (it == mDBs.end()) { // the thread specific store hasn't even been allocated UpgradedLock upgraded_lock(upgrade_lock); // verify another thread hasn't added it, then add it it = mDBs.find(name); if (it == mDBs.end()) { std::tr1::shared_ptr<ThreadDBPtr> newDb(new ThreadDBPtr()); mDBs[name]=newDb; it = mDBs.find(name); } } assert(it != mDBs.end()); std::tr1::shared_ptr<ThreadDBPtr> thread_db_ptr_ptr = it->second; assert(thread_db_ptr_ptr); // Now get the thread specific weak database connection WeakSQLiteDBPtr* weak_db_ptr_ptr = thread_db_ptr_ptr->get(); if (weak_db_ptr_ptr == NULL) { // we don't have a weak pointer for this thread UpgradedLock upgraded_lock(upgrade_lock); weak_db_ptr_ptr = thread_db_ptr_ptr->get(); if (weak_db_ptr_ptr == NULL) { // verify and create weak_db_ptr_ptr = new WeakSQLiteDBPtr(); thread_db_ptr_ptr->reset( weak_db_ptr_ptr ); } } assert(weak_db_ptr_ptr != NULL); SQLiteDBPtr db; db = weak_db_ptr_ptr->lock(); if (!db) { // the weak pointer for this thread is NULL UpgradedLock upgraded_lock(upgrade_lock); db = weak_db_ptr_ptr->lock(); if (!db) { db = SQLiteDBPtr(new SQLiteDB(name)); *weak_db_ptr_ptr = db; } } assert(db); return db; }