xref: /plugin/combo/action/eventsystem.php (revision 4d15adcc14acacfdcef0f5f356b5ad038e9e1da9)
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;
15da10f333Sgerardnicouse ComboStrap\ExceptionTimeOut;
16da10f333Sgerardnicouse 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";
27da10f333Sgerardnico    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
40da10f333Sgerardnico        /**
41da10f333Sgerardnico         * https://forum.dokuwiki.org/d/21044-taskrunner-running-multiple-times-eating-the-memory-lock/5
42da10f333Sgerardnico         */
43da10f333Sgerardnico        $controller->register_hook('INDEXER_TASKS_RUN', 'BEFORE', $this, 'lockSystemBefore', array());
44da10f333Sgerardnico        $controller->register_hook('INDEXER_TASKS_RUN', 'AFTER', $this, 'lockSystemAfter', array());
4504fd306cSNickeau
46da10f333Sgerardnico
47da10f333Sgerardnico    }
48da10f333Sgerardnico
49da10f333Sgerardnico    public function lockSystemBefore(Doku_Event $event, $param)
50da10f333Sgerardnico    {
51da10f333Sgerardnico        print 'ComboLockTaskRunner(): Trying to get a lock' . NL;
52da10f333Sgerardnico        self::$taskRunnerlock = Lock::create("combo-taskrunner");
53da10f333Sgerardnico        try {
54da10f333Sgerardnico            self::$taskRunnerlock->acquire();
55da10f333Sgerardnico        } catch (ExceptionTimeOut $e) {
56da10f333Sgerardnico            // process running
57*4d15adccSNico            print 'ComboLockTaskRunner(): Already running, not acquired. Message: ' . $e->getMessage(). NL;
58e311b56eSgerardnico            exit;
59da10f333Sgerardnico        }
60da10f333Sgerardnico        print 'ComboLockTaskRunner(): Locked' . NL;
61da10f333Sgerardnico    }
62da10f333Sgerardnico
63da10f333Sgerardnico    public function lockSystemAfter(Doku_Event $event, $param)
64da10f333Sgerardnico    {
65da10f333Sgerardnico        self::$taskRunnerlock->release();
66da10f333Sgerardnico        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