⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 unix_event_processor.cpp

📁 彩信浏览器
💻 CPP
字号:
// This file is part of Ambulant Player, www.ambulantplayer.org.//// Copyright (C) 2003-2007 Stichting CWI, // Kruislaan 413, 1098 SJ Amsterdam, The Netherlands.//// Ambulant Player is free software; you can redistribute it and/or modify// it under the terms of the GNU Lesser General Public License as published by// the Free Software Foundation; either version 2.1 of the License, or// (at your option) any later version.//// Ambulant Player is distributed in the hope that it will be useful,// but WITHOUT ANY WARRANTY; without even the implied warranty of// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the// GNU Lesser General Public License for more details.//// You should have received a copy of the GNU Lesser General Public License// along with Ambulant Player; if not, write to the Free Software// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA/*  * @$Id: unix_event_processor.cpp,v 1.24 2007/02/12 14:15:03 jackjansen Exp $  */#include "ambulant/lib/unix/unix_event_processor.h"#ifndef AM_DBG#define AM_DBG if(0)#endifusing namespace ambulant;lib::unix::event_processor::event_processor(timer *t) :   event_processor_impl(t){  	pthread_mutex_init(&m_queue_mutex, NULL);	pthread_cond_init(&m_queue_condition, NULL);	AM_DBG lib::logger::get_logger()->debug("event_processor 0x%x created", (void *)this);	if (pthread_mutex_init(&m_queue_mutex, NULL) < 0) {		lib::logger::get_logger()->fatal("unix_event_processor: pthread_mutex_init failed: %s", strerror(errno));	}	if (pthread_cond_init(&m_queue_condition, NULL) < 0) {		lib::logger::get_logger()->fatal("unix_event_processor: pthread_cond_init failed: %s", strerror(errno));	}	start();}lib::unix::event_processor::~event_processor(){	stop();	AM_DBG lib::logger::get_logger()->debug("event_processor 0x%x deleted", (void *)this);}unsigned longlib::unix::event_processor::run(){	AM_DBG lib::logger::get_logger()->debug("event_processor 0x%x started", (void *)this);	// XXXX Note: the use of the mutex means that only one thread is actively	// serving events. This needs to be rectified at some point: only the	// queue manipulations should be locked with the mutex.	if (pthread_mutex_lock(&m_queue_mutex) < 0 ) {		lib::logger::get_logger()->fatal("unix_event_processor.run: pthread_mutex_lock failed: %s", strerror(errno));	}	while(!exit_requested()) {			serve_events();				wait_event();	}	pthread_mutex_unlock(&m_queue_mutex);	AM_DBG lib::logger::get_logger()->debug("event_processor 0x%x stopped", (void *)this);	return 0;}voidlib::unix::event_processor::wait_event(){	int rv;	struct timespec ts;	struct timeval tv;	int dummy;				// we want to wait for 10ms	dummy = gettimeofday(&tv,NULL);	ts.tv_sec = tv.tv_sec;	ts.tv_nsec = (tv.tv_usec + 10000)* 1000;	if (ts.tv_nsec > 1000000000) {		ts.tv_sec += 1;		ts.tv_nsec -= 1000000000;	}		rv = pthread_cond_timedwait(&m_queue_condition, &m_queue_mutex, &ts);	if ( rv < 0 && errno != ETIMEDOUT) {		lib::logger::get_logger()->fatal("unix_event_processor.wait_event: pthread_cond_wait failed: %s", strerror(errno));	}}voidlib::unix::event_processor::wakeup(){	if (pthread_cond_signal(&m_queue_condition) < 0) {		lib::logger::get_logger()->fatal("unix_event_processor.wakeup: pthread_cond_signal failed: %s", strerror(errno));	}}lib::event_processor *lib::event_processor_factory(timer *t){	return new unix::event_processor(t);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -