xref: /plugin/combo/action/eventsystem.php (revision da10f3339e21c2892f45297c0b95d1c9528e60ee)
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