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) { ...@@ -90,7 +90,7 @@ struct VPFX(file_reader) {
unsigned magic; unsigned magic;
#define FILE_READER_MAGIC 0x08d18e5b #define FILE_READER_MAGIC 0x08d18e5b
int flags; int flags;
pthread_rwlock_t lock; pthread_rwlock_t *lock;
struct file_info *info; struct file_info *info;
char *addr; char *addr;
char *vcl_name; char *vcl_name;
...@@ -127,6 +127,7 @@ check(union sigval val) ...@@ -127,6 +127,7 @@ check(union sigval val)
AN(rdr->vcl_name); AN(rdr->vcl_name);
AN(rdr->obj_name); AN(rdr->obj_name);
AN(rdr->errbuf); AN(rdr->errbuf);
AN(rdr->lock);
AN(rdr->info->path); AN(rdr->info->path);
errno = 0; errno = 0;
...@@ -251,7 +252,7 @@ check(union sigval val) ...@@ -251,7 +252,7 @@ check(union sigval val)
flags |= RDR_INITIALIZED; flags |= RDR_INITIALIZED;
out: out:
AZ(pthread_rwlock_wrlock(&rdr->lock)); AZ(pthread_rwlock_wrlock(rdr->lock));
if (addr != NULL) { if (addr != NULL) {
prev = rdr->addr; prev = rdr->addr;
rdr->addr = addr; rdr->addr = addr;
...@@ -280,7 +281,7 @@ check(union sigval val) ...@@ -280,7 +281,7 @@ check(union sigval val)
memcpy(rdr->info, info, sizeof(*rdr->info)); memcpy(rdr->info, info, sizeof(*rdr->info));
if (rdr->info->sha256 != NULL) if (rdr->info->sha256 != NULL)
memcpy(rdr->info->sha256, sha256, VSHA256_DIGEST_LENGTH); memcpy(rdr->info->sha256, sha256, VSHA256_DIGEST_LENGTH);
AZ(pthread_rwlock_unlock(&rdr->lock)); AZ(pthread_rwlock_unlock(rdr->lock));
free(errbuf); free(errbuf);
if (fd != -1) if (fd != -1)
...@@ -356,6 +357,16 @@ vmod_reader__init(VRT_CTX, struct VPFX(file_reader) **rdrp, ...@@ -356,6 +357,16 @@ vmod_reader__init(VRT_CTX, struct VPFX(file_reader) **rdrp,
vcl_name, vstrerror(errno)); vcl_name, vstrerror(errno));
return; 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); AZ(info->sha256);
if (enable_sha256) { if (enable_sha256) {
errno = 0; errno = 0;
...@@ -422,7 +433,7 @@ vmod_reader__init(VRT_CTX, struct VPFX(file_reader) **rdrp, ...@@ -422,7 +433,7 @@ vmod_reader__init(VRT_CTX, struct VPFX(file_reader) **rdrp,
} }
errno = 0; 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, VFAIL(ctx, "new %s: initializing lock: %s", vcl_name,
vstrerror(errno)); vstrerror(errno));
return; return;
...@@ -545,6 +556,8 @@ vmod_reader__fini(struct VPFX(file_reader) **rdrp) ...@@ -545,6 +556,8 @@ vmod_reader__fini(struct VPFX(file_reader) **rdrp)
free(rdr->obj_name); free(rdr->obj_name);
if (rdr->errbuf != NULL) if (rdr->errbuf != NULL)
free(rdr->errbuf); free(rdr->errbuf);
if (rdr->lock != NULL)
free(rdr->lock);
FREE_OBJ(rdr); FREE_OBJ(rdr);
} }
...@@ -553,7 +566,7 @@ vmod_reader__fini(struct VPFX(file_reader) **rdrp) ...@@ -553,7 +566,7 @@ vmod_reader__fini(struct VPFX(file_reader) **rdrp)
AN(strcmp((rdr)->errbuf, NO_ERR)); \ AN(strcmp((rdr)->errbuf, NO_ERR)); \
VRT_fail((ctx), "%s." method "(): %s", \ VRT_fail((ctx), "%s." method "(): %s", \
(rdr)->obj_name, (rdr)->errbuf); \ (rdr)->obj_name, (rdr)->errbuf); \
AZ(pthread_rwlock_unlock(&(rdr)->lock)); \ AZ(pthread_rwlock_unlock((rdr)->lock)); \
return ret; \ return ret; \
} \ } \
} while (0) } while (0)
...@@ -563,14 +576,15 @@ vmod_reader_get(VRT_CTX, struct VPFX(file_reader) *rdr) ...@@ -563,14 +576,15 @@ vmod_reader_get(VRT_CTX, struct VPFX(file_reader) *rdr)
{ {
CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC); CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC);
CHECK_OBJ_NOTNULL(rdr, FILE_READER_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); ERRCHK(ctx, rdr, "get", NULL);
AN(rdr->flags & RDR_MAPPED); AN(rdr->flags & RDR_MAPPED);
AN(rdr->addr); AN(rdr->addr);
AZ(pthread_rwlock_unlock(&rdr->lock)); AZ(pthread_rwlock_unlock(rdr->lock));
return (rdr->addr); return (rdr->addr);
} }
...@@ -582,6 +596,7 @@ vmod_reader_synth(VRT_CTX, struct VPFX(file_reader) *rdr) ...@@ -582,6 +596,7 @@ vmod_reader_synth(VRT_CTX, struct VPFX(file_reader) *rdr)
CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC); CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC);
CHECK_OBJ_NOTNULL(rdr, FILE_READER_MAGIC); CHECK_OBJ_NOTNULL(rdr, FILE_READER_MAGIC);
AN(rdr->lock);
if ((ctx->method & (VCL_MET_SYNTH | VCL_MET_BACKEND_ERROR)) == 0) { if ((ctx->method & (VCL_MET_SYNTH | VCL_MET_BACKEND_ERROR)) == 0) {
VRT_fail(ctx, "%s.synth() may only be called in vcl_synth or " 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) ...@@ -589,7 +604,7 @@ vmod_reader_synth(VRT_CTX, struct VPFX(file_reader) *rdr)
return; return;
} }
AZ(pthread_rwlock_rdlock(&rdr->lock)); AZ(pthread_rwlock_rdlock(rdr->lock));
ERRCHK(ctx, rdr, "synth", ); ERRCHK(ctx, rdr, "synth", );
AN(rdr->flags & RDR_MAPPED); AN(rdr->flags & RDR_MAPPED);
...@@ -597,7 +612,7 @@ vmod_reader_synth(VRT_CTX, struct VPFX(file_reader) *rdr) ...@@ -597,7 +612,7 @@ vmod_reader_synth(VRT_CTX, struct VPFX(file_reader) *rdr)
strands.p[0] = rdr->addr; strands.p[0] = rdr->addr;
VRT_synth_page(ctx, &strands); VRT_synth_page(ctx, &strands);
AZ(pthread_rwlock_unlock(&rdr->lock)); AZ(pthread_rwlock_unlock(rdr->lock));
return; return;
} }
...@@ -609,14 +624,15 @@ vmod_reader_blob(VRT_CTX, struct VPFX(file_reader) *rdr) ...@@ -609,14 +624,15 @@ vmod_reader_blob(VRT_CTX, struct VPFX(file_reader) *rdr)
CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC); CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC);
CHECK_OBJ_NOTNULL(rdr, FILE_READER_MAGIC); CHECK_OBJ_NOTNULL(rdr, FILE_READER_MAGIC);
CHECK_OBJ_NOTNULL(rdr->info, FILE_INFO_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); ERRCHK(ctx, rdr, "blob", NULL);
AN(rdr->flags & RDR_MAPPED); AN(rdr->flags & RDR_MAPPED);
AN(rdr->addr); AN(rdr->addr);
blob = VRT_blob(ctx, "VMOD file blob()", rdr->addr, rdr->info->len - 1, blob = VRT_blob(ctx, "VMOD file blob()", rdr->addr, rdr->info->len - 1,
VMOD_FILE_BLOB_MAGIC); VMOD_FILE_BLOB_MAGIC);
AZ(pthread_rwlock_unlock(&rdr->lock)); AZ(pthread_rwlock_unlock(rdr->lock));
return (blob); return (blob);
} }
...@@ -657,11 +673,12 @@ vmod_reader_size(VRT_CTX, struct VPFX(file_reader) *rdr) ...@@ -657,11 +673,12 @@ vmod_reader_size(VRT_CTX, struct VPFX(file_reader) *rdr)
CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC); CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC);
CHECK_OBJ_NOTNULL(rdr, FILE_READER_MAGIC); CHECK_OBJ_NOTNULL(rdr, FILE_READER_MAGIC);
CHECK_OBJ_NOTNULL(rdr->info, FILE_INFO_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); ERRCHK(ctx, rdr, "size", 0);
sz = rdr->info->len - 1; sz = rdr->info->len - 1;
AZ(pthread_rwlock_unlock(&rdr->lock)); AZ(pthread_rwlock_unlock(rdr->lock));
return (sz); return (sz);
} }
...@@ -675,12 +692,13 @@ vmod_reader_mtime(VRT_CTX, struct VPFX(file_reader) *rdr) ...@@ -675,12 +692,13 @@ vmod_reader_mtime(VRT_CTX, struct VPFX(file_reader) *rdr)
CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC); CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC);
CHECK_OBJ_NOTNULL(rdr, FILE_READER_MAGIC); CHECK_OBJ_NOTNULL(rdr, FILE_READER_MAGIC);
CHECK_OBJ_NOTNULL(rdr->info, FILE_INFO_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.); ERRCHK(ctx, rdr, "mtime", 0.);
secs = rdr->info->mtime.tv_sec; secs = rdr->info->mtime.tv_sec;
nsecs = rdr->info->mtime.tv_nsec; nsecs = rdr->info->mtime.tv_nsec;
AZ(pthread_rwlock_unlock(&rdr->lock)); AZ(pthread_rwlock_unlock(rdr->lock));
return (secs + nsecs * 1e-9); return (secs + nsecs * 1e-9);
} }
...@@ -719,14 +737,15 @@ vmod_reader_id(VRT_CTX, struct VPFX(file_reader) *rdr) ...@@ -719,14 +737,15 @@ vmod_reader_id(VRT_CTX, struct VPFX(file_reader) *rdr)
CHECK_OBJ_NOTNULL(ctx->ws, WS_MAGIC); CHECK_OBJ_NOTNULL(ctx->ws, WS_MAGIC);
CHECK_OBJ_NOTNULL(rdr, FILE_READER_MAGIC); CHECK_OBJ_NOTNULL(rdr, FILE_READER_MAGIC);
CHECK_OBJ_NOTNULL(rdr->info, FILE_INFO_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); ERRCHK(ctx, rdr, "id", NULL);
secs = rdr->info->mtime.tv_sec; secs = rdr->info->mtime.tv_sec;
nsecs = (uint32_t) rdr->info->mtime.tv_nsec; nsecs = (uint32_t) rdr->info->mtime.tv_nsec;
dev = rdr->info->dev; dev = rdr->info->dev;
ino = rdr->info->ino; 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) if ((data = WS_Alloc(ctx->ws, sizeof(secs) + sizeof(nsecs)
+ sizeof(dev) + sizeof(ino))) == NULL) { + sizeof(dev) + sizeof(ino))) == NULL) {
...@@ -754,16 +773,17 @@ vmod_reader_sha256(VRT_CTX, struct VPFX(file_reader) *rdr) ...@@ -754,16 +773,17 @@ vmod_reader_sha256(VRT_CTX, struct VPFX(file_reader) *rdr)
CHECK_OBJ_NOTNULL(ctx->ws, WS_MAGIC); CHECK_OBJ_NOTNULL(ctx->ws, WS_MAGIC);
CHECK_OBJ_NOTNULL(rdr, FILE_READER_MAGIC); CHECK_OBJ_NOTNULL(rdr, FILE_READER_MAGIC);
CHECK_OBJ_NOTNULL(rdr->info, FILE_INFO_MAGIC); CHECK_OBJ_NOTNULL(rdr->info, FILE_INFO_MAGIC);
AN(rdr->lock);
if (rdr->info->sha256 == NULL) { if (rdr->info->sha256 == NULL) {
VFAIL(ctx, "%s.sha256(): sha256 not enabled", rdr->obj_name); VFAIL(ctx, "%s.sha256(): sha256 not enabled", rdr->obj_name);
return NULL; return NULL;
} }
AZ(pthread_rwlock_rdlock(&rdr->lock)); AZ(pthread_rwlock_rdlock(rdr->lock));
ERRCHK(ctx, rdr, "sha256", NULL); ERRCHK(ctx, rdr, "sha256", NULL);
digest = WS_Copy(ctx->ws, rdr->info->sha256, VSHA256_DIGEST_LENGTH); 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) { if (digest == NULL) {
VFAIL(ctx, "%s.sha256(): insufficient workspace for digest", 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