Changeset: fd5f0630e013 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=fd5f0630e013 Modified Files: gdk/gdk_storage.c Branch: resultset Log Message:
Fixes to BATmsync. Only call msync on memory-mapped files. Don't refer to data on the stack of another thread. diffs (88 lines): diff --git a/gdk/gdk_storage.c b/gdk/gdk_storage.c --- a/gdk/gdk_storage.c +++ b/gdk/gdk_storage.c @@ -606,9 +606,12 @@ typedef struct{ } Msyncjob; static void -BATmsyncImplementation( void *arg){ - Msyncjob job = *(Msyncjob*) arg; - (void) MT_msync(job.adr, job.len); +BATmsyncImplementation(void *arg) +{ + Msyncjob job = *(Msyncjob *) arg; + + GDKfree(arg); + (void) MT_msync(job.adr, job.len); } void @@ -617,36 +620,47 @@ BATmsync(BAT *b) #ifdef MSYNC_BACKGROUND MT_Id tid; #endif - - Msyncjob job; - Msyncjob jobv; + + Msyncjob *job; size_t offset; - job.adr = b->T->heap.base; - offset = ((size_t)job.adr % (size_t)MT_pagesize()); - job.len = MT_pagesize() * (1+((b->T->heap.base + b->T->heap.free - job.adr)/MT_pagesize())); - if( offset ) - job.adr -= (MT_pagesize() - offset); - if( job.len) + if (b->T->heap.storage == STORE_MMAP) { + job = GDKmalloc(sizeof(*job)); + + if (job) { + job->adr = b->T->heap.base; + offset = ((size_t) job->adr % MT_pagesize()); + job->len = MT_pagesize() * (1 + ((b->T->heap.base + b->T->heap.free - job->adr) / MT_pagesize())); + if (offset) + job->adr -= (MT_pagesize() - offset); + if (job->len) { #ifdef MSYNC_BACKGROUND - MT_create_thread(&tid, BATmsyncImplementation, (void *) &job, MT_THR_DETACHED); + MT_create_thread(&tid, BATmsyncImplementation, (void *) job, MT_THR_DETACHED); #else - BATmsyncImplementation((void*) &job); + BATmsyncImplementation((void*) job); #endif - - if( b->T->vheap){ - jobv.adr = b->T->vheap->base; - offset = ((size_t)jobv.adr % (size_t)MT_pagesize()); - jobv.len = MT_pagesize() * (1+((b->T->vheap->base + b->T->vheap->free - jobv.adr)/MT_pagesize())); + } + } + } - if( offset ) - jobv.adr -= (MT_pagesize() - offset); - if( jobv.len) + if (b->T->vheap && b->T->vheap->storage == STORE_MMAP) { + job = GDKmalloc(sizeof(*job)); + + if (job) { + job->adr = b->T->vheap->base; + offset = ((size_t)job->adr % MT_pagesize()); + job->len = MT_pagesize() * (1 + ((b->T->vheap->base + b->T->vheap->free - job->adr) / MT_pagesize())); + + if (offset) + job->adr -= (MT_pagesize() - offset); + if (job->len) { #ifdef MSYNC_BACKGROUND - MT_create_thread(&tid, BATmsyncImplementation, (void *) &jobv, MT_THR_DETACHED); + MT_create_thread(&tid, BATmsyncImplementation, (void *) job, MT_THR_DETACHED); #else - BATmsyncImplementation((void*) &job); + BATmsyncImplementation((void*) job); #endif + } + } } } _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list