Commit 68852c62 authored by Geoff Simmons's avatar Geoff Simmons

The reader object struct points to the lock.

Rather than contain it entirely, in the continued effort for
better cacheline-friendliness. This is a considerable improvement,
but we're still not quite there.
parent 3c2e7f8d
......@@ -90,7 +90,7 @@ struct VPFX(file_reader) {
unsigned magic;
#define FILE_READER_MAGIC 0x08d18e5b
int flags;
pthread_rwlock_t lock;
pthread_rwlock_t *lock;
struct file_info *info;
char *addr;
char *vcl_name;
......@@ -127,6 +127,7 @@ check(union sigval val)
AN(rdr->vcl_name);
AN(rdr->obj_name);
AN(rdr->errbuf);
AN(rdr->lock);
AN(rdr->info->path);
errno = 0;
......@@ -251,7 +252,7 @@ check(union sigval val)
flags |= RDR_INITIALIZED;
out:
AZ(pthread_rwlock_wrlock(&rdr->lock));
AZ(pthread_rwlock_wrlock(rdr->lock));
if (addr != NULL) {
prev = rdr->addr;
rdr->addr = addr;
......@@ -280,7 +281,7 @@ check(union sigval val)
memcpy(rdr->info, info, sizeof(*rdr->info));
if (rdr->info->sha256 != NULL)
memcpy(rdr->info->sha256, sha256, VSHA256_DIGEST_LENGTH);
AZ(pthread_rwlock_unlock(&rdr->lock));
AZ(pthread_rwlock_unlock(rdr->lock));
free(errbuf);
if (fd != -1)
......@@ -356,6 +357,16 @@ vmod_reader__init(VRT_CTX, struct VPFX(file_reader) **rdrp,
vcl_name, vstrerror(errno));
return;
}
AZ(rdr->lock);
errno = 0;
rdr->lock = malloc(sizeof(*rdr->lock));
if (rdr->lock == NULL) {
VFAIL(ctx, "new %s: allocating space for lock: %s",
vcl_name, vstrerror(errno));
return;
}
AZ(info->sha256);
if (enable_sha256) {
errno = 0;
......@@ -422,7 +433,7 @@ vmod_reader__init(VRT_CTX, struct VPFX(file_reader) **rdrp,
}
errno = 0;
if (pthread_rwlock_init(&rdr->lock, NULL) != 0) {
if (pthread_rwlock_init(rdr->lock, NULL) != 0) {
VFAIL(ctx, "new %s: initializing lock: %s", vcl_name,
vstrerror(errno));
return;
......@@ -545,6 +556,8 @@ vmod_reader__fini(struct VPFX(file_reader) **rdrp)
free(rdr->obj_name);
if (rdr->errbuf != NULL)
free(rdr->errbuf);
if (rdr->lock != NULL)
free(rdr->lock);
FREE_OBJ(rdr);
}
......@@ -553,7 +566,7 @@ vmod_reader__fini(struct VPFX(file_reader) **rdrp)
AN(strcmp((rdr)->errbuf, NO_ERR)); \
VRT_fail((ctx), "%s." method "(): %s", \
(rdr)->obj_name, (rdr)->errbuf); \
AZ(pthread_rwlock_unlock(&(rdr)->lock)); \
AZ(pthread_rwlock_unlock((rdr)->lock)); \
return ret; \
} \
} while (0)
......@@ -563,14 +576,15 @@ vmod_reader_get(VRT_CTX, struct VPFX(file_reader) *rdr)
{
CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC);
CHECK_OBJ_NOTNULL(rdr, FILE_READER_MAGIC);
AN(rdr->lock);
AZ(pthread_rwlock_rdlock(&rdr->lock));
AZ(pthread_rwlock_rdlock(rdr->lock));
ERRCHK(ctx, rdr, "get", NULL);
AN(rdr->flags & RDR_MAPPED);
AN(rdr->addr);
AZ(pthread_rwlock_unlock(&rdr->lock));
AZ(pthread_rwlock_unlock(rdr->lock));
return (rdr->addr);
}
......@@ -582,6 +596,7 @@ vmod_reader_synth(VRT_CTX, struct VPFX(file_reader) *rdr)
CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC);
CHECK_OBJ_NOTNULL(rdr, FILE_READER_MAGIC);
AN(rdr->lock);
if ((ctx->method & (VCL_MET_SYNTH | VCL_MET_BACKEND_ERROR)) == 0) {
VRT_fail(ctx, "%s.synth() may only be called in vcl_synth or "
......@@ -589,7 +604,7 @@ vmod_reader_synth(VRT_CTX, struct VPFX(file_reader) *rdr)
return;
}
AZ(pthread_rwlock_rdlock(&rdr->lock));
AZ(pthread_rwlock_rdlock(rdr->lock));
ERRCHK(ctx, rdr, "synth", );
AN(rdr->flags & RDR_MAPPED);
......@@ -597,7 +612,7 @@ vmod_reader_synth(VRT_CTX, struct VPFX(file_reader) *rdr)
strands.p[0] = rdr->addr;
VRT_synth_page(ctx, &strands);
AZ(pthread_rwlock_unlock(&rdr->lock));
AZ(pthread_rwlock_unlock(rdr->lock));
return;
}
......@@ -609,14 +624,15 @@ vmod_reader_blob(VRT_CTX, struct VPFX(file_reader) *rdr)
CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC);
CHECK_OBJ_NOTNULL(rdr, FILE_READER_MAGIC);
CHECK_OBJ_NOTNULL(rdr->info, FILE_INFO_MAGIC);
AN(rdr->lock);
AZ(pthread_rwlock_rdlock(&rdr->lock));
AZ(pthread_rwlock_rdlock(rdr->lock));
ERRCHK(ctx, rdr, "blob", NULL);
AN(rdr->flags & RDR_MAPPED);
AN(rdr->addr);
blob = VRT_blob(ctx, "VMOD file blob()", rdr->addr, rdr->info->len - 1,
VMOD_FILE_BLOB_MAGIC);
AZ(pthread_rwlock_unlock(&rdr->lock));
AZ(pthread_rwlock_unlock(rdr->lock));
return (blob);
}
......@@ -657,11 +673,12 @@ vmod_reader_size(VRT_CTX, struct VPFX(file_reader) *rdr)
CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC);
CHECK_OBJ_NOTNULL(rdr, FILE_READER_MAGIC);
CHECK_OBJ_NOTNULL(rdr->info, FILE_INFO_MAGIC);
AN(rdr->lock);
AZ(pthread_rwlock_rdlock(&rdr->lock));
AZ(pthread_rwlock_rdlock(rdr->lock));
ERRCHK(ctx, rdr, "size", 0);
sz = rdr->info->len - 1;
AZ(pthread_rwlock_unlock(&rdr->lock));
AZ(pthread_rwlock_unlock(rdr->lock));
return (sz);
}
......@@ -675,12 +692,13 @@ vmod_reader_mtime(VRT_CTX, struct VPFX(file_reader) *rdr)
CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC);
CHECK_OBJ_NOTNULL(rdr, FILE_READER_MAGIC);
CHECK_OBJ_NOTNULL(rdr->info, FILE_INFO_MAGIC);
AN(rdr->lock);
AZ(pthread_rwlock_rdlock(&rdr->lock));
AZ(pthread_rwlock_rdlock(rdr->lock));
ERRCHK(ctx, rdr, "mtime", 0.);
secs = rdr->info->mtime.tv_sec;
nsecs = rdr->info->mtime.tv_nsec;
AZ(pthread_rwlock_unlock(&rdr->lock));
AZ(pthread_rwlock_unlock(rdr->lock));
return (secs + nsecs * 1e-9);
}
......@@ -719,14 +737,15 @@ vmod_reader_id(VRT_CTX, struct VPFX(file_reader) *rdr)
CHECK_OBJ_NOTNULL(ctx->ws, WS_MAGIC);
CHECK_OBJ_NOTNULL(rdr, FILE_READER_MAGIC);
CHECK_OBJ_NOTNULL(rdr->info, FILE_INFO_MAGIC);
AN(rdr->lock);
AZ(pthread_rwlock_rdlock(&rdr->lock));
AZ(pthread_rwlock_rdlock(rdr->lock));
ERRCHK(ctx, rdr, "id", NULL);
secs = rdr->info->mtime.tv_sec;
nsecs = (uint32_t) rdr->info->mtime.tv_nsec;
dev = rdr->info->dev;
ino = rdr->info->ino;
AZ(pthread_rwlock_unlock(&rdr->lock));
AZ(pthread_rwlock_unlock(rdr->lock));
if ((data = WS_Alloc(ctx->ws, sizeof(secs) + sizeof(nsecs)
+ sizeof(dev) + sizeof(ino))) == NULL) {
......@@ -754,16 +773,17 @@ vmod_reader_sha256(VRT_CTX, struct VPFX(file_reader) *rdr)
CHECK_OBJ_NOTNULL(ctx->ws, WS_MAGIC);
CHECK_OBJ_NOTNULL(rdr, FILE_READER_MAGIC);
CHECK_OBJ_NOTNULL(rdr->info, FILE_INFO_MAGIC);
AN(rdr->lock);
if (rdr->info->sha256 == NULL) {
VFAIL(ctx, "%s.sha256(): sha256 not enabled", rdr->obj_name);
return NULL;
}
AZ(pthread_rwlock_rdlock(&rdr->lock));
AZ(pthread_rwlock_rdlock(rdr->lock));
ERRCHK(ctx, rdr, "sha256", NULL);
digest = WS_Copy(ctx->ws, rdr->info->sha256, VSHA256_DIGEST_LENGTH);
AZ(pthread_rwlock_unlock(&rdr->lock));
AZ(pthread_rwlock_unlock(rdr->lock));
if (digest == NULL) {
VFAIL(ctx, "%s.sha256(): insufficient workspace for digest",
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment