delorie.com/archives/browse.cgi   search  
Mail Archives: djgpp/1999/06/15/12:54:07

From: "Christopher Nelson" <paradox AT gye DOT satnet DOT net>
To: <djgpp AT delorie DOT com>
Subject: FSEXT problem/question
Date: Mon, 14 Jun 1999 23:24:15 -0600
Message-ID: <01beb6ef$4f604220$LocalHost@thendren>
MIME-Version: 1.0
X-Priority: 3
X-MSMail-Priority: Normal
X-Mailer: Microsoft Outlook Express 4.71.1712.3
X-MimeOLE: Produced By Microsoft MimeOLE V4.71.1712.3
Reply-To: djgpp AT delorie DOT com

This is a multi-part message in MIME format.

------=_NextPart_000_0041_01BEB6BD.04C5D220
Content-Type: text/plain;
	charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable


  Probably Eli, Nate, or DJ can best answer this question for me:
=20
    I wrote a File System Extension for DJGPP using DJDEV2.02.  This =
extension allows a programmer to treate memory as if it were a file.  =
That way you can use the normal f{open/close/read/write/etc.} routines =
and have what is essentially a RAMDRIVE.
=20
    It fully emulates the device, down to stat and fstat.  The extension =
basically builds it's own mini-filesystem right in memory.  To access =
the extension, files should be opened under "/dev/ramdrv/", which then =
triggers the open function into creating a ram-based file and taking =
control of it, rather than passing it along.  All good and well.  Here's =
the problem:
=20
    According to the help file, extensions which fully emulate a device =
should use __FSEXT_alloc_fd to get a file descriptor, since they won't =
recieve one through DOS's normal gateway, that being logical since DOS =
has no "/dev/ramdrv" device.  Unfortunately, instead of getting re-used, =
closed file handles are discarded.  That means that a user may open only =
255-13 files in a session (not simulataneously, i mean ever.  during the =
life of the program, the user may only open a ramdrv file 255-13 times.  =
which means that you could open and close the same file 255-13 times, or =
something similiar, see?) and after that it dies because I get a -1 for =
the file descriptor.
=20
    I realize that that happens because __FSEXT_alloc_fd only does a dup =
off the descriptor for the "nul" device, but isn't there anyway to reuse =
it?  That seems to be a fairly huge problem.  I can't see any extension =
being satisfactory with only being able to work 255-13  times. =20
=20
    The only other option I saw was to allocate ONE descriptor, then =
allocate my own descriptors for each additional file.  However, that =
does not work because I only get one bit of information from read and =
write, and that is the descriptor.  It would be impossible for me to =
know WHICH file it was referring to if they were broken off from the =
main descriptor.
=20
    Is there anything I can do?  The close procedure for my extension is =
pretty simple, not that it matters anyway, since the same thing happens =
whether I want it to or not: (meaning that the _close function always =
closes the handle passed it, no matter what it is that I tell it.)
=20
int
mmf_close(int filedes)
{
 __FSEXT_set_data(filedes, 0);
 return(0);
}


And this is the entry in the handler:

  case   __FSEXT_close:
       *rv =3D mmf_close(va_arg(args, int));
       return(1);
       break;

This is output from the testbench.  The number to the far left is =
obviously the cycle, the number following 1: is the file handle obtained =
from fileno(test1_f) for the disk-based file.  The number following the =
2: is the same thing for the ram-based file using fileno(test2_f):

0 (1:9 2:13)
1 (1:9 2:14)
2 (1:9 2:15)
3 (1:9 2:16)
4 (1:9 2:17)
5 (1:9 2:18)
6 (1:9 2:19)
7 (1:9 2:20)
8 (1:9 2:21)
9 (1:9 2:22)
10 (1:9 2:23)
11 (1:9 2:24)
12 (1:9 2:25)
13 (1:9 2:26)
14 (1:9 2:27)
15 (1:9 2:28)
16 (1:9 2:29)
17 (1:9 2:30)
18 (1:9 2:31)
19 (1:9 2:32)
20 (1:9 2:33)

as you can see, the descriptor slowly progresses up the ladder.
here's a little farther on:

226 (1:9 2:239)
227 (1:9 2:240)
228 (1:9 2:241)
229 (1:9 2:242)
230 (1:9 2:243)
231 (1:9 2:244)
232 (1:9 2:245)
233 (1:9 2:246)
234 (1:9 2:247)
235 (1:9 2:248)
236 (1:9 2:249)
237 (1:9 2:250)
238 (1:9 2:251)
239 (1:9 2:252)
240 (1:9 2:253)
241 (1:9 2:254)
242 (1:9 2:-1)
243 (1:9 2:-1)
244 (1:9 2:-1)
245 (1:9 2:-1)
246 (1:9 2:-1)

