Skip to content
Snippets Groups Projects

concurrent CTL

Merged Libor Peltan requested to merge concurrent_ctl into master
1 unresolved thread
Viewing commit 15c9b5ac
Show latest version
2 files
+ 12
12
Preferences
Compare changes
Files
2
+ 11
11
@@ -2413,29 +2413,29 @@ ctl_cmd_t ctl_str_to_cmd(const char *cmd_str)
return CTL_NONE;
}
static int ctl_lock(server_t *s, ctl_lock_flag_t fl, uint64_t millis)
static int ctl_lock(server_t *server, ctl_lock_flag_t flags, uint64_t timeout_ms)
{
struct timespec ts;
int ret = clock_gettime(CLOCK_REALTIME, &ts);
if (ret != 0) {
return KNOT_ERROR;
}
ts.tv_sec += millis / 1000;
ts.tv_nsec += (millis % 1000) * 1000000LU;
ts.tv_sec += timeout_ms / 1000;
ts.tv_nsec += (timeout_ms % 1000) * 1000000LU;
if ((fl & CTL_LOCK_SRV_W)) {
assert(!(fl & CTL_LOCK_SRV_R));
ret = pthread_rwlock_timedwrlock(&s->ctl_lock, &ts);
if ((flags & CTL_LOCK_SRV_W)) {
assert(!(flags & CTL_LOCK_SRV_R));
ret = pthread_rwlock_timedwrlock(&server->ctl_lock, &ts);
}
if ((fl & CTL_LOCK_SRV_R)) {
ret = pthread_rwlock_timedrdlock(&s->ctl_lock, &ts);
if ((flags & CTL_LOCK_SRV_R)) {
ret = pthread_rwlock_timedrdlock(&server->ctl_lock, &ts);
}
return (ret != 0 ? KNOT_EBUSY : KNOT_EOK);
}
static void ctl_unlock(server_t *s, ctl_lock_flag_t fl)
static void ctl_unlock(server_t *server)
{
pthread_rwlock_unlock(&s->ctl_lock);
pthread_rwlock_unlock(&server->ctl_lock);
}
int ctl_exec(ctl_cmd_t cmd, ctl_args_t *args)
@@ -2447,7 +2447,7 @@ int ctl_exec(ctl_cmd_t cmd, ctl_args_t *args)
int ret = ctl_lock(args->server, cmd_table[cmd].locks, conf()->cache.ctl_timeout);
if (ret == KNOT_EOK) {
ret = cmd_table[cmd].fcn(args, cmd);
ctl_unlock(args->server, cmd_table[cmd].locks);
ctl_unlock(args->server);
}
return ret;