From: klueska Date: Sat, 17 May 2008 02:18:09 +0000 (+0000) Subject: Added alternalte PowerManagerP implementation that infinitely retrys on the fail... X-Git-Tag: release_tinyos_2_1_0_0~397 X-Git-Url: https://oss.titaniummirror.com/gitweb/?p=tinyos-2.x.git;a=commitdiff_plain;h=f2dd72f830b2977ea9709c35dddb960eb59e31f3 Added alternalte PowerManagerP implementation that infinitely retrys on the fail of start or stop --- diff --git a/tos/lib/power/InfiniteRetryPowerManagerP.nc b/tos/lib/power/InfiniteRetryPowerManagerP.nc new file mode 100644 index 00000000..48eb1cb2 --- /dev/null +++ b/tos/lib/power/InfiniteRetryPowerManagerP.nc @@ -0,0 +1,135 @@ +/* + * "Copyright (c) 2005 Washington University in St. Louis. + * All rights reserved. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose, without fee, and without written agreement is + * hereby granted, provided that the above copyright notice, the following + * two paragraphs and the author appear in all copies of this software. + * + * IN NO EVENT SHALL WASHINGTON UNIVERSITY IN ST. LOUIS BE LIABLE TO ANY PARTY + * FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING + * OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF WASHINGTON + * UNIVERSITY IN ST. LOUIS HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * WASHINGTON UNIVERSITY IN ST. LOUIS SPECIFICALLY DISCLAIMS ANY WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND WASHINGTON UNIVERSITY IN ST. LOUIS HAS NO + * OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR + * MODIFICATIONS." + * + */ + +/* + * - Revision ------------------------------------------------------------- + * $Revision$ + * $Date$ + * ======================================================================== + */ + +/** + * Please refer to TEP 115 for more information about this component and its + * intended use.

+ * + * This is the internal implementation of the standard power management + * policy for managing the power states of non-virtualized devices. + * Non-virtualized devices are shared using a parameterized Resource + * interface, and are powered down according to some policy whenever there + * are no more pending requests to that Resource. The policy implemented + * by this component is to power down a device as soon as it becomes free. + * Such a policy is useful whenever a device has a negligible wake-up + * latency. There is no cost associated with waiting for the device to + * power up, so it can be powered on and off as often as possible. + * + * @author Kevin Klues (klueska@cs.wustl.edu) + */ + +generic module PowerManagerP() { + uses { + interface StdControl; + interface SplitControl; + + interface PowerDownCleanup; + interface ResourceDefaultOwner; + interface ArbiterInfo; + } +} +implementation { + + norace bool stopping = FALSE; + norace bool requested = FALSE; + + task void startTask() { + if(call StdControl.start() == SUCCESS) + if(call SplitControl.start() == SUCCESS) + return; + post startTask(); + } + + task void stopTask() { + if(call StdControl.stop() == SUCCESS) + if(call SplitControl.stop() == SUCCESS) + return; + post startTask(); + } + + async event void ResourceDefaultOwner.requested() { + if(stopping == FALSE) { + post startTask(); + } + else requested = TRUE; + } + + async event void ResourceDefaultOwner.immediateRequested() { + } + + default command error_t StdControl.start() { + return SUCCESS; + } + default command error_t SplitControl.start() { + signal SplitControl.startDone(SUCCESS); + return SUCCESS; + } + + event void SplitControl.startDone(error_t error) { + if(error != SUCCESS) { + post startTask(); + return; + } + if(call ResourceDefaultOwner.isOwner()) + call ResourceDefaultOwner.release(); + } + + async event void ResourceDefaultOwner.granted() { + atomic stopping = TRUE; + call PowerDownCleanup.cleanup(); + post stopTask(); + } + + event void SplitControl.stopDone(error_t error) { + if(error != SUCCESS) { + post stopTask(); + return; + } + if(requested == TRUE) { + call StdControl.start(); + call SplitControl.start(); + } + atomic { + requested = FALSE; + stopping = FALSE; + } + } + + default command error_t StdControl.stop() { + return SUCCESS; + } + default command error_t SplitControl.stop() { + signal SplitControl.stopDone(SUCCESS); + return SUCCESS; + } + + default async command void PowerDownCleanup.cleanup() { + } +}