2
0

TestFs.Mod 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521
  1. MODULE TestFs;
  2. IMPORT
  3. SYSTEM, Random, Files, Kernel, Commands, FoxBasic, Strings;
  4. TYPE
  5. Writer = OBJECT
  6. VAR
  7. id: LONGINT;
  8. file: Files.File;
  9. fw: Files.Writer;
  10. fileSize: HUGEINT;
  11. byteCount: HUGEINT;
  12. rndData, rndUpdate: Random.Generator;
  13. tStart: Kernel.MilliTimer;
  14. startByteCount: HUGEINT;
  15. fileName0: Files.FileName;
  16. partNum: LONGINT;
  17. partByteCount: LONGINT;
  18. run := FALSE, exited := FALSE: BOOLEAN;
  19. PROCEDURE &InitWriter(id: LONGINT; CONST fileName: ARRAY OF CHAR; fileSize: HUGEINT);
  20. BEGIN
  21. ASSERT(~exited);
  22. file := Files.New(fileName);
  23. ASSERT(file # NIL);
  24. Files.Register(file);
  25. Files.OpenWriter(fw,file,0);
  26. NEW(rndData);
  27. rndData.InitSeed(id);
  28. NEW(rndUpdate);
  29. rndUpdate.InitSeed(-id);
  30. SELF.id := id;
  31. SELF.fileSize := fileSize;
  32. COPY(fileName,fileName0);
  33. partNum := 0;
  34. byteCount := 0;
  35. partByteCount := 0;
  36. run := TRUE;
  37. END InitWriter;
  38. PROCEDURE Exit;
  39. BEGIN{EXCLUSIVE}
  40. run := FALSE;
  41. AWAIT(exited);
  42. END Exit;
  43. PROCEDURE Start;
  44. BEGIN {EXCLUSIVE}
  45. run := TRUE
  46. END Start;
  47. PROCEDURE Pause;
  48. BEGIN {EXCLUSIVE}
  49. run := FALSE
  50. END Pause;
  51. PROCEDURE Running (): BOOLEAN;
  52. BEGIN {EXCLUSIVE}
  53. RETURN run
  54. END Running;
  55. PROCEDURE Exited (): BOOLEAN;
  56. BEGIN {EXCLUSIVE}
  57. RETURN exited
  58. END Exited;
  59. PROCEDURE Loop;
  60. VAR
  61. v: LONGINT;
  62. strNum: ARRAY 16 OF CHAR;
  63. str: Files.FileName;
  64. BEGIN
  65. WHILE run & ((fileSize <= 0) OR (byteCount < fileSize)) & (fw.res = 0) DO
  66. v := rndData.Integer();
  67. fw.RawLInt(v);
  68. INC(byteCount,SIZEOF(LONGINT));
  69. INC(partByteCount,SIZEOF(LONGINT));
  70. IF partByteCount MOD 0x1000000 = 0 THEN
  71. Kernel.SetTimer(tStart,0);
  72. startByteCount := byteCount;
  73. END;
  74. (*
  75. IF rndUpdate.Dice(4096) = 0 THEN (* Files.DefaultWriterSize *)
  76. fw.Update;
  77. END;
  78. *)
  79. IF partByteCount = 0x40000000 THEN (* 1GB parts *)
  80. partByteCount := 0;
  81. INC(partNum);
  82. fw.Update;
  83. file.Close;
  84. Strings.IntToStr(partNum,strNum);
  85. Strings.Concat(fileName0,".p",str);
  86. Strings.Concat(str,strNum,str);
  87. file := Files.New(str);
  88. Files.Register(file);
  89. Files.OpenWriter(fw,file,0);
  90. TRACE("started a new file part",id,fileName0,partNum,byteCount);
  91. END;
  92. END;
  93. IF fw.res # 0 THEN
  94. TRACE("TestFs writer",id,"stopped due to a writer error",fw.res);
  95. END;
  96. fw.Update;
  97. run := FALSE;
  98. END Loop;
  99. BEGIN{ACTIVE}
  100. Kernel.SetTimer(tStart,0);
  101. startByteCount := 0;
  102. Loop;
  103. FINALLY
  104. BEGIN{EXCLUSIVE}
  105. exited := TRUE;
  106. END;
  107. END Writer;
  108. (* High-level reader activity *)
  109. Reader = OBJECT
  110. VAR
  111. id: LONGINT;
  112. file: Files.File;
  113. fr: Files.Reader;
  114. rndData: Random.Generator;
  115. byteCount: HUGEINT;
  116. run, exited: BOOLEAN;
  117. tStart: Kernel.MilliTimer;
  118. startByteCount: HUGEINT;
  119. fileName0: Files.FileName;
  120. partNum: LONGINT;
  121. partByteCount: LONGINT;
  122. PROCEDURE & InitReader(id: LONGINT; CONST fileName: ARRAY OF CHAR);
  123. BEGIN
  124. SELF.id := id;
  125. file := Files.Old(fileName);
  126. ASSERT(file # NIL);
  127. Files.OpenReader(fr, file, 0);
  128. NEW(rndData);
  129. rndData.InitSeed(id);
  130. COPY(fileName,fileName0);
  131. partNum := 0;
  132. byteCount := 0;
  133. partByteCount := 0;
  134. run := TRUE;
  135. END InitReader;
  136. PROCEDURE Exit;
  137. BEGIN {EXCLUSIVE}
  138. run := FALSE;
  139. AWAIT(exited);
  140. END Exit;
  141. PROCEDURE Start;
  142. BEGIN {EXCLUSIVE}
  143. run := TRUE
  144. END Start;
  145. PROCEDURE Pause;
  146. BEGIN {EXCLUSIVE}
  147. run := FALSE
  148. END Pause;
  149. PROCEDURE Running (): BOOLEAN;
  150. BEGIN {EXCLUSIVE}
  151. RETURN run
  152. END Running;
  153. PROCEDURE Exited (): BOOLEAN;
  154. BEGIN {EXCLUSIVE}
  155. RETURN exited
  156. END Exited;
  157. PROCEDURE Loop;
  158. VAR
  159. v: LONGINT;
  160. strNum: ARRAY 16 OF CHAR;
  161. str: Files.FileName;
  162. BEGIN
  163. WHILE run & (fr.res = 0) DO
  164. fr.RawLInt(v);
  165. INC(partByteCount, SIZEOF(LONGINT));
  166. INC(byteCount, SIZEOF(LONGINT));
  167. ASSERT(v = rndData.Integer());
  168. IF partByteCount MOD 0x1000000 = 0 THEN
  169. Kernel.SetTimer(tStart,0);
  170. startByteCount := byteCount;
  171. END;
  172. IF partByteCount = 0x40000000 THEN (* 1GB parts *)
  173. partByteCount := 0;
  174. INC(partNum);
  175. file.Close;
  176. Strings.IntToStr(partNum,strNum);
  177. Strings.Concat(fileName0,".p",str);
  178. Strings.Concat(str,strNum,str);
  179. file := Files.Old(str);
  180. IF file = NIL THEN
  181. RETURN;
  182. END;
  183. Files.OpenReader(fr,file,0);
  184. TRACE("started a new file part",id,fileName0,partNum,byteCount);
  185. END;
  186. END;
  187. END Loop;
  188. BEGIN {ACTIVE}
  189. Kernel.SetTimer(tStart, 0);
  190. startByteCount := 0;
  191. Loop;
  192. FINALLY
  193. BEGIN {EXCLUSIVE}
  194. exited := TRUE;
  195. END;
  196. END Reader;
  197. VAR
  198. writers: FoxBasic.List;
  199. readers: FoxBasic.List;
  200. (**
  201. Start id fileName fileSize ~
  202. *)
  203. PROCEDURE StartWriter*(ctx: Commands.Context);
  204. VAR
  205. id: LONGINT;
  206. fileName: Files.FileName;
  207. fileSize: LONGINT;
  208. w: Writer;
  209. i: LONGINT;
  210. BEGIN{EXCLUSIVE}
  211. IF ~ctx.arg.GetInteger(id,FALSE) THEN ctx.result := 1; RETURN; END;
  212. IF ~ctx.arg.GetString(fileName) THEN ctx.result := 1; RETURN;END;
  213. IF ~ctx.arg.GetInteger(fileSize,FALSE) THEN fileSize := -1; END;
  214. i := 0;
  215. WHILE (i < writers.Length()) & (writers.Get(i)(Writer).id # id) DO
  216. INC(i);
  217. END;
  218. IF i < writers.Length() THEN
  219. ctx.error.String("TestFs writer with ID "); ctx.error.Int(id,0); ctx.error.String(" already running"); ctx.error.Ln;
  220. ctx.result := 1;
  221. RETURN;
  222. END;
  223. NEW(w,id,fileName,fileSize);
  224. writers.Add(w);
  225. ctx.out.String("Started TestFs writer with ID "); ctx.out.Int(id,0);
  226. ctx.out.String(", fileName='"); ctx.out.String(fileName);
  227. ctx.out.String("', fileSize="); ctx.out.Int(fileSize,0); ctx.out.Ln;
  228. END StartWriter;
  229. (* ID *)
  230. PROCEDURE StopWriter*(ctx: Commands.Context);
  231. VAR
  232. id: LONGINT;
  233. i: LONGINT;
  234. BEGIN{EXCLUSIVE}
  235. IF ~ctx.arg.GetInteger(id,FALSE) THEN ctx.result := 1; RETURN; END;
  236. i := 0;
  237. WHILE (i < writers.Length()) & (writers.Get(i)(Writer).id # id) DO
  238. INC(i);
  239. END;
  240. IF i < writers.Length() THEN
  241. writers.Get(i)(Writer).Exit;
  242. writers.RemoveByIndex(i);
  243. ctx.out.String("Stopped TestFs writer with ID "); ctx.out.Int(id,0); ctx.out.Ln;
  244. ELSE
  245. ctx.error.String("TestFs writer with ID "); ctx.error.Int(id,0); ctx.error.String(" not found"); ctx.error.Ln;
  246. ctx.result := 1;
  247. RETURN;
  248. END;
  249. END StopWriter;
  250. (**
  251. ReportWriter id ~
  252. *)
  253. PROCEDURE ReportWriter*(ctx: Commands.Context);
  254. VAR
  255. id: LONGINT;
  256. i: LONGINT;
  257. w: Writer;
  258. speed: REAL;
  259. BEGIN{EXCLUSIVE}
  260. IF ~ctx.arg.GetInteger(id,FALSE) THEN ctx.result := 1; RETURN; END;
  261. i := 0;
  262. WHILE (i < writers.Length()) & (writers.Get(i)(Writer).id # id) DO
  263. INC(i);
  264. END;
  265. IF i < writers.Length() THEN
  266. w := writers.Get(i)(Writer);
  267. ctx.out.String("byte count="); ctx.out.Int(w.byteCount,0); ctx.out.Ln;
  268. speed := 1000.0 * REAL(w.byteCount-w.startByteCount) / Kernel.Elapsed(w.tStart);
  269. ctx.out.String("speed="); ctx.out.FloatFix(speed,0,5,0); ctx.out.String(" bytes/s"); ctx.out.Ln;
  270. ctx.out.String("status: ");
  271. IF w.Exited() THEN
  272. ctx.out.String("Finished");
  273. ELSIF w.Running() THEN
  274. ctx.out.String("Running");
  275. ELSE
  276. ctx.out.String("Paused");
  277. END;
  278. ctx.out.Ln;
  279. ELSE
  280. ctx.error.String("TestFs writer with ID "); ctx.error.Int(id,0); ctx.error.String(" not found"); ctx.error.Ln;
  281. ctx.result := 1;
  282. RETURN;
  283. END;
  284. END ReportWriter;
  285. PROCEDURE StartReader*(ctx: Commands.Context);
  286. VAR
  287. fileName: Files.FileName;
  288. r: Reader;
  289. id: LONGINT;
  290. i: LONGINT;
  291. BEGIN {EXCLUSIVE}
  292. IF ~ctx.arg.GetInteger(id,FALSE) THEN ctx.result := 1; RETURN; END;
  293. IF ~ctx.arg.GetString(fileName) THEN ctx.result := 1; RETURN;END;
  294. WHILE (i < readers.Length()) & (readers.Get(i)(Reader).id # id) DO INC(i); END;
  295. IF i < readers.Length() THEN
  296. ctx.error.String("TestFs reader with ID ");
  297. ctx.error.Int(id, 0);
  298. ctx.error.String(" already running.");
  299. ctx.error.Ln;
  300. ctx.result := 1;
  301. RETURN;
  302. END;
  303. NEW(r, id, fileName);
  304. readers.Add(r);
  305. ctx.out.String("Added TestFs reader with ID ");
  306. ctx.out.Int(id, 0);
  307. ctx.out.String(", fileName='");
  308. ctx.out.String(fileName);
  309. ctx.out.String("'");
  310. ctx.out.Ln;
  311. END StartReader;
  312. PROCEDURE StopReader*(ctx: Commands.Context);
  313. VAR
  314. r: Reader;
  315. id: LONGINT;
  316. i: LONGINT;
  317. BEGIN {EXCLUSIVE}
  318. IF ~ctx.arg.GetInteger(id, FALSE) THEN ctx.result := 1; RETURN; END;
  319. WHILE (i < readers.Length()) & (readers.Get(i)(Reader).id # id) DO INC(i); END;
  320. IF i = readers.Length() THEN
  321. ctx.error.String("TestFs reader with ID ");
  322. ctx.error.Int(id, 0);
  323. ctx.error.String(" is not running");
  324. ctx.error.Ln;
  325. ctx.result := 1;
  326. RETURN;
  327. END;
  328. r := readers.Get(i)(Reader);
  329. r.Exit;
  330. readers.RemoveByIndex(i);
  331. ctx.out.String("TestFs reader ");
  332. ctx.out.Int(id, 0);
  333. ctx.out.String(" stopped");
  334. ctx.out.Ln;
  335. END StopReader;
  336. PROCEDURE ReportReader*(ctx: Commands.Context);
  337. VAR
  338. r: Reader;
  339. id: LONGINT;
  340. i: LONGINT;
  341. speed: LONGREAL;
  342. BEGIN {EXCLUSIVE}
  343. IF ~ctx.arg.GetInteger(id, FALSE) THEN ctx.result := 1; RETURN; END;
  344. WHILE (i < readers.Length()) & (readers.Get(i)(Reader).id # id) DO INC(i); END;
  345. IF i = readers.Length() THEN
  346. ctx.error.String("TestFs reader with ID ");
  347. ctx.error.Int(id, 0);
  348. ctx.error.String(" is not running");
  349. ctx.error.Ln;
  350. ctx.result := 1;
  351. RETURN;
  352. END;
  353. r := readers.Get(i)(Reader);
  354. speed := 1000.0 * (r.byteCount-r.startByteCount) / Kernel.Elapsed(r.tStart);
  355. ctx.out.String("byte count="); ctx.out.Int(r.byteCount, 0); ctx.out.Ln;
  356. ctx.out.String("speed="); ctx.out.FloatFix(speed,0,5,0); ctx.out.String(" bytes/s"); ctx.out.Ln;
  357. ctx.out.String("status: ");
  358. IF r.Exited() THEN
  359. ctx.out.String("Finished");
  360. ELSIF r.Running() THEN
  361. ctx.out.String("Running");
  362. ELSE
  363. ctx.out.String("Paused");
  364. END;
  365. ctx.out.Ln;
  366. END ReportReader;
  367. BEGIN
  368. NEW(writers,8);
  369. NEW(readers, 8);
  370. END TestFs.
  371. SystemTools.DoCommands
  372. TFTPServer.Start ~
  373. OEB.NewServer --type=Auto
  374. PLAN
  375. setsource TFTP 10.3.34.188
  376. mount A2 SD0 3
  377. load A2.Bin a2
  378. load build/TestFs.Gof t
  379. deploy t file A2:TestFs.Gof
  380. setinput auto.txt
  381. END
  382. ~
  383. (*OEB.NewServer --type=Interactive ~*)
  384. OEB.NewInterface --type=Udp --server=0 ~
  385. OEB.Server --start --all ~
  386. OEB.Interface --start --all --server=0 ~
  387. ~
  388. SystemTools.DoCommands
  389. TFTPServer.Start ~
  390. OEB.NewServer --type=Interactive ~
  391. OEB.NewInterface --type=Udp --server=0 ~
  392. OEB.Server --start --all ~
  393. OEB.Interface --start --all --server=0 ~
  394. ~
  395. StaticLinker.Link --fileName=A2.Bin --displacement=100000H -a --path=build/
  396. Runtime Initializer Platform FPE64 ARMRuntime Trace BootConfig Uart Machine Heaps Modules Objects Kernel KernelLog Plugins
  397. Streams Pipes Commands Reals Clock Dates Strings Files Disks Reflection TrapWriters Traps Locks Options PsConfig SdEnvironment
  398. Sd SdDisks SdControllers Caches DiskVolumes DiskFS BitSets StringPool ObjectFile Diagnostics GenericLinker GenericLoader
  399. BootConsole
  400. ~
  401. OEB.Command --server=0 --id=0
  402. setsource TFTP 10.3.34.188
  403. mount A2 SD0 3
  404. load A2.Bin a2
  405. save a2
  406. setinput auto.txt
  407. ~
  408. save a2
  409. ~
  410. OEB.Command --server=0 --id=0
  411. setsource TFTP 10.3.34.188
  412. mount A2 SD0 3
  413. deployfile build/TestFs.Gof A2:TestFs.Gof
  414. ~
  415. OEB.Command --server=0 --id=0
  416. start
  417. ~
  418. OEB.Command --server=0 --id=0
  419. setinput auto.txt
  420. ~
  421. OEB.Command --server=0 --id=0
  422. reset
  423. ~
  424. OEB.Interface --show --all --server=0 ~
  425. OEB.Server --show --all ~
  426. OEB.Session --show --all ~
  427. OEB.Server --kill --all ~
  428. SystemTools.FreeDownTo OEBInterfaces ~
  429. SystemTools.FreeDownTo UDP ~
  430. mount DATA AosFS SD0#4 '|' N
  431. TestFs.StartWriter 1234567 DATA:TestFs-123457.dat 1000000000
  432. TestFs.StartWriter 7654321 DATA:TestFs-7654321.dat 1000000000
  433. TestFs.StartReader 1234567 DATA:TestFs-123457.dat 1000000000
  434. TestFs.StartReader 7654321 DATA:TestFs-7654321.dat
  435. TestFs.ReportWriter 1234567
  436. TestFs.ReportWriter 7654321
  437. TestFs.ReportReader 1234567
  438. TestFs.ReportReader 1234567
  439. asd