-#include <sys/time.h>
#include <errno.h>
#include <fcntl.h>
#include <unistd.h>
-#include "slock.h"
#include "jsl_log.h"
-#include "method_thread.h"
#include "lang/verify.h"
#include "pollmgr.h"
+#include "lock.h"
PollMgr *PollMgr::instance = NULL;
-static pthread_once_t pollmgr_is_initialized = PTHREAD_ONCE_INIT;
+static std::once_flag pollmgr_is_initialized;
void
PollMgrInit()
PollMgr *
PollMgr::Instance()
{
- pthread_once(&pollmgr_is_initialized, PollMgrInit);
+ std::call_once(pollmgr_is_initialized, PollMgrInit);
return instance;
}
aio_ = new SelectAIO();
//aio_ = new EPollAIO();
- VERIFY(pthread_mutex_init(&m_, NULL) == 0);
- VERIFY(pthread_cond_init(&changedone_c_, NULL) == 0);
- VERIFY((th_ = method_thread(this, false, &PollMgr::wait_loop)) != 0);
+ th_ = std::thread(&PollMgr::wait_loop, this);
}
PollMgr::~PollMgr()
{
VERIFY(fd < MAX_POLL_FDS);
- ScopedLock ml(&m_);
+ lock ml(m_);
aio_->watch_fd(fd, flag);
VERIFY(!callbacks_[fd] || callbacks_[fd]==ch);
void
PollMgr::block_remove_fd(int fd)
{
- ScopedLock ml(&m_);
+ lock ml(m_);
aio_->unwatch_fd(fd, CB_RDWR);
pending_change_ = true;
- VERIFY(pthread_cond_wait(&changedone_c_, &m_)==0);
+ changedone_c_.wait(ml);
callbacks_[fd] = NULL;
}
void
PollMgr::del_callback(int fd, poll_flag flag)
{
- ScopedLock ml(&m_);
+ lock ml(m_);
if (aio_->unwatch_fd(fd, flag)) {
callbacks_[fd] = NULL;
}
bool
PollMgr::has_callback(int fd, poll_flag flag, aio_callback *c)
{
- ScopedLock ml(&m_);
+ lock ml(m_);
if (!callbacks_[fd] || callbacks_[fd]!=c)
return false;
while (1) {
{
- ScopedLock ml(&m_);
+ lock ml(m_);
if (pending_change_) {
pending_change_ = false;
- VERIFY(pthread_cond_broadcast(&changedone_c_)==0);
+ changedone_c_.notify_all();
}
}
readable.clear();
int flags = fcntl(pipefd_[0], F_GETFL, NULL);
flags |= O_NONBLOCK;
fcntl(pipefd_[0], F_SETFL, flags);
-
- VERIFY(pthread_mutex_init(&m_, NULL) == 0);
}
SelectAIO::~SelectAIO()
{
- VERIFY(pthread_mutex_destroy(&m_) == 0);
}
void
SelectAIO::watch_fd(int fd, poll_flag flag)
{
- ScopedLock ml(&m_);
+ lock ml(m_);
if (highfds_ <= fd)
highfds_ = fd;
bool
SelectAIO::is_watched(int fd, poll_flag flag)
{
- ScopedLock ml(&m_);
+ lock ml(m_);
if (flag == CB_RDONLY) {
return FD_ISSET(fd,&rfds_);
}else if (flag == CB_WRONLY) {
bool
SelectAIO::unwatch_fd(int fd, poll_flag flag)
{
- ScopedLock ml(&m_);
+ lock ml(m_);
if (flag == CB_RDONLY) {
FD_CLR(fd, &rfds_);
}else if (flag == CB_WRONLY) {
int high;
{
- ScopedLock ml(&m_);
+ lock ml(m_);
trfds = rfds_;
twfds = wfds_;
high = highfds_;
-
}
int ret = select(high+1, &trfds, &twfds, NULL, NULL);