~ubuntu-branches/ubuntu/saucy/ricochet/saucy-proposed

« back to all changes in this revision

Viewing changes to ricochet_0.2.orig/timer.5c

  • Committer: Package Import Robot
  • Author(s): Keith Packard
  • Date: 2012-06-11 13:37:57 UTC
  • Revision ID: package-import@ubuntu.com-20120611133757-zn0ukd22vz56ymto
Tags: 0.3
* Improve appearance of board
* Fix user list when removing/adding same user

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/*
2
 
 * $Id$
3
 
 *
4
 
 * Copyright © 2003 Keith Packard
5
 
 *
6
 
 * Permission to use, copy, modify, distribute, and sell this software and its
7
 
 * documentation for any purpose is hereby granted without fee, provided that
8
 
 * the above copyright notice appear in all copies and that both that
9
 
 * copyright notice and this permission notice appear in supporting
10
 
 * documentation, and that the name of Keith Packard not be used in
11
 
 * advertising or publicity pertaining to distribution of the software without
12
 
 * specific, written prior permission.  Keith Packard makes no
13
 
 * representations about the suitability of this software for any purpose.  It
14
 
 * is provided "as is" without express or implied warranty.
15
 
 *
16
 
 * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
17
 
 * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
18
 
 * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
19
 
 * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
20
 
 * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
21
 
 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
22
 
 * PERFORMANCE OF THIS SOFTWARE.
23
 
 */
24
 
 
25
 
public namespace Timer {
26
 
    public int start (int expire_delta, int notify_delta,
27
 
                       bool() lock, bool () unlock,
28
 
                       bool() validate,
29
 
                       void(int number) notify,
30
 
                       void() expire) 
31
 
    {
32
 
        int start_time = time();
33
 
        int expire_time = start_time + expire_delta;
34
 
        int notify_time = start_time;
35
 
 
36
 
        void timer () {
37
 
            twixt (lock (); unlock ()) {
38
 
                for (;;) {
39
 
                    if (!validate ())
40
 
                        return;
41
 
 
42
 
                    int now = time ();
43
 
                    int remain = expire_time - now;
44
 
 
45
 
                    if (remain <= 0) 
46
 
                    {
47
 
                        expire ();
48
 
                        return;
49
 
                    }
50
 
                    while (now >= notify_time) {
51
 
                        notify (remain);
52
 
                        notify_time += notify_delta;
53
 
                    }
54
 
                    int delay = notify_time - now;
55
 
                    if (delay > remain)
56
 
                        delay = remain;
57
 
                    twixt (unlock (); lock ())
58
 
                        sleep (delay * 1000);
59
 
                }
60
 
            }
61
 
        }
62
 
 
63
 
        fork timer();
64
 
        return expire_time;
65
 
    }
66
 
}