File: ccrw2.h

package info (click to toggle)
libsoxr 0.1.2-3
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 728 kB
  • sloc: ansic: 6,850; sh: 241; cpp: 40; makefile: 18
file content (75 lines) | stat: -rw-r--r-- 2,038 bytes parent folder | download | duplicates (6)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
/* SoX Resampler Library      Copyright (c) 2007-13 robs@users.sourceforge.net
 * Licence for this file: LGPL v2.1                  See LICENCE for details. */

/* Concurrent Control with "Readers" and "Writers", P.J. Courtois et al, 1971 */

#if !defined ccrw2_included
#define ccrw2_included

#if defined SOXR_LIB
#include "internal.h"
#endif

#if defined _OPENMP

#include <omp.h>

typedef struct {
  int readcount, writecount; /* initial value = 0 */
  omp_lock_t mutex_1, mutex_2, mutex_3, w, r; /* initial value = 1 */
} ccrw2_t; /* Problem #2: `writers-preference' */

#define ccrw2_become_reader(p) do {\
  omp_set_lock(&p.mutex_3);\
    omp_set_lock(&p.r);\
      omp_set_lock(&p.mutex_1);\
        if (++p.readcount == 1) omp_set_lock(&p.w);\
      omp_unset_lock(&p.mutex_1);\
    omp_unset_lock(&p.r);\
  omp_unset_lock(&p.mutex_3);\
} while (0)
#define ccrw2_cease_reading(p) do {\
  omp_set_lock(&p.mutex_1);\
    if (!--p.readcount) omp_unset_lock(&p.w);\
  omp_unset_lock(&p.mutex_1);\
} while (0)
#define ccrw2_become_writer(p) do {\
  omp_set_lock(&p.mutex_2);\
    if (++p.writecount == 1) omp_set_lock(&p.r);\
  omp_unset_lock(&p.mutex_2);\
  omp_set_lock(&p.w);\
} while (0)
#define ccrw2_cease_writing(p) do {\
  omp_unset_lock(&p.w);\
  omp_set_lock(&p.mutex_2);\
    if (!--p.writecount) omp_unset_lock(&p.r);\
  omp_unset_lock(&p.mutex_2);\
} while (0)
#define ccrw2_init(p) do {\
  omp_init_lock(&p.mutex_1);\
  omp_init_lock(&p.mutex_2);\
  omp_init_lock(&p.mutex_3);\
  omp_init_lock(&p.w);\
  omp_init_lock(&p.r);\
} while (0)
#define ccrw2_clear(p) do {\
  omp_destroy_lock(&p.r);\
  omp_destroy_lock(&p.w);\
  omp_destroy_lock(&p.mutex_3);\
  omp_destroy_lock(&p.mutex_2);\
  omp_destroy_lock(&p.mutex_1);\
} while (0)

#else

typedef int ccrw2_t;
#define ccrw2_become_reader(x) (void)(x)
#define ccrw2_cease_reading(x) (void)(x)
#define ccrw2_become_writer(x) (void)(x)
#define ccrw2_cease_writing(x) (void)(x)
#define ccrw2_init(x) (void)(x)
#define ccrw2_clear(x) (void)(x)

#endif /* _OPENMP */

#endif