+ break;
+
+ case 'semaphore':
+ self::$driver = new Lock\SemaphoreLockDriver();
+ break;
+
+ default:
+ self::useAutoDriver();
+ }
+ } catch (\Exception $exception) {
+ logger ('Driver \'' . $lock_driver . '\' failed - Fallback to \'useAutoDriver()\'');
+ self::useAutoDriver();
+ }
+ }
+
+ /**
+ * @brief This method tries to find the best - local - locking method for Friendica
+ *
+ * The following sequence will be tried:
+ * 1. Semaphore Locking
+ * 2. Cache Locking
+ * 3. Database Locking
+ *
+ */
+ private static function useAutoDriver() {
+
+ // 1. Try to use Semaphores for - local - locking
+ if (function_exists('sem_get')) {
+ try {
+ self::$driver = new Lock\SemaphoreLockDriver();
+ return;
+ } catch (\Exception $exception) {
+ logger ('Using Semaphore driver for locking failed: ' . $exception->getMessage());
+ }
+ }
+
+ // 2. Try to use Cache Locking (don't use the DB-Cache Locking because it works different!)
+ $cache_driver = Config::get('system', 'cache_driver', 'database');
+ if ($cache_driver != 'database') {
+ try {
+ $lock_driver = CacheDriverFactory::create($cache_driver);
+ if ($lock_driver instanceof IMemoryCacheDriver) {
+ self::$driver = new Lock\CacheLockDriver($lock_driver);