Coverage Report

Created: 2024-02-25 06:34

/src/kamailio/src/core/locking.c
Line
Count
Source (jump to first uncovered line)
1
/*
2
 * Copyright (C) 2016 kamailio.org
3
 *
4
 * This file is part of Kamailio, a free SIP server.
5
 *
6
 * Kamailio is free software; you can redistribute it and/or modify
7
 * it under the terms of the GNU General Public License as published by
8
 * the Free Software Foundation; either version 2 of the License, or
9
 * (at your option) any later version
10
 *
11
 * Kamailio is distributed in the hope that it will be useful,
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 * GNU General Public License for more details.
15
 *
16
 * You should have received a copy of the GNU General Public License
17
 * along with this program; if not, write to the Free Software
18
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
19
 */
20
21
#include <stdlib.h>
22
#include <string.h>
23
24
#include "mem/shm.h"
25
26
#include "locking.h"
27
28
/**
29
 *
30
 */
31
rec_lock_t *rec_lock_alloc()
32
0
{
33
0
  return shm_malloc(sizeof(rec_lock_t));
34
0
}
35
36
/**
37
 *
38
 */
39
rec_lock_t *rec_lock_init(rec_lock_t *rlock)
40
0
{
41
0
  memset(rlock, 0, sizeof(rec_lock_t));
42
0
  if(lock_init(&rlock->lock) == 0) {
43
0
    return NULL;
44
0
  }
45
0
  return rlock;
46
0
}
47
48
/**
49
 *
50
 */
51
void rec_lock_destroy(rec_lock_t *rlock)
52
0
{
53
0
  lock_destroy(&rlock->lock);
54
0
  memset(rlock, 0, sizeof(rec_lock_t));
55
0
}
56
57
/**
58
 *
59
 */
60
void rec_lock_dealloc(rec_lock_t *rlock)
61
0
{
62
0
  shm_free(rlock);
63
0
}
64
65
/**
66
 *
67
 */
68
void rec_lock_get(rec_lock_t *rlock)
69
0
{
70
0
  int mypid;
71
72
0
  mypid = my_pid();
73
0
  if(likely(atomic_get(&rlock->locker_pid) != mypid)) {
74
0
    lock_get(&rlock->lock);
75
0
    atomic_set(&rlock->locker_pid, mypid);
76
0
  } else {
77
    /* locked within the same process that executed us */
78
0
    rlock->rec_lock_level++;
79
0
  }
80
0
}
81
82
/**
83
 *
84
 */
85
void rec_lock_release(rec_lock_t *rlock)
86
0
{
87
0
  if(likely(rlock->rec_lock_level == 0)) {
88
0
    atomic_set(&rlock->locker_pid, 0);
89
0
    lock_release(&rlock->lock);
90
0
  } else {
91
    /* recursive locked => decrease lock count */
92
0
    rlock->rec_lock_level--;
93
0
  }
94
0
}
95
96
/**
97
 *
98
 */
99
rec_lock_set_t *rec_lock_set_alloc(int n)
100
0
{
101
0
  rec_lock_set_t *ls;
102
0
  ls = (rec_lock_set_t *)shm_malloc(
103
0
      sizeof(rec_lock_set_t) + n * sizeof(rec_lock_t));
104
0
  if(ls == 0) {
105
0
    SHM_MEM_CRITICAL;
106
0
  } else {
107
0
    ls->locks = (rec_lock_t *)((char *)ls + sizeof(rec_lock_set_t));
108
0
    ls->size = n;
109
0
  }
110
0
  return ls;
111
0
}
112
113
/**
114
 *
115
 */
116
rec_lock_set_t *rec_lock_set_init(rec_lock_set_t *lset)
117
0
{
118
0
  int r;
119
0
  for(r = 0; r < lset->size; r++)
120
0
    if(rec_lock_init(&lset->locks[r]) == 0)
121
0
      return 0;
122
0
  return lset;
123
0
}
124
125
/**
126
 *
127
 */
128
void rec_lock_set_destroy(rec_lock_set_t *lset)
129
0
{
130
0
  return;
131
0
}
132
133
/**
134
 *
135
 */
136
void rec_lock_set_dealloc(rec_lock_set_t *lset)
137
0
{
138
0
  shm_free((void *)lset);
139
0
  return;
140
0
}
141
142
/**
143
 *
144
 */
145
void rec_lock_set_get(rec_lock_set_t *lset, int i)
146
0
{
147
0
  rec_lock_get(&lset->locks[i]);
148
0
  return;
149
0
}
150
151
/**
152
 *
153
 */
154
void rec_lock_set_release(rec_lock_set_t *lset, int i)
155
0
{
156
0
  rec_lock_release(&lset->locks[i]);
157
0
  return;
158
0
}