Example #1
0
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;
}
Example #2
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;
}
Example #3
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;
}