Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 13 May 2000 07:08:27 -0700
From:      nathan@khmere.com
To:        Alfred Perlstein <bright@wintelcom.net>
Cc:        "hackers@FreeBSD.ORG" <hackers@FreeBSD.ORG>
Subject:   Re: mremap help ? or no support for FreeBSD ? so do what ?
Message-ID:  <391D61DA.C9793AAC@khmere.com>
References:  <391D39E0.934224E4@khmere.com> <20000512235721.A28383@fw.wintelcom.net>

next in thread | previous in thread | raw e-mail | index | archive | help
Alfred Perlstein wrote:

> * nathan@khmere.com <nathan@khmere.com> [000512 21:54] wrote:
> > I know that this was discussed in the past but I can't find out what to
> > do ?
> >
> > In Linux if I have to resize a mmap 'ed object I can just use mremap....
> > but in FreeBSD if,  I want to resize it what do I do ?
> >
> > I have tried writing past where I know the end is and it kinda works ?
> > but why ?
> >
> > Is their a better solution besides just writing to the file and then
> > calling msync ?
> >
> > Is their new plans to make a mremap call for FreeBSD 4.x ?
>
> no.
>
> >
> > Or am I just  sh%t  out of luck ?
>
> Possibly, but if you describe what you are trying to accomplish
> there may be some advice available.  Your misuse of msync makes me
> think that a rethinking of what you are trying to accomplish may
> be a good idea.  Please explain what makes you need mremap which
> is not portable to any version of unix.  I'm assuming you want your
> app to work on Solaris and other commercial systems.
>
> --
> -Alfred Perlstein - [bright@wintelcom.net|alfred@freebsd.org]
> "I have the heart of a child; I keep it in a jar on my desk."
>
> To Unsubscribe: send mail to majordomo@FreeBSD.org
> with "unsubscribe freebsd-hackers" in the body of the message

Sorry !

Ok here is a snipit of what I am trying to do....

fstat(fd, &st);
if( (base = (caddr_t *) mmap(0, st.st_size, ( PROT_READ | PROT_WRITE ) ,
MAP_SHARED, fd, 0)) == MAP_FAILED)
 {
   MSG_ERR("cannot mmap file, exiting ! ");
   _exit(1);
 }

/* say st.st_size = 200, and I want to add to the end of the file more data
*/
base += 200; /* we are now at the end */

rec = (stuct rec_t *) base;
rec->len = 200;
/* we are writing to the buff, but we are past.... */
memmove(rec->data, data, 100);
msync(base, 0, (st.st_len + rec->len),  MS_ASYNC);

the struct rec_t is an example of a stuct that I want to append to the buf
and make another reccord.
If base was a regular pointer we would segfault.... cause we are past the
pointers buf....
but  it kinda works.. meaning it will write and add and sometimes and not
segfault... sometimes...

or I can do this:

rec = (stuct rec_t *) base;
rec->len = 200;
memmove(rec->data, data, 100);
write(fd, (char *) rec, rec->len);
msync(base, 0, (st.st_len + rec->len),  MS_ASYNC);

After I append to the file and then msync.  I should be able to read the
reccord that I just added from base.
base  should reflect the file.... right ?

I want to make things simple and only append to the buffer "base" and not
have to re-open the file and write to it then msync it back to mem. I know
that some of this under FreeBSD "automatic" meaning that the changes made to
the file  are seen by "base" even though I do not call msync..... but in
order to keep things clear, I will msync.

I hope that this wasn't too confusing... I am not good at explanations.... or
spelling....

thank you

nathan



To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-hackers" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?391D61DA.C9793AAC>