63
memset(&addr, 0, sizeof(addr));
64
memcpy(addr.sun_path, SINGLENODE_CLVMD_SOCKNAME,
65
sizeof(SINGLENODE_CLVMD_SOCKNAME));
66
addr.sun_family = AF_UNIX;
68
77
if (bind(listen_fd, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
69
78
DEBUGLOG("Can't bind local socket: %s\n", strerror(errno));
153
167
/* Real locking */
154
168
static int _lock_resource(const char *resource, int mode, int flags, int *lockid)
160
if (mode == LCK_READ) { /* only track PREAD, aka PROTECTED READ */
161
DEBUGLOG("Not tracking CONCURRENT READ lock: %s, flags=%d, mode=%d\n",
162
resource, flags, mode);
167
172
DEBUGLOG("Locking resource %s, flags=%d, mode=%d\n",
168
173
resource, flags, mode);
175
mode &= LCK_TYPE_MASK;
170
176
pthread_mutex_lock(&_lock_mutex);
173
/* look for an existing lock for this resource */
174
for (i = 1; i < _lock_max; ++i) {
177
if (!strcmp(_resources[i], resource)) {
178
if ((_locks[i] & LCK_TYPE_MASK) == LCK_WRITE ||
179
(_locks[i] & LCK_TYPE_MASK) == LCK_EXCL) {
180
DEBUGLOG("Resource %s already write/exclusively locked...\n", resource);
183
if ((mode & LCK_TYPE_MASK) == LCK_WRITE ||
184
(mode & LCK_TYPE_MASK) == LCK_EXCL) {
185
DEBUGLOG("Resource %s already locked and WRITE/EXCL lock requested...\n",
192
if (i == _lock_max) { /* out of lock slots, extend */
193
if (!(_locks_1 = dm_realloc(_locks, 2 * _lock_max * sizeof(int))))
197
if (!(_resources_1 = dm_realloc(_resources, 2 * _lock_max * sizeof(char *))))
198
/* _locks may get realloc'd twice, but that should be safe */
201
_resources = _resources_1;
202
/* clear the new resource entries */
203
for (j = _lock_max; j < 2 * _lock_max; ++j)
204
_resources[j] = NULL;
205
_lock_max = 2 * _lock_max;
208
/* resource is not currently locked, grab it */
209
if (!(_resources[i] = dm_strdup(resource)))
215
DEBUGLOG("Locked resource %s, lockid=%d\n", resource, i);
178
if (!(lck = dm_hash_lookup(_locks, resource))) {
179
/* Add new locked resource */
180
if (!(lck = dm_zalloc(sizeof(struct lock))) ||
181
!dm_hash_insert(_locks, resource, lck))
184
lck->lockid = ++_lockid;
188
/* Update/convert lock */
189
if (flags == LCKF_CONVERT) {
192
} else if ((lck->mode == LCK_WRITE) || (lck->mode == LCK_EXCL)) {
193
DEBUGLOG("Resource %s already %s locked (%d)...\n", resource,
194
(lck->mode == LCK_WRITE) ? "write" : "exclusively", lck->lockid);
196
} else if (lck->mode > mode) {
197
DEBUGLOG("Resource %s already locked and %s lock requested...\n",
199
(mode == LCK_READ) ? "READ" :
200
(mode == LCK_WRITE) ? "WRITE" : "EXCLUSIVE");
205
*lockid = lck->lockid;
207
lck->excl |= (mode == LCK_EXCL);
208
DEBUGLOG("Locked resource %s, lockid=%d, mode=%d\n", resource, lck->lockid, mode);
209
pthread_cond_broadcast(&_lock_cond); /* wakeup waiters */
216
210
pthread_mutex_unlock(&_lock_mutex);
240
237
DEBUGLOG("Unlocking resource %s, lockid=%d\n", resource, lockid);
241
238
pthread_mutex_lock(&_lock_mutex);
243
if (!_resources[lockid]) {
244
pthread_mutex_unlock(&_lock_mutex);
245
DEBUGLOG("Resource %s, lockid=%d is not locked\n", resource, lockid);
249
if (strcmp(_resources[lockid], resource)) {
250
pthread_mutex_unlock(&_lock_mutex);
251
DEBUGLOG("Resource %d has wrong resource (requested %s, got %s)\n",
252
lockid, resource, _resources[lockid]);
256
dm_free(_resources[lockid]);
257
_resources[lockid] = 0;
240
if (!(lck = dm_hash_lookup(_locks, resource))) {
241
pthread_mutex_unlock(&_lock_mutex);
242
DEBUGLOG("Resource %s, lockid=%d is not locked.\n", resource, lockid);
246
if (lck->lockid != lockid) {
247
pthread_mutex_unlock(&_lock_mutex);
248
DEBUGLOG("Resource %s has wrong lockid %d, expected %d.\n",
249
resource, lck->lockid, lockid);
253
dm_hash_remove(_locks, resource);
258
255
pthread_cond_broadcast(&_lock_cond); /* wakeup waiters */
259
256
pthread_mutex_unlock(&_lock_mutex);