From bf390762064344fbfdba1be0011762e2af995081 Mon Sep 17 00:00:00 2001 From: fros4943 Date: Wed, 4 Feb 2009 17:49:15 +0000 Subject: [PATCH] added experimental checkpointing functionality: currently only implemented on the sky platform --- apps/shell/Makefile.shell | 3 +- apps/shell/shell-checkpoint.c | 107 ++++++++++++++++++++++++++++++++++ apps/shell/shell-checkpoint.h | 41 +++++++++++++ apps/shell/shell.h | 3 +- core/lib/checkpoint.c | 59 +++++++++++++++++++ core/lib/checkpoint.h | 59 +++++++++++++++++++ 6 files changed, 270 insertions(+), 2 deletions(-) create mode 100644 apps/shell/shell-checkpoint.c create mode 100644 apps/shell/shell-checkpoint.h create mode 100644 core/lib/checkpoint.c create mode 100644 core/lib/checkpoint.h diff --git a/apps/shell/Makefile.shell b/apps/shell/Makefile.shell index d3dd5ec29..deaedeabd 100644 --- a/apps/shell/Makefile.shell +++ b/apps/shell/Makefile.shell @@ -4,7 +4,8 @@ shell_src = shell.c shell-reboot.c \ shell-file.c shell-netfile.c shell-run.c \ shell-rime-ping.c shell-rime-sniff.c shell-rime-netcmd.c \ shell-rime-debug.c shell-coffee.c \ - shell-wget.c shell-httpd.c shell-irc.c + shell-wget.c shell-httpd.c shell-irc.c \ + shell-checkpoint.c #shell-rsh.c shell_dsc = shell-dsc.c diff --git a/apps/shell/shell-checkpoint.c b/apps/shell/shell-checkpoint.c new file mode 100644 index 000000000..30e10c492 --- /dev/null +++ b/apps/shell/shell-checkpoint.c @@ -0,0 +1,107 @@ +/* + * Copyright (c) 2009, Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of the Contiki operating system. + * + * $Id: shell-checkpoint.c,v 1.1 2009/02/04 17:49:15 fros4943 Exp $ + */ + +#include "contiki.h" +#include "shell.h" + +#include "cfs/cfs.h" +#include "cfs/cfs-coffee.h" +#include "lib/checkpoint.h" + +#include + +/*---------------------------------------------------------------------------*/ +PROCESS(shell_checkpoint_process, "checkpoint"); +SHELL_COMMAND(checkpoint_command, + "checkpoint", + "checkpoint : checkpoint local state to file", + &shell_checkpoint_process); +PROCESS(shell_rollback_process, "rollback"); +SHELL_COMMAND(rollback_command, + "rollback", + "rollback : rollback local state from file", + &shell_rollback_process); + +/*---------------------------------------------------------------------------*/ +PROCESS_THREAD(shell_checkpoint_process, ev, data) +{ + int fd = 0; + + PROCESS_BEGIN(); + + /* Make sure file does not already exist */ + cfs_remove(data); + + cfs_coffee_reserve(data, checkpoint_arch_size()); + fd = cfs_open(data, CFS_WRITE); + + if(fd < 0) { + shell_output_str(&checkpoint_command, + "checkpoint: could not open file for writing: ", data); + } else { + shell_output_str(&rollback_command, "checkpoint to: ", data); + checkpoint_checkpoint(fd); + cfs_close(fd); + } + + PROCESS_END(); +} +/*---------------------------------------------------------------------------*/ +PROCESS_THREAD(shell_rollback_process, ev, data) +{ + int fd = 0; + + PROCESS_BEGIN(); + + fd = cfs_open(data, CFS_READ); + + if(fd < 0) { + shell_output_str(&rollback_command, + "rollback: could not open file for reading: ", data); + } else { + shell_output_str(&rollback_command, "rollback from: ", data); + checkpoint_rollback(fd); + cfs_close(fd); + } + + PROCESS_END(); +} +/*---------------------------------------------------------------------------*/ +void +shell_checkpoint_init(void) +{ + checkpoint_init(); + shell_register_command(&checkpoint_command); + shell_register_command(&rollback_command); +} +/*---------------------------------------------------------------------------*/ diff --git a/apps/shell/shell-checkpoint.h b/apps/shell/shell-checkpoint.h new file mode 100644 index 000000000..7daf2d92f --- /dev/null +++ b/apps/shell/shell-checkpoint.h @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2009, Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of the Contiki operating system. + * + * $Id: shell-checkpoint.h,v 1.1 2009/02/04 17:49:15 fros4943 Exp $ + */ + +#ifndef __SHELL_CHECKPOINT_H__ +#define __SHELL_CHECKPOINT_H__ + +#include "shell.h" + +void shell_checkpoint_init(void); + +#endif /* __SHELL_CHECKPOINT_H__ */ diff --git a/apps/shell/shell.h b/apps/shell/shell.h index 94afdadd4..2a829ffdf 100644 --- a/apps/shell/shell.h +++ b/apps/shell/shell.h @@ -28,7 +28,7 @@ * * This file is part of the Contiki operating system. * - * $Id: shell.h,v 1.10 2008/11/09 12:38:02 adamdunkels Exp $ + * $Id: shell.h,v 1.11 2009/02/04 17:49:15 fros4943 Exp $ */ /** @@ -101,6 +101,7 @@ struct shell_input { #include "shell-blink.h" #include "shell-coffee.h" +#include "shell-checkpoint.h" #include "shell-exec.h" #include "shell-file.h" #include "shell-httpd.h" diff --git a/core/lib/checkpoint.c b/core/lib/checkpoint.c new file mode 100644 index 000000000..479d1b860 --- /dev/null +++ b/core/lib/checkpoint.c @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2009, Swedish Institute of Computer Science + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of the Contiki operating system. + * + */ + +/** + * \file + * Checkpoint library. + * \author + * Fredrik Osterlind + */ + +#include "lib/checkpoint.h" + +/*---------------------------------------------------------------------------*/ +void +checkpoint_init(void) +{ + checkpoint_arch_init(); +} +/*---------------------------------------------------------------------------*/ +void +checkpoint_checkpoint(int fd) +{ + checkpoint_arch_checkpoint(fd); +} +/*---------------------------------------------------------------------------*/ +void +checkpoint_rollback(int fd) +{ + checkpoint_arch_rollback(fd); +} diff --git a/core/lib/checkpoint.h b/core/lib/checkpoint.h new file mode 100644 index 000000000..4a8164536 --- /dev/null +++ b/core/lib/checkpoint.h @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2009, Swedish Institute of Computer Science + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of the Contiki operating system. + * + */ + +/** + * \file + * Checkpoint library header. + * \author + * Fredrik Osterlind + */ + +#ifndef CHECKPOINT_H +#define CHECKPOINT_H + +#include "contiki.h" + +void checkpoint_init(void); + +void checkpoint_checkpoint(int fd); + +void checkpoint_rollback(int fd); + +void checkpoint_arch_init(void); + +void checkpoint_arch_checkpoint(int fd); + +void checkpoint_arch_rollback(int fd); + +int checkpoint_arch_size(); + +#endif /* CHECKPOINT_H */