GooMutex.h 2.12 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
//
//========================================================================

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 20
// Copyright (C) 2013 Thomas Freitag <Thomas.Freitag@alfa.de>
// Copyright (C) 2013 Albert Astals Cid <aacid@kde.org>
21 22 23 24 25 26
//
// 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
27 28 29 30 31 32 33 34 35 36 37 38 39 40
#ifndef GMUTEX_H
#define GMUTEX_H

// Usage:
//
// GooMutex m;
// gInitMutex(&m);
// ...
// gLockMutex(&m);
//   ... critical section ...
// gUnlockMutex(&m);
// ...
// gDestroyMutex(&m);

41
#ifdef _WIN32
Kristian Høgsberg's avatar
Kristian Høgsberg committed
42 43 44 45 46 47 48 49 50 51 52 53 54 55

#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>

56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75
typedef struct {
  pthread_mutexattr_t attributes;
  pthread_mutex_t mutex;
} GooMutex;

inline void gInitMutex(GooMutex *m) {
  pthread_mutexattr_init(&m->attributes);
  pthread_mutexattr_settype(&m->attributes, PTHREAD_MUTEX_RECURSIVE);
  pthread_mutex_init(&m->mutex, &m->attributes);
}
inline void gDestroyMutex(GooMutex *m) {
  pthread_mutex_destroy(&m->mutex);
  pthread_mutexattr_destroy(&m->attributes);
}
inline void gLockMutex(GooMutex *m) {
  pthread_mutex_lock(&m->mutex);
}
inline void gUnlockMutex(GooMutex *m) {
  pthread_mutex_unlock(&m->mutex);
}
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 87

private:
  GooMutex *mutex;
};

Kristian Høgsberg's avatar
Kristian Høgsberg committed
88
#endif