As you can imagine, this is somewhat annoying.  Is there anything at all =
that I can do?

    -=3D{C}=3D-

------=_NextPart_000_0041_01BEB6BD.04C5D220
Content-Type: text/html;
	charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable

<!DOCTYPE HTML PUBLIC "-//W3C//DTD W3 HTML//EN">
<HTML>
<HEAD>

<META content=3Dtext/html;charset=3Diso-8859-1 =
http-equiv=3DContent-Type><!DOCTYPE HTML PUBLIC "-//W3C//DTD W3 =
HTML//EN"><!DOCTYPE HTML PUBLIC "-//W3C//DTD W3 HTML//EN">
<META content=3D'"MSHTML 4.71.1712.3"' name=3DGENERATOR>
</HEAD>
<BODY bgColor=3D#ffffff>
<DIV>&nbsp;</DIV>
<DIV><FONT color=3D#000000 size=3D2>&nbsp; Probably Eli, Nate, or DJ can =
best answer=20
this question for me:</FONT></DIV>
<DIV><FONT color=3D#000000 size=3D2></FONT>&nbsp;</DIV>
<DIV><FONT color=3D#000000 size=3D2>&nbsp;&nbsp;&nbsp; I wrote a File =
System=20
Extension for DJGPP using DJDEV2.02.&nbsp; This extension allows a =
programmer to=20
treate memory as if it were a file.&nbsp; That way you can use the =
normal=20
f{open/close/read/write/etc.} routines and have what is essentially a=20
RAMDRIVE.</FONT></DIV>
<DIV><FONT color=3D#000000 size=3D2></FONT>&nbsp;</DIV>
<DIV><FONT color=3D#000000 size=3D2>&nbsp;&nbsp;&nbsp; It fully emulates =
the device,=20
down to stat and fstat.&nbsp; The extension basically builds it's own=20
mini-filesystem right in memory.&nbsp; To access the extension, files =
should be=20
opened under &quot;/dev/ramdrv/&quot;, which then triggers the open =
function=20
into creating a ram-based file and taking control of it, rather than =
passing it=20
along.&nbsp; All good and well.&nbsp; Here's the problem:</FONT></DIV>
<DIV><FONT color=3D#000000 size=3D2></FONT>&nbsp;</DIV>
<DIV><FONT color=3D#000000 size=3D2>&nbsp;&nbsp;&nbsp; According to the =
help file,=20
extensions which fully emulate a device should use __FSEXT_alloc_fd to =
get a=20
file descriptor, since they won't recieve one through DOS's normal =
gateway, that=20
being logical since DOS has no &quot;/dev/ramdrv&quot; device.&nbsp;=20
Unfortunately, instead of getting re-used, closed file handles are=20
discarded.&nbsp; That means that a user may open only 255-13 files in a =
session=20
(not simulataneously, i mean ever.&nbsp; during the life of the program, =
the=20
user may only open a ramdrv file 255-13 times.&nbsp; which means that =
you could=20
open and close the same file 255-13 times, or something similiar, see?) =
and=20
after that it dies because I get a -1 for the file =
descriptor.</FONT></DIV>
<DIV><FONT color=3D#000000 size=3D2></FONT>&nbsp;</DIV>
<DIV><FONT color=3D#000000 size=3D2>&nbsp;&nbsp;&nbsp; I realize that =
that happens=20
because __FSEXT_alloc_fd only does a dup off the descriptor for the=20
&quot;nul&quot; device, but isn't there anyway to reuse it?&nbsp; That =
seems to=20
be a fairly huge problem.&nbsp; I can't see any extension being =
satisfactory=20
with only being able to work 255-13&nbsp; times.&nbsp; </FONT></DIV>
<DIV><FONT color=3D#000000 size=3D2></FONT>&nbsp;</DIV>
<DIV><FONT color=3D#000000 size=3D2>&nbsp;&nbsp;&nbsp; The only other =
option I saw=20
was to allocate ONE descriptor, then allocate my own descriptors for =
each=20
additional file.&nbsp; However, that does not work because I only get =
one bit of=20
information from read and write, and that is the descriptor.&nbsp; It =
would be=20
impossible for me to know WHICH file it was referring to if they were =
broken off=20
from the main descriptor.</FONT></DIV>
<DIV><FONT color=3D#000000 size=3D2></FONT>&nbsp;</DIV>
<DIV><FONT color=3D#000000 size=3D2>&nbsp;&nbsp;&nbsp; Is there anything =
I can=20
do?&nbsp; The close procedure for my extension is pretty simple, not =
that it=20
matters anyway, since the same thing happens whether I want it to or =
not:=20
(meaning that the _close function always closes the handle passed it, no =
matter=20
what it is that I tell it.)</FONT></DIV>
<DIV><FONT color=3D#000000 size=3D2></FONT>&nbsp;&nbsp;</DIV>
<DIV><FONT color=3D#000000 size=3D2>int<BR>mmf_close(int =
filedes)<BR>{<BR>=20
__FSEXT_set_data(filedes, 0);<BR> return(0);<BR>}</FONT>&nbsp;</DIV>
<DIV><FONT color=3D#000000 size=3D2></FONT>&nbsp;</DIV>
<DIV><FONT color=3D#000000 size=3D2><BR>And this is the entry in the=20
handler:</FONT>&nbsp;</DIV>
<DIV><FONT color=3D#000000 size=3D2></FONT>&nbsp;</DIV>
<DIV><FONT size=3D2>&nbsp; case&nbsp;&nbsp;=20
__FSEXT_close:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *rv =3D=20
mmf_close(va_arg(args, int));<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=20
return(1);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; =
break;</FONT>&nbsp;</DIV>
<DIV><FONT size=3D2></FONT>&nbsp;</DIV>
<DIV><FONT size=3D2>This is output from the testbench.&nbsp; The number =
to the far=20
left is obviously the cycle, the number following 1: is the file handle =
obtained=20
from fileno(test1_f) for the disk-based file.&nbsp; The number following =
the 2:=20
is the same thing for the ram-based file using=20
fileno(test2_f):<BR></FONT>&nbsp;</DIV>
<DIV><FONT size=3D2>0 (1:9 2:13)<BR>1 (1:9 2:14)<BR>2 (1:9 2:15)<BR>3 =
(1:9=20
2:16)<BR>4 (1:9 2:17)<BR>5 (1:9 2:18)<BR>6 (1:9 2:19)<BR>7 (1:9 =
2:20)<BR>8 (1:9=20
2:21)<BR>9 (1:9 2:22)<BR>10 (1:9 2:23)<BR>11 (1:9 2:24)<BR>12 (1:9 =
2:25)<BR>13=20
(1:9 2:26)<BR>14 (1:9 2:27)<BR>15 (1:9 2:28)<BR>16 (1:9 2:29)<BR>17 (1:9 =

2:30)<BR>18 (1:9 2:31)<BR>19 (1:9 2:32)<BR>20 (1:9 =
2:33)<BR></FONT>&nbsp;</DIV>
<DIV><FONT size=3D2>as you can see, the descriptor slowly progresses up =
the=20
ladder.</FONT></DIV>
<DIV><FONT color=3D#000000 size=3D2>here's a little farther =
on:</FONT></DIV>
<DIV><FONT color=3D#000000 size=3D2></FONT>&nbsp;</DIV>
<DIV><FONT color=3D#000000 size=3D2>226 (1:9 2:239)<BR>227 (1:9 =
2:240)<BR>228 (1:9=20
2:241)<BR>229 (1:9 2:242)<BR>230 (1:9 2:243)<BR>231 (1:9 2:244)<BR>232 =
(1:9=20
2:245)<BR>233 (1:9 2:246)<BR>234 (1:9 2:247)<BR>235 (1:9 2:248)<BR>236 =
(1:9=20
2:249)<BR>237 (1:9 2:250)<BR>238 (1:9 2:251)<BR>239 (1:9 2:252)<BR>240 =
(1:9=20
2:253)<BR>241 (1:9 2:254)<BR>242 (1:9 2:-1)<BR>243 (1:9 2:-1)<BR>244 =
(1:9=20
2:-1)<BR>245 (1:9 2:-1)<BR>246 (1:9 2:-1)<BR></FONT>&nbsp;</DIV>
<DIV><FONT color=3D#000000 size=3D2>As you can imagine, this is somewhat =

annoying.&nbsp; Is there anything at all that I can do?</FONT></DIV>
<DIV><FONT color=3D#000000 size=3D2></FONT>&nbsp;</DIV>
<DIV><FONT color=3D#000000 face=3D"" size=3D2>&nbsp;&nbsp;&nbsp;=20
-=3D{C}=3D-</FONT></DIV></BODY></HTML>

------=_NextPart_000_0041_01BEB6BD.04C5D220--

- Raw text -


  webmaster     delorie software   privacy  
  Copyright © 2019   by DJ Delorie     Updated Jul 2019