1 // 2 // Watchdog.cs: A generic watchdog 3 // 4 // Authors: 5 // Leonardo Taglialegne <leonardo.taglialegne@gmail.com> 6 // 7 // (C) Copyright 2013 Leonardo Taglialegne 8 // 9 // Permission is hereby granted, free of charge, to any person obtaining 10 // a copy of this software and associated documentation files (the 11 // "Software"), to deal in the Software without restriction, including 12 // without limitation the rights to use, copy, modify, merge, publish, 13 // distribute, sublicense, and/or sell copies of the Software, and to 14 // permit persons to whom the Software is furnished to do so, subject to 15 // the following conditions: 16 // 17 // The above copyright notice and this permission notice shall be 18 // included in all copies or substantial portions of the Software. 19 // 20 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 21 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 22 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 23 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 24 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 25 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 26 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 27 // 28 29 using System.Timers; 30 31 namespace Mono.WebServer.FastCgi 32 { 33 class Watchdog 34 { 35 /// <summary> 36 /// Gets the timeout. 37 /// </summary> 38 /// <value>The timeout, in milliseconds.</value> 39 public double Timeout { 40 get; 41 private set; 42 } 43 44 public event ElapsedEventHandler End; 45 46 Timer timer; 47 48 readonly object end_lock = new object (); 49 50 bool ended; 51 52 /// <param name="timeout">Timeout, in milliseconds.</param> Watchdog(double timeout)53 public Watchdog(double timeout) 54 { 55 Timeout = timeout; 56 timer = CreateTimer (timeout); 57 } 58 Kick()59 public void Kick() 60 { 61 lock (end_lock) { 62 if (ended) 63 return; 64 65 timer.Dispose (); 66 timer = CreateTimer (Timeout); 67 } 68 } 69 CreateTimer(double timeout)70 Timer CreateTimer (double timeout) 71 { 72 var toret = new Timer (timeout) { 73 AutoReset = false 74 }; 75 toret.Elapsed += (sender, args) => { 76 lock (end_lock) { 77 ended = true; 78 } 79 if (End != null) 80 End (sender, args); 81 }; 82 toret.Start (); 83 return toret; 84 } 85 } 86 } 87