Fork of Smoothie to port to mbed non-LPC targets.

Dependencies:   mbed

Fork of Smoothie by Stéphane Cachat

Committer:
Michael J. Spencer
Date:
Fri Feb 28 18:52:52 2014 -0800
Revision:
2:1df0b61d3b5a
Update to latest Smoothie.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Michael J. Spencer 2:1df0b61d3b5a 1 /*
Michael J. Spencer 2:1df0b61d3b5a 2 * Copyright (c) 2003, Adam Dunkels.
Michael J. Spencer 2:1df0b61d3b5a 3 * All rights reserved.
Michael J. Spencer 2:1df0b61d3b5a 4 *
Michael J. Spencer 2:1df0b61d3b5a 5 * Redistribution and use in source and binary forms, with or without
Michael J. Spencer 2:1df0b61d3b5a 6 * modification, are permitted provided that the following conditions
Michael J. Spencer 2:1df0b61d3b5a 7 * are met:
Michael J. Spencer 2:1df0b61d3b5a 8 * 1. Redistributions of source code must retain the above copyright
Michael J. Spencer 2:1df0b61d3b5a 9 * notice, this list of conditions and the following disclaimer.
Michael J. Spencer 2:1df0b61d3b5a 10 * 2. Redistributions in binary form must reproduce the above copyright
Michael J. Spencer 2:1df0b61d3b5a 11 * notice, this list of conditions and the following disclaimer in the
Michael J. Spencer 2:1df0b61d3b5a 12 * documentation and/or other materials provided with the distribution.
Michael J. Spencer 2:1df0b61d3b5a 13 * 3. The name of the author may not be used to endorse or promote
Michael J. Spencer 2:1df0b61d3b5a 14 * products derived from this software without specific prior
Michael J. Spencer 2:1df0b61d3b5a 15 * written permission.
Michael J. Spencer 2:1df0b61d3b5a 16 *
Michael J. Spencer 2:1df0b61d3b5a 17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
Michael J. Spencer 2:1df0b61d3b5a 18 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
Michael J. Spencer 2:1df0b61d3b5a 19 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
Michael J. Spencer 2:1df0b61d3b5a 20 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
Michael J. Spencer 2:1df0b61d3b5a 21 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
Michael J. Spencer 2:1df0b61d3b5a 22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
Michael J. Spencer 2:1df0b61d3b5a 23 * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
Michael J. Spencer 2:1df0b61d3b5a 24 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
Michael J. Spencer 2:1df0b61d3b5a 25 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
Michael J. Spencer 2:1df0b61d3b5a 26 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
Michael J. Spencer 2:1df0b61d3b5a 27 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Michael J. Spencer 2:1df0b61d3b5a 28 *
Michael J. Spencer 2:1df0b61d3b5a 29 * This file is part of the uIP TCP/IP stack.
Michael J. Spencer 2:1df0b61d3b5a 30 *
Michael J. Spencer 2:1df0b61d3b5a 31 * $Id: shell.c,v 1.1 2006/06/07 09:43:54 adam Exp $
Michael J. Spencer 2:1df0b61d3b5a 32 *
Michael J. Spencer 2:1df0b61d3b5a 33 */
Michael J. Spencer 2:1df0b61d3b5a 34
Michael J. Spencer 2:1df0b61d3b5a 35 #include "stdlib.h"
Michael J. Spencer 2:1df0b61d3b5a 36 #include "shell.h"
Michael J. Spencer 2:1df0b61d3b5a 37 #include "uip.h"
Michael J. Spencer 2:1df0b61d3b5a 38 #include <string.h>
Michael J. Spencer 2:1df0b61d3b5a 39 #include "checksumm.h"
Michael J. Spencer 2:1df0b61d3b5a 40 #include "utils.h"
Michael J. Spencer 2:1df0b61d3b5a 41 #include "stdio.h"
Michael J. Spencer 2:1df0b61d3b5a 42 #include "stdlib.h"
Michael J. Spencer 2:1df0b61d3b5a 43 #include "telnetd.h"
Michael J. Spencer 2:1df0b61d3b5a 44 #include "CallbackStream.h"
Michael J. Spencer 2:1df0b61d3b5a 45 #include "Kernel.h"
Michael J. Spencer 2:1df0b61d3b5a 46
Michael J. Spencer 2:1df0b61d3b5a 47 //#define DEBUG_PRINTF(...)
Michael J. Spencer 2:1df0b61d3b5a 48 #define DEBUG_PRINTF printf
Michael J. Spencer 2:1df0b61d3b5a 49
Michael J. Spencer 2:1df0b61d3b5a 50 struct ptentry {
Michael J. Spencer 2:1df0b61d3b5a 51 uint16_t command_cs;
Michael J. Spencer 2:1df0b61d3b5a 52 void (* pfunc)(char *str, Shell *sh);
Michael J. Spencer 2:1df0b61d3b5a 53 };
Michael J. Spencer 2:1df0b61d3b5a 54
Michael J. Spencer 2:1df0b61d3b5a 55 #define SHELL_PROMPT "> "
Michael J. Spencer 2:1df0b61d3b5a 56
Michael J. Spencer 2:1df0b61d3b5a 57 /*---------------------------------------------------------------------------*/
Michael J. Spencer 2:1df0b61d3b5a 58 bool Shell::parse(register char *str, struct ptentry *t)
Michael J. Spencer 2:1df0b61d3b5a 59 {
Michael J. Spencer 2:1df0b61d3b5a 60 struct ptentry *p;
Michael J. Spencer 2:1df0b61d3b5a 61 for (p = t; p->command_cs != 0; ++p) {
Michael J. Spencer 2:1df0b61d3b5a 62 if (get_checksum(str) == p->command_cs) {
Michael J. Spencer 2:1df0b61d3b5a 63 break;
Michael J. Spencer 2:1df0b61d3b5a 64 }
Michael J. Spencer 2:1df0b61d3b5a 65 }
Michael J. Spencer 2:1df0b61d3b5a 66
Michael J. Spencer 2:1df0b61d3b5a 67 p->pfunc(str, this);
Michael J. Spencer 2:1df0b61d3b5a 68
Michael J. Spencer 2:1df0b61d3b5a 69 return p->command_cs != 0;
Michael J. Spencer 2:1df0b61d3b5a 70 }
Michael J. Spencer 2:1df0b61d3b5a 71 /*---------------------------------------------------------------------------*/
Michael J. Spencer 2:1df0b61d3b5a 72 static void help(char *str, Shell *sh)
Michael J. Spencer 2:1df0b61d3b5a 73 {
Michael J. Spencer 2:1df0b61d3b5a 74 sh->output("Available commands: All others are passed on\n");
Michael J. Spencer 2:1df0b61d3b5a 75 sh->output("netstat - show network info\n");
Michael J. Spencer 2:1df0b61d3b5a 76 sh->output("? - show network help\n");
Michael J. Spencer 2:1df0b61d3b5a 77 sh->output("help - show command help\n");
Michael J. Spencer 2:1df0b61d3b5a 78 sh->output("exit, quit - exit shell\n");
Michael J. Spencer 2:1df0b61d3b5a 79 }
Michael J. Spencer 2:1df0b61d3b5a 80
Michael J. Spencer 2:1df0b61d3b5a 81 /*---------------------------------------------------------------------------*/
Michael J. Spencer 2:1df0b61d3b5a 82 static const char *states[] = {
Michael J. Spencer 2:1df0b61d3b5a 83 "CLOSED",
Michael J. Spencer 2:1df0b61d3b5a 84 "SYN_RCVD",
Michael J. Spencer 2:1df0b61d3b5a 85 "SYN_SENT",
Michael J. Spencer 2:1df0b61d3b5a 86 "ESTABLISHED",
Michael J. Spencer 2:1df0b61d3b5a 87 "FIN_WAIT_1",
Michael J. Spencer 2:1df0b61d3b5a 88 "FIN_WAIT_2",
Michael J. Spencer 2:1df0b61d3b5a 89 "CLOSING",
Michael J. Spencer 2:1df0b61d3b5a 90 "TIME_WAIT",
Michael J. Spencer 2:1df0b61d3b5a 91 "LAST_ACK",
Michael J. Spencer 2:1df0b61d3b5a 92 "NONE",
Michael J. Spencer 2:1df0b61d3b5a 93 "RUNNING",
Michael J. Spencer 2:1df0b61d3b5a 94 "CALLED"
Michael J. Spencer 2:1df0b61d3b5a 95 };
Michael J. Spencer 2:1df0b61d3b5a 96 static void connections(char *str, Shell *sh)
Michael J. Spencer 2:1df0b61d3b5a 97 {
Michael J. Spencer 2:1df0b61d3b5a 98 char istr[128];
Michael J. Spencer 2:1df0b61d3b5a 99 struct uip_conn *connr;
Michael J. Spencer 2:1df0b61d3b5a 100 snprintf(istr, sizeof(istr), "Initial MSS: %d, MSS: %d\n", uip_initialmss(), uip_mss());
Michael J. Spencer 2:1df0b61d3b5a 101 sh->output(istr);
Michael J. Spencer 2:1df0b61d3b5a 102 sh->output("Current connections: \n");
Michael J. Spencer 2:1df0b61d3b5a 103
Michael J. Spencer 2:1df0b61d3b5a 104 for (connr = &uip_conns[0]; connr <= &uip_conns[UIP_CONNS - 1]; ++connr) {
Michael J. Spencer 2:1df0b61d3b5a 105 if(connr->tcpstateflags != UIP_CLOSED) {
Michael J. Spencer 2:1df0b61d3b5a 106 snprintf(istr, sizeof(istr), "%d, %u.%u.%u.%u:%u, %s, %u, %u, %c %c\n",
Michael J. Spencer 2:1df0b61d3b5a 107 HTONS(connr->lport),
Michael J. Spencer 2:1df0b61d3b5a 108 uip_ipaddr1(connr->ripaddr), uip_ipaddr2(connr->ripaddr), uip_ipaddr3(connr->ripaddr), uip_ipaddr4(connr->ripaddr),
Michael J. Spencer 2:1df0b61d3b5a 109 HTONS(connr->rport),
Michael J. Spencer 2:1df0b61d3b5a 110 states[connr->tcpstateflags & UIP_TS_MASK],
Michael J. Spencer 2:1df0b61d3b5a 111 connr->nrtx,
Michael J. Spencer 2:1df0b61d3b5a 112 connr->timer,
Michael J. Spencer 2:1df0b61d3b5a 113 (uip_outstanding(connr)) ? '*' : ' ',
Michael J. Spencer 2:1df0b61d3b5a 114 (uip_stopped(connr)) ? '!' : ' ');
Michael J. Spencer 2:1df0b61d3b5a 115
Michael J. Spencer 2:1df0b61d3b5a 116 sh->output(istr);
Michael J. Spencer 2:1df0b61d3b5a 117 }
Michael J. Spencer 2:1df0b61d3b5a 118 }
Michael J. Spencer 2:1df0b61d3b5a 119 }
Michael J. Spencer 2:1df0b61d3b5a 120
Michael J. Spencer 2:1df0b61d3b5a 121 static void quit(char *str, Shell *sh)
Michael J. Spencer 2:1df0b61d3b5a 122 {
Michael J. Spencer 2:1df0b61d3b5a 123 sh->close();
Michael J. Spencer 2:1df0b61d3b5a 124 }
Michael J. Spencer 2:1df0b61d3b5a 125
Michael J. Spencer 2:1df0b61d3b5a 126 //#include "clock.h"
Michael J. Spencer 2:1df0b61d3b5a 127 static void test(char *str, Shell *sh)
Michael J. Spencer 2:1df0b61d3b5a 128 {
Michael J. Spencer 2:1df0b61d3b5a 129 printf("In Test\n");
Michael J. Spencer 2:1df0b61d3b5a 130
Michael J. Spencer 2:1df0b61d3b5a 131 // struct timer t;
Michael J. Spencer 2:1df0b61d3b5a 132 // u16_t ticks= CLOCK_SECOND*5;
Michael J. Spencer 2:1df0b61d3b5a 133 // timer_set(&t, ticks);
Michael J. Spencer 2:1df0b61d3b5a 134 // printf("Wait....\n");
Michael J. Spencer 2:1df0b61d3b5a 135 // while(!timer_expired(&t)) {
Michael J. Spencer 2:1df0b61d3b5a 136
Michael J. Spencer 2:1df0b61d3b5a 137 // }
Michael J. Spencer 2:1df0b61d3b5a 138 // printf("Done\n");
Michael J. Spencer 2:1df0b61d3b5a 139 /*
Michael J. Spencer 2:1df0b61d3b5a 140 const char *fn= "/sd/test6.txt";
Michael J. Spencer 2:1df0b61d3b5a 141 uint16_t *buf= (uint16_t *)malloc(200*2);
Michael J. Spencer 2:1df0b61d3b5a 142 int cnt= 0;
Michael J. Spencer 2:1df0b61d3b5a 143 FILE *fp;
Michael J. Spencer 2:1df0b61d3b5a 144 for(int i=0;i<10;i++) {
Michael J. Spencer 2:1df0b61d3b5a 145 fp= fopen(fn, i == 0 ? "w" : "a");
Michael J. Spencer 2:1df0b61d3b5a 146 if(fp == NULL) {
Michael J. Spencer 2:1df0b61d3b5a 147 printf("failed to open file\n");
Michael J. Spencer 2:1df0b61d3b5a 148 return;
Michael J. Spencer 2:1df0b61d3b5a 149 }
Michael J. Spencer 2:1df0b61d3b5a 150 for (int x = 0; x < 200; ++x) {
Michael J. Spencer 2:1df0b61d3b5a 151 buf[x]= x+cnt;
Michael J. Spencer 2:1df0b61d3b5a 152 }
Michael J. Spencer 2:1df0b61d3b5a 153 cnt+=200;
Michael J. Spencer 2:1df0b61d3b5a 154 int n= fwrite(buf, 2, 200, fp);
Michael J. Spencer 2:1df0b61d3b5a 155 printf("wrote %d, %d\n", i, n);
Michael J. Spencer 2:1df0b61d3b5a 156 fclose(fp);
Michael J. Spencer 2:1df0b61d3b5a 157 }
Michael J. Spencer 2:1df0b61d3b5a 158
Michael J. Spencer 2:1df0b61d3b5a 159 fp= fopen(fn, "r");
Michael J. Spencer 2:1df0b61d3b5a 160 if(fp == NULL) {
Michael J. Spencer 2:1df0b61d3b5a 161 printf("failed to open file for read\n");
Michael J. Spencer 2:1df0b61d3b5a 162 return;
Michael J. Spencer 2:1df0b61d3b5a 163 }
Michael J. Spencer 2:1df0b61d3b5a 164 printf("Opened file %s for read\n", fn);
Michael J. Spencer 2:1df0b61d3b5a 165 do {
Michael J. Spencer 2:1df0b61d3b5a 166 int n= fread(buf, 2, 200, fp);
Michael J. Spencer 2:1df0b61d3b5a 167 if(n <= 0) break;
Michael J. Spencer 2:1df0b61d3b5a 168 for(int x=0;x<n;x++) {
Michael J. Spencer 2:1df0b61d3b5a 169 printf("%04X, ", buf[x]);
Michael J. Spencer 2:1df0b61d3b5a 170 }
Michael J. Spencer 2:1df0b61d3b5a 171 }while(1);
Michael J. Spencer 2:1df0b61d3b5a 172 fclose(fp);
Michael J. Spencer 2:1df0b61d3b5a 173 free(buf);
Michael J. Spencer 2:1df0b61d3b5a 174 */
Michael J. Spencer 2:1df0b61d3b5a 175 }
Michael J. Spencer 2:1df0b61d3b5a 176
Michael J. Spencer 2:1df0b61d3b5a 177 /*---------------------------------------------------------------------------*/
Michael J. Spencer 2:1df0b61d3b5a 178
Michael J. Spencer 2:1df0b61d3b5a 179 static void unknown(char *str, Shell *sh)
Michael J. Spencer 2:1df0b61d3b5a 180 {
Michael J. Spencer 2:1df0b61d3b5a 181 // its some other command, so queue it for mainloop to find
Michael J. Spencer 2:1df0b61d3b5a 182 if (strlen(str) > 0) {
Michael J. Spencer 2:1df0b61d3b5a 183 CommandQueue::getInstance()->add(str, sh->getStream());
Michael J. Spencer 2:1df0b61d3b5a 184 }
Michael J. Spencer 2:1df0b61d3b5a 185 }
Michael J. Spencer 2:1df0b61d3b5a 186 /*---------------------------------------------------------------------------*/
Michael J. Spencer 2:1df0b61d3b5a 187 static struct ptentry parsetab[] = {
Michael J. Spencer 2:1df0b61d3b5a 188 {CHECKSUM("netstat"), connections},
Michael J. Spencer 2:1df0b61d3b5a 189 {CHECKSUM("exit"), quit},
Michael J. Spencer 2:1df0b61d3b5a 190 {CHECKSUM("quit"), quit},
Michael J. Spencer 2:1df0b61d3b5a 191 {CHECKSUM("test"), test},
Michael J. Spencer 2:1df0b61d3b5a 192 {CHECKSUM("?"), help},
Michael J. Spencer 2:1df0b61d3b5a 193
Michael J. Spencer 2:1df0b61d3b5a 194 /* Default action */
Michael J. Spencer 2:1df0b61d3b5a 195 {0, unknown}
Michael J. Spencer 2:1df0b61d3b5a 196 };
Michael J. Spencer 2:1df0b61d3b5a 197 /*---------------------------------------------------------------------------*/
Michael J. Spencer 2:1df0b61d3b5a 198 // this callback gets the results of a command, line by line
Michael J. Spencer 2:1df0b61d3b5a 199 // NULL means command completed
Michael J. Spencer 2:1df0b61d3b5a 200 // static
Michael J. Spencer 2:1df0b61d3b5a 201 int Shell::command_result(const char *str, void *p)
Michael J. Spencer 2:1df0b61d3b5a 202 {
Michael J. Spencer 2:1df0b61d3b5a 203 // FIXME problem when shell is deleted and this gets called from slow command
Michael J. Spencer 2:1df0b61d3b5a 204 // need a way to know this shell was closed or deleted
Michael J. Spencer 2:1df0b61d3b5a 205 Shell *sh = (Shell *)p;
Michael J. Spencer 2:1df0b61d3b5a 206 if (str == NULL) {
Michael J. Spencer 2:1df0b61d3b5a 207 // indicates command is complete
Michael J. Spencer 2:1df0b61d3b5a 208 // only prompt when command is completed
Michael J. Spencer 2:1df0b61d3b5a 209 sh->telnet->output_prompt(SHELL_PROMPT);
Michael J. Spencer 2:1df0b61d3b5a 210 return 0;
Michael J. Spencer 2:1df0b61d3b5a 211
Michael J. Spencer 2:1df0b61d3b5a 212 } else {
Michael J. Spencer 2:1df0b61d3b5a 213 if (sh->telnet->can_output()) {
Michael J. Spencer 2:1df0b61d3b5a 214 if (sh->telnet->output(str) == -1) return -1; // connection was closed
Michael J. Spencer 2:1df0b61d3b5a 215 return 1;
Michael J. Spencer 2:1df0b61d3b5a 216 }
Michael J. Spencer 2:1df0b61d3b5a 217 // we are stalled
Michael J. Spencer 2:1df0b61d3b5a 218 return 0;
Michael J. Spencer 2:1df0b61d3b5a 219 }
Michael J. Spencer 2:1df0b61d3b5a 220 }
Michael J. Spencer 2:1df0b61d3b5a 221
Michael J. Spencer 2:1df0b61d3b5a 222 /*---------------------------------------------------------------------------*/
Michael J. Spencer 2:1df0b61d3b5a 223 void Shell::start()
Michael J. Spencer 2:1df0b61d3b5a 224 {
Michael J. Spencer 2:1df0b61d3b5a 225 telnet->output("Smoothie command shell\r\n> ");
Michael J. Spencer 2:1df0b61d3b5a 226 }
Michael J. Spencer 2:1df0b61d3b5a 227
Michael J. Spencer 2:1df0b61d3b5a 228 int Shell::queue_size()
Michael J. Spencer 2:1df0b61d3b5a 229 {
Michael J. Spencer 2:1df0b61d3b5a 230 return CommandQueue::getInstance()->size();
Michael J. Spencer 2:1df0b61d3b5a 231 }
Michael J. Spencer 2:1df0b61d3b5a 232 /*---------------------------------------------------------------------------*/
Michael J. Spencer 2:1df0b61d3b5a 233 void Shell::input(char *cmd)
Michael J. Spencer 2:1df0b61d3b5a 234 {
Michael J. Spencer 2:1df0b61d3b5a 235 if (parse(cmd, parsetab)) {
Michael J. Spencer 2:1df0b61d3b5a 236 telnet->output_prompt(SHELL_PROMPT);
Michael J. Spencer 2:1df0b61d3b5a 237 }
Michael J. Spencer 2:1df0b61d3b5a 238 }
Michael J. Spencer 2:1df0b61d3b5a 239 /*---------------------------------------------------------------------------*/
Michael J. Spencer 2:1df0b61d3b5a 240
Michael J. Spencer 2:1df0b61d3b5a 241 int Shell::output(const char *str)
Michael J. Spencer 2:1df0b61d3b5a 242 {
Michael J. Spencer 2:1df0b61d3b5a 243 return telnet->output(str);
Michael J. Spencer 2:1df0b61d3b5a 244 }
Michael J. Spencer 2:1df0b61d3b5a 245
Michael J. Spencer 2:1df0b61d3b5a 246 void Shell::close()
Michael J. Spencer 2:1df0b61d3b5a 247 {
Michael J. Spencer 2:1df0b61d3b5a 248 telnet->close();
Michael J. Spencer 2:1df0b61d3b5a 249 }
Michael J. Spencer 2:1df0b61d3b5a 250
Michael J. Spencer 2:1df0b61d3b5a 251 void Shell::setConsole()
Michael J. Spencer 2:1df0b61d3b5a 252 {
Michael J. Spencer 2:1df0b61d3b5a 253 // add it to the kernels output stream if we are a console
Michael J. Spencer 2:1df0b61d3b5a 254 // TODO do we do this for all connections? so pronterface will get file done when playing from M24?
Michael J. Spencer 2:1df0b61d3b5a 255 // then we need to turn it off for the streaming app
Michael J. Spencer 2:1df0b61d3b5a 256 DEBUG_PRINTF("Shell: Adding stream to kernel streams\n");
Michael J. Spencer 2:1df0b61d3b5a 257 THEKERNEL->streams->append_stream(pstream);
Michael J. Spencer 2:1df0b61d3b5a 258 isConsole= true;
Michael J. Spencer 2:1df0b61d3b5a 259 }
Michael J. Spencer 2:1df0b61d3b5a 260
Michael J. Spencer 2:1df0b61d3b5a 261 Shell::Shell(Telnetd *telnet)
Michael J. Spencer 2:1df0b61d3b5a 262 {
Michael J. Spencer 2:1df0b61d3b5a 263 DEBUG_PRINTF("Shell: ctor %p - %p\n", this, telnet);
Michael J. Spencer 2:1df0b61d3b5a 264 this->telnet= telnet;
Michael J. Spencer 2:1df0b61d3b5a 265 // create a callback StreamOutput for this connection
Michael J. Spencer 2:1df0b61d3b5a 266 pstream = new CallbackStream(command_result, this);
Michael J. Spencer 2:1df0b61d3b5a 267 isConsole= false;
Michael J. Spencer 2:1df0b61d3b5a 268 }
Michael J. Spencer 2:1df0b61d3b5a 269
Michael J. Spencer 2:1df0b61d3b5a 270 Shell::~Shell()
Michael J. Spencer 2:1df0b61d3b5a 271 {
Michael J. Spencer 2:1df0b61d3b5a 272 if(isConsole) {
Michael J. Spencer 2:1df0b61d3b5a 273 DEBUG_PRINTF("Shell: Removing stream from kernel streams\n");
Michael J. Spencer 2:1df0b61d3b5a 274 THEKERNEL->streams->remove_stream(pstream);
Michael J. Spencer 2:1df0b61d3b5a 275 }
Michael J. Spencer 2:1df0b61d3b5a 276 // we cannot delete this stream until it is no longer in any command queue entries
Michael J. Spencer 2:1df0b61d3b5a 277 // so mark it as closed, and allow it to delete itself when it is no longer being used
Michael J. Spencer 2:1df0b61d3b5a 278 static_cast<CallbackStream*>(pstream)->mark_closed(); // mark the stream as closed so we do not get any callbacks
Michael J. Spencer 2:1df0b61d3b5a 279 DEBUG_PRINTF("Shell: dtor %p\n", this);
Michael J. Spencer 2:1df0b61d3b5a 280 }