int rb_write(buffer_t * rb, void * data, int _priority){ (void)_priority; assert(rb->type == RING_BUFFER); if(rb_available(rb) > 0) { memmove(rb->buffer + rb->start*rb->size, data, rb->size); rb->used += 1; rb->start = (rb->start + 1) % rb->n; return 1; } return 0; }
int hb_write(buffer_t * hb, void * data, int priority){ assert(hb->type == HEAP_BUFFER); if(rb_available(hb) > 0){ heap_node_t * n = (heap_node_t*)heap_get(hb, hb->used); n->priority = priority; memmove(n->value, data, hb->size - sizeof(int)); int i = hb->used; hb->used++; while(i > 0){ int j = (i - 1)/2; heap_node_t * pn = (heap_node_t*)heap_get(hb, j); if(n->priority > pn->priority){ __hb_swap(hb, n, pn); i = j; n = pn; }else break; } return 1; } return 0; }
/* process rx data */ void telnet_process_rx(struct telnet_session* telnet, rt_uint8_t *data, rt_size_t length) { rt_size_t rx_length, index; for (index = 0; index < length; index ++) { switch(telnet->state) { case STATE_IAC: if (*data == TELNET_IAC) { /* take semaphore */ rt_sem_take(telnet->rx_ringbuffer_lock, RT_WAITING_FOREVER); /* put buffer to ringbuffer */ rb_putchar(&(telnet->rx_ringbuffer), *data); /* release semaphore */ rt_sem_release(telnet->rx_ringbuffer_lock); telnet->state = STATE_NORMAL; } else { /* set telnet state according to received package */ switch (*data) { case TELNET_WILL: telnet->state = STATE_WILL; break; case TELNET_WONT: telnet->state = STATE_WONT; break; case TELNET_DO: telnet->state = STATE_DO; break; case TELNET_DONT: telnet->state = STATE_DONT; break; default: telnet->state = STATE_NORMAL; break; } } break; /* don't option */ case STATE_WILL: case STATE_WONT: telnet_send_option(telnet, TELNET_DONT, *data); telnet->state = STATE_NORMAL; break; /* won't option */ case STATE_DO: case STATE_DONT: telnet_send_option(telnet, TELNET_WONT, *data); telnet->state = STATE_NORMAL; break; case STATE_NORMAL: if (*data == TELNET_IAC) telnet->state = STATE_IAC; else if (*data != '\r') /* ignore '\r' */ { rt_sem_take(telnet->rx_ringbuffer_lock, RT_WAITING_FOREVER); /* put buffer to ringbuffer */ rb_putchar(&(telnet->rx_ringbuffer), *data); rt_sem_release(telnet->rx_ringbuffer_lock); } break; } data ++; } rt_sem_take(telnet->rx_ringbuffer_lock, RT_WAITING_FOREVER); /* get total size */ rx_length = rb_available(&telnet->rx_ringbuffer); rt_sem_release(telnet->rx_ringbuffer_lock); /* indicate there are reception data */ if ((rx_length > 0) && (telnet->device.rx_indicate != RT_NULL)) telnet->device.rx_indicate(&telnet->device, rx_length); return; }