summaryrefslogtreecommitdiffstats
blob: 61357d49ccf2d6f234f011717815e625e600e5fc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
/*
 * Copyright (c) 2010 Remko Tron¨on
 * Licensed under the GNU General Public License v3.
 * See Documentation/Licenses/GPLv3.txt for more information.
 */
/*
 * Copyright (c) 2010, Isode Limited, London, England.
 * All rights reserved.
 */
package com.isode.stroke.network;

import com.isode.stroke.eventloop.Event;
import com.isode.stroke.eventloop.EventLoop;

class JavaTimer extends Timer {

    private class TimerRunnable implements Runnable {

        boolean running_ = true;
        private final EventLoop eventLoop_;
        private final int milliseconds_;

        public TimerRunnable(EventLoop eventLoop, int milliseconds) {
            eventLoop_ = eventLoop;
            milliseconds_ = milliseconds;
        }

        public void run() {
            while (shouldEmit()) {
                try {
                    Thread.sleep(milliseconds_);
                } catch (InterruptedException ex) {
                    /* If we were interrupted, either emit or don't, based on whether stop was called.*/
                }
                if (shouldEmit()) {
                    eventLoop_.postEvent(new Event.Callback() {
                        public void run() {
                            onTick.emit();
                        }
                    });
                }
            }
        }


        synchronized boolean shouldEmit() {
            return running_;
        }

        public synchronized void stop() {
            running_ = false;
        }
    }

    public JavaTimer(EventLoop eventLoop, int milliseconds) {
        timer_ = new TimerRunnable(eventLoop, milliseconds);
    }

    @Override
    public void start() {
        Thread thread = (new Thread(timer_));
        thread.setDaemon(true);
        thread.start();
    }

    @Override
    public void stop() {
        timer_.stop();
        //FIXME: This needs to clear any remaining events out of the EventLoop queue.
    }
    private final TimerRunnable timer_;
}