X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fcontrib%2Flibqxt-2007-10-24%2Fsrc%2Fcore%2Fqxtsemaphore.cpp;fp=src%2Fcontrib%2Flibqxt-2007-10-24%2Fsrc%2Fcore%2Fqxtsemaphore.cpp;h=a7be0fdf43ee1fbf9dcf044fe1f5ea7425c93959;hp=0000000000000000000000000000000000000000;hb=a634acadbcf6017474f68a3eaf7cb632660e9e49;hpb=cd122ca8e0d2c0ffc5397e0a813c75d791a7e6e3 diff --git a/src/contrib/libqxt-2007-10-24/src/core/qxtsemaphore.cpp b/src/contrib/libqxt-2007-10-24/src/core/qxtsemaphore.cpp new file mode 100644 index 00000000..a7be0fdf --- /dev/null +++ b/src/contrib/libqxt-2007-10-24/src/core/qxtsemaphore.cpp @@ -0,0 +1,136 @@ +/**************************************************************************** +** +** Copyright (C) Qxt Foundation. Some rights reserved. +** +** This file is part of the QxtCore module of the Qt eXTension library +** +** This library is free software; you can redistribute it and/or modify it +** under the terms of th Common Public License, version 1.0, as published by +** IBM. +** +** This file is provided "AS IS", without WARRANTIES OR CONDITIONS OF ANY +** KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY +** WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR +** FITNESS FOR A PARTICULAR PURPOSE. +** +** You should have received a copy of the CPL along with this file. +** See the LICENSE file and the cpl1.0.txt file included with the source +** distribution for more information. If you did not receive a copy of the +** license, contact the Qxt Foundation. +** +** +** +****************************************************************************/ +#include "qxtsemaphore.h" + +/** +\class QxtSemaphore QxtSemaphore +\ingroup QxtCore +\brief system wide semaphore (former QxtSingleInstance) + + +\code + QxtSemaphore instance("com.mycompany.foobla.uniquestring"); + if(!instance.trylock()) + { + qDebug("already started") + } + +\endcode + +Note that the semaphore is autoaticly unlocked on destruction, but not on segfault,sigkill,etc...! +*/ + +#ifdef Q_WS_WIN +#include "Windows.h" + +class QxtSemaphorePrivate : public QxtPrivate +{ +public: + QString name; + unsigned sem_m; + void init() + { + sem_m=0; + } + + bool trylock() + { + sem_m = (unsigned ) CreateSemaphoreA ( NULL , 1 , 2 , qPrintable("Global\\"+name) ); + if (sem_m == 0 ) + return false; + return true; + } + bool unlock() + { + if (sem_m==0) + return false; + return CloseHandle((void *)sem_m); + } +}; + + + +#else + +#include +#include +#include + +class QxtSemaphorePrivate : public QxtPrivate +{ +public: + QString name; + sem_t* m_sem; + bool s_N; + void init() + { + s_N=false; + m_sem=NULL; + } + + bool trylock() + { + m_sem=sem_open(qPrintable(name), O_CREAT, S_IRUSR | S_IWUSR, 1); + if (m_sem==(sem_t*)(SEM_FAILED) || sem_trywait(m_sem)) + { + m_sem=NULL; + s_N=true; + return false; + } + s_N=false; + return true; + } + bool unlock() + { + if (m_sem==NULL) + return false; + if (!s_N) + { + sem_post(m_sem); + } + return (sem_close(m_sem)==0); + } +}; + +#endif + +QxtSemaphore::QxtSemaphore(QString uniqueID) +{ + qxt_d().name=uniqueID; + qxt_d().init(); +} + +QxtSemaphore::~QxtSemaphore() +{ + unlock(); +} + +bool QxtSemaphore::trylock() +{ + return qxt_d().trylock(); +} +bool QxtSemaphore::unlock() +{ + return qxt_d().unlock(); +}