📄 sem.cpp
字号:
/*************************************************************************** sem.cpp - description ------------------- begin : Fri Jul 20 2001 copyright : (C) 2001 by Mark email : alben@yeah.net ***************************************************************************//*************************************************************************** * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * ***************************************************************************/#include <errno.h>#include <string.h>#include <stdarg.h>#include "sem.h"CSem::CSem(key_t tKey, int iSems, int iMode) : m_iSems(iSems), m_tKey(tKey){ GetSem(iMode);}CSem::~CSem(){}void CSem::GetSem(int iMode){ if ((m_iSemId = semget(m_tKey, m_iSems, IPC_CREAT | IPC_EXCL | iMode)) < 0) { if (errno != EEXIST) throw CSemException(strerror(errno), __FILE__, __LINE__); if ((m_iSemId = semget(m_tKey, 0, iMode)) < 0) throw CSemException(strerror(errno), __FILE__, __LINE__); m_bCreate = false; return; } m_bCreate = true;}void CSem::RemoveSem(){ union semun unSem; if (semctl(m_iSemId, 0, IPC_RMID, unSem) < 0) throw CSemException(strerror(errno), __FILE__, __LINE__);}bool CSem::SemOpWithUndo(int iSems, ...){ struct sembuf* pstSemBuf = new struct sembuf [iSems]; va_list ap; va_start(ap, iSems); for (int i = 0; i < iSems; i++) { pstSemBuf[i].sem_num = (unsigned short int)va_arg(ap, int); pstSemBuf[i].sem_op = (short int)va_arg(ap, int); pstSemBuf[i].sem_flg = SEM_UNDO; } va_end(ap); if (semop(m_iSemId, pstSemBuf, iSems) < 0) { if (errno == EAGAIN || errno == EINTR) { delete [] pstSemBuf; return false; } delete [] pstSemBuf; throw CSemException(strerror(errno), __FILE__, __LINE__); } delete [] pstSemBuf; return true;}bool CSem::SemOp(int iSems, ...){ struct sembuf* pstSemBuf = new struct sembuf [iSems]; va_list ap; va_start(ap, iSems); for (int i = 0; i < iSems; i++) { pstSemBuf[i].sem_num = (unsigned short int)va_arg(ap, int); pstSemBuf[i].sem_op = (short int)va_arg(ap, int); pstSemBuf[i].sem_flg = (short int)va_arg(ap, int); } va_end(ap); if (semop(m_iSemId, pstSemBuf, iSems) < 0) { if (errno == EAGAIN || errno == EINTR) { delete [] pstSemBuf; return false; } delete [] pstSemBuf; throw CSemException(strerror(errno), __FILE__, __LINE__); } delete [] pstSemBuf; return true;}bool CSem::Lock(){ struct sembuf* pstSemBuf = new struct sembuf [m_iSems]; for (int i = 0; i < m_iSems; i++) { pstSemBuf[i].sem_num = i; pstSemBuf[i].sem_op = -1; pstSemBuf[i].sem_flg = SEM_UNDO; } if (semop(m_iSemId, pstSemBuf, m_iSems) < 0) { if (errno == EAGAIN || errno == EINTR) { delete [] pstSemBuf; return false; } delete [] pstSemBuf; throw CSemException(strerror(errno), __FILE__, __LINE__); } delete [] pstSemBuf; return true;}void CSem::Unlock(){ struct sembuf* pstSemBuf = new struct sembuf [m_iSems]; for (int i = 0; i < m_iSems; i++) { pstSemBuf[i].sem_num = i; pstSemBuf[i].sem_op = 1; pstSemBuf[i].sem_flg = SEM_UNDO; } if (semop(m_iSemId, pstSemBuf, m_iSems) < 0) { delete [] pstSemBuf; throw CSemException(strerror(errno), __FILE__, __LINE__); } delete [] pstSemBuf;}void CSem::SetAll(int iSems, ...){ if (iSems != m_iSems) throw CSemException("argument error.", __FILE__, __LINE__); unsigned short int* pusiValue = new unsigned short int [iSems]; va_list ap; va_start(ap, iSems); for (int i = 0; i < iSems; i++) pusiValue[i] = (unsigned short int)va_arg(ap, int); va_end(ap); semun unSem; unSem.array = pusiValue; if (semctl(m_iSemId, 0, SETALL, unSem) < 0) { delete [] pusiValue; throw CSemException(strerror(errno), __FILE__, __LINE__); } delete [] pusiValue;}void CSem::SetValue(int iSemNum, int iValue){ semun unSem; unSem.val = iValue; if (semctl(m_iSemId, iSemNum, SETVAL, unSem) < 0) throw CSemException(strerror(errno), __FILE__, __LINE__);}void CSem::GetAll(unsigned short int* pusiArray){ semun unSem; unSem.array = pusiArray; if (semctl(m_iSemId, 0, GETALL, unSem) < 0) throw CSemException(strerror(errno), __FILE__, __LINE__); }int CSem::GetValue(int iSemNum){ semun unSem; int iValue = semctl(m_iSemId, iSemNum, GETVAL, unSem); if (iValue < 0) throw CSemException(strerror(errno), __FILE__, __LINE__); return iValue;}void CSem::InitSem(){ unsigned short int* pusiValue = new unsigned short int [m_iSems]; for (int i = 0; i < m_iSems; i++) pusiValue[i] = (unsigned short int)1; semun unSem; unSem.array = pusiValue; if (semctl(m_iSemId, 0, SETALL, unSem) < 0) { delete [] pusiValue; throw CSemException(strerror(errno), __FILE__, __LINE__); } delete [] pusiValue;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -