您当前的位置:首页 > IT编程 > C++
| C语言 | Java | VB | VC | python | Android | TensorFlow | C++ | oracle | 学术与代码 | cnn卷积神经网络 | gnn | 图像修复 | Keras | 数据集 | Neo4j | 自然语言处理 | 深度学习 | 医学CAD | 医学影像 | 超参数 | pointnet | pytorch | 异常检测 | Transformers | 情感分类 | 知识图谱 |

自学教程:C++ wake_up_interruptible_sync函数代码示例

51自学网 2021-06-03 09:51:43
  C++
这篇教程C++ wake_up_interruptible_sync函数代码示例写得很实用,希望能帮到您。

本文整理汇总了C++中wake_up_interruptible_sync函数的典型用法代码示例。如果您正苦于以下问题:C++ wake_up_interruptible_sync函数的具体用法?C++ wake_up_interruptible_sync怎么用?C++ wake_up_interruptible_sync使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。

在下文中一共展示了wake_up_interruptible_sync函数的29个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的C++代码示例。

示例1: OUTPUT_Flush

/* *  @fn OS_STATUS  OUTPUT_Flush() * *  @brief  Flush the module buffers and sample buffers * *  @return OS_STATUS  * *  For each CPU in the system, set buffer full to the byte count to flush. *  Flush the modules buffer, as well. * */extern int OUTPUT_Flush (    VOID){    int        i;    int        writers = 0;    OUTPUT     outbuf;    /*     *  Flush all remaining data to files     *  set up a flush event     */    init_waitqueue_head(&flush_queue);    SEP_PRINT_DEBUG("flush: waiting for %d writers/n",(GLOBAL_STATE_num_cpus(driver_state)+ OTHER_C_DEVICES));    for (i = 0; i < GLOBAL_STATE_num_cpus(driver_state); i++) {        if (CPU_STATE_initial_mask(&pcb[i]) == 0) {            continue;        }        outbuf = &(cpu_buf[i].outbuf);        writers += 1;        OUTPUT_buffer_full(outbuf,OUTPUT_current_buffer(outbuf)) =             OUTPUT_total_buffer_size(outbuf) - OUTPUT_remaining_buffer_size(outbuf);    }    atomic_set(&flush_writers, writers + OTHER_C_DEVICES);       // Flip the switch to terminate the output threads    // Do not do this earlier, as threads may terminate before all the data is flushed    flush = 1;    for (i = 0; i < GLOBAL_STATE_num_cpus(driver_state); i++) {        if (CPU_STATE_initial_mask(&pcb[i]) == 0) {            continue;        }        outbuf = &BUFFER_DESC_outbuf(&cpu_buf[i]);        OUTPUT_buffer_full(outbuf,OUTPUT_current_buffer(outbuf)) =             OUTPUT_total_buffer_size(outbuf) - OUTPUT_remaining_buffer_size(outbuf);        wake_up_interruptible_sync(&BUFFER_DESC_queue(&cpu_buf[i]));    }    // Flush all data from the module buffers    outbuf = &BUFFER_DESC_outbuf(module_buf);    OUTPUT_buffer_full(outbuf,OUTPUT_current_buffer(outbuf)) =                               OUTPUT_total_buffer_size(outbuf) - OUTPUT_remaining_buffer_size(outbuf);    SEP_PRINT_DEBUG("OUTPUT_Flush - waking up module_queue/n");    wake_up_interruptible_sync(&BUFFER_DESC_queue(module_buf));    //Wait for buffers to empty    if (wait_event_interruptible(flush_queue, atomic_read(&flush_writers)==0)) {        return OS_RESTART_SYSCALL;    }    SEP_PRINT_DEBUG("OUTPUT_Flush - awakened from flush_queue/n");    flush = 0;    return 0;}
开发者ID:nel82,项目名称:android_zenfone4_JB,代码行数:66,


示例2: videobuf_queue_cancel

/* Locking: Caller holds q->vb_lock */void videobuf_queue_cancel(struct videobuf_queue *q){	unsigned long flags = 0;	int i;	q->streaming = 0;	q->reading  = 0;	wake_up_interruptible_sync(&q->wait);	/* remove queued buffers from list */	spin_lock_irqsave(q->irqlock, flags);	for (i = 0; i < VIDEO_MAX_FRAME; i++) {		if (NULL == q->bufs[i])			continue;		if (q->bufs[i]->state == VIDEOBUF_QUEUED) {			list_del(&q->bufs[i]->queue);			q->bufs[i]->state = VIDEOBUF_ERROR;			wake_up_all(&q->bufs[i]->done);		}	}	spin_unlock_irqrestore(q->irqlock, flags);	/* free all buffers + clear queue */	for (i = 0; i < VIDEO_MAX_FRAME; i++) {		if (NULL == q->bufs[i])			continue;		q->ops->buf_release(q, q->bufs[i]);	}	INIT_LIST_HEAD(&q->stream);}
开发者ID:Anjali05,项目名称:linux,代码行数:31,


示例3: IO_irq_release

int IO_irq_release(struct inode *inode, struct file *filp){		free_irq(IO_irq_devices->IO_irq1, NULL);	free_irq(IO_irq_devices->IO_irq2, NULL);	free_irq(IO_irq_devices->IO_irq3, NULL);	free_irq(IO_irq_devices->IO_irq4, NULL);	s3c2410_gpio_cfgpin(S3C2410_GPG11, S3C2410_GPG11_INP);	s3c2410_gpio_cfgpin(S3C2410_GPG3, S3C2410_GPG3_INP);	s3c2410_gpio_cfgpin(S3C2410_GPF2, S3C2410_GPF2_INP);	s3c2410_gpio_cfgpin(S3C2410_GPF0, S3C2410_GPF0_INP);	IO_irq_devices->IO_status = 0 ;	tasklet_kill(&keytask);	if(!cancel_delayed_work(&irq_work_delay)) flush_workqueue(tekkamanwork);	destroy_workqueue(tekkamanwork);		kfifo_free(tekkamanfifo);	kfree(tekkamantmp);	kfree(tekkamanbuf);	atomic_inc(&IO_irq_available); /* release the device */	wake_up_interruptible_sync(&IO_irq_wait); /* awake other uid's */	printk( "IO_irq: release !  /n");	return 0;}
开发者ID:cutecheng,项目名称:rounder,代码行数:27,


示例4: videobuf_streamon

int videobuf_streamon(struct videobuf_queue *q){	struct videobuf_buffer *buf;	unsigned long flags = 0;	int retval;	videobuf_queue_lock(q);	retval = -EBUSY;	if (q->reading)		goto done;	retval = 0;	if (q->streaming)		goto done;	q->streaming = 1;	spin_lock_irqsave(q->irqlock, flags);	list_for_each_entry(buf, &q->stream, stream)		if (buf->state == VIDEOBUF_PREPARED)			q->ops->buf_queue(q, buf);	spin_unlock_irqrestore(q->irqlock, flags);	wake_up_interruptible_sync(&q->wait);done:	videobuf_queue_unlock(q);	return retval;}
开发者ID:Anjali05,项目名称:linux,代码行数:25,


示例5: ipp_test_complete

void ipp_test_complete(int retval){	printk("ipp_test_complete retval=%d/n",retval);	if(retval==0)	{		test_condition = 1;		wake_up_interruptible_sync(&test_queue);	}}
开发者ID:Dee-UK,项目名称:RK3188_KK_4.4.02_Beta,代码行数:9,


示例6: proc_insertBuff

// insert a written block.int proc_insertBuff(int index,int pathIndex,struct block *buff,loff_t pos, size_t count,context *ct){	loff_t* f_pos,spos;	size_t left = count, wrt;	int ret;	if(RELEASE(index)) return count;	if(pathIndex==INDEX_PATH_NUM) {		spos = ((pipes[index].ct)[CONTEXT]).bpos + pos;	} else {		spos=pos;	}					f_pos=(loff_t *)&spos;			while(1) {		Down(index);		wrt = left;		ret = dev_insertBuff(&((pipes[index]).device), f_pos,buff, &left, ct);		if(pathIndex==INDEX_PATH_NUM)			POS(ct)=*f_pos-((pipes[index].ct)[CONTEXT]).bpos;		else			POS(ct)=*f_pos;					if(ret == DEV_FAULT) {Up(index); return -EFAULT;}		if(wrt && !R_ABLE(ct)) {			R_ABLE(ct) = 1;			if(ret == DEV_SEEK) {				wake_up_interruptible_sync(&(RQ(index)));			}			else {				wake_up_interruptible(&(RQ(index)));			}		}		if(ret == DEV_SEEK) {Up(index); return -P_ESEEK;}		if(ret == DEV_FULL) {			W_ABLE(ct) = 0; Up(index);			PDEBUG("<%d>: device full, sleep, left %d/n", current->pid, (int)left);			Wait_Event(WQ(index), RELEASE(index)||W_ABLE(ct));			if(RELEASE(index)) return count;			continue;		}		Up(index);		if(left <= 0) break;	}	return count;}
开发者ID:NikhilNJ,项目名称:screenplay-dx,代码行数:55,


示例7: __wake_up_parent

/* * Joy. Or not. Pthread wants us to wake up every thread * in our parent group. */static void __wake_up_parent(struct task_struct *p,				    struct task_struct *parent){	struct task_struct *tsk = parent;	/*	 * Fortunately this is not necessary for thread groups:	 */	if (p->tgid == tsk->tgid) {		wake_up_interruptible_sync(&tsk->wait_chldexit);		return;	}	do {		wake_up_interruptible_sync(&tsk->wait_chldexit);		tsk = next_thread(tsk);		if (tsk->signal != parent->signal)			BUG();	} while (tsk != parent);}
开发者ID:dwrudis,项目名称:clustermatic,代码行数:24,


示例8: OUTPUT_Reserve_Buffer_Space

/*! *  @fn  int OUTPUT_Reserve_Buffer_Space (OUTPUT      outbuf, *                                        U32         size) * *  @param  outbuf        IN output buffer to manipulate *  @param  size          IN The size of data to reserve * *  @result outloc - to the location where data is to be written * *  Reserve space in the output buffers for data.  If a buffer is full, *  signal the caller that the flush routine needs to be called. * * <I>Special Notes:</I> * */extern void* OUTPUT_Reserve_Buffer_Space (    BUFFER_DESC  bd,    U32          size){    int     signal_full = FALSE;    char   *outloc      = NULL;    OUTPUT  outbuf      = &BUFFER_DESC_outbuf(bd);    if (OUTPUT_remaining_buffer_size(outbuf) >= size) {        outloc = (OUTPUT_buffer(outbuf,OUTPUT_current_buffer(outbuf)) +           (OUTPUT_total_buffer_size(outbuf) - OUTPUT_remaining_buffer_size(outbuf)));    }    else {        U32  i, j, start;        OUTPUT_buffer_full(outbuf,OUTPUT_current_buffer(outbuf)) =                 OUTPUT_total_buffer_size(outbuf) - OUTPUT_remaining_buffer_size(outbuf);        //        // Massive Naive assumption:  Must find a way to fix it.        // In spite of the loop.        // The next buffer to fill are monotonically increasing        // indicies.        //        signal_full = TRUE;        start = OUTPUT_current_buffer(outbuf);         for (i = start+1; i < start+OUTPUT_NUM_BUFFERS; i++) {            j = i%OUTPUT_NUM_BUFFERS;            if (!OUTPUT_buffer_full(outbuf,j)) {                OUTPUT_current_buffer(outbuf) = j;                OUTPUT_remaining_buffer_size(outbuf) = OUTPUT_total_buffer_size(outbuf);                 outloc = OUTPUT_buffer(outbuf,j);            }            else {                signal_full = FALSE;            }        }    }    if (outloc) {        OUTPUT_remaining_buffer_size(outbuf) -= size;        memset(outloc, 0, size);    }#if !defined(CONFIG_PREEMPT_RT)    if (signal_full) {        wake_up_interruptible_sync(&BUFFER_DESC_queue(bd));    }#endif    return outloc;}
开发者ID:nel82,项目名称:android_zenfone4_JB,代码行数:68,


示例9: scull_w_release

static int scull_w_release(struct inode *inode, struct file *filp) {    int temp;    spin_lock(&scull_w_lock);    scull_w_count--;    temp = scull_w_count;    spin_unlock(&scull_w_lock);    if (temp == 0)        wake_up_interruptible_sync(&scull_w_wait);    return 0;}
开发者ID:Wysaat,项目名称:drivers,代码行数:12,


示例10: IO_mem_release

int IO_mem_release(struct inode *inode, struct file *filp){	iowrite32((u32) gpjcon_old ,io_addr);	iowrite32((u32) gpjdat_old ,io_addr+4);	iowrite32((u32) gpjup_old ,io_addr+8);	iounmap((void *)io_addr);//	ioport_unmap((void *)io_addr);   /*WARNING: "ioport_unmap"  undefined!  Don't use it*/	atomic_inc(&IO_mem_available); /* release the device */	wake_up_interruptible_sync(&IO_mem_wait); /* awake other uid's */	return 0;}
开发者ID:cutecheng,项目名称:rounder,代码行数:13,


示例11: smsdvb_stats_release

static int smsdvb_stats_release(struct inode *inode, struct file *file){	struct smsdvb_debugfs *debug_data = file->private_data;	spin_lock(&debug_data->lock);	debug_data->stats_was_read = true;	/* return EOF to read() */	spin_unlock(&debug_data->lock);	wake_up_interruptible_sync(&debug_data->stats_queue);	kref_put(&debug_data->refcount, smsdvb_debugfs_data_release);	file->private_data = NULL;	return 0;}
开发者ID:pipecivil,项目名称:media_build-bst,代码行数:14,


示例12: device_close

static int device_close(struct inode *i, struct file *f){    int temp;    spin_lock(&lock);    count--;    temp = count;    spin_unlock(&lock);    if (temp == 0)        wake_up_interruptible_sync(&wait); /* awake other uid's */    printk(KERN_INFO "Driver: close()/n");    return 0;}
开发者ID:yatendrakumar,项目名称:Important_Links,代码行数:14,


示例13: rk29_ipp_irq

static irqreturn_t rk29_ipp_irq(int irq,  void *dev_id){	DBG("rk29_ipp_irq %d /n",irq);	//printk("rk29_ipp_irq %d /n",irq);#ifdef IPP_TEST	hw_end = ktime_get();#endif	ipp_write(ipp_read(IPP_INT)|0x3c, IPP_INT);	if(((ipp_read(IPP_INT)>>6)&0x3) !=0)// idle	{			printk("IPP is not idle!/n");		ipp_soft_reset();		drvdata->ipp_result =  -EAGAIN;	}		//interacting with hardware done	wq_condition = 1;	#ifdef IPP_TEST	irq_start = ktime_get();#endif	if(drvdata->issync)//sync	{		//wake_up_interruptible_sync(&hw_wait_queue);		wake_up(&hw_wait_queue);	}	else//async	{		//power off		schedule_delayed_work(&drvdata->power_off_work, msecs_to_jiffies(50));		drvdata->ipp_irq_callback(drvdata->ipp_result);				//In the case of async call ,we wake up the wait queue here		drvdata->ipp_async_result = drvdata->ipp_result;		idle_condition = 1;		wake_up_interruptible_sync(&blit_wait_queue);	}			return IRQ_HANDLED;}
开发者ID:Dee-UK,项目名称:RK3188_KK_4.4.02_Beta,代码行数:44,


示例14: p_write

static ssize_t p_write(int index, struct file* filp, const char* buf, size_t count, loff_t* f_pos){	context *ct = filp->private_data;	size_t left = count, wrt;	int ret;	if(RELEASE(index)) return count;	while(1) {		Down(index);		wrt = left;		ret = dev_write(&((pipes[index]).device), f_pos, buf+(count-left), &left, ct);		if(ret == DEV_FAULT) {Up(index); return -EFAULT;}#ifdef __PIPE_SELECT        pipes[index].r_poll = 1;#endif		if(wrt) {			R_ABLE(ct) = 1;			if(ret == DEV_SEEK) {				wake_up_interruptible_sync(&(RQ(index)));			}			else {				wake_up_interruptible(&(RQ(index)));			}		}		if(ret == DEV_SEEK) {Up(index); return -P_ESEEK;}		if(ret == DEV_FULL) {			W_ABLE(ct) = 0; Up(index);			PDEBUG("<%d>: device full, sleep, left %d/n", current->pid, (int)left);			Wait_Event(WQ(index), RELEASE(index)||W_ABLE(ct));			if(RELEASE(index)) return count;			continue;		}		Up(index);		if(left <= 0) break;	}	return count;}
开发者ID:NikhilNJ,项目名称:screenplay-dx,代码行数:42,


示例15: wait_for_dump_helpers

static void wait_for_dump_helpers(struct file *file){	struct pipe_inode_info *pipe;	pipe = file_inode(file)->i_pipe;	pipe_lock(pipe);	pipe->readers++;	pipe->writers--;	wake_up_interruptible_sync(&pipe->wait);	kill_fasync(&pipe->fasync_readers, SIGIO, POLL_IN);	pipe_unlock(pipe);	wait_event_freezable(pipe->wait, pipe->readers == 1);	pipe_lock(pipe);	pipe->readers--;	pipe->writers++;	pipe_unlock(pipe);}
开发者ID:mbgg,项目名称:linux,代码行数:20,


示例16: wait_for_dump_helpers

static void wait_for_dump_helpers(struct file *file){	struct pipe_inode_info *pipe;	pipe = file_inode(file)->i_pipe;	pipe_lock(pipe);	pipe->readers++;	pipe->writers--;	while ((pipe->readers > 1) && (!signal_pending(current))) {		wake_up_interruptible_sync(&pipe->wait);		kill_fasync(&pipe->fasync_readers, SIGIO, POLL_IN);		pipe_wait(pipe);	}	pipe->readers--;	pipe->writers++;	pipe_unlock(pipe);}
开发者ID:virtuoso,项目名称:linux-ci,代码行数:21,


示例17: wait_for_dump_helpers

static void wait_for_dump_helpers(struct file *file){	struct pipe_inode_info *pipe = file->private_data;	pipe_lock(pipe);	pipe->readers++;	pipe->writers--;	wake_up_interruptible_sync(&pipe->wait);	kill_fasync(&pipe->fasync_readers, SIGIO, POLL_IN);	pipe_unlock(pipe);	/*	 * We actually want wait_event_freezable() but then we need	 * to clear TIF_SIGPENDING and improve dump_interrupted().	 */	wait_event_interruptible(pipe->wait, pipe->readers == 1);	pipe_lock(pipe);	pipe->readers--;	pipe->writers++;	pipe_unlock(pipe);}
开发者ID:Scorpio92,项目名称:mediatek,代码行数:22,


示例18: pipe_read

static ssize_tpipe_read(struct kiocb *iocb, const struct iovec *_iov,	   unsigned long nr_segs, loff_t pos){	struct file *filp = iocb->ki_filp;	struct inode *inode = filp->f_path.dentry->d_inode;	struct pipe_inode_info *pipe;	int do_wakeup;	ssize_t ret;	struct iovec *iov = (struct iovec *)_iov;	size_t total_len;	total_len = iov_length(iov, nr_segs);	/* Null read succeeds. */	if (unlikely(total_len == 0))		return 0;	do_wakeup = 0;	ret = 0;	mutex_lock(&inode->i_mutex);	pipe = inode->i_pipe;	for (;;) {		int bufs = pipe->nrbufs;		if (bufs) {			int curbuf = pipe->curbuf;			struct pipe_buffer *buf = pipe->bufs + curbuf;			const struct pipe_buf_operations *ops = buf->ops;			void *addr;			size_t chars = buf->len;			int error, atomic;			if (chars > total_len)				chars = total_len;			error = ops->confirm(pipe, buf);			if (error) {				if (!ret)					error = ret;				break;			}			atomic = !iov_fault_in_pages_write(iov, chars);redo:			addr = ops->map(pipe, buf, atomic);			error = pipe_iov_copy_to_user(iov, addr + buf->offset, chars, atomic);			ops->unmap(pipe, buf, addr);			if (unlikely(error)) {				/*				 * Just retry with the slow path if we failed.				 */				if (atomic) {					atomic = 0;					goto redo;				}				if (!ret)					ret = error;				break;			}			ret += chars;			buf->offset += chars;			buf->len -= chars;			if (!buf->len) {				buf->ops = NULL;				ops->release(pipe, buf);				curbuf = (curbuf + 1) & (pipe->buffers - 1);				pipe->curbuf = curbuf;				pipe->nrbufs = --bufs;				do_wakeup = 1;			}			total_len -= chars;			if (!total_len)				break;	/* common path: read succeeded */		}		if (bufs)	/* More to do? */			continue;		if (!pipe->writers)			break;		if (!pipe->waiting_writers) {			/* syscall merging: Usually we must not sleep			 * if O_NONBLOCK is set, or if we got some data.			 * But if a writer sleeps in kernel space, then			 * we can wait for that data without violating POSIX.			 */			if (ret)				break;			if (filp->f_flags & O_NONBLOCK) {				ret = -EAGAIN;				break;			}		}		if (signal_pending(current)) {			if (!ret)				ret = -ERESTARTSYS;			break;		}		if (do_wakeup) {			wake_up_interruptible_sync(&pipe->wait); 			kill_fasync(&pipe->fasync_writers, SIGIO, POLL_OUT);		}		pipe_wait(pipe);//.........这里部分代码省略.........
开发者ID:ARMP,项目名称:samsung_kernel_cooper,代码行数:101,


示例19: ipp_blit_sync_real

static int ipp_blit_sync_real(const struct rk29_ipp_req *req){	int status;	int wait_ret;		//printk("ipp_blit_sync -------------------/n");	//If IPP is busy now,wait until it becomes idle	mutex_lock(&drvdata->mutex);	{		status = wait_event_interruptible(blit_wait_queue, idle_condition);				if(status < 0)		{			printk("ipp_blit_sync_real wait_event_interruptible=%d/n",status);			mutex_unlock(&drvdata->mutex);			return status;		}				idle_condition = 0;			}	mutex_unlock(&drvdata->mutex);	  	drvdata->issync = true;	drvdata->ipp_result = ipp_blit(req);   	if(drvdata->ipp_result == 0)	{		//wait_ret = wait_event_interruptible_timeout(hw_wait_queue, wq_condition, msecs_to_jiffies(req->timeout));		wait_ret = wait_event_timeout(hw_wait_queue, wq_condition, msecs_to_jiffies(req->timeout));#ifdef IPP_TEST		irq_end = ktime_get(); 		irq_end = ktime_sub(irq_end,irq_start);		hw_end = ktime_sub(hw_end,hw_start);		if((((int)ktime_to_us(hw_end)/1000)>10)||(((int)ktime_to_us(irq_end)/1000)>10))		{			//printk("hw time: %d ms, irq time: %d ms/n",(int)ktime_to_us(hw_end)/1000,(int)ktime_to_us(irq_end)/1000);		}#endif						if (wait_ret <= 0)		{			printk("%s wait_ret=%d,wq_condition =%d,wait_event_timeout:%dms! /n",__FUNCTION__,wait_ret,wq_condition,req->timeout);			if(wq_condition==0)			{				//print all register's value				printk("IPP_CONFIG: %x/n",ipp_read(IPP_CONFIG));				printk("IPP_SRC_IMG_INFO: %x/n",ipp_read(IPP_SRC_IMG_INFO));				printk("IPP_DST_IMG_INFO: %x/n",ipp_read(IPP_DST_IMG_INFO));				printk("IPP_IMG_VIR: %x/n",ipp_read(IPP_IMG_VIR));				printk("IPP_INT: %x/n",ipp_read(IPP_INT));				printk("IPP_SRC0_Y_MST: %x/n",ipp_read(IPP_SRC0_Y_MST));				printk("IPP_SRC0_CBR_MST: %x/n",ipp_read(IPP_SRC0_CBR_MST));				printk("IPP_SRC1_Y_MST: %x/n",ipp_read(IPP_SRC1_Y_MST));				printk("IPP_SRC1_CBR_MST: %x/n",ipp_read(IPP_SRC1_CBR_MST));				printk("IPP_DST0_Y_MST: %x/n",ipp_read(IPP_DST0_Y_MST));				printk("IPP_DST0_CBR_MST: %x/n",ipp_read(IPP_DST0_CBR_MST));				printk("IPP_DST1_Y_MST: %x/n",ipp_read(IPP_DST1_Y_MST));				printk("IPP_DST1_CBR_MST: %x/n",ipp_read(IPP_DST1_CBR_MST));				printk("IPP_PRE_SCL_PARA: %x/n",ipp_read(IPP_PRE_SCL_PARA));				printk("IPP_POST_SCL_PARA: %x/n",ipp_read(IPP_POST_SCL_PARA));				printk("IPP_SWAP_CTRL: %x/n",ipp_read(IPP_SWAP_CTRL));				printk("IPP_PRE_IMG_INFO: %x/n",ipp_read(IPP_PRE_IMG_INFO));				printk("IPP_AXI_ID: %x/n",ipp_read(IPP_AXI_ID));				printk("IPP_SRESET: %x/n",ipp_read(IPP_SRESET));				printk("IPP_PROCESS_ST: %x/n",ipp_read(IPP_PROCESS_ST));						ipp_soft_reset();				drvdata->ipp_result = -EAGAIN;			}		}		ipp_power_off(NULL);	}	drvdata->issync = false;	//IPP is idle, wake up the wait queue	//printk("ipp_blit_sync done ----------------/n");	status = drvdata->ipp_result;	idle_condition = 1;	wake_up_interruptible_sync(&blit_wait_queue);		return status;}
开发者ID:Dee-UK,项目名称:RK3188_KK_4.4.02_Beta,代码行数:86,


示例20: pipe_readv

static ssize_tpipe_readv(struct file *filp, const struct iovec *_iov,           unsigned long nr_segs, loff_t *ppos){    struct inode *inode = filp->f_dentry->d_inode;    int do_wakeup;    ssize_t ret;    struct iovec *iov = (struct iovec *)_iov;    size_t total_len;    total_len = iov_length(iov, nr_segs);    /* Null read succeeds. */    if (unlikely(total_len == 0))        return 0;    do_wakeup = 0;    ret = 0;    down(PIPE_SEM(*inode));    for (;;) {        int size = PIPE_LEN(*inode);        if (size) {            char *pipebuf = PIPE_BASE(*inode) + PIPE_START(*inode);            ssize_t chars = PIPE_MAX_RCHUNK(*inode);            if (chars > total_len)                chars = total_len;            if (chars > size)                chars = size;            if (pipe_iov_copy_to_user(iov, pipebuf, chars)) {                if (!ret) ret = -EFAULT;                break;            }            ret += chars;            PIPE_START(*inode) += chars;            PIPE_START(*inode) &= (PIPE_SIZE - 1);            PIPE_LEN(*inode) -= chars;            total_len -= chars;            do_wakeup = 1;            if (!total_len)                break;	/* common path: read succeeded */        }        if (PIPE_LEN(*inode)) /* test for cyclic buffers */            continue;        if (!PIPE_WRITERS(*inode))            break;        if (!PIPE_WAITING_WRITERS(*inode)) {            /* syscall merging: Usually we must not sleep             * if O_NONBLOCK is set, or if we got some data.             * But if a writer sleeps in kernel space, then             * we can wait for that data without violating POSIX.             */            if (ret)                break;            if (filp->f_flags & O_NONBLOCK) {                ret = -EAGAIN;                break;            }        }        if (signal_pending(current)) {            if (!ret) ret = -ERESTARTSYS;            break;        }        if (do_wakeup) {            wake_up_interruptible_sync(PIPE_WAIT(*inode));            kill_fasync(PIPE_FASYNC_WRITERS(*inode), SIGIO, POLL_OUT);        }        pipe_wait(inode);    }    up(PIPE_SEM(*inode));    /* Signal writers asynchronously that there is more room.  */    if (do_wakeup) {        wake_up_interruptible(PIPE_WAIT(*inode));        kill_fasync(PIPE_FASYNC_WRITERS(*inode), SIGIO, POLL_OUT);    }    /*     * Hack: we turn off atime updates for -RT kernels.     * Who uses them on pipes anyway?     */#ifndef CONFIG_PREEMPT_RT    if (ret > 0)        file_accessed(filp);#endif    return ret;}
开发者ID:GodFox,项目名称:magx_kernel_xpixl,代码行数:86,


示例21: SANLED_timer_fn

void SANLED_timer_fn(unsigned long arg){    SANLED_Start_thread = 1;		if(arg == 1)	{        Mode1 = 1;	}	else if(arg == 2)	{         Mode1 = 2;	}    else if(arg == 3)	{         Mode1 = 3;	}    else if(arg == 4)	{         Mode1 = 4;	}else if(arg ==5)	{		Mode1 =5;	}	else if(arg ==6)	{		Mode1 =6;	}else if(arg == 7)	{	   Mode1 =7;			}else if (arg ==8)	{		Mode1 =8;			}else if(arg ==9)	{		Mode1 =9;	}	else if(arg ==10)	{		Mode1 =10;	}else if(arg == 11)	{	   Mode1 =11;			}else if (arg ==12)	{		Mode1 =12;			}else if (arg ==13)	{		Mode1 =13;			}	else if (arg ==14)	{		Mode1 =14;			}	else if (arg ==15)	{		Mode1 =15;			}	else if (arg ==16)	{		Mode1 =16;			}	wake_up_interruptible_sync(&SANLED_waitMain);}
开发者ID:SeriniTY320,项目名称:mediatek,代码行数:65,


示例22: pipe_write

static ssize_tpipe_write(struct file *filp, const char *buf, size_t count, loff_t *ppos){	struct inode *inode = filp->f_dentry->d_inode;	ssize_t free, written, ret;	/* Seeks are not allowed on pipes.  */	ret = -ESPIPE;	written = 0;	if (ppos != &filp->f_pos)		goto out_nolock;	/* Null write succeeds.  */	ret = 0;	if (count == 0)		goto out_nolock;	ret = -ERESTARTSYS;	if (down_interruptible(PIPE_SEM(*inode)))		goto out_nolock;	/* No readers yields SIGPIPE.  */	if (!PIPE_READERS(*inode))		goto sigpipe;	/* If count <= PIPE_BUF, we have to make it atomic.  */	free = (count <= PIPE_BUF ? count : 1);	/* Wait, or check for, available space.  */	if (filp->f_flags & O_NONBLOCK) {		ret = -EAGAIN;		if (PIPE_FREE(*inode) < free)			goto out;	} else {		while (PIPE_FREE(*inode) < free) {			PIPE_WAITING_WRITERS(*inode)++;			pipe_wait(inode);			PIPE_WAITING_WRITERS(*inode)--;			ret = -ERESTARTSYS;			if (signal_pending(current))				goto out;			if (!PIPE_READERS(*inode))				goto sigpipe;		}	}	/* Copy into available space.  */	ret = -EFAULT;	while (count > 0) {		int space;		char *pipebuf = PIPE_BASE(*inode) + PIPE_END(*inode);		ssize_t chars = PIPE_MAX_WCHUNK(*inode);		if ((space = PIPE_FREE(*inode)) != 0) {			if (chars > count)				chars = count;			if (chars > space)				chars = space;			if (copy_from_user(pipebuf, buf, chars))				goto out;			written += chars;			PIPE_LEN(*inode) += chars;			count -= chars;			buf += chars;			space = PIPE_FREE(*inode);			continue;		}		ret = written;		if (filp->f_flags & O_NONBLOCK)			break;		do {			/*			 * Synchronous wake-up: it knows that this process			 * is going to give up this CPU, so it doesn't have			 * to do idle reschedules.			 */			wake_up_interruptible_sync(PIPE_WAIT(*inode));			PIPE_WAITING_WRITERS(*inode)++;			pipe_wait(inode);			PIPE_WAITING_WRITERS(*inode)--;			if (signal_pending(current))				goto out;			if (!PIPE_READERS(*inode))				goto sigpipe;		} while (!PIPE_FREE(*inode));		ret = -EFAULT;	}	/* Signal readers asynchronously that there is more data.  */	wake_up_interruptible(PIPE_WAIT(*inode));	update_mctime(inode);out:	up(PIPE_SEM(*inode));//.........这里部分代码省略.........
开发者ID:SnkBitten,项目名称:amithlon4,代码行数:101,


示例23: videobuf_qbuf

int videobuf_qbuf(struct videobuf_queue *q, struct v4l2_buffer *b){	struct videobuf_buffer *buf;	enum v4l2_field field;	unsigned long flags = 0;	int retval;	MAGIC_CHECK(q->int_ops->magic, MAGIC_QTYPE_OPS);	if (b->memory == V4L2_MEMORY_MMAP)		down_read(&current->mm->mmap_sem);	videobuf_queue_lock(q);	retval = -EBUSY;	if (q->reading) {		dprintk(1, "qbuf: Reading running.../n");		goto done;	}	retval = -EINVAL;	if (b->type != q->type) {		dprintk(1, "qbuf: Wrong type./n");		goto done;	}	if (b->index >= VIDEO_MAX_FRAME) {		dprintk(1, "qbuf: index out of range./n");		goto done;	}	buf = q->bufs[b->index];	if (NULL == buf) {		dprintk(1, "qbuf: buffer is null./n");		goto done;	}	MAGIC_CHECK(buf->magic, MAGIC_BUFFER);	if (buf->memory != b->memory) {		dprintk(1, "qbuf: memory type is wrong./n");		goto done;	}	if (buf->state != VIDEOBUF_NEEDS_INIT && buf->state != VIDEOBUF_IDLE) {		dprintk(1, "qbuf: buffer is already queued or active./n");		goto done;	}	switch (b->memory) {	case V4L2_MEMORY_MMAP:		if (0 == buf->baddr) {			dprintk(1, "qbuf: mmap requested but buffer addr is zero!/n");			goto done;		}		if (q->type == V4L2_BUF_TYPE_VIDEO_OUTPUT		    || q->type == V4L2_BUF_TYPE_VBI_OUTPUT		    || q->type == V4L2_BUF_TYPE_SLICED_VBI_OUTPUT		    || q->type == V4L2_BUF_TYPE_SDR_OUTPUT) {			buf->size = b->bytesused;			buf->field = b->field;			buf->ts = v4l2_timeval_to_ns(&b->timestamp);		}		break;	case V4L2_MEMORY_USERPTR:		if (b->length < buf->bsize) {			dprintk(1, "qbuf: buffer length is not enough/n");			goto done;		}		if (VIDEOBUF_NEEDS_INIT != buf->state &&		    buf->baddr != b->m.userptr)			q->ops->buf_release(q, buf);		buf->baddr = b->m.userptr;		break;	case V4L2_MEMORY_OVERLAY:		buf->boff = b->m.offset;		break;	default:		dprintk(1, "qbuf: wrong memory type/n");		goto done;	}	dprintk(1, "qbuf: requesting next field/n");	field = videobuf_next_field(q);	retval = q->ops->buf_prepare(q, buf, field);	if (0 != retval) {		dprintk(1, "qbuf: buffer_prepare returned %d/n", retval);		goto done;	}	list_add_tail(&buf->stream, &q->stream);	if (q->streaming) {		spin_lock_irqsave(q->irqlock, flags);		q->ops->buf_queue(q, buf);		spin_unlock_irqrestore(q->irqlock, flags);	}	dprintk(1, "qbuf: succeeded/n");	retval = 0;	wake_up_interruptible_sync(&q->wait);done:	videobuf_queue_unlock(q);	if (b->memory == V4L2_MEMORY_MMAP)		up_read(&current->mm->mmap_sem);	return retval;//.........这里部分代码省略.........
开发者ID:Anjali05,项目名称:linux,代码行数:101,


示例24: pipe_writev

static ssize_tpipe_writev(struct file *filp, const struct iovec *_iov,            unsigned long nr_segs, loff_t *ppos){    struct inode *inode = filp->f_dentry->d_inode;    ssize_t ret;    size_t min;    int do_wakeup;    struct iovec *iov = (struct iovec *)_iov;    size_t total_len;    total_len = iov_length(iov, nr_segs);    /* Null write succeeds. */    if (unlikely(total_len == 0))        return 0;    do_wakeup = 0;    ret = 0;    min = total_len;    if (min > PIPE_BUF)        min = 1;    down(PIPE_SEM(*inode));    for (;;) {        int free;        if (!PIPE_READERS(*inode)) {            send_sig(SIGPIPE, current, 0);            if (!ret) ret = -EPIPE;            break;        }        free = PIPE_FREE(*inode);        if (free >= min) {            /* transfer data */            ssize_t chars = PIPE_MAX_WCHUNK(*inode);            char *pipebuf = PIPE_BASE(*inode) + PIPE_END(*inode);            /* Always wakeup, even if the copy fails. Otherwise             * we lock up (O_NONBLOCK-)readers that sleep due to             * syscall merging.             */            do_wakeup = 1;            if (chars > total_len)                chars = total_len;            if (chars > free)                chars = free;            if (pipe_iov_copy_from_user(pipebuf, iov, chars)) {                if (!ret) ret = -EFAULT;                break;            }            ret += chars;            PIPE_LEN(*inode) += chars;            total_len -= chars;            if (!total_len)                break;        }        if (PIPE_FREE(*inode) && ret) {            /* handle cyclic data buffers */            min = 1;            continue;        }        if (filp->f_flags & O_NONBLOCK) {            if (!ret) ret = -EAGAIN;            break;        }        if (signal_pending(current)) {            if (!ret) ret = -ERESTARTSYS;            break;        }        if (do_wakeup) {            wake_up_interruptible_sync(PIPE_WAIT(*inode));            kill_fasync(PIPE_FASYNC_READERS(*inode), SIGIO, POLL_IN);            do_wakeup = 0;        }        PIPE_WAITING_WRITERS(*inode)++;        pipe_wait(inode);        PIPE_WAITING_WRITERS(*inode)--;    }    up(PIPE_SEM(*inode));    if (do_wakeup) {        wake_up_interruptible(PIPE_WAIT(*inode));        kill_fasync(PIPE_FASYNC_READERS(*inode), SIGIO, POLL_IN);    }    /*     * Hack: we turn off atime updates for -RT kernels.     * Who uses them on pipes anyway?     */#ifndef CONFIG_PREEMPT_RT    if (ret > 0)        inode_update_time(inode, 1);	/* mtime and ctime */#endif    return ret;}
开发者ID:GodFox,项目名称:magx_kernel_xpixl,代码行数:92,


示例25: output_Read

/*! *  @fn  ssize_t  output_Read(struct file  *filp,  *                            char         *buf,  *                            size_t        count,  *                            loff_t       *f_pos, *                            BUFFER_DESC   kernel_buf) * *  @brief  Return a sample buffer to user-mode. If not full or flush, wait * *  @param *filp          a file pointer *  @param *buf           a sampling buffer *  @param  count         size of the user's buffer *  @param  f_pos         file pointer (current offset in bytes) *  @param  kernel_buf    the kernel output buffer structure * *  @return number of bytes read. zero indicates end of file. Neg means error * *  Place no more than count bytes into the user's buffer. *  Block if unavailable on "BUFFER_DESC_queue(buf)" * * <I>Special Notes:</I> * */static ssize_toutput_Read (    struct file  *filp,     char         *buf,     size_t        count,     loff_t       *f_pos,    BUFFER_DESC   kernel_buf){    ssize_t  to_copy;    ssize_t  uncopied;    OUTPUT   outbuf = &BUFFER_DESC_outbuf(kernel_buf);    U32      cur_buf, i;/* Buffer is filled by output_fill_modules. */    cur_buf = OUTPUT_current_buffer(outbuf);    for (i=0; i<OUTPUT_NUM_BUFFERS; i++) { //iterate through all buffers        cur_buf++;        if (cur_buf >= OUTPUT_NUM_BUFFERS) { cur_buf = 0; } //circularly        if ((to_copy = OUTPUT_buffer_full(outbuf, cur_buf))) {            break;        }    }    SEP_PRINT_DEBUG("buffer %d has %d bytes ready/n", (S32)cur_buf, (S32)to_copy);    if (!flush && to_copy == 0) {#if defined(CONFIG_PREEMPT_RT)        do {            unsigned long delay;            delay = msecs_to_jiffies(1000);            wait_event_interruptible_timeout(BUFFER_DESC_queue(kernel_buf),                                 flush||OUTPUT_buffer_full(outbuf, cur_buf), delay);        } while (!(flush||OUTPUT_buffer_full(outbuf, cur_buf)));#else        if (wait_event_interruptible(BUFFER_DESC_queue(kernel_buf),                                 flush||OUTPUT_buffer_full(outbuf, cur_buf))) {            return OS_RESTART_SYSCALL;        }#endif        SEP_PRINT_DEBUG("Get to copy/n", (S32)cur_buf);        to_copy = OUTPUT_buffer_full(outbuf, cur_buf);        SEP_PRINT_DEBUG("output_Read awakened, buffer %d has %d bytes/n",cur_buf, (int)to_copy );    }    /* Ensure that the user's buffer is large enough */    if (to_copy > count) {        SEP_PRINT_DEBUG("user buffer is too small/n");        return OS_NO_MEM;    }    /* Copy data to user space. Note that we use cur_buf as the source */     if (abnormal_terminate == 0) {        uncopied = copy_to_user(buf,                                OUTPUT_buffer(outbuf, cur_buf),                                to_copy);        /* Mark the buffer empty */        OUTPUT_buffer_full(outbuf, cur_buf) = 0;        *f_pos += to_copy-uncopied;        if (uncopied) {            SEP_PRINT_DEBUG("only copied %d of %lld bytes of module records/n",                     (S32)to_copy, (long long)uncopied);            return (to_copy - uncopied);        }    }    else {        to_copy = 0;        SEP_PRINT_DEBUG("to copy set to 0/n");    }    // At end-of-file, decrement the count of active buffer writers    if (to_copy == 0) {        DRV_BOOL flush_val = atomic_dec_and_test(&flush_writers);        SEP_PRINT_DEBUG("output_Read decremented flush_writers/n");        if (flush_val == TRUE) {            wake_up_interruptible_sync(&flush_queue);        }//.........这里部分代码省略.........
开发者ID:nel82,项目名称:android_zenfone4_JB,代码行数:101,


示例26: splice_from_pipe

/* * Pipe input worker. Most of this logic works like a regular pipe, the * key here is the 'actor' worker passed in that actually moves the data * to the wanted destination. See pipe_to_file/pipe_to_sendpage above. */ssize_t splice_from_pipe(struct pipe_inode_info *pipe, struct file *out,			 loff_t *ppos, size_t len, unsigned int flags,			 splice_actor *actor){	int ret, do_wakeup, err;	struct splice_desc sd;	ret = 0;	do_wakeup = 0;	sd.total_len = len;	sd.flags = flags;	sd.file = out;	sd.pos = *ppos;	if (pipe->inode)		mutex_lock(&pipe->inode->i_mutex);	for (;;) {		if (pipe->nrbufs) {			struct pipe_buffer *buf = pipe->bufs + pipe->curbuf;			struct pipe_buf_operations *ops = buf->ops;			sd.len = buf->len;			if (sd.len > sd.total_len)				sd.len = sd.total_len;			err = actor(pipe, buf, &sd);			if (err <= 0) {				if (!ret && err != -ENODATA)					ret = err;				break;			}			ret += err;			buf->offset += err;			buf->len -= err;			sd.len -= err;			sd.pos += err;			sd.total_len -= err;			if (sd.len)				continue;			if (!buf->len) {				buf->ops = NULL;				ops->release(pipe, buf);				pipe->curbuf = (pipe->curbuf + 1) & (PIPE_BUFFERS - 1);				pipe->nrbufs--;				if (pipe->inode)					do_wakeup = 1;			}			if (!sd.total_len)				break;		}		if (pipe->nrbufs)			continue;		if (!pipe->writers)			break;		if (!pipe->waiting_writers) {			if (ret)				break;		}		if (flags & SPLICE_F_NONBLOCK) {			if (!ret)				ret = -EAGAIN;			break;		}		if (signal_pending(current)) {			if (!ret)				ret = -ERESTARTSYS;			break;		}		if (do_wakeup) {			smp_mb();			if (waitqueue_active(&pipe->wait))				wake_up_interruptible_sync(&pipe->wait);			kill_fasync(&pipe->fasync_writers, SIGIO, POLL_OUT);			do_wakeup = 0;		}		pipe_wait(pipe);	}	if (pipe->inode)		mutex_unlock(&pipe->inode->i_mutex);	if (do_wakeup) {		smp_mb();//.........这里部分代码省略.........
开发者ID:xf739645524,项目名称:kernel-rhel5,代码行数:101,


示例27: splice_to_pipe

/* * Pipe output worker. This sets up our pipe format with the page cache * pipe buffer operations. Otherwise very similar to the regular pipe_writev(). */static ssize_t splice_to_pipe(struct pipe_inode_info *pipe,			      struct splice_pipe_desc *spd){	int ret, do_wakeup, page_nr;	ret = 0;	do_wakeup = 0;	page_nr = 0;	if (pipe->inode)		mutex_lock(&pipe->inode->i_mutex);	for (;;) {		if (!pipe->readers) {			send_sig(SIGPIPE, current, 0);			if (!ret)				ret = -EPIPE;			break;		}		if (pipe->nrbufs < PIPE_BUFFERS) {			int newbuf = (pipe->curbuf + pipe->nrbufs) & (PIPE_BUFFERS - 1);			struct pipe_buffer *buf = pipe->bufs + newbuf;			buf->page = spd->pages[page_nr];			buf->offset = spd->partial[page_nr].offset;			buf->len = spd->partial[page_nr].len;			buf->ops = spd->ops;			if (spd->flags & SPLICE_F_GIFT)				buf->flags |= PIPE_BUF_FLAG_GIFT;			pipe->nrbufs++;			page_nr++;			ret += buf->len;			if (pipe->inode)				do_wakeup = 1;			if (!--spd->nr_pages)				break;			if (pipe->nrbufs < PIPE_BUFFERS)				continue;			break;		}		if (spd->flags & SPLICE_F_NONBLOCK) {			if (!ret)				ret = -EAGAIN;			break;		}		if (signal_pending(current)) {			if (!ret)				ret = -ERESTARTSYS;			break;		}		if (do_wakeup) {			smp_mb();			if (waitqueue_active(&pipe->wait))				wake_up_interruptible_sync(&pipe->wait);			kill_fasync(&pipe->fasync_readers, SIGIO, POLL_IN);			do_wakeup = 0;		}		pipe->waiting_writers++;		pipe_wait(pipe);		pipe->waiting_writers--;	}	if (pipe->inode)		mutex_unlock(&pipe->inode->i_mutex);	if (do_wakeup) {		smp_mb();		if (waitqueue_active(&pipe->wait))			wake_up_interruptible(&pipe->wait);		kill_fasync(&pipe->fasync_readers, SIGIO, POLL_IN);	}	while (page_nr < spd->nr_pages)		page_cache_release(spd->pages[page_nr++]);	return ret;}
开发者ID:xf739645524,项目名称:kernel-rhel5,代码行数:90,


示例28: atomisp_qbuf

/* * Applications call the VIDIOC_QBUF ioctl to enqueue an empty (capturing) or * filled (output) buffer in the drivers incoming queue. */static int atomisp_qbuf(struct file *file, void *fh, struct v4l2_buffer *buf){	struct video_device *vdev = video_devdata(file);	struct atomisp_device *isp = video_get_drvdata(vdev);	struct atomisp_video_pipe *pipe = atomisp_to_video_pipe(vdev);	unsigned long userptr = buf->m.userptr;	struct videobuf_buffer *vb;	struct videobuf_vmalloc_memory *vm_mem;	struct sh_css_frame_info out_info, vf_info;	struct sh_css_frame *handle = NULL;	u32 length;	u32 pgnr;	int ret = 0;	if ((!pipe->is_main) &&	    (!atomisp_is_viewfinder_support(isp)))		return -EINVAL;	if (!buf || buf->index >= VIDEO_MAX_FRAME ||		!pipe->capq.bufs[buf->index]) {		v4l2_err(&atomisp_dev,			    "Invalid index for qbuf./n");		return -EINVAL;	}	v4l2_dbg(2, dbg_level, &atomisp_dev, "%s/n", __func__);	/*	 * For userptr type frame, we convert user space address to physic	 * address and reprograme out page table properly	 */	if (buf->memory == V4L2_MEMORY_USERPTR) {		vb = pipe->capq.bufs[buf->index];		vm_mem = vb->priv;		if (!vm_mem)			return -EINVAL;		length = vb->bsize;		pgnr = (length + (PAGE_SIZE - 1)) >> PAGE_SHIFT;		/* We must stop to atomisp to remove the		* race condition when updating the new userptr. */		if (buf->flags & V4L2_BUF_FLAG_BUFFER_INVALID) {			isp->sw_contex.updating_uptr = true;			return 0;		}		/* Check whether need to start the atomisp_work */		if (buf->flags & V4L2_BUF_FLAG_BUFFER_VALID) {			isp->sw_contex.updating_uptr = false;			wake_up_interruptible_sync(&pipe->capq.wait);			return 0;		}		if ((vb->baddr == userptr) && (vm_mem->vaddr))			goto done;		switch (isp->sw_contex.run_mode) {		case CI_MODE_STILL_CAPTURE:			if ((isp->main_format->out_sh_fmt !=				SH_CSS_FRAME_FORMAT_RAW) &&			sh_css_capture_get_viewfinder_frame_info(&vf_info))				goto error;			if (sh_css_capture_get_output_frame_info(&out_info))				goto error;			break;		case CI_MODE_VIDEO:			if (sh_css_video_get_viewfinder_frame_info(&vf_info))				goto error;			if (sh_css_video_get_output_frame_info(&out_info))				goto error;			break;		case CI_MODE_PREVIEW:			if (sh_css_preview_get_output_frame_info(&out_info))				goto error;			break;		}		hrt_isp_css_mm_set_user_ptr(userptr, pgnr);		if (!pipe->is_main)			ret = sh_css_frame_allocate_from_info(&handle,								&vf_info);		else			ret = sh_css_frame_allocate_from_info(&handle,								&out_info);		hrt_isp_css_mm_set_user_ptr(0, 0);		if (ret != sh_css_success) {			v4l2_err(&atomisp_dev, "Error to allocate frame/n");			return -ENOMEM;		}		if (vm_mem->vaddr) {			mutex_lock(&pipe->capq.vb_lock);			sh_css_frame_free(vm_mem->vaddr);			vm_mem->vaddr = NULL;			vb->state = VIDEOBUF_NEEDS_INIT;//.........这里部分代码省略.........
开发者ID:kamarush,项目名称:ZTE_GXIn_Kernel-3.0.8,代码行数:101,


示例29: pipe_read

static ssize_tpipe_read(struct file *filp, char *buf, size_t count, loff_t *ppos){	struct inode *inode = filp->f_dentry->d_inode;	ssize_t size, read, ret;	/* Seeks are not allowed on pipes.  */	ret = -ESPIPE;	read = 0;	if (ppos != &filp->f_pos)		goto out_nolock;	/* Always return 0 on null read.  */	ret = 0;	if (count == 0)		goto out_nolock;	/* Get the pipe semaphore */	ret = -ERESTARTSYS;	if (down_interruptible(PIPE_SEM(*inode)))		goto out_nolock;	if (PIPE_EMPTY(*inode)) {do_more_read:		ret = 0;		if (!PIPE_WRITERS(*inode))			goto out;		ret = -EAGAIN;		if (filp->f_flags & O_NONBLOCK)			goto out;		for (;;) {			PIPE_WAITING_READERS(*inode)++;			pipe_wait(inode);			PIPE_WAITING_READERS(*inode)--;			ret = -ERESTARTSYS;			if (signal_pending(current))				goto out;			ret = 0;			if (!PIPE_EMPTY(*inode))				break;			if (!PIPE_WRITERS(*inode))				goto out;		}	}	/* Read what data is available.  */	ret = -EFAULT;	while (count > 0 && (size = PIPE_LEN(*inode))) {		char *pipebuf = PIPE_BASE(*inode) + PIPE_START(*inode);		ssize_t chars = PIPE_MAX_RCHUNK(*inode);		if (chars > count)			chars = count;		if (chars > size)			chars = size;		if (copy_to_user(buf, pipebuf, chars))			goto out;		read += chars;		PIPE_START(*inode) += chars;		PIPE_START(*inode) &= (PIPE_SIZE - 1);		PIPE_LEN(*inode) -= chars;		count -= chars;		buf += chars;	}	/* Cache behaviour optimization */	if (!PIPE_LEN(*inode))		PIPE_START(*inode) = 0;	if (count && PIPE_WAITING_WRITERS(*inode) && !(filp->f_flags & O_NONBLOCK)) {		/*		 * We know that we are going to sleep: signal		 * writers synchronously that there is more		 * room.		 */		wake_up_interruptible_sync(PIPE_WAIT(*inode));		if (!PIPE_EMPTY(*inode))			BUG();		goto do_more_read;	}	/* Signal writers asynchronously that there is more room.  */	wake_up_interruptible(PIPE_WAIT(*inode));	ret = read;out:	up(PIPE_SEM(*inode));out_nolock:	if (read)		ret = read;	UPDATE_ATIME(inode);	return ret;}
开发者ID:SnkBitten,项目名称:amithlon4,代码行数:97,



注:本文中的wake_up_interruptible_sync函数示例整理自Github/MSDocs等源码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。


C++ wake_up_new_task函数代码示例
C++ wake_up_interruptible_all函数代码示例
万事OK自学网:51自学网_软件自学网_CAD自学网自学excel、自学PS、自学CAD、自学C语言、自学css3实例,是一个通过网络自主学习工作技能的自学平台,网友喜欢的软件自学网站。