This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

dm365 udp mutilcast

     
  I want to do video udp multicast on the dm365 Platform , within the dvsdk encode demo ,dvsdk_2_10_01_18 ,kernel

release inux-2.6.18_pro500.
 but i found i can not set the udp thread attribute, once i set the udp thread attribute the program will be dead, th codes

are below.
        schedParam.sched_priority = UDPSEND_THREAD_PRIORITY;
        if (pthread_attr_setschedparam(&attr, &schedParam)) {
            ERR("Failed to set scheduler parameters\n");
            cleanup(EXIT_FAILURE);
        }
       
        if (pthread_create(&udpSendThread,&attr,udpSendThrFxn,NULL)) {
             ERR("Failed to create udp send thread\n");
             cleanup(EXIT_FAILURE);
        }
        initMask |= UDPSENDTHREADCREATED;
        ERR("create udp send thread successful \n");


 But when i do not set the attribute the thread could create successful,but after transfer about 2M data between

writer thread and udp send thread, only the udp thread is alive ,the other thread such as capture, video, writer are killed

unaccountable,so no data is generated .I use shared memory buffer like a FIFO to share data between the writer and Udp send

thread. the FIFO code are list below . 
 struct kfifo *kfifo_init(unsigned char *buffer, unsigned int size,pthread_mutex_t *mutex)
{
 struct kfifo *fifo;

 /* size must be a power of 2 */
// BUG_ON(size & (size - 1));

 fifo = malloc(sizeof(struct kfifo));
 if (!fifo)
  return -1;

 fifo->buffer = buffer;
 fifo->size = size;
 fifo->in = fifo->out = 0;
 fifo->lock = mutex;

 return fifo;
}


/**
 * kfifo_alloc - allocates a new FIFO and its internal buffer
 * @size: the size of the internal buffer to be allocated.
 * @gfp_mask: get_free_pages mask, passed to kmalloc()
 * @lock: the lock to be used to protect the fifo buffer
 *
 * The size will be rounded-up to a power of 2.
 */
struct kfifo *kfifo_alloc(unsigned int size,pthread_mutex_t *mutex)
{
 unsigned char *buffer;
 struct kfifo *ret;

 /*
  * round up to the next power of 2, since our 'let the indices
  * wrap' tachnique works only in this case.
  */
  /*
 if (size & (size - 1)) {
  BUG_ON(size > 0x80000000);
  size = roundup_pow_of_two(size);
 } */

 buffer = malloc(size);
 if (!buffer)
  return -1;

 ret = kfifo_init(buffer, size,mutex);

 return ret;
}

/**
 * kfifo_free - frees the FIFO
 * @fifo: the fifo to be freed.
 */
void kfifo_free(struct kfifo *fifo)
{
 free(fifo->buffer);
 free(fifo);
}
//EXPORT_SYMBOL(kfifo_free);

/**
 * __kfifo_put - puts some data into the FIFO, no locking version
 * @fifo: the fifo to be used.
 * @buffer: the data to be added.
 * @len: the length of the data to be added.
 *
 * This function copies at most 'len' bytes from the 'buffer' into
 * the FIFO depending on the free space, and returns the number of
 * bytes copied.
 *
 * Note that with only one concurrent reader and one concurrent
 * writer, you don't need extra locking to use these functions.
 */
unsigned int __kfifo_put(struct kfifo *fifo,
    unsigned char *buffer, unsigned int len)
{
 unsigned int l;

 len = min(len, fifo->size - fifo->in + fifo->out);

 /* first put the data starting from fifo->in to buffer end */
 l = min(len, fifo->size - (fifo->in & (fifo->size - 1)));
 memcpy(fifo->buffer + (fifo->in & (fifo->size - 1)), buffer, l);

 /* then put the rest (if any) at the beginning of the buffer */
 memcpy(fifo->buffer, buffer + l, len - l);

 fifo->in += len;

 return len;
}

/**
 * __kfifo_get - gets some data from the FIFO, no locking version
 * @fifo: the fifo to be used.
 * @buffer: where the data must be copied.
 * @len: the size of the destination buffer.
 *
 * This function copies at most 'len' bytes from the FIFO into the
 * 'buffer' and returns the number of copied bytes.
 *
 * Note that with only one concurrent reader and one concurrent
 * writer, you don't need extra locking to use these functions.
 */
unsigned int __kfifo_get(struct kfifo *fifo,
    unsigned char *buffer, unsigned int len)
{
 unsigned int l;

 len = min(len, fifo->in - fifo->out);

 /* first get the data from fifo->out until the end of the buffer */
 l = min(len, fifo->size - (fifo->out & (fifo->size - 1)));
 memcpy(buffer, fifo->buffer + (fifo->out & (fifo->size - 1)), l);

 /* then get the rest (if any) from the beginning of the buffer */
 memcpy(buffer + l, fifo->buffer, len - l);

 fifo->out += len;

 return len;
}


so I want to know how to set the thread attribute in the encode demo ,and how to send udp mutilcast data realtime,anyone have

better and more simple  suggestion ? If there are any setting on the encode demo about thread management ? thanks a lot !