104fd306cSNickeau<?php 204fd306cSNickeau/** 304fd306cSNickeau * Copyright (c) 2021. ComboStrap, Inc. and its affiliates. All Rights Reserved. 404fd306cSNickeau * 504fd306cSNickeau * This source code is licensed under the GPL license found in the 604fd306cSNickeau * COPYING file in the root directory of this source tree. 704fd306cSNickeau * 804fd306cSNickeau * @license GPL 3 (https://www.gnu.org/licenses/gpl-3.0.en.html) 904fd306cSNickeau * @author ComboStrap <support@combostrap.com> 1004fd306cSNickeau * 1104fd306cSNickeau * 1204fd306cSNickeau */ 1304fd306cSNickeau 1404fd306cSNickeauuse ComboStrap\Event; 15*da10f333Sgerardnicouse ComboStrap\ExceptionTimeOut; 16*da10f333Sgerardnicouse ComboStrap\Lock; 1704fd306cSNickeau 1804fd306cSNickeau 1904fd306cSNickeau/** 2004fd306cSNickeau * Just start our own event system 2104fd306cSNickeau */ 2204fd306cSNickeauclass action_plugin_combo_eventsystem extends DokuWiki_Action_Plugin 2304fd306cSNickeau{ 2404fd306cSNickeau 2504fd306cSNickeau 2604fd306cSNickeau const CANONICAL = "event"; 27*da10f333Sgerardnico private static Lock $taskRunnerlock; 2804fd306cSNickeau 2904fd306cSNickeau public function register(Doku_Event_Handler $controller) 3004fd306cSNickeau { 3104fd306cSNickeau 3204fd306cSNickeau /** 3304fd306cSNickeau * Process the event table 3404fd306cSNickeau * 3504fd306cSNickeau * We do it after because if there is an error 3604fd306cSNickeau * It will not stop the Dokuwiki Processing 3704fd306cSNickeau */ 3804fd306cSNickeau $controller->register_hook('INDEXER_TASKS_RUN', 'AFTER', $this, 'processEventTable', array()); 3904fd306cSNickeau 40*da10f333Sgerardnico /** 41*da10f333Sgerardnico * https://forum.dokuwiki.org/d/21044-taskrunner-running-multiple-times-eating-the-memory-lock/5 42*da10f333Sgerardnico */ 43*da10f333Sgerardnico $controller->register_hook('INDEXER_TASKS_RUN', 'BEFORE', $this, 'lockSystemBefore', array()); 44*da10f333Sgerardnico $controller->register_hook('INDEXER_TASKS_RUN', 'AFTER', $this, 'lockSystemAfter', array()); 4504fd306cSNickeau 46*da10f333Sgerardnico 47*da10f333Sgerardnico } 48*da10f333Sgerardnico 49*da10f333Sgerardnico public function lockSystemBefore(Doku_Event $event, $param) 50*da10f333Sgerardnico { 51*da10f333Sgerardnico print 'ComboLockTaskRunner(): Trying to get a lock' . NL; 52*da10f333Sgerardnico self::$taskRunnerlock = Lock::create("combo-taskrunner"); 53*da10f333Sgerardnico try { 54*da10f333Sgerardnico self::$taskRunnerlock->acquire(); 55*da10f333Sgerardnico } catch (ExceptionTimeOut $e) { 56*da10f333Sgerardnico // process running 57*da10f333Sgerardnico print 'ComboLockTaskRunner(): Already running, not acquired' . NL; 58*da10f333Sgerardnico return; 59*da10f333Sgerardnico } 60*da10f333Sgerardnico print 'ComboLockTaskRunner(): Locked' . NL; 61*da10f333Sgerardnico } 62*da10f333Sgerardnico 63*da10f333Sgerardnico public function lockSystemAfter(Doku_Event $event, $param) 64*da10f333Sgerardnico { 65*da10f333Sgerardnico self::$taskRunnerlock->release(); 66*da10f333Sgerardnico print 'ComboLockTaskRunner(): Lock Released' . NL; 6704fd306cSNickeau } 6804fd306cSNickeau 6904fd306cSNickeau /** 7004fd306cSNickeau */ 7104fd306cSNickeau public function processEventTable(Doku_Event $event, $param) 7204fd306cSNickeau { 7304fd306cSNickeau 7404fd306cSNickeau 7504fd306cSNickeau /** 7604fd306cSNickeau * Process the async event 7704fd306cSNickeau */ 7804fd306cSNickeau Event::dispatchEvent(); 7904fd306cSNickeau 8004fd306cSNickeau 8104fd306cSNickeau } 8204fd306cSNickeau 8304fd306cSNickeau 8404fd306cSNickeau} 85