Fork of Smoothie to port to mbed non-LPC targets.
Fork of Smoothie by
libs/Network/uip/CallbackStream.cpp@2:1df0b61d3b5a, 2014-02-28 (annotated)
- 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?
User | Revision | Line number | New contents of line |
---|---|---|---|
Michael J. Spencer |
2:1df0b61d3b5a | 1 | #include "CallbackStream.h" |
Michael J. Spencer |
2:1df0b61d3b5a | 2 | #include "Kernel.h" |
Michael J. Spencer |
2:1df0b61d3b5a | 3 | |
Michael J. Spencer |
2:1df0b61d3b5a | 4 | #define DEBUG_PRINTF std::printf |
Michael J. Spencer |
2:1df0b61d3b5a | 5 | |
Michael J. Spencer |
2:1df0b61d3b5a | 6 | CallbackStream::CallbackStream(cb_t cb, void *u) |
Michael J. Spencer |
2:1df0b61d3b5a | 7 | { |
Michael J. Spencer |
2:1df0b61d3b5a | 8 | DEBUG_PRINTF("Callbackstream ctor: %p\n", this); |
Michael J. Spencer |
2:1df0b61d3b5a | 9 | callback= cb; |
Michael J. Spencer |
2:1df0b61d3b5a | 10 | user= u; |
Michael J. Spencer |
2:1df0b61d3b5a | 11 | closed= false; |
Michael J. Spencer |
2:1df0b61d3b5a | 12 | use_count= 0; |
Michael J. Spencer |
2:1df0b61d3b5a | 13 | } |
Michael J. Spencer |
2:1df0b61d3b5a | 14 | |
Michael J. Spencer |
2:1df0b61d3b5a | 15 | CallbackStream::~CallbackStream() |
Michael J. Spencer |
2:1df0b61d3b5a | 16 | { |
Michael J. Spencer |
2:1df0b61d3b5a | 17 | DEBUG_PRINTF("Callbackstream dtor: %p\n", this); |
Michael J. Spencer |
2:1df0b61d3b5a | 18 | } |
Michael J. Spencer |
2:1df0b61d3b5a | 19 | |
Michael J. Spencer |
2:1df0b61d3b5a | 20 | int CallbackStream::puts(const char *s) |
Michael J. Spencer |
2:1df0b61d3b5a | 21 | { |
Michael J. Spencer |
2:1df0b61d3b5a | 22 | if(closed) return 0; |
Michael J. Spencer |
2:1df0b61d3b5a | 23 | |
Michael J. Spencer |
2:1df0b61d3b5a | 24 | if(s == NULL) return (*callback)(NULL, user); |
Michael J. Spencer |
2:1df0b61d3b5a | 25 | |
Michael J. Spencer |
2:1df0b61d3b5a | 26 | int len = strlen(s); |
Michael J. Spencer |
2:1df0b61d3b5a | 27 | int n; |
Michael J. Spencer |
2:1df0b61d3b5a | 28 | do { |
Michael J. Spencer |
2:1df0b61d3b5a | 29 | // call this streams result callback |
Michael J. Spencer |
2:1df0b61d3b5a | 30 | n= (*callback)(s, user); |
Michael J. Spencer |
2:1df0b61d3b5a | 31 | |
Michael J. Spencer |
2:1df0b61d3b5a | 32 | // if closed just pretend we sent it |
Michael J. Spencer |
2:1df0b61d3b5a | 33 | if(n == -1) { |
Michael J. Spencer |
2:1df0b61d3b5a | 34 | closed= true; |
Michael J. Spencer |
2:1df0b61d3b5a | 35 | return len; |
Michael J. Spencer |
2:1df0b61d3b5a | 36 | |
Michael J. Spencer |
2:1df0b61d3b5a | 37 | }else if(n == 0) { |
Michael J. Spencer |
2:1df0b61d3b5a | 38 | // if output queue is full |
Michael J. Spencer |
2:1df0b61d3b5a | 39 | // call idle until we can output more |
Michael J. Spencer |
2:1df0b61d3b5a | 40 | THEKERNEL->call_event(ON_IDLE); |
Michael J. Spencer |
2:1df0b61d3b5a | 41 | } |
Michael J. Spencer |
2:1df0b61d3b5a | 42 | } while(n == 0); |
Michael J. Spencer |
2:1df0b61d3b5a | 43 | |
Michael J. Spencer |
2:1df0b61d3b5a | 44 | return len; |
Michael J. Spencer |
2:1df0b61d3b5a | 45 | } |
Michael J. Spencer |
2:1df0b61d3b5a | 46 | |
Michael J. Spencer |
2:1df0b61d3b5a | 47 | void CallbackStream::mark_closed() |
Michael J. Spencer |
2:1df0b61d3b5a | 48 | { |
Michael J. Spencer |
2:1df0b61d3b5a | 49 | closed= true; |
Michael J. Spencer |
2:1df0b61d3b5a | 50 | if(use_count <= 0) delete this; |
Michael J. Spencer |
2:1df0b61d3b5a | 51 | } |
Michael J. Spencer |
2:1df0b61d3b5a | 52 | void CallbackStream::dec() |
Michael J. Spencer |
2:1df0b61d3b5a | 53 | { |
Michael J. Spencer |
2:1df0b61d3b5a | 54 | use_count--; |
Michael J. Spencer |
2:1df0b61d3b5a | 55 | if(closed && use_count <= 0) delete this; |
Michael J. Spencer |
2:1df0b61d3b5a | 56 | } |
Michael J. Spencer |
2:1df0b61d3b5a | 57 | |
Michael J. Spencer |
2:1df0b61d3b5a | 58 | extern "C" void *new_callback_stream(cb_t cb, void *u) |
Michael J. Spencer |
2:1df0b61d3b5a | 59 | { |
Michael J. Spencer |
2:1df0b61d3b5a | 60 | return new CallbackStream(cb, u); |
Michael J. Spencer |
2:1df0b61d3b5a | 61 | } |
Michael J. Spencer |
2:1df0b61d3b5a | 62 | |
Michael J. Spencer |
2:1df0b61d3b5a | 63 | extern "C" void delete_callback_stream(void *p) |
Michael J. Spencer |
2:1df0b61d3b5a | 64 | { |
Michael J. Spencer |
2:1df0b61d3b5a | 65 | // we don't delete it in case it is still on the command queue |
Michael J. Spencer |
2:1df0b61d3b5a | 66 | ((CallbackStream*)p)->mark_closed(); |
Michael J. Spencer |
2:1df0b61d3b5a | 67 | } |