GooMutex.h 2.43 KB
Newer Older
Kristian Høgsberg's avatar
Kristian Høgsberg committed
1 2 3 4 5 6 7 8 9 10
//========================================================================
//
// GooMutex.h
//
// Portable mutex macros.
//
// Copyright 2002-2003 Glyph & Cog, LLC
//
//========================================================================

Kovid Goyal's avatar
Kovid Goyal committed
11 12 13 14 15 16 17 18
//========================================================================
//
// Modified under the Poppler project - http://poppler.freedesktop.org
//
// All changes made under the Poppler project to this file are licensed
// under GPL version 2 or later
//
// Copyright (C) 2009 Kovid Goyal <kovid@kovidgoyal.net>
19
// Copyright (C) 2013 Thomas Freitag <Thomas.Freitag@alfa.de>
20
// Copyright (C) 2013, 2018 Albert Astals Cid <aacid@kde.org>
21
// Copyright (C) 2013 Adam Reichold <adamreichold@myopera.com>
22
// Copyright (C) 2014 Bogdan Cristea <cristeab@gmail.com>
23
// Copyright (C) 2014 Peter Breitenlohner <peb@mppmu.mpg.de>
24
// Copyright (C) 2017 Adrian Johnson <ajohnson@redneon.com>
Kovid Goyal's avatar
Kovid Goyal committed
25 26 27 28 29 30
//
// To see a description of the changes please see the Changelog file that
// came with your tarball or type make ChangeLog if you are building from git
//
//========================================================================

Kristian Høgsberg's avatar
Kristian Høgsberg committed
31 32 33
#ifndef GMUTEX_H
#define GMUTEX_H

34 35
#ifdef MULTITHREADED

Kristian Høgsberg's avatar
Kristian Høgsberg committed
36 37 38 39 40 41 42 43 44 45 46
// Usage:
//
// GooMutex m;
// gInitMutex(&m);
// ...
// gLockMutex(&m);
//   ... critical section ...
// gUnlockMutex(&m);
// ...
// gDestroyMutex(&m);

Kovid Goyal's avatar
Kovid Goyal committed
47
#ifdef _WIN32
48
#ifndef NOMINMAX
49
#define NOMINMAX
50
#endif
Kristian Høgsberg's avatar
Kristian Høgsberg committed
51 52 53 54 55 56 57 58 59 60 61 62 63
#include <windows.h>

typedef CRITICAL_SECTION GooMutex;

#define gInitMutex(m) InitializeCriticalSection(m)
#define gDestroyMutex(m) DeleteCriticalSection(m)
#define gLockMutex(m) EnterCriticalSection(m)
#define gUnlockMutex(m) LeaveCriticalSection(m)

#else // assume pthreads

#include <pthread.h>

64
typedef pthread_mutex_t GooMutex;
65 66

inline void gInitMutex(GooMutex *m) {
67 68 69 70 71
  pthread_mutexattr_t mutexattr;
  pthread_mutexattr_init(&mutexattr);
  pthread_mutexattr_settype(&mutexattr, PTHREAD_MUTEX_RECURSIVE);
  pthread_mutex_init(m, &mutexattr);
  pthread_mutexattr_destroy(&mutexattr);
72
}
73 74 75
#define gDestroyMutex(m) pthread_mutex_destroy(m)
#define gLockMutex(m) pthread_mutex_lock(m)
#define gUnlockMutex(m) pthread_mutex_unlock(m)
Kristian Høgsberg's avatar
Kristian Høgsberg committed
76 77 78

#endif

79 80
class MutexLocker {
public:
81 82
  MutexLocker(GooMutex *mutexA) : mutex(mutexA) { gLockMutex(mutex); }
  ~MutexLocker() { gUnlockMutex(mutex); }
83

84 85 86
  MutexLocker(const MutexLocker &) = delete;
  MutexLocker& operator=(const MutexLocker &other) = delete;

87 88 89 90
private:
  GooMutex *mutex;
};

91 92 93
#endif // MULTITHREADED

#endif // GMUTEX_H