diff options
author | Thomas Schwinge <thomas@codesourcery.com> | 2012-05-24 23:08:09 +0200 |
---|---|---|
committer | Thomas Schwinge <thomas@codesourcery.com> | 2012-05-24 23:08:09 +0200 |
commit | 2910b7c5b1d55bc304344b584a25ea571a9075fb (patch) | |
tree | bfbfbc98d4c0e205d2726fa44170a16e8421855e /user/jkoenig | |
parent | 35b719f54c96778f571984065579625bc9f15bf5 (diff) |
Prepare toolchain/logs/master branch.
Diffstat (limited to 'user/jkoenig')
-rw-r--r-- | user/jkoenig/d-i.mdwn | 358 | ||||
-rw-r--r-- | user/jkoenig/gsoc2011_classes.dia | 2227 | ||||
-rw-r--r-- | user/jkoenig/gsoc2011_classes.png | bin | 59337 -> 0 bytes | |||
-rw-r--r-- | user/jkoenig/gsoc2011_proposal.mdwn | 12 | ||||
-rw-r--r-- | user/jkoenig/java.mdwn | 516 | ||||
-rw-r--r-- | user/jkoenig/java/discussion.mdwn | 559 | ||||
-rw-r--r-- | user/jkoenig/java/java-access-bridge.mdwn | 92 | ||||
-rw-r--r-- | user/jkoenig/java/proposal.mdwn | 629 | ||||
-rw-r--r-- | user/jkoenig/java/report.mdwn | 136 | ||||
-rw-r--r-- | user/jkoenig/objcap.mdwn | 85 |
10 files changed, 0 insertions, 4614 deletions
diff --git a/user/jkoenig/d-i.mdwn b/user/jkoenig/d-i.mdwn deleted file mode 100644 index 0b9f9f7d..00000000 --- a/user/jkoenig/d-i.mdwn +++ /dev/null @@ -1,358 +0,0 @@ -[[!meta copyright="Copyright © 2010 Free Software Foundation, Inc."]] - -[[!meta license="""[[!toggle id="license" text="GFDL 1.2+"]][[!toggleable -id="license" text="Permission is granted to copy, distribute and/or modify this -document under the terms of the GNU Free Documentation License, Version 1.2 or -any later version published by the Free Software Foundation; with no Invariant -Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license -is included in the section entitled [[GNU Free Documentation -License|/fdl]]."]]"""]] - -## Hurd Debian-Installer - -My [proposal](http://wiki.debian.org/SummerOfCode2010/HurdDebianInstaller/JeremieKoenig) -to work on porting d-i on Hurd -as a [Google Summer of Code](http://code.google.com/soc/) student -has been accepted by the Debian project. - -I will be keeping track of my progress on this page. - -### Links - - * [Modified packages](http://jk.fr.eu.org/debian/unstable) - * [Latest images](http://jk.fr.eu.org/debian/hurd-installer) - * [Debian bugs](http://bugs.debian.org/cgi-bin/pkgreport.cgi?users=jk@jk.fr.eu.org&tag=gsoc2010) - * [BusyBox port](http://lists.debian.org/debian-bsd/2010/05/msg00048.html) - * [GNU Mach initrd](http://lists.gnu.org/archive/html/bug-hurd/2010-06/msg00047.html) - -### Roadmap - -* **mach**: initrd support - * (./) preliminary patch posted and self-built (2010-06-12) - * adjustments will be needed (postponed) - * consider the alternatives discussed on bug-hurd (postponed) - -* **glibc**: fix `mkdir("/")` which returned `EINVAL` - * (./) eglibc 2.11.2-1 includes a quick fix by youpi (2010-06-15) - * (./) more complete patch posted to bug-hurd, - since other calls return incorrect errors under some circumstances - (2010-06-16) - * more work on it will be needed to make it fix the whole thing - (postponed) - -* (./) **partman** (2010-06-23) - * (./) add hurd-i386 to - `partman-partitioning/lib/disk-label.sh` - (2010-06-16, commited by youpi on 2010-06-23) - * (./) short-circuit - `partman-basicfilesystems/init.d/kernelmodules_basicfilesystems` - (2010-06-16) - * (./) partman-auto recipes: - make the default filesystem os-dependent - when it has not been preseeded (ie. the *seen* flag is clear) - * (./) force 4k blocks and 128 bytes inodes - * (./) submit patches to bugs.debian.org - ([[!debbug 586870]] and [[!debbug 586871]]) - * (./) rebuild with responsible version numbers and upload to my repository - -* (./) **libparted** (2010-06-23) - * (./) fix device paths ([[!debbug 586696]]) - * (./) fix crash on exit for part:* stores ([[!debbug 586682]]) - -* **hurd-udeb** (2010-06-23) - * (./) rebuild with the hack suggested by youpi for qemu network configuration - * (./) fix mount to accept `-o defaults` - * cleanup, ask youpi to commit - -* reloading the partition table (2010-06-25) - * User-space part stores - * (./) hurd-udeb now uses `part:N:device:X` for partition devices - (2010-06-23) - * (./) it also provides /lib/partman/commit.d/??hurd\_reloadpart, - which basically does `settrans -ag /dev/[hs]d*`. - (2010-06-24) - * Kernel-based partition devices - * (./) Mach's drivers from Linux support reloading partitions. - With help from youpi this has been made available through a - device\_set\_status() call. - * (./) make libparted use it - * Reminder: - I should file a bug against libparted with the patch sometime. - -* (./) The `/servers/exec` issue (2010-06-26) - * Due to /servers being inexistant, - the bootstrap ext2fs could not register the initial exec server, - meaning that non-bootstrap filesystems used a different one - (started from the passive translator), - which for some reason died on shell scripts, making them stall. - * Adding the `/servers` directory to hurd-udeb fixed it, - as well as the /hurd/proc issue - (failed to be run by init the first time around). - * Reminder: report the non-bootstrap exec servers failure on scripts. - -* (./) **base-installer**: (2010-06-26) - * Work around non-existant /proc/mounts. - * Firmlink /servers into /target after debootstrap - to make the network available. - -* (./) **grub-installer** - * (./) add hurd support (2010-06-27) - * /!\ grub-legacy still needs to be tested - * submit changes as a Debian bug - -**Milestone (2010-06-28): -installer kindof works, with documented manual intervention required** - -* (./) Sort out the situation with dev node creation (2010-07-07): - * Devices and servers used to be set up by debootstrap; - the hurd package would add some missing nodes. - * New strategy implemented in hurd and debootstrap: - * debootstrap uses active firmlinks into the host system - for the target system's /dev and /servers. - * the hurd package now include a `setup-translators` script, - which is used to register the passive translators by the installer's - `/libexec/runsystem` and hurd's postinst script. - -* **busybox**: submit upstream and to [[!debbug 323670]] - (waiting for upstream to review) - * (./) I have mentioned my work on the upstream mailing list, - * (./) merge the recent changes from upstream, - notably to the build system. - (2010-06-23) - * (./) ask upstream for review and merge - (2010-06-25) - * (./) sent as patches as requested - (2010-07-08) - * (./) backport any additional changes onto the debian branch - * (./) hijack [[!debbug 323670]] and submit my patches - -* **aptitude**: - * Currently broken on hurd-i386: - [[!debpkg gtest]] fails to build because of a segfault in one of the test - cases, [[!debpkg google-mock]] and hence [[!debpkg aptitude]] are missing - it as a build-dep. - The older package is not installable anymore because it's linked against - an older version of libept, which has been removed. - * (./) I bypassed the tests and uploaded the 3 packages to my repository - (2010-07-08) - * The segfault will have to be sorted out. (postponed) - -* (./) "Fix" the swap situation. (2010-07-08) - * The device\_close() libstore patch - had the unfortunate effect of making swapon fail, - since the device it activates has to be kept open. - * add options for MAKEDEV and setup-devices - to use the libparted stores - * disable youpi's patch - * make partman-basicfilesystems re-create the device - as a kernel partition, which is needed for swapon - -* (./) netcfg-static: port to hurd (2010-07-09) - * There was some amount of hurd support already - (namely, activating the interface by replacing the socket translator) - * However, this code started an active translator with - di\_exec\_shell\_log("settrans -a ...), - which stalled as a consequence of it capturing libdi's pipe - as its standard output. - * Network devices must be probed by trying to open Mach devices - with predetermined names (currently eth%d, wl%d), - because getifaddrs() does not seem to work on Hurd. - * /!\ netcfg, and configuring the installed system, postponed. - -* **procps** 3.2.7-11 (current hurd-i386 version) has [[!debbug 546888]] - * (./) Submit [[!debbug 588677]] and upload the result to my repository. - (2010-07-11) - -* (./) Set up a Debian mirror with modified packages for installation - * the [mirror](http://jk.fr.eu.org/debian/hurd-install/mirror) - is now up and running (2010-07-06) - * hacked the image build script to include its public key in - debian-archive-keyring at image build time (2010-07-08) - * Apparently debootstrap does not handle multiple versions very well. - Fix by using dpkg-scan{package,sources} rather than apt-ftparchive - to create index files. - (2010-07-10) - * Use the override files from ftp.debian.org, - to avoid debootstrap grabbing inappropriate packages. - * Changed them to make [[!debpkg ifupdown]], - [[!debpkg dhcp3-client]] and [[!debpkg dhcp3-client]] priority extra, - because they're uninstallable at the moment. - (2010-07-12) - -* (./) Put together a "jk-archive-keyring" package, - so that the mirror is authenticated in the target system as well. - (2010-07-12) - -* (./) Fix grub for user-space partitions (2010-07-16) - * grub-probe detects the whole device rather than the partition - as the device behind /boot/grub. - Consequently, grub-install fails. - * One approach would be to replace /dev/hd* by kernel devices - for file systems as well as for swap partitions. - > {X} this makes the installer crash, - > possibly due to cache coherency issue between hdX and hdXsY. - - * (./) GRUB2 kern/emu/getroot.c - [patched](http://lists.gnu.org/archive/html/bug-hurd/2010-07/msg00059.html) - to support part stores. - -* (./) Fix finish-install to skip `finish-install.d/90console` on Hurd - (2010-07-17) - -* (./) Avoid starting unnecessary /dev translators in a burst (2010-07-20) - * Use debootstrap use the extracted /usr/lib/hurd/setup-translators - to create device and server nodes in /target, - then firmlink the whole /target/dev and /target/servers - to the outer system. - * Make hurd.postinst not touch them on initial install. - -* (./) Fix mach-defpager for file and part stores on larger devices - * Use DEVICE\_GET\_RECORDS instead of DEVICE\_GET\_SIZE, which overflows an int - (2010-07-22) - -**Milestone (2010-07-22): -installer works but it's still somewhat ugly and broken** - -* (./) Ship the UTF-8 font for the hurd console - (2010-07-22) - * Upload a version of bogl with youpi's patch for Hurd. - (see [[!debbug 589987]]) - * Fix the hurd console for fonts with 16 pixels wide glyphs - (ie. handle the 8-wide glyph in there correclty) - * Support double-width glyphs (2010-07-24) - * (./) However the reduced font can't be loaded yet, - so make installer/build/Makefile - ship the whole `/usr/src/unifont.bgf` - as `/usr/share/hurd/vga-system.bgf`. - -* (./) Make the installer used the extended capabilities of the Hurd console - (2010-07-23) - * Set an UTF-8 locale in `/lib/debian-installer.d/S41term-hurd`. - * localechooser: set the language display level to 3 - when using the hurd console. - -* (./) **busybox**: cross-platform package uploaded to experimental - (2010-08-03?) - * Aurelien Jarno updated the packaging to busybox 1.17.1, - fixed a whole lot of bugs, - and uploaded a new package with both our changes; - * most patches adopted upstream, and included in the new package; - * (u)mount/swaponoff ported to kFreeBSD; - * per-OS configuration overrides. - -* (./) Update custom packages to the latest versions - and send updated patches to the BTS - (2010-08-11) - * updated partman-base to choose a default filesystem in debian/rules - rather than at runtime, - as suggested by Aurelien Jarno in [[!debbug 586870]] - * patch submitted for debian-installer-utils - ([[!debbug 592684]]). - * patch submitted for locale-chooser - ([[!debbug 592690]]). - * debootstrap, grub-installer and finish-install not yet submitted, - since the details may still change. - -* (./) **partman-target**: fix fstab creation - (2010-08-11) - * See [[!debbug 592671]] - * debian/rules: set `partman/mount_style` to `traditional` on Hurd. - * finish.d/create\_fstab\_header: add a Hurd case. - -* (./) **rootskel**: FTBFS on Hurd and other quirks - (to be fixed very soon) - -* **d-i/installer/build**: (expected soon) - * publish the patch I use - * sort out the changes suitable for inclusion - and ask youpi and/or debian-boot@l.d.o to commit them - -* call for testing and fix the bugs - -* Bug in setup-translators/MAKEDEV: - permissions are broken for nodes re-created through `MAKEDEV -k`, - because MAKEDEV's chmod/chown reaches the pre-existing translator - * Maybe settrans could be made to accept -o/--owner and - -p/--perm, to set the permissions for the underlying node? - -* (./) Silence the "no kernel" warning somehow. - -* Investigate the wget/libc/pfinet/whatever bug which corrupts Packages.gz, - see the IRC log for 2010-07-23, around 1am UTC+0200 - -* Try to resolve problems with udebs which are uninstallable on hurd-i386, - such as installation-locale and partman-whatever. - -* Provide `/proc/cmdline -> 2/cmdline`, or something. - -* Prepare a NMU for genext2fs (which is orphaned), - and ask youpi to sponsor the upload. - -* **busybox**: port - * fix stty/stat/ipcs on kFreeBSD, - * generally port more stuff, - * *ip* is needed (maybe) for network configuration, - * *mount*, *swaponoff* can be from hurd-udeb for now, - though the kFreeBSD people will need them - -* **partman**: further adjustments - * partman-base: handle /dev/hd?s* in lib/base.h - * hide irrelevant mount options? (sync, relatime) - -* Network configuration on the installed system. - This includes porting ifupdown and isc-dhcp-client, - which are currently uninstallable on hurd-i386. -* Also, better DHCP support during and after installation - -* improve the [initrd situation](FIXME: link to bug-hurd post): - ajust the ramdisk support in Mach, - use tmpfs if possible. - -* mklibs{,-copy}: - test library reduction, - make it copy the ld.so -> ld.so.1 symlink. - -* (./) hurd console fonts - -**Milestone (expected 2010-07-19): -it works great and it's beautiful** - -* test, fix, document -* support more types of installation images -* give a shot at the graphical installer if time permits -* integrate wireless drivers with netcfg -* see how [[zhengda]]'s work on DDE could be integrated -* etc.. - -### Mostly done - -#### Week 1 (2010-05-24) - -* genext2fs: patches submitted, [[!debbug 562999]] - which add support for all block sizes and choosing them at runtime. -* busybox: started porting the upstream and Debian package to Hurd and FreeBSD -* rebuilding hurd-udeb from the pkg-hurd version - and adding a ld.so link to the initrd - fixes the exec translator crashing on startup. - (BTW would there be a mean to detect this from the libdiskfs bootstrap code - and report it ?) - -#### Week 2 (2010-05-31 to 2010-06-06) - -* *busybox*: patches [posted](http://lists.debian.org/debian-bsd/2010/05/msg00048.html). -* *libdebian-installer4*: [[!debbug 584538]] -* started working on mach initrd support -* the installation images could boot into the main-menu - with the following changes: - * rebuild hurd-udeb from with the latest pkg-hurd patches - * use busybox from my osports-debian branch (see link above) - * tweak the d-i image build scripts - * the symlink /lib/ld.so -> ld.so.1 needs to be created somehow - (youpi mentionned it being the job of libc0.3-udeb I think) - * fix the poll() issue in libdebian-installer - (patch to be submitted soon), - also there is some hurd doxygen short-circuiting stuff - there which does not apply any more and prevents is to build. - * feed the initrd as a hard drive in qemu - (with some more space added to avoid it from becoming full) - diff --git a/user/jkoenig/gsoc2011_classes.dia b/user/jkoenig/gsoc2011_classes.dia deleted file mode 100644 index 1aa3ef6c..00000000 --- a/user/jkoenig/gsoc2011_classes.dia +++ /dev/null @@ -1,2227 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<dia:diagram xmlns:dia="http://www.lysator.liu.se/~alla/dia/"> - <dia:diagramdata> - <dia:attribute name="background"> - <dia:color val="#ffffff"/> - </dia:attribute> - <dia:attribute name="pagebreak"> - <dia:color val="#000099"/> - </dia:attribute> - <dia:attribute name="paper"> - <dia:composite type="paper"> - <dia:attribute name="name"> - <dia:string>#A4#</dia:string> - </dia:attribute> - <dia:attribute name="tmargin"> - <dia:real val="2.8222000598907471"/> - </dia:attribute> - <dia:attribute name="bmargin"> - <dia:real val="2.8222000598907471"/> - </dia:attribute> - <dia:attribute name="lmargin"> - <dia:real val="2.8222000598907471"/> - </dia:attribute> - <dia:attribute name="rmargin"> - <dia:real val="2.8222000598907471"/> - </dia:attribute> - <dia:attribute name="is_portrait"> - <dia:boolean val="true"/> - </dia:attribute> - <dia:attribute name="scaling"> - <dia:real val="1"/> - </dia:attribute> - <dia:attribute name="fitto"> - <dia:boolean val="false"/> - </dia:attribute> - </dia:composite> - </dia:attribute> - <dia:attribute name="grid"> - <dia:composite type="grid"> - <dia:attribute name="width_x"> - <dia:real val="1"/> - </dia:attribute> - <dia:attribute name="width_y"> - <dia:real val="1"/> - </dia:attribute> - <dia:attribute name="visible_x"> - <dia:int val="1"/> - </dia:attribute> - <dia:attribute name="visible_y"> - <dia:int val="1"/> - </dia:attribute> - <dia:composite type="color"/> - </dia:composite> - </dia:attribute> - <dia:attribute name="color"> - <dia:color val="#d8e5e5"/> - </dia:attribute> - <dia:attribute name="guides"> - <dia:composite type="guides"> - <dia:attribute name="hguides"/> - <dia:attribute name="vguides"/> - </dia:composite> - </dia:attribute> - </dia:diagramdata> - <dia:layer name="Arrière-plan" visible="true" active="true"> - <dia:group> - <dia:object type="UML - LargePackage" version="0" id="O0"> - <dia:attribute name="obj_pos"> - <dia:point val="43.3541,9.67669"/> - </dia:attribute> - <dia:attribute name="obj_bb"> - <dia:rectangle val="43.3041,8.62669;62.3869,21.8152"/> - </dia:attribute> - <dia:attribute name="meta"> - <dia:composite type="dict"/> - </dia:attribute> - <dia:attribute name="elem_corner"> - <dia:point val="43.3541,9.67669"/> - </dia:attribute> - <dia:attribute name="elem_width"> - <dia:real val="18.982784066269787"/> - </dia:attribute> - <dia:attribute name="elem_height"> - <dia:real val="12.08849294970096"/> - </dia:attribute> - <dia:attribute name="line_width"> - <dia:real val="0.10000000149011612"/> - </dia:attribute> - <dia:attribute name="line_colour"> - <dia:color val="#000000"/> - </dia:attribute> - <dia:attribute name="fill_colour"> - <dia:color val="#ffffff"/> - </dia:attribute> - <dia:attribute name="text_colour"> - <dia:color val="#000000"/> - </dia:attribute> - <dia:attribute name="stereotype"> - <dia:string>##</dia:string> - </dia:attribute> - <dia:attribute name="name"> - <dia:string>#User-defined classes#</dia:string> - </dia:attribute> - </dia:object> - <dia:object type="UML - Class" version="0" id="O1"> - <dia:attribute name="obj_pos"> - <dia:point val="46.0492,12.9799"/> - </dia:attribute> - <dia:attribute name="obj_bb"> - <dia:rectangle val="45.9992,12.9299;60.4592,18.4299"/> - </dia:attribute> - <dia:attribute name="elem_corner"> - <dia:point val="46.0492,12.9799"/> - </dia:attribute> - <dia:attribute name="elem_width"> - <dia:real val="14.359999999999999"/> - </dia:attribute> - <dia:attribute name="elem_height"> - <dia:real val="5.4000000000000004"/> - </dia:attribute> - <dia:attribute name="name"> - <dia:string>#HelloIo#</dia:string> - </dia:attribute> - <dia:attribute name="stereotype"> - <dia:string>##</dia:string> - </dia:attribute> - <dia:attribute name="comment"> - <dia:string>#Implements a file which always contains "Hello, World!\n"#</dia:string> - </dia:attribute> - <dia:attribute name="abstract"> - <dia:boolean val="false"/> - </dia:attribute> - <dia:attribute name="suppress_attributes"> - <dia:boolean val="false"/> - </dia:attribute> - <dia:attribute name="suppress_operations"> - <dia:boolean val="false"/> - </dia:attribute> - <dia:attribute name="visible_attributes"> - <dia:boolean val="false"/> - </dia:attribute> - <dia:attribute name="visible_operations"> - <dia:boolean val="true"/> - </dia:attribute> - <dia:attribute name="visible_comments"> - <dia:boolean val="true"/> - </dia:attribute> - <dia:attribute name="wrap_operations"> - <dia:boolean val="true"/> - </dia:attribute> - <dia:attribute name="wrap_after_char"> - <dia:int val="40"/> - </dia:attribute> - <dia:attribute name="comment_line_length"> - <dia:int val="40"/> - </dia:attribute> - <dia:attribute name="comment_tagging"> - <dia:boolean val="false"/> - </dia:attribute> - <dia:attribute name="line_width"> - <dia:real val="0.10000000000000001"/> - </dia:attribute> - <dia:attribute name="line_color"> - <dia:color val="#000000"/> - </dia:attribute> - <dia:attribute name="fill_color"> - <dia:color val="#ffffff"/> - </dia:attribute> - <dia:attribute name="text_color"> - <dia:color val="#000000"/> - </dia:attribute> - <dia:attribute name="normal_font"> - <dia:font family="monospace" style="0" name="Courier"/> - </dia:attribute> - <dia:attribute name="abstract_font"> - <dia:font family="monospace" style="88" name="Courier-BoldOblique"/> - </dia:attribute> - <dia:attribute name="polymorphic_font"> - <dia:font family="monospace" style="8" name="Courier-Oblique"/> - </dia:attribute> - <dia:attribute name="classname_font"> - <dia:font family="sans" style="80" name="Helvetica-Bold"/> - </dia:attribute> - <dia:attribute name="abstract_classname_font"> - <dia:font family="sans" style="88" name="Helvetica-BoldOblique"/> - </dia:attribute> - <dia:attribute name="comment_font"> - <dia:font family="sans" style="8" name="Helvetica-Oblique"/> - </dia:attribute> - <dia:attribute name="normal_font_height"> - <dia:real val="0.80000000000000004"/> - </dia:attribute> - <dia:attribute name="polymorphic_font_height"> - <dia:real val="0.80000000000000004"/> - </dia:attribute> - <dia:attribute name="abstract_font_height"> - <dia:real val="0.80000000000000004"/> - </dia:attribute> - <dia:attribute name="classname_font_height"> - <dia:real val="1"/> - </dia:attribute> - <dia:attribute name="abstract_classname_font_height"> - <dia:real val="1"/> - </dia:attribute> - <dia:attribute name="comment_font_height"> - <dia:real val="0.69999999999999996"/> - </dia:attribute> - <dia:attribute name="attributes"/> - <dia:attribute name="operations"> - <dia:composite type="umloperation"> - <dia:attribute name="name"> - <dia:string>#write#</dia:string> - </dia:attribute> - <dia:attribute name="stereotype"> - <dia:string>##</dia:string> - </dia:attribute> - <dia:attribute name="type"> - <dia:string>#int#</dia:string> - </dia:attribute> - <dia:attribute name="visibility"> - <dia:enum val="0"/> - </dia:attribute> - <dia:attribute name="comment"> - <dia:string>##</dia:string> - </dia:attribute> - <dia:attribute name="abstract"> - <dia:boolean val="false"/> - </dia:attribute> - <dia:attribute name="inheritance_type"> - <dia:enum val="2"/> - </dia:attribute> - <dia:attribute name="query"> - <dia:boolean val="false"/> - </dia:attribute> - <dia:attribute name="class_scope"> - <dia:boolean val="false"/> - </dia:attribute> - <dia:attribute name="parameters"> - <dia:composite type="umlparameter"> - <dia:attribute name="name"> - <dia:string>#data#</dia:string> - </dia:attribute> - <dia:attribute name="type"> - <dia:string>#char[]#</dia:string> - </dia:attribute> - <dia:attribute name="value"> - <dia:string>##</dia:string> - </dia:attribute> - <dia:attribute name="comment"> - <dia:string>##</dia:string> - </dia:attribute> - <dia:attribute name="kind"> - <dia:enum val="0"/> - </dia:attribute> - </dia:composite> - <dia:composite type="umlparameter"> - <dia:attribute name="name"> - <dia:string>#offset#</dia:string> - </dia:attribute> - <dia:attribute name="type"> - <dia:string>#int#</dia:string> - </dia:attribute> - <dia:attribute name="value"> - <dia:string>##</dia:string> - </dia:attribute> - <dia:attribute name="comment"> - <dia:string>##</dia:string> - </dia:attribute> - <dia:attribute name="kind"> - <dia:enum val="0"/> - </dia:attribute> - </dia:composite> - </dia:attribute> - </dia:composite> - <dia:composite type="umloperation"> - <dia:attribute name="name"> - <dia:string>#read#</dia:string> - </dia:attribute> - <dia:attribute name="stereotype"> - <dia:string>##</dia:string> - </dia:attribute> - <dia:attribute name="type"> - <dia:string>#char[]#</dia:string> - </dia:attribute> - <dia:attribute name="visibility"> - <dia:enum val="0"/> - </dia:attribute> - <dia:attribute name="comment"> - <dia:string>##</dia:string> - </dia:attribute> - <dia:attribute name="abstract"> - <dia:boolean val="false"/> - </dia:attribute> - <dia:attribute name="inheritance_type"> - <dia:enum val="2"/> - </dia:attribute> - <dia:attribute name="query"> - <dia:boolean val="false"/> - </dia:attribute> - <dia:attribute name="class_scope"> - <dia:boolean val="false"/> - </dia:attribute> - <dia:attribute name="parameters"> - <dia:composite type="umlparameter"> - <dia:attribute name="name"> - <dia:string>#offset#</dia:string> - </dia:attribute> - <dia:attribute name="type"> - <dia:string>#int#</dia:string> - </dia:attribute> - <dia:attribute name="value"> - <dia:string>##</dia:string> - </dia:attribute> - <dia:attribute name="comment"> - <dia:string>##</dia:string> - </dia:attribute> - <dia:attribute name="kind"> - <dia:enum val="0"/> - </dia:attribute> - </dia:composite> - <dia:composite type="umlparameter"> - <dia:attribute name="name"> - <dia:string>#amount#</dia:string> - </dia:attribute> - <dia:attribute name="type"> - <dia:string>#int#</dia:string> - </dia:attribute> - <dia:attribute name="value"> - <dia:string>##</dia:string> - </dia:attribute> - <dia:attribute name="comment"> - <dia:string>##</dia:string> - </dia:attribute> - <dia:attribute name="kind"> - <dia:enum val="0"/> - </dia:attribute> - </dia:composite> - </dia:attribute> - </dia:composite> - <dia:composite type="umloperation"> - <dia:attribute name="name"> - <dia:string>#seek#</dia:string> - </dia:attribute> - <dia:attribute name="stereotype"> - <dia:string>##</dia:string> - </dia:attribute> - <dia:attribute name="type"> - <dia:string>#int#</dia:string> - </dia:attribute> - <dia:attribute name="visibility"> - <dia:enum val="0"/> - </dia:attribute> - <dia:attribute name="comment"> - <dia:string>##</dia:string> - </dia:attribute> - <dia:attribute name="abstract"> - <dia:boolean val="false"/> - </dia:attribute> - <dia:attribute name="inheritance_type"> - <dia:enum val="2"/> - </dia:attribute> - <dia:attribute name="query"> - <dia:boolean val="false"/> - </dia:attribute> - <dia:attribute name="class_scope"> - <dia:boolean val="false"/> - </dia:attribute> - <dia:attribute name="parameters"> - <dia:composite type="umlparameter"> - <dia:attribute name="name"> - <dia:string>#offset#</dia:string> - </dia:attribute> - <dia:attribute name="type"> - <dia:string>#int#</dia:string> - </dia:attribute> - <dia:attribute name="value"> - <dia:string>##</dia:string> - </dia:attribute> - <dia:attribute name="comment"> - <dia:string>##</dia:string> - </dia:attribute> - <dia:attribute name="kind"> - <dia:enum val="0"/> - </dia:attribute> - </dia:composite> - <dia:composite type="umlparameter"> - <dia:attribute name="name"> - <dia:string>#whence#</dia:string> - </dia:attribute> - <dia:attribute name="type"> - <dia:string>#int#</dia:string> - </dia:attribute> - <dia:attribute name="value"> - <dia:string>##</dia:string> - </dia:attribute> - <dia:attribute name="comment"> - <dia:string>##</dia:string> - </dia:attribute> - <dia:attribute name="kind"> - <dia:enum val="0"/> - </dia:attribute> - </dia:composite> - </dia:attribute> - </dia:composite> - </dia:attribute> - <dia:attribute name="template"> - <dia:boolean val="false"/> - </dia:attribute> - <dia:attribute name="templates"/> - </dia:object> - </dia:group> - <dia:group> - <dia:object type="UML - LargePackage" version="0" id="O2"> - <dia:attribute name="obj_pos"> - <dia:point val="20.9284,1.19141"/> - </dia:attribute> - <dia:attribute name="obj_bb"> - <dia:rectangle val="20.8784,0.141406;41.2223,31.2904"/> - </dia:attribute> - <dia:attribute name="meta"> - <dia:composite type="dict"/> - </dia:attribute> - <dia:attribute name="elem_corner"> - <dia:point val="20.9284,1.19141"/> - </dia:attribute> - <dia:attribute name="elem_width"> - <dia:real val="20.243864620053902"/> - </dia:attribute> - <dia:attribute name="elem_height"> - <dia:real val="30.049005191839264"/> - </dia:attribute> - <dia:attribute name="line_width"> - <dia:real val="0.10000000149011612"/> - </dia:attribute> - <dia:attribute name="line_colour"> - <dia:color val="#000000"/> - </dia:attribute> - <dia:attribute name="fill_colour"> - <dia:color val="#ffffff"/> - </dia:attribute> - <dia:attribute name="text_colour"> - <dia:color val="#000000"/> - </dia:attribute> - <dia:attribute name="stereotype"> - <dia:string>##</dia:string> - </dia:attribute> - <dia:attribute name="name"> - <dia:string>#MIG-generated classes#</dia:string> - </dia:attribute> - </dia:object> - <dia:object type="UML - Class" version="0" id="O3"> - <dia:attribute name="obj_pos"> - <dia:point val="24.8976,5.14749"/> - </dia:attribute> - <dia:attribute name="obj_bb"> - <dia:rectangle val="24.8476,5.09749;38.1526,9.79749"/> - </dia:attribute> - <dia:attribute name="elem_corner"> - <dia:point val="24.8976,5.14749"/> - </dia:attribute> - <dia:attribute name="elem_width"> - <dia:real val="13.205"/> - </dia:attribute> - <dia:attribute name="elem_height"> - <dia:real val="4.5999999999999996"/> - </dia:attribute> - <dia:attribute name="name"> - <dia:string>#IoServer#</dia:string> - </dia:attribute> - <dia:attribute name="stereotype"> - <dia:string>##</dia:string> - </dia:attribute> - <dia:attribute name="comment"> - <dia:string>#Implements a message handler using a given IO object as a backend#</dia:string> - </dia:attribute> - <dia:attribute name="abstract"> - <dia:boolean val="false"/> - </dia:attribute> - <dia:attribute name="suppress_attributes"> - <dia:boolean val="false"/> - </dia:attribute> - <dia:attribute name="suppress_operations"> - <dia:boolean val="false"/> - </dia:attribute> - <dia:attribute name="visible_attributes"> - <dia:boolean val="false"/> - </dia:attribute> - <dia:attribute name="visible_operations"> - <dia:boolean val="true"/> - </dia:attribute> - <dia:attribute name="visible_comments"> - <dia:boolean val="true"/> - </dia:attribute> - <dia:attribute name="wrap_operations"> - <dia:boolean val="true"/> - </dia:attribute> - <dia:attribute name="wrap_after_char"> - <dia:int val="40"/> - </dia:attribute> - <dia:attribute name="comment_line_length"> - <dia:int val="40"/> - </dia:attribute> - <dia:attribute name="comment_tagging"> - <dia:boolean val="false"/> - </dia:attribute> - <dia:attribute name="line_width"> - <dia:real val="0.10000000000000001"/> - </dia:attribute> - <dia:attribute name="line_color"> - <dia:color val="#000000"/> - </dia:attribute> - <dia:attribute name="fill_color"> - <dia:color val="#ffffff"/> - </dia:attribute> - <dia:attribute name="text_color"> - <dia:color val="#000000"/> - </dia:attribute> - <dia:attribute name="normal_font"> - <dia:font family="monospace" style="0" name="Courier"/> - </dia:attribute> - <dia:attribute name="abstract_font"> - <dia:font family="monospace" style="88" name="Courier-BoldOblique"/> - </dia:attribute> - <dia:attribute name="polymorphic_font"> - <dia:font family="monospace" style="8" name="Courier-Oblique"/> - </dia:attribute> - <dia:attribute name="classname_font"> - <dia:font family="sans" style="80" name="Helvetica-Bold"/> - </dia:attribute> - <dia:attribute name="abstract_classname_font"> - <dia:font family="sans" style="88" name="Helvetica-BoldOblique"/> - </dia:attribute> - <dia:attribute name="comment_font"> - <dia:font family="sans" style="8" name="Helvetica-Oblique"/> - </dia:attribute> - <dia:attribute name="normal_font_height"> - <dia:real val="0.80000000000000004"/> - </dia:attribute> - <dia:attribute name="polymorphic_font_height"> - <dia:real val="0.80000000000000004"/> - </dia:attribute> - <dia:attribute name="abstract_font_height"> - <dia:real val="0.80000000000000004"/> - </dia:attribute> - <dia:attribute name="classname_font_height"> - <dia:real val="1"/> - </dia:attribute> - <dia:attribute name="abstract_classname_font_height"> - <dia:real val="1"/> - </dia:attribute> - <dia:attribute name="comment_font_height"> - <dia:real val="0.69999999999999996"/> - </dia:attribute> - <dia:attribute name="attributes"/> - <dia:attribute name="operations"> - <dia:composite type="umloperation"> - <dia:attribute name="name"> - <dia:string>#IoServer#</dia:string> - </dia:attribute> - <dia:attribute name="stereotype"> - <dia:string>##</dia:string> - </dia:attribute> - <dia:attribute name="type"> - <dia:string>##</dia:string> - </dia:attribute> - <dia:attribute name="visibility"> - <dia:enum val="0"/> - </dia:attribute> - <dia:attribute name="comment"> - <dia:string>##</dia:string> - </dia:attribute> - <dia:attribute name="abstract"> - <dia:boolean val="false"/> - </dia:attribute> - <dia:attribute name="inheritance_type"> - <dia:enum val="2"/> - </dia:attribute> - <dia:attribute name="query"> - <dia:boolean val="false"/> - </dia:attribute> - <dia:attribute name="class_scope"> - <dia:boolean val="false"/> - </dia:attribute> - <dia:attribute name="parameters"> - <dia:composite type="umlparameter"> - <dia:attribute name="name"> - <dia:string>#back#</dia:string> - </dia:attribute> - <dia:attribute name="type"> - <dia:string>#Io#</dia:string> - </dia:attribute> - <dia:attribute name="value"> - <dia:string>##</dia:string> - </dia:attribute> - <dia:attribute name="comment"> - <dia:string>##</dia:string> - </dia:attribute> - <dia:attribute name="kind"> - <dia:enum val="0"/> - </dia:attribute> - </dia:composite> - </dia:attribute> - </dia:composite> - <dia:composite type="umloperation"> - <dia:attribute name="name"> - <dia:string>#handle#</dia:string> - </dia:attribute> - <dia:attribute name="stereotype"> - <dia:string>##</dia:string> - </dia:attribute> - <dia:attribute name="type"> - <dia:string>#Message#</dia:string> - </dia:attribute> - <dia:attribute name="visibility"> - <dia:enum val="0"/> - </dia:attribute> - <dia:attribute name="comment"> - <dia:string>##</dia:string> - </dia:attribute> - <dia:attribute name="abstract"> - <dia:boolean val="false"/> - </dia:attribute> - <dia:attribute name="inheritance_type"> - <dia:enum val="2"/> - </dia:attribute> - <dia:attribute name="query"> - <dia:boolean val="false"/> - </dia:attribute> - <dia:attribute name="class_scope"> - <dia:boolean val="false"/> - </dia:attribute> - <dia:attribute name="parameters"> - <dia:composite type="umlparameter"> - <dia:attribute name="name"> - <dia:string>#message#</dia:string> - </dia:attribute> - <dia:attribute name="type"> - <dia:string>#Message#</dia:string> - </dia:attribute> - <dia:attribute name="value"> - <dia:string>##</dia:string> - </dia:attribute> - <dia:attribute name="comment"> - <dia:string>##</dia:string> - </dia:attribute> - <dia:attribute name="kind"> - <dia:enum val="0"/> - </dia:attribute> - </dia:composite> - </dia:attribute> - </dia:composite> - </dia:attribute> - <dia:attribute name="template"> - <dia:boolean val="false"/> - </dia:attribute> - <dia:attribute name="templates"/> - </dia:object> - <dia:object type="UML - Class" version="0" id="O4"> - <dia:attribute name="obj_pos"> - <dia:point val="24.2494,13.3231"/> - </dia:attribute> - <dia:attribute name="obj_bb"> - <dia:rectangle val="24.1994,13.2731;38.6594,18.1731"/> - </dia:attribute> - <dia:attribute name="elem_corner"> - <dia:point val="24.2494,13.3231"/> - </dia:attribute> - <dia:attribute name="elem_width"> - <dia:real val="14.359999999999999"/> - </dia:attribute> - <dia:attribute name="elem_height"> - <dia:real val="4.8000000000000007"/> - </dia:attribute> - <dia:attribute name="name"> - <dia:string>#Io#</dia:string> - </dia:attribute> - <dia:attribute name="stereotype"> - <dia:string>#interface#</dia:string> - </dia:attribute> - <dia:attribute name="comment"> - <dia:string>##</dia:string> - </dia:attribute> - <dia:attribute name="abstract"> - <dia:boolean val="true"/> - </dia:attribute> - <dia:attribute name="suppress_attributes"> - <dia:boolean val="false"/> - </dia:attribute> - <dia:attribute name="suppress_operations"> - <dia:boolean val="false"/> - </dia:attribute> - <dia:attribute name="visible_attributes"> - <dia:boolean val="false"/> - </dia:attribute> - <dia:attribute name="visible_operations"> - <dia:boolean val="true"/> - </dia:attribute> - <dia:attribute name="visible_comments"> - <dia:boolean val="false"/> - </dia:attribute> - <dia:attribute name="wrap_operations"> - <dia:boolean val="true"/> - </dia:attribute> - <dia:attribute name="wrap_after_char"> - <dia:int val="40"/> - </dia:attribute> - <dia:attribute name="comment_line_length"> - <dia:int val="17"/> - </dia:attribute> - <dia:attribute name="comment_tagging"> - <dia:boolean val="false"/> - </dia:attribute> - <dia:attribute name="line_width"> - <dia:real val="0.10000000000000001"/> - </dia:attribute> - <dia:attribute name="line_color"> - <dia:color val="#000000"/> - </dia:attribute> - <dia:attribute name="fill_color"> - <dia:color val="#ffffff"/> - </dia:attribute> - <dia:attribute name="text_color"> - <dia:color val="#000000"/> - </dia:attribute> - <dia:attribute name="normal_font"> - <dia:font family="monospace" style="0" name="Courier"/> - </dia:attribute> - <dia:attribute name="abstract_font"> - <dia:font family="monospace" style="88" name="Courier-BoldOblique"/> - </dia:attribute> - <dia:attribute name="polymorphic_font"> - <dia:font family="monospace" style="8" name="Courier-Oblique"/> - </dia:attribute> - <dia:attribute name="classname_font"> - <dia:font family="sans" style="80" name="Helvetica-Bold"/> - </dia:attribute> - <dia:attribute name="abstract_classname_font"> - <dia:font family="sans" style="88" name="Helvetica-BoldOblique"/> - </dia:attribute> - <dia:attribute name="comment_font"> - <dia:font family="sans" style="8" name="Helvetica-Oblique"/> - </dia:attribute> - <dia:attribute name="normal_font_height"> - <dia:real val="0.80000000000000004"/> - </dia:attribute> - <dia:attribute name="polymorphic_font_height"> - <dia:real val="0.80000000000000004"/> - </dia:attribute> - <dia:attribute name="abstract_font_height"> - <dia:real val="0.80000000000000004"/> - </dia:attribute> - <dia:attribute name="classname_font_height"> - <dia:real val="1"/> - </dia:attribute> - <dia:attribute name="abstract_classname_font_height"> - <dia:real val="1"/> - </dia:attribute> - <dia:attribute name="comment_font_height"> - <dia:real val="0.69999999999999996"/> - </dia:attribute> - <dia:attribute name="attributes"/> - <dia:attribute name="operations"> - <dia:composite type="umloperation"> - <dia:attribute name="name"> - <dia:string>#write#</dia:string> - </dia:attribute> - <dia:attribute name="stereotype"> - <dia:string>##</dia:string> - </dia:attribute> - <dia:attribute name="type"> - <dia:string>#int#</dia:string> - </dia:attribute> - <dia:attribute name="visibility"> - <dia:enum val="0"/> - </dia:attribute> - <dia:attribute name="comment"> - <dia:string>##</dia:string> - </dia:attribute> - <dia:attribute name="abstract"> - <dia:boolean val="false"/> - </dia:attribute> - <dia:attribute name="inheritance_type"> - <dia:enum val="2"/> - </dia:attribute> - <dia:attribute name="query"> - <dia:boolean val="false"/> - </dia:attribute> - <dia:attribute name="class_scope"> - <dia:boolean val="false"/> - </dia:attribute> - <dia:attribute name="parameters"> - <dia:composite type="umlparameter"> - <dia:attribute name="name"> - <dia:string>#data#</dia:string> - </dia:attribute> - <dia:attribute name="type"> - <dia:string>#char[]#</dia:string> - </dia:attribute> - <dia:attribute name="value"> - <dia:string>##</dia:string> - </dia:attribute> - <dia:attribute name="comment"> - <dia:string>##</dia:string> - </dia:attribute> - <dia:attribute name="kind"> - <dia:enum val="0"/> - </dia:attribute> - </dia:composite> - <dia:composite type="umlparameter"> - <dia:attribute name="name"> - <dia:string>#offset#</dia:string> - </dia:attribute> - <dia:attribute name="type"> - <dia:string>#int#</dia:string> - </dia:attribute> - <dia:attribute name="value"> - <dia:string>##</dia:string> - </dia:attribute> - <dia:attribute name="comment"> - <dia:string>##</dia:string> - </dia:attribute> - <dia:attribute name="kind"> - <dia:enum val="0"/> - </dia:attribute> - </dia:composite> - </dia:attribute> - </dia:composite> - <dia:composite type="umloperation"> - <dia:attribute name="name"> - <dia:string>#read#</dia:string> - </dia:attribute> - <dia:attribute name="stereotype"> - <dia:string>##</dia:string> - </dia:attribute> - <dia:attribute name="type"> - <dia:string>#char[]#</dia:string> - </dia:attribute> - <dia:attribute name="visibility"> - <dia:enum val="0"/> - </dia:attribute> - <dia:attribute name="comment"> - <dia:string>##</dia:string> - </dia:attribute> - <dia:attribute name="abstract"> - <dia:boolean val="false"/> - </dia:attribute> - <dia:attribute name="inheritance_type"> - <dia:enum val="2"/> - </dia:attribute> - <dia:attribute name="query"> - <dia:boolean val="false"/> - </dia:attribute> - <dia:attribute name="class_scope"> - <dia:boolean val="false"/> - </dia:attribute> - <dia:attribute name="parameters"> - <dia:composite type="umlparameter"> - <dia:attribute name="name"> - <dia:string>#offset#</dia:string> - </dia:attribute> - <dia:attribute name="type"> - <dia:string>#int#</dia:string> - </dia:attribute> - <dia:attribute name="value"> - <dia:string>##</dia:string> - </dia:attribute> - <dia:attribute name="comment"> - <dia:string>##</dia:string> - </dia:attribute> - <dia:attribute name="kind"> - <dia:enum val="0"/> - </dia:attribute> - </dia:composite> - <dia:composite type="umlparameter"> - <dia:attribute name="name"> - <dia:string>#amount#</dia:string> - </dia:attribute> - <dia:attribute name="type"> - <dia:string>#int#</dia:string> - </dia:attribute> - <dia:attribute name="value"> - <dia:string>##</dia:string> - </dia:attribute> - <dia:attribute name="comment"> - <dia:string>##</dia:string> - </dia:attribute> - <dia:attribute name="kind"> - <dia:enum val="0"/> - </dia:attribute> - </dia:composite> - </dia:attribute> - </dia:composite> - <dia:composite type="umloperation"> - <dia:attribute name="name"> - <dia:string>#seek#</dia:string> - </dia:attribute> - <dia:attribute name="stereotype"> - <dia:string>##</dia:string> - </dia:attribute> - <dia:attribute name="type"> - <dia:string>#int#</dia:string> - </dia:attribute> - <dia:attribute name="visibility"> - <dia:enum val="0"/> - </dia:attribute> - <dia:attribute name="comment"> - <dia:string>##</dia:string> - </dia:attribute> - <dia:attribute name="abstract"> - <dia:boolean val="false"/> - </dia:attribute> - <dia:attribute name="inheritance_type"> - <dia:enum val="2"/> - </dia:attribute> - <dia:attribute name="query"> - <dia:boolean val="false"/> - </dia:attribute> - <dia:attribute name="class_scope"> - <dia:boolean val="false"/> - </dia:attribute> - <dia:attribute name="parameters"> - <dia:composite type="umlparameter"> - <dia:attribute name="name"> - <dia:string>#offset#</dia:string> - </dia:attribute> - <dia:attribute name="type"> - <dia:string>#int#</dia:string> - </dia:attribute> - <dia:attribute name="value"> - <dia:string>##</dia:string> - </dia:attribute> - <dia:attribute name="comment"> - <dia:string>##</dia:string> - </dia:attribute> - <dia:attribute name="kind"> - <dia:enum val="0"/> - </dia:attribute> - </dia:composite> - <dia:composite type="umlparameter"> - <dia:attribute name="name"> - <dia:string>#whence#</dia:string> - </dia:attribute> - <dia:attribute name="type"> - <dia:string>#int#</dia:string> - </dia:attribute> - <dia:attribute name="value"> - <dia:string>##</dia:string> - </dia:attribute> - <dia:attribute name="comment"> - <dia:string>##</dia:string> - </dia:attribute> - <dia:attribute name="kind"> - <dia:enum val="0"/> - </dia:attribute> - </dia:composite> - </dia:attribute> - </dia:composite> - </dia:attribute> - <dia:attribute name="template"> - <dia:boolean val="false"/> - </dia:attribute> - <dia:attribute name="templates"/> - </dia:object> - <dia:object type="UML - Class" version="0" id="O5"> - <dia:attribute name="obj_pos"> - <dia:point val="24.2494,21.6986"/> - </dia:attribute> - <dia:attribute name="obj_bb"> - <dia:rectangle val="24.1994,21.6486;38.6594,27.9486"/> - </dia:attribute> - <dia:attribute name="elem_corner"> - <dia:point val="24.2494,21.6986"/> - </dia:attribute> - <dia:attribute name="elem_width"> - <dia:real val="14.359999999999999"/> - </dia:attribute> - <dia:attribute name="elem_height"> - <dia:real val="6.2000000000000002"/> - </dia:attribute> - <dia:attribute name="name"> - <dia:string>#IoUser#</dia:string> - </dia:attribute> - <dia:attribute name="stereotype"> - <dia:string>##</dia:string> - </dia:attribute> - <dia:attribute name="comment"> - <dia:string>#Implements the Io interface by performing RPC#</dia:string> - </dia:attribute> - <dia:attribute name="abstract"> - <dia:boolean val="false"/> - </dia:attribute> - <dia:attribute name="suppress_attributes"> - <dia:boolean val="false"/> - </dia:attribute> - <dia:attribute name="suppress_operations"> - <dia:boolean val="false"/> - </dia:attribute> - <dia:attribute name="visible_attributes"> - <dia:boolean val="false"/> - </dia:attribute> - <dia:attribute name="visible_operations"> - <dia:boolean val="true"/> - </dia:attribute> - <dia:attribute name="visible_comments"> - <dia:boolean val="true"/> - </dia:attribute> - <dia:attribute name="wrap_operations"> - <dia:boolean val="true"/> - </dia:attribute> - <dia:attribute name="wrap_after_char"> - <dia:int val="40"/> - </dia:attribute> - <dia:attribute name="comment_line_length"> - <dia:int val="40"/> - </dia:attribute> - <dia:attribute name="comment_tagging"> - <dia:boolean val="false"/> - </dia:attribute> - <dia:attribute name="line_width"> - <dia:real val="0.10000000000000001"/> - </dia:attribute> - <dia:attribute name="line_color"> - <dia:color val="#000000"/> - </dia:attribute> - <dia:attribute name="fill_color"> - <dia:color val="#ffffff"/> - </dia:attribute> - <dia:attribute name="text_color"> - <dia:color val="#000000"/> - </dia:attribute> - <dia:attribute name="normal_font"> - <dia:font family="monospace" style="0" name="Courier"/> - </dia:attribute> - <dia:attribute name="abstract_font"> - <dia:font family="monospace" style="88" name="Courier-BoldOblique"/> - </dia:attribute> - <dia:attribute name="polymorphic_font"> - <dia:font family="monospace" style="8" name="Courier-Oblique"/> - </dia:attribute> - <dia:attribute name="classname_font"> - <dia:font family="sans" style="80" name="Helvetica-Bold"/> - </dia:attribute> - <dia:attribute name="abstract_classname_font"> - <dia:font family="sans" style="88" name="Helvetica-BoldOblique"/> - </dia:attribute> - <dia:attribute name="comment_font"> - <dia:font family="sans" style="8" name="Helvetica-Oblique"/> - </dia:attribute> - <dia:attribute name="normal_font_height"> - <dia:real val="0.80000000000000004"/> - </dia:attribute> - <dia:attribute name="polymorphic_font_height"> - <dia:real val="0.80000000000000004"/> - </dia:attribute> - <dia:attribute name="abstract_font_height"> - <dia:real val="0.80000000000000004"/> - </dia:attribute> - <dia:attribute name="classname_font_height"> - <dia:real val="1"/> - </dia:attribute> - <dia:attribute name="abstract_classname_font_height"> - <dia:real val="1"/> - </dia:attribute> - <dia:attribute name="comment_font_height"> - <dia:real val="0.69999999999999996"/> - </dia:attribute> - <dia:attribute name="attributes"/> - <dia:attribute name="operations"> - <dia:composite type="umloperation"> - <dia:attribute name="name"> - <dia:string>#IoUser#</dia:string> - </dia:attribute> - <dia:attribute name="stereotype"> - <dia:string>##</dia:string> - </dia:attribute> - <dia:attribute name="type"> - <dia:string>##</dia:string> - </dia:attribute> - <dia:attribute name="visibility"> - <dia:enum val="0"/> - </dia:attribute> - <dia:attribute name="comment"> - <dia:string>##</dia:string> - </dia:attribute> - <dia:attribute name="abstract"> - <dia:boolean val="false"/> - </dia:attribute> - <dia:attribute name="inheritance_type"> - <dia:enum val="2"/> - </dia:attribute> - <dia:attribute name="query"> - <dia:boolean val="false"/> - </dia:attribute> - <dia:attribute name="class_scope"> - <dia:boolean val="false"/> - </dia:attribute> - <dia:attribute name="parameters"> - <dia:composite type="umlparameter"> - <dia:attribute name="name"> - <dia:string>#port#</dia:string> - </dia:attribute> - <dia:attribute name="type"> - <dia:string>#MachPort#</dia:string> - </dia:attribute> - <dia:attribute name="value"> - <dia:string>##</dia:string> - </dia:attribute> - <dia:attribute name="comment"> - <dia:string>##</dia:string> - </dia:attribute> - <dia:attribute name="kind"> - <dia:enum val="0"/> - </dia:attribute> - </dia:composite> - </dia:attribute> - </dia:composite> - <dia:composite type="umloperation"> - <dia:attribute name="name"> - <dia:string>#write#</dia:string> - </dia:attribute> - <dia:attribute name="stereotype"> - <dia:string>##</dia:string> - </dia:attribute> - <dia:attribute name="type"> - <dia:string>#int#</dia:string> - </dia:attribute> - <dia:attribute name="visibility"> - <dia:enum val="0"/> - </dia:attribute> - <dia:attribute name="comment"> - <dia:string>##</dia:string> - </dia:attribute> - <dia:attribute name="abstract"> - <dia:boolean val="false"/> - </dia:attribute> - <dia:attribute name="inheritance_type"> - <dia:enum val="2"/> - </dia:attribute> - <dia:attribute name="query"> - <dia:boolean val="false"/> - </dia:attribute> - <dia:attribute name="class_scope"> - <dia:boolean val="false"/> - </dia:attribute> - <dia:attribute name="parameters"> - <dia:composite type="umlparameter"> - <dia:attribute name="name"> - <dia:string>#data#</dia:string> - </dia:attribute> - <dia:attribute name="type"> - <dia:string>#char[]#</dia:string> - </dia:attribute> - <dia:attribute name="value"> - <dia:string>##</dia:string> - </dia:attribute> - <dia:attribute name="comment"> - <dia:string>##</dia:string> - </dia:attribute> - <dia:attribute name="kind"> - <dia:enum val="0"/> - </dia:attribute> - </dia:composite> - <dia:composite type="umlparameter"> - <dia:attribute name="name"> - <dia:string>#offset#</dia:string> - </dia:attribute> - <dia:attribute name="type"> - <dia:string>#int#</dia:string> - </dia:attribute> - <dia:attribute name="value"> - <dia:string>##</dia:string> - </dia:attribute> - <dia:attribute name="comment"> - <dia:string>##</dia:string> - </dia:attribute> - <dia:attribute name="kind"> - <dia:enum val="0"/> - </dia:attribute> - </dia:composite> - </dia:attribute> - </dia:composite> - <dia:composite type="umloperation"> - <dia:attribute name="name"> - <dia:string>#read#</dia:string> - </dia:attribute> - <dia:attribute name="stereotype"> - <dia:string>##</dia:string> - </dia:attribute> - <dia:attribute name="type"> - <dia:string>#char[]#</dia:string> - </dia:attribute> - <dia:attribute name="visibility"> - <dia:enum val="0"/> - </dia:attribute> - <dia:attribute name="comment"> - <dia:string>##</dia:string> - </dia:attribute> - <dia:attribute name="abstract"> - <dia:boolean val="false"/> - </dia:attribute> - <dia:attribute name="inheritance_type"> - <dia:enum val="2"/> - </dia:attribute> - <dia:attribute name="query"> - <dia:boolean val="false"/> - </dia:attribute> - <dia:attribute name="class_scope"> - <dia:boolean val="false"/> - </dia:attribute> - <dia:attribute name="parameters"> - <dia:composite type="umlparameter"> - <dia:attribute name="name"> - <dia:string>#offset#</dia:string> - </dia:attribute> - <dia:attribute name="type"> - <dia:string>#int#</dia:string> - </dia:attribute> - <dia:attribute name="value"> - <dia:string>##</dia:string> - </dia:attribute> - <dia:attribute name="comment"> - <dia:string>##</dia:string> - </dia:attribute> - <dia:attribute name="kind"> - <dia:enum val="0"/> - </dia:attribute> - </dia:composite> - <dia:composite type="umlparameter"> - <dia:attribute name="name"> - <dia:string>#amount#</dia:string> - </dia:attribute> - <dia:attribute name="type"> - <dia:string>#int#</dia:string> - </dia:attribute> - <dia:attribute name="value"> - <dia:string>##</dia:string> - </dia:attribute> - <dia:attribute name="comment"> - <dia:string>##</dia:string> - </dia:attribute> - <dia:attribute name="kind"> - <dia:enum val="0"/> - </dia:attribute> - </dia:composite> - </dia:attribute> - </dia:composite> - <dia:composite type="umloperation"> - <dia:attribute name="name"> - <dia:string>#seek#</dia:string> - </dia:attribute> - <dia:attribute name="stereotype"> - <dia:string>##</dia:string> - </dia:attribute> - <dia:attribute name="type"> - <dia:string>#int#</dia:string> - </dia:attribute> - <dia:attribute name="visibility"> - <dia:enum val="0"/> - </dia:attribute> - <dia:attribute name="comment"> - <dia:string>##</dia:string> - </dia:attribute> - <dia:attribute name="abstract"> - <dia:boolean val="false"/> - </dia:attribute> - <dia:attribute name="inheritance_type"> - <dia:enum val="2"/> - </dia:attribute> - <dia:attribute name="query"> - <dia:boolean val="false"/> - </dia:attribute> - <dia:attribute name="class_scope"> - <dia:boolean val="false"/> - </dia:attribute> - <dia:attribute name="parameters"> - <dia:composite type="umlparameter"> - <dia:attribute name="name"> - <dia:string>#offset#</dia:string> - </dia:attribute> - <dia:attribute name="type"> - <dia:string>#int#</dia:string> - </dia:attribute> - <dia:attribute name="value"> - <dia:string>##</dia:string> - </dia:attribute> - <dia:attribute name="comment"> - <dia:string>##</dia:string> - </dia:attribute> - <dia:attribute name="kind"> - <dia:enum val="0"/> - </dia:attribute> - </dia:composite> - <dia:composite type="umlparameter"> - <dia:attribute name="name"> - <dia:string>#whence#</dia:string> - </dia:attribute> - <dia:attribute name="type"> - <dia:string>#int#</dia:string> - </dia:attribute> - <dia:attribute name="value"> - <dia:string>##</dia:string> - </dia:attribute> - <dia:attribute name="comment"> - <dia:string>##</dia:string> - </dia:attribute> - <dia:attribute name="kind"> - <dia:enum val="0"/> - </dia:attribute> - </dia:composite> - </dia:attribute> - </dia:composite> - </dia:attribute> - <dia:attribute name="template"> - <dia:boolean val="false"/> - </dia:attribute> - <dia:attribute name="templates"/> - </dia:object> - <dia:object type="UML - Realizes" version="1" id="O6"> - <dia:attribute name="obj_pos"> - <dia:point val="31.4294,18.1734"/> - </dia:attribute> - <dia:attribute name="obj_bb"> - <dia:rectangle val="31.3794,18.1734;31.5294,21.719"/> - </dia:attribute> - <dia:attribute name="meta"> - <dia:composite type="dict"/> - </dia:attribute> - <dia:attribute name="orth_points"> - <dia:point val="31.4294,18.1734"/> - <dia:point val="31.4294,18.1734"/> - <dia:point val="31.4294,21.6482"/> - <dia:point val="31.4294,21.6482"/> - </dia:attribute> - <dia:attribute name="orth_orient"> - <dia:enum val="0"/> - <dia:enum val="1"/> - <dia:enum val="0"/> - </dia:attribute> - <dia:attribute name="orth_autoroute"> - <dia:boolean val="true"/> - </dia:attribute> - <dia:attribute name="line_colour"> - <dia:color val="#000000"/> - </dia:attribute> - <dia:attribute name="text_colour"> - <dia:color val="#000000"/> - </dia:attribute> - <dia:attribute name="name"> - <dia:string>##</dia:string> - </dia:attribute> - <dia:attribute name="stereotype"> - <dia:string>##</dia:string> - </dia:attribute> - <dia:connections> - <dia:connection handle="0" to="O4" connection="14"/> - <dia:connection handle="1" to="O5" connection="16"/> - </dia:connections> - </dia:object> - <dia:object type="UML - Association" version="2" id="O7"> - <dia:attribute name="name"> - <dia:string>##</dia:string> - </dia:attribute> - <dia:attribute name="direction"> - <dia:enum val="1"/> - </dia:attribute> - <dia:attribute name="show_direction"> - <dia:boolean val="false"/> - </dia:attribute> - <dia:attribute name="assoc_type"> - <dia:enum val="1"/> - </dia:attribute> - <dia:attribute name="role_a"> - <dia:string>##</dia:string> - </dia:attribute> - <dia:attribute name="multipicity_a"> - <dia:string>##</dia:string> - </dia:attribute> - <dia:attribute name="visibility_a"> - <dia:enum val="3"/> - </dia:attribute> - <dia:attribute name="show_arrow_a"> - <dia:boolean val="false"/> - </dia:attribute> - <dia:attribute name="role_b"> - <dia:string>##</dia:string> - </dia:attribute> - <dia:attribute name="multipicity_b"> - <dia:string>##</dia:string> - </dia:attribute> - <dia:attribute name="visibility_b"> - <dia:enum val="3"/> - </dia:attribute> - <dia:attribute name="show_arrow_b"> - <dia:boolean val="false"/> - </dia:attribute> - <dia:attribute name="obj_pos"> - <dia:point val="24.8976,8.44749"/> - </dia:attribute> - <dia:attribute name="obj_bb"> - <dia:rectangle val="22.3132,7.69749;25.6476,16.0231"/> - </dia:attribute> - <dia:attribute name="meta"> - <dia:composite type="dict"/> - </dia:attribute> - <dia:attribute name="orth_points"> - <dia:point val="24.8976,8.44749"/> - <dia:point val="22.3632,8.44749"/> - <dia:point val="22.3632,14.4231"/> - <dia:point val="24.2494,14.4231"/> - </dia:attribute> - <dia:attribute name="orth_orient"> - <dia:enum val="0"/> - <dia:enum val="1"/> - <dia:enum val="0"/> - </dia:attribute> - <dia:attribute name="orth_autoroute"> - <dia:boolean val="false"/> - </dia:attribute> - <dia:attribute name="text_colour"> - <dia:color val="#000000"/> - </dia:attribute> - <dia:attribute name="line_colour"> - <dia:color val="#000000"/> - </dia:attribute> - <dia:connections> - <dia:connection handle="0" to="O3" connection="8"/> - <dia:connection handle="1" to="O4" connection="3"/> - </dia:connections> - <dia:childnode parent="O2"/> - </dia:object> - </dia:group> - <dia:group> - <dia:object type="UML - Realizes" version="1" id="O8"> - <dia:attribute name="obj_pos"> - <dia:point val="10.6153,8.74801"/> - </dia:attribute> - <dia:attribute name="obj_bb"> - <dia:rectangle val="10.5653,8.74801;10.7153,12.32"/> - </dia:attribute> - <dia:attribute name="meta"> - <dia:composite type="dict"/> - </dia:attribute> - <dia:attribute name="orth_points"> - <dia:point val="10.6153,8.74801"/> - <dia:point val="10.6153,8.74801"/> - <dia:point val="10.6153,12.2493"/> - <dia:point val="10.6153,12.2493"/> - </dia:attribute> - <dia:attribute name="orth_orient"> - <dia:enum val="0"/> - <dia:enum val="1"/> - <dia:enum val="0"/> - </dia:attribute> - <dia:attribute name="orth_autoroute"> - <dia:boolean val="true"/> - </dia:attribute> - <dia:attribute name="line_colour"> - <dia:color val="#000000"/> - </dia:attribute> - <dia:attribute name="text_colour"> - <dia:color val="#000000"/> - </dia:attribute> - <dia:attribute name="name"> - <dia:string>##</dia:string> - </dia:attribute> - <dia:attribute name="stereotype"> - <dia:string>##</dia:string> - </dia:attribute> - <dia:connections> - <dia:connection handle="0" to="O10" connection="10"/> - <dia:connection handle="1" to="O11" connection="12"/> - </dia:connections> - <dia:childnode parent="O9"/> - </dia:object> - <dia:object type="UML - LargePackage" version="0" id="O9"> - <dia:attribute name="obj_pos"> - <dia:point val="0.503207,3.45415"/> - </dia:attribute> - <dia:attribute name="obj_bb"> - <dia:rectangle val="0.453207,2.40415;18.7966,24.081"/> - </dia:attribute> - <dia:attribute name="meta"> - <dia:composite type="dict"/> - </dia:attribute> - <dia:attribute name="elem_corner"> - <dia:point val="0.503207,3.45415"/> - </dia:attribute> - <dia:attribute name="elem_width"> - <dia:real val="18.243354954612922"/> - </dia:attribute> - <dia:attribute name="elem_height"> - <dia:real val="20.576807332528524"/> - </dia:attribute> - <dia:attribute name="line_width"> - <dia:real val="0.10000000149011612"/> - </dia:attribute> - <dia:attribute name="line_colour"> - <dia:color val="#000000"/> - </dia:attribute> - <dia:attribute name="fill_colour"> - <dia:color val="#ffffff"/> - </dia:attribute> - <dia:attribute name="text_colour"> - <dia:color val="#000000"/> - </dia:attribute> - <dia:attribute name="stereotype"> - <dia:string>##</dia:string> - </dia:attribute> - <dia:attribute name="name"> - <dia:string>#libports-like library#</dia:string> - </dia:attribute> - </dia:object> - <dia:object type="UML - Class" version="0" id="O10"> - <dia:attribute name="obj_pos"> - <dia:point val="4.78285,5.49761"/> - </dia:attribute> - <dia:attribute name="obj_bb"> - <dia:rectangle val="4.73285,5.44761;16.4978,8.74761"/> - </dia:attribute> - <dia:attribute name="elem_corner"> - <dia:point val="4.78285,5.49761"/> - </dia:attribute> - <dia:attribute name="elem_width"> - <dia:real val="11.664999999999999"/> - </dia:attribute> - <dia:attribute name="elem_height"> - <dia:real val="3.2000000000000002"/> - </dia:attribute> - <dia:attribute name="name"> - <dia:string>#Server#</dia:string> - </dia:attribute> - <dia:attribute name="stereotype"> - <dia:string>#interface#</dia:string> - </dia:attribute> - <dia:attribute name="comment"> - <dia:string>##</dia:string> - </dia:attribute> - <dia:attribute name="abstract"> - <dia:boolean val="false"/> - </dia:attribute> - <dia:attribute name="suppress_attributes"> - <dia:boolean val="false"/> - </dia:attribute> - <dia:attribute name="suppress_operations"> - <dia:boolean val="false"/> - </dia:attribute> - <dia:attribute name="visible_attributes"> - <dia:boolean val="false"/> - </dia:attribute> - <dia:attribute name="visible_operations"> - <dia:boolean val="true"/> - </dia:attribute> - <dia:attribute name="visible_comments"> - <dia:boolean val="false"/> - </dia:attribute> - <dia:attribute name="wrap_operations"> - <dia:boolean val="true"/> - </dia:attribute> - <dia:attribute name="wrap_after_char"> - <dia:int val="40"/> - </dia:attribute> - <dia:attribute name="comment_line_length"> - <dia:int val="17"/> - </dia:attribute> - <dia:attribute name="comment_tagging"> - <dia:boolean val="false"/> - </dia:attribute> - <dia:attribute name="line_width"> - <dia:real val="0.10000000000000001"/> - </dia:attribute> - <dia:attribute name="line_color"> - <dia:color val="#000000"/> - </dia:attribute> - <dia:attribute name="fill_color"> - <dia:color val="#ffffff"/> - </dia:attribute> - <dia:attribute name="text_color"> - <dia:color val="#000000"/> - </dia:attribute> - <dia:attribute name="normal_font"> - <dia:font family="monospace" style="0" name="Courier"/> - </dia:attribute> - <dia:attribute name="abstract_font"> - <dia:font family="monospace" style="88" name="Courier-BoldOblique"/> - </dia:attribute> - <dia:attribute name="polymorphic_font"> - <dia:font family="monospace" style="8" name="Courier-Oblique"/> - </dia:attribute> - <dia:attribute name="classname_font"> - <dia:font family="sans" style="80" name="Helvetica-Bold"/> - </dia:attribute> - <dia:attribute name="abstract_classname_font"> - <dia:font family="sans" style="88" name="Helvetica-BoldOblique"/> - </dia:attribute> - <dia:attribute name="comment_font"> - <dia:font family="sans" style="8" name="Helvetica-Oblique"/> - </dia:attribute> - <dia:attribute name="normal_font_height"> - <dia:real val="0.80000000000000004"/> - </dia:attribute> - <dia:attribute name="polymorphic_font_height"> - <dia:real val="0.80000000000000004"/> - </dia:attribute> - <dia:attribute name="abstract_font_height"> - <dia:real val="0.80000000000000004"/> - </dia:attribute> - <dia:attribute name="classname_font_height"> - <dia:real val="1"/> - </dia:attribute> - <dia:attribute name="abstract_classname_font_height"> - <dia:real val="1"/> - </dia:attribute> - <dia:attribute name="comment_font_height"> - <dia:real val="0.69999999999999996"/> - </dia:attribute> - <dia:attribute name="attributes"/> - <dia:attribute name="operations"> - <dia:composite type="umloperation"> - <dia:attribute name="name"> - <dia:string>#handle#</dia:string> - </dia:attribute> - <dia:attribute name="stereotype"> - <dia:string>##</dia:string> - </dia:attribute> - <dia:attribute name="type"> - <dia:string>#Message#</dia:string> - </dia:attribute> - <dia:attribute name="visibility"> - <dia:enum val="0"/> - </dia:attribute> - <dia:attribute name="comment"> - <dia:string>##</dia:string> - </dia:attribute> - <dia:attribute name="abstract"> - <dia:boolean val="false"/> - </dia:attribute> - <dia:attribute name="inheritance_type"> - <dia:enum val="2"/> - </dia:attribute> - <dia:attribute name="query"> - <dia:boolean val="false"/> - </dia:attribute> - <dia:attribute name="class_scope"> - <dia:boolean val="false"/> - </dia:attribute> - <dia:attribute name="parameters"> - <dia:composite type="umlparameter"> - <dia:attribute name="name"> - <dia:string>#msg#</dia:string> - </dia:attribute> - <dia:attribute name="type"> - <dia:string>#Message#</dia:string> - </dia:attribute> - <dia:attribute name="value"> - <dia:string>##</dia:string> - </dia:attribute> - <dia:attribute name="comment"> - <dia:string>##</dia:string> - </dia:attribute> - <dia:attribute name="kind"> - <dia:enum val="0"/> - </dia:attribute> - </dia:composite> - </dia:attribute> - </dia:composite> - </dia:attribute> - <dia:attribute name="template"> - <dia:boolean val="false"/> - </dia:attribute> - <dia:attribute name="templates"/> - </dia:object> - <dia:object type="UML - Class" version="0" id="O11"> - <dia:attribute name="obj_pos"> - <dia:point val="4.78285,12.2997"/> - </dia:attribute> - <dia:attribute name="obj_bb"> - <dia:rectangle val="4.73285,12.2497;16.4978,15.5497"/> - </dia:attribute> - <dia:attribute name="elem_corner"> - <dia:point val="4.78285,12.2997"/> - </dia:attribute> - <dia:attribute name="elem_width"> - <dia:real val="11.664999999999999"/> - </dia:attribute> - <dia:attribute name="elem_height"> - <dia:real val="3.2000000000000002"/> - </dia:attribute> - <dia:attribute name="name"> - <dia:string>#Demux#</dia:string> - </dia:attribute> - <dia:attribute name="stereotype"> - <dia:string>##</dia:string> - </dia:attribute> - <dia:attribute name="comment"> - <dia:string>##</dia:string> - </dia:attribute> - <dia:attribute name="abstract"> - <dia:boolean val="false"/> - </dia:attribute> - <dia:attribute name="suppress_attributes"> - <dia:boolean val="false"/> - </dia:attribute> - <dia:attribute name="suppress_operations"> - <dia:boolean val="false"/> - </dia:attribute> - <dia:attribute name="visible_attributes"> - <dia:boolean val="false"/> - </dia:attribute> - <dia:attribute name="visible_operations"> - <dia:boolean val="true"/> - </dia:attribute> - <dia:attribute name="visible_comments"> - <dia:boolean val="false"/> - </dia:attribute> - <dia:attribute name="wrap_operations"> - <dia:boolean val="true"/> - </dia:attribute> - <dia:attribute name="wrap_after_char"> - <dia:int val="40"/> - </dia:attribute> - <dia:attribute name="comment_line_length"> - <dia:int val="17"/> - </dia:attribute> - <dia:attribute name="comment_tagging"> - <dia:boolean val="false"/> - </dia:attribute> - <dia:attribute name="line_width"> - <dia:real val="0.10000000000000001"/> - </dia:attribute> - <dia:attribute name="line_color"> - <dia:color val="#000000"/> - </dia:attribute> - <dia:attribute name="fill_color"> - <dia:color val="#ffffff"/> - </dia:attribute> - <dia:attribute name="text_color"> - <dia:color val="#000000"/> - </dia:attribute> - <dia:attribute name="normal_font"> - <dia:font family="monospace" style="0" name="Courier"/> - </dia:attribute> - <dia:attribute name="abstract_font"> - <dia:font family="monospace" style="88" name="Courier-BoldOblique"/> - </dia:attribute> - <dia:attribute name="polymorphic_font"> - <dia:font family="monospace" style="8" name="Courier-Oblique"/> - </dia:attribute> - <dia:attribute name="classname_font"> - <dia:font family="sans" style="80" name="Helvetica-Bold"/> - </dia:attribute> - <dia:attribute name="abstract_classname_font"> - <dia:font family="sans" style="88" name="Helvetica-BoldOblique"/> - </dia:attribute> - <dia:attribute name="comment_font"> - <dia:font family="sans" style="8" name="Helvetica-Oblique"/> - </dia:attribute> - <dia:attribute name="normal_font_height"> - <dia:real val="0.80000000000000004"/> - </dia:attribute> - <dia:attribute name="polymorphic_font_height"> - <dia:real val="0.80000000000000004"/> - </dia:attribute> - <dia:attribute name="abstract_font_height"> - <dia:real val="0.80000000000000004"/> - </dia:attribute> - <dia:attribute name="classname_font_height"> - <dia:real val="1"/> - </dia:attribute> - <dia:attribute name="abstract_classname_font_height"> - <dia:real val="1"/> - </dia:attribute> - <dia:attribute name="comment_font_height"> - <dia:real val="0.69999999999999996"/> - </dia:attribute> - <dia:attribute name="attributes"/> - <dia:attribute name="operations"> - <dia:composite type="umloperation"> - <dia:attribute name="name"> - <dia:string>#addServer#</dia:string> - </dia:attribute> - <dia:attribute name="stereotype"> - <dia:string>##</dia:string> - </dia:attribute> - <dia:attribute name="type"> - <dia:string>##</dia:string> - </dia:attribute> - <dia:attribute name="visibility"> - <dia:enum val="0"/> - </dia:attribute> - <dia:attribute name="comment"> - <dia:string>##</dia:string> - </dia:attribute> - <dia:attribute name="abstract"> - <dia:boolean val="false"/> - </dia:attribute> - <dia:attribute name="inheritance_type"> - <dia:enum val="2"/> - </dia:attribute> - <dia:attribute name="query"> - <dia:boolean val="false"/> - </dia:attribute> - <dia:attribute name="class_scope"> - <dia:boolean val="false"/> - </dia:attribute> - <dia:attribute name="parameters"> - <dia:composite type="umlparameter"> - <dia:attribute name="name"> - <dia:string>#s#</dia:string> - </dia:attribute> - <dia:attribute name="type"> - <dia:string>#Server#</dia:string> - </dia:attribute> - <dia:attribute name="value"> - <dia:string>##</dia:string> - </dia:attribute> - <dia:attribute name="comment"> - <dia:string>##</dia:string> - </dia:attribute> - <dia:attribute name="kind"> - <dia:enum val="0"/> - </dia:attribute> - </dia:composite> - </dia:attribute> - </dia:composite> - <dia:composite type="umloperation"> - <dia:attribute name="name"> - <dia:string>#handle#</dia:string> - </dia:attribute> - <dia:attribute name="stereotype"> - <dia:string>##</dia:string> - </dia:attribute> - <dia:attribute name="type"> - <dia:string>#Message#</dia:string> - </dia:attribute> - <dia:attribute name="visibility"> - <dia:enum val="0"/> - </dia:attribute> - <dia:attribute name="comment"> - <dia:string>##</dia:string> - </dia:attribute> - <dia:attribute name="abstract"> - <dia:boolean val="false"/> - </dia:attribute> - <dia:attribute name="inheritance_type"> - <dia:enum val="2"/> - </dia:attribute> - <dia:attribute name="query"> - <dia:boolean val="false"/> - </dia:attribute> - <dia:attribute name="class_scope"> - <dia:boolean val="false"/> - </dia:attribute> - <dia:attribute name="parameters"> - <dia:composite type="umlparameter"> - <dia:attribute name="name"> - <dia:string>#msg#</dia:string> - </dia:attribute> - <dia:attribute name="type"> - <dia:string>#Message#</dia:string> - </dia:attribute> - <dia:attribute name="value"> - <dia:string>##</dia:string> - </dia:attribute> - <dia:attribute name="comment"> - <dia:string>##</dia:string> - </dia:attribute> - <dia:attribute name="kind"> - <dia:enum val="0"/> - </dia:attribute> - </dia:composite> - </dia:attribute> - </dia:composite> - </dia:attribute> - <dia:attribute name="template"> - <dia:boolean val="false"/> - </dia:attribute> - <dia:attribute name="templates"/> - <dia:childnode parent="O9"/> - </dia:object> - <dia:object type="UML - Association" version="2" id="O12"> - <dia:attribute name="name"> - <dia:string>##</dia:string> - </dia:attribute> - <dia:attribute name="direction"> - <dia:enum val="1"/> - </dia:attribute> - <dia:attribute name="show_direction"> - <dia:boolean val="false"/> - </dia:attribute> - <dia:attribute name="assoc_type"> - <dia:enum val="1"/> - </dia:attribute> - <dia:attribute name="role_a"> - <dia:string>##</dia:string> - </dia:attribute> - <dia:attribute name="multipicity_a"> - <dia:string>##</dia:string> - </dia:attribute> - <dia:attribute name="visibility_a"> - <dia:enum val="3"/> - </dia:attribute> - <dia:attribute name="show_arrow_a"> - <dia:boolean val="false"/> - </dia:attribute> - <dia:attribute name="role_b"> - <dia:string>##</dia:string> - </dia:attribute> - <dia:attribute name="multipicity_b"> - <dia:string>##</dia:string> - </dia:attribute> - <dia:attribute name="visibility_b"> - <dia:enum val="3"/> - </dia:attribute> - <dia:attribute name="show_arrow_b"> - <dia:boolean val="false"/> - </dia:attribute> - <dia:attribute name="obj_pos"> - <dia:point val="4.78285,12.9997"/> - </dia:attribute> - <dia:attribute name="obj_bb"> - <dia:rectangle val="2.75192,6.54761;5.53285,14.5997"/> - </dia:attribute> - <dia:attribute name="meta"> - <dia:composite type="dict"/> - </dia:attribute> - <dia:attribute name="orth_points"> - <dia:point val="4.78285,12.9997"/> - <dia:point val="2.80192,12.9997"/> - <dia:point val="2.80192,6.59761"/> - <dia:point val="4.78285,6.59761"/> - </dia:attribute> - <dia:attribute name="orth_orient"> - <dia:enum val="0"/> - <dia:enum val="1"/> - <dia:enum val="0"/> - </dia:attribute> - <dia:attribute name="orth_autoroute"> - <dia:boolean val="false"/> - </dia:attribute> - <dia:attribute name="text_colour"> - <dia:color val="#000000"/> - </dia:attribute> - <dia:attribute name="line_colour"> - <dia:color val="#000000"/> - </dia:attribute> - <dia:connections> - <dia:connection handle="0" to="O11" connection="3"/> - <dia:connection handle="1" to="O10" connection="3"/> - </dia:connections> - <dia:childnode parent="O9"/> - </dia:object> - <dia:object type="UML - Note" version="0" id="O13"> - <dia:attribute name="obj_pos"> - <dia:point val="5.16035,19.1017"/> - </dia:attribute> - <dia:attribute name="obj_bb"> - <dia:rectangle val="5.11035,19.0517;16.1203,22.4517"/> - </dia:attribute> - <dia:attribute name="meta"> - <dia:composite type="dict"/> - </dia:attribute> - <dia:attribute name="elem_corner"> - <dia:point val="5.16035,19.1017"/> - </dia:attribute> - <dia:attribute name="elem_width"> - <dia:real val="10.91"/> - </dia:attribute> - <dia:attribute name="elem_height"> - <dia:real val="3.3000000000000003"/> - </dia:attribute> - <dia:attribute name="line_width"> - <dia:real val="0.10000000000000001"/> - </dia:attribute> - <dia:attribute name="line_colour"> - <dia:color val="#000000"/> - </dia:attribute> - <dia:attribute name="fill_colour"> - <dia:color val="#ffffff"/> - </dia:attribute> - <dia:attribute name="text"> - <dia:composite type="text"> - <dia:attribute name="string"> - <dia:string>#Plus some kind of port set -support and a way to start -a server thread.#</dia:string> - </dia:attribute> - <dia:attribute name="font"> - <dia:font family="monospace" style="0" name="Courier"/> - </dia:attribute> - <dia:attribute name="height"> - <dia:real val="0.80000000000000004"/> - </dia:attribute> - <dia:attribute name="pos"> - <dia:point val="5.51035,20.3467"/> - </dia:attribute> - <dia:attribute name="color"> - <dia:color val="#000000"/> - </dia:attribute> - <dia:attribute name="alignment"> - <dia:enum val="0"/> - </dia:attribute> - </dia:composite> - </dia:attribute> - <dia:childnode parent="O9"/> - </dia:object> - <dia:object type="UML - Realizes" version="1" id="O14"> - <dia:attribute name="obj_pos"> - <dia:point val="10.6153,8.74801"/> - </dia:attribute> - <dia:attribute name="obj_bb"> - <dia:rectangle val="10.5653,8.74801;10.7153,12.32"/> - </dia:attribute> - <dia:attribute name="meta"> - <dia:composite type="dict"/> - </dia:attribute> - <dia:attribute name="orth_points"> - <dia:point val="10.6153,8.74801"/> - <dia:point val="10.6153,8.74801"/> - <dia:point val="10.6153,12.2493"/> - <dia:point val="10.6153,12.2493"/> - </dia:attribute> - <dia:attribute name="orth_orient"> - <dia:enum val="0"/> - <dia:enum val="1"/> - <dia:enum val="0"/> - </dia:attribute> - <dia:attribute name="orth_autoroute"> - <dia:boolean val="true"/> - </dia:attribute> - <dia:attribute name="line_colour"> - <dia:color val="#000000"/> - </dia:attribute> - <dia:attribute name="text_colour"> - <dia:color val="#000000"/> - </dia:attribute> - <dia:attribute name="name"> - <dia:string>##</dia:string> - </dia:attribute> - <dia:attribute name="stereotype"> - <dia:string>##</dia:string> - </dia:attribute> - <dia:connections> - <dia:connection handle="0" to="O10" connection="10"/> - <dia:connection handle="1" to="O11" connection="12"/> - </dia:connections> - <dia:childnode parent="O9"/> - </dia:object> - </dia:group> - <dia:object type="UML - Note" version="0" id="O15"> - <dia:attribute name="obj_pos"> - <dia:point val="29.2528,-4.64872"/> - </dia:attribute> - <dia:attribute name="obj_bb"> - <dia:rectangle val="29.2028,-4.69872;32.8978,-2.89872"/> - </dia:attribute> - <dia:attribute name="meta"> - <dia:composite type="dict"/> - </dia:attribute> - <dia:attribute name="elem_corner"> - <dia:point val="29.2528,-4.64872"/> - </dia:attribute> - <dia:attribute name="elem_width"> - <dia:real val="3.5949999999999998"/> - </dia:attribute> - <dia:attribute name="elem_height"> - <dia:real val="1.7"/> - </dia:attribute> - <dia:attribute name="line_width"> - <dia:real val="0.10000000000000001"/> - </dia:attribute> - <dia:attribute name="line_colour"> - <dia:color val="#000000"/> - </dia:attribute> - <dia:attribute name="fill_colour"> - <dia:color val="#ffffff"/> - </dia:attribute> - <dia:attribute name="text"> - <dia:composite type="text"> - <dia:attribute name="string"> - <dia:string>#io.defs#</dia:string> - </dia:attribute> - <dia:attribute name="font"> - <dia:font family="monospace" style="0" name="Courier"/> - </dia:attribute> - <dia:attribute name="height"> - <dia:real val="0.80000000000000004"/> - </dia:attribute> - <dia:attribute name="pos"> - <dia:point val="29.6028,-3.40372"/> - </dia:attribute> - <dia:attribute name="color"> - <dia:color val="#000000"/> - </dia:attribute> - <dia:attribute name="alignment"> - <dia:enum val="0"/> - </dia:attribute> - </dia:composite> - </dia:attribute> - </dia:object> - <dia:object type="UML - Dependency" version="1" id="O16"> - <dia:attribute name="obj_pos"> - <dia:point val="31.0503,-2.94872"/> - </dia:attribute> - <dia:attribute name="obj_bb"> - <dia:rectangle val="31.0003,-2.94872;32.3053,1.26212"/> - </dia:attribute> - <dia:attribute name="meta"> - <dia:composite type="dict"/> - </dia:attribute> - <dia:attribute name="orth_points"> - <dia:point val="31.0503,-2.94872"/> - <dia:point val="31.0503,-2.94872"/> - <dia:point val="31.0503,1.19141"/> - <dia:point val="31.0503,1.19141"/> - </dia:attribute> - <dia:attribute name="orth_orient"> - <dia:enum val="0"/> - <dia:enum val="1"/> - <dia:enum val="0"/> - </dia:attribute> - <dia:attribute name="orth_autoroute"> - <dia:boolean val="true"/> - </dia:attribute> - <dia:attribute name="text_colour"> - <dia:color val="#000000"/> - </dia:attribute> - <dia:attribute name="line_colour"> - <dia:color val="#000000"/> - </dia:attribute> - <dia:attribute name="name"> - <dia:string>#mig#</dia:string> - </dia:attribute> - <dia:attribute name="stereotype"> - <dia:string>##</dia:string> - </dia:attribute> - <dia:attribute name="draw_arrow"> - <dia:boolean val="true"/> - </dia:attribute> - <dia:connections> - <dia:connection handle="0" to="O15" connection="6"/> - <dia:connection handle="1" to="O2" connection="1"/> - </dia:connections> - </dia:object> - <dia:object type="UML - Realizes" version="1" id="O17"> - <dia:attribute name="obj_pos"> - <dia:point val="38.6094,14.4231"/> - </dia:attribute> - <dia:attribute name="obj_bb"> - <dia:rectangle val="38.5594,13.5731;46.0992,16.0015"/> - </dia:attribute> - <dia:attribute name="meta"> - <dia:composite type="dict"/> - </dia:attribute> - <dia:attribute name="orth_points"> - <dia:point val="38.6094,14.4231"/> - <dia:point val="42.3293,14.4231"/> - <dia:point val="42.3293,14.3799"/> - <dia:point val="46.0492,14.3799"/> - </dia:attribute> - <dia:attribute name="orth_orient"> - <dia:enum val="0"/> - <dia:enum val="1"/> - <dia:enum val="0"/> - </dia:attribute> - <dia:attribute name="orth_autoroute"> - <dia:boolean val="true"/> - </dia:attribute> - <dia:attribute name="line_colour"> - <dia:color val="#000000"/> - </dia:attribute> - <dia:attribute name="text_colour"> - <dia:color val="#000000"/> - </dia:attribute> - <dia:attribute name="name"> - <dia:string>##</dia:string> - </dia:attribute> - <dia:attribute name="stereotype"> - <dia:string>##</dia:string> - </dia:attribute> - <dia:connections> - <dia:connection handle="0" to="O4" connection="4"/> - <dia:connection handle="1" to="O1" connection="3"/> - </dia:connections> - </dia:object> - <dia:object type="UML - Realizes" version="1" id="O18"> - <dia:attribute name="obj_pos"> - <dia:point val="16.4478,6.59761"/> - </dia:attribute> - <dia:attribute name="obj_bb"> - <dia:rectangle val="16.3978,5.74761;24.9476,8.17255"/> - </dia:attribute> - <dia:attribute name="meta"> - <dia:composite type="dict"/> - </dia:attribute> - <dia:attribute name="orth_points"> - <dia:point val="16.4478,6.59761"/> - <dia:point val="20.4657,6.59761"/> - <dia:point val="20.4657,6.54749"/> - <dia:point val="24.8976,6.54749"/> - </dia:attribute> - <dia:attribute name="orth_orient"> - <dia:enum val="0"/> - <dia:enum val="1"/> - <dia:enum val="0"/> - </dia:attribute> - <dia:attribute name="orth_autoroute"> - <dia:boolean val="false"/> - </dia:attribute> - <dia:attribute name="line_colour"> - <dia:color val="#000000"/> - </dia:attribute> - <dia:attribute name="text_colour"> - <dia:color val="#000000"/> - </dia:attribute> - <dia:attribute name="name"> - <dia:string>##</dia:string> - </dia:attribute> - <dia:attribute name="stereotype"> - <dia:string>##</dia:string> - </dia:attribute> - <dia:connections> - <dia:connection handle="0" to="O10" connection="4"/> - <dia:connection handle="1" to="O3" connection="3"/> - </dia:connections> - </dia:object> - </dia:layer> -</dia:diagram> diff --git a/user/jkoenig/gsoc2011_classes.png b/user/jkoenig/gsoc2011_classes.png Binary files differdeleted file mode 100644 index 7149b813..00000000 --- a/user/jkoenig/gsoc2011_classes.png +++ /dev/null diff --git a/user/jkoenig/gsoc2011_proposal.mdwn b/user/jkoenig/gsoc2011_proposal.mdwn deleted file mode 100644 index 9840f14f..00000000 --- a/user/jkoenig/gsoc2011_proposal.mdwn +++ /dev/null @@ -1,12 +0,0 @@ -[[!meta copyright="Copyright © 2010 Free Software Foundation, Inc."]] - -[[!meta license="""[[!toggle id="license" text="GFDL 1.2+"]][[!toggleable -id="license" text="Permission is granted to copy, distribute and/or modify this -document under the terms of the GNU Free Documentation License, Version 1.2 or -any later version published by the Free Software Foundation; with no Invariant -Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license -is included in the section entitled [[GNU Free Documentation -License|/fdl]]."]]"""]] - -This page has moved [[here|java]]. - diff --git a/user/jkoenig/java.mdwn b/user/jkoenig/java.mdwn deleted file mode 100644 index fd12987e..00000000 --- a/user/jkoenig/java.mdwn +++ /dev/null @@ -1,516 +0,0 @@ -[[!meta copyright="Copyright © 2011 Free Software Foundation, Inc."]] - -[[!meta license="""[[!toggle id="license" text="GFDL 1.2+"]][[!toggleable -id="license" text="Permission is granted to copy, distribute and/or modify this -document under the terms of the GNU Free Documentation License, Version 1.2 or -any later version published by the Free Software Foundation; with no Invariant -Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license -is included in the section entitled [[GNU Free Documentation -License|/fdl]]."]]"""]] - -[[!tag stable_URL]] - - -# Improve Java on Hurd - - -## Description - -The project consists in improving Java support on Hurd. -This includes porting OpenJDK, -creating low-level Java bindings for Mach and Hurd, -as well as creating Java libraries to help with translator development. - -I started working on this as a participant in Google Summer of Code 2011, -for the GNU project. -See my original [[proposal]] and final [[report]]. - - -## Current status - -OpenJDK 7 kindof works, -but there are still imperfections and some integration work remains. - -This page is somewhat out-of-date. -At the moment, -the GSoC [report] is more accurate. - - -### Apt repository - -Modified Debian packages are available in this repository: - - deb http://jk.fr.eu.org/debian experimental/ - deb-src http://jk.fr.eu.org/debian experimental/ - - -### Glibc signal code improvements - -2011-06-29: -Patches were submitted to `libc-alpha` -which implement global signal dispositions and `SA_SIGINFO`. -My latest code is available on -[github](http://github.com/jeremie-koenig/glibc/commits/master-beware-rebase), -and modified Debian packages -are available in my apt repository. - -2011-07-20: -The patches were reviewed by Samuel Thibault. -Samuel pointed out a couple of issues -and I beleive I have addressed all of them (fixes posted). -I'm in the process of publishing updated libc and hurd packages; -provided those work as expected, -the next step would be to get these changes into Debian. - -One question is how the new symbols introduced by my patches -should be handled. -Weak symbols turned out to be impractical, -so I'm currently considering using a Debian-specific -symbol version in the interim period (`GLIBC_2.13_DEBIAN_8` so far). -The ultimate symbol version to be used will depend on -the time at which the patches get integrated upstream -(most likely `GLIBC_2.15`), -at which point we will alias the interim version -to the new one in debian packages. - -I have modified libc0.3 to include a `deb-symbols(5)` file -(alternatively see <http://wiki.debian.org/Projects/ImprovedDpkgShlibdeps>) -so that we get an accurate libc dependency in `hurd` and other packages -when the symbols in question are pulled in. - -[[hurd/libthreads]] (cthreads library) will not be changed. There's no reason -why its behavior should change, whereas for [[libpthread]] it's needed for -conformance. Patches posted on 2011-05-25, but there's a more recent one in -the modified hurd package (adds `_hurd_sigstate_delete` and removes the weak -symbols). - -IRC, freenode, #hurd, 2011-07-27: - - < jkoenig> the glibc patches are pending review and inclusion in Debian (I - think youpi wants to check my latest additions before we go ahead with - that) - < jkoenig> when it's in Debian and the sky does not fall, I intend to - resubmit a full series to libc-alpha for inclusion upstream. - -IRC, freenode, #hurd, 2011-08-24: - - < youpi> jkoenig: I'll probably commit your siginfo/globalsig patches soon - < youpi> I'm building the ant package atm, seems to proceed great - < jkoenig> youpi, great! - -Another issue which came up with OpenJDK is the expansion -by the dynamic linker of `$ORIGIN` in the `RPATH` header, -see below. - -#### Plans - -The patches are pending review and inclusion upstream. -As soon as we reach an agreement wrt. the new interfaces -(in particular wrt. the value of `SA_SIGINFO`), -the patches will be applied to the Debian libc packages -for broader testing. - - -##### Open Items - - * Test patches: in progress, [[jkoenig]], Svante. More volunteers welcome, - of course. - - > There's an issue with gdb, - > namely signals lose their "untracedness" when they go - > through the global sigstate's pending mask, - > so gdb spins intercepting a signal and trying to deliver it. - > [Patch](http://github.com/jeremie-koenig/glibc/commit/3ecb990e9d08d5f75adc40b738b35a1802cc0943). - - * If [[jkoenig]] thinks it's mature enough: should ask - [[Samuel|samuelthibault]] to test these patches on the buildds. - - > There's a risk that a dependency on my patched libc - > might be pulled in while building packages - > (in particular hurd) - > --[[jkoenig]] 2011-06-22 - - * Waiting on ABI finalization ([!] Roland). - - * Which numeric values to use for `SA_SIGINFO` (and `SA_NOCLDWAIT`)? - - > Staying in sync with BSD seems the most logical approach, - > so I have defined it to 0x40. --[[jkoenig]] 2011-06-29 - - * Get patches reviewed (Roland?), and integrated into official sources: [!] - [[tschwinge]]. - - > [[samuelthibault]] reviewed the patches and pointed out a couple of - > issues which I'm currently working on: - > - > * Slight behaviour change with respect to forgetting blocked ignored - > signals. POSIX is flexible in this regard but I guess we could retain - > them instead of the current behaviour. - > * Sigstate accessors could be made extern inline functions. - > I suggest we postpone this. - > * Incorrect changes for `msg_{get,set}_init_int(INIT_SIGMASK)` - > * Some comments which can be improved. - > - > Once these are fixed we can probably test the patches in Debian. - > - > --[[jk]] 2011-07-06 - - * Documentations bits (from here, the initial [[proposal]], and elsewhere) - should probably be - moved either into the appropriate glibc or Hurd documentation - files/reference manuals, or to [[glibc/signal]]. - - * `SA_SIGINFO` patch is based on [[Samuel|samuelthibault]]'s earlier work. - Thus, have him review the new patch? - - * `SA_SIGINFO` patch has a few TODOs w.r.t. protocol changes for missing - information, and for FPU state. Providing even incomplete information is - an improvement on the current status. The question is, whether - applications rely on this information in any hard way if `SA_SIGINFO` is - available? - - * We could possibly rename certain fields in `struct siginfo`, say - `si_pid_not_implemented`, to ensure compilation failures for programs - which use them. Or perhaps a linker warning is possible. - - IRC, freenode, #hurd, 2011-08-20: - - < youpi> jkoenig: I was considering renaming the fields of siginfo - < youpi> to catch applications which need those which we haven't - yet - < jkoenig> youpi, makes sense AFAICT - < youpi> one issue we'll get is some application which previously - built without SA_SIGINFO, and will now want some information - we're not yet able to provide - < youpi> but at least we'll know - < jkoenig> youpi, yes it would still be better than having them - crash at runtime because of it - - IRC, freenode, #hurd, 2011-08-21: - - < youpi> jkoenig: actually we need the fields for waitid - - * The FPU state is not included in the `ucontext_t` passed to the signal - handler. On the other hand, `ucontext_t` is actually being somewhat - deprecated: the functions to restore it are no longer in POSIX. - `thread_get_state`() should return this information, in case we decide - to fill the gap, and there might be existing glibc wrappers, too. - - * Perhaps have a look at `SA_NOCLDWAIT`. - - -### Port OpenJDK - -As suggested by [[tschwinge]], I have targeted OpenJDK 7 at first. -I don't expect it will be too hard to backport my patches to OpenJDK 6. -I have succeeded in building a working JIT-less ("zero") version, -although the dynamic linker issue must be worked around. -Porting Hotspot (the original just-in-time compiler of OpenJDK) -should not be too hard. -If that fails we can fall back on Shark -(a portable alternative JIT which uses LLVM). - -Complexity of porting HotSpot: probably low. The complex things should be -arch- rather than OS-specific. Not many Linux-specific interfaces used. -Garbage collection/memory management, etc. and/or most of other Linux-specific -interfaces are already dealt with for the zero build. - -The dynamic linker issue is as follows. -An executable-specific search path can be provided in the ELF RPATH header. -RPATH directories can include the special string `$ORIGIN`, -which is to be expanded to the directory the executable was loaded from. -OpenJDK's `java` command uses this feature to locate -the right `libjli.so` at runtime. -However, -on Hurd this information is not available to the dynamic linker -and as a consequence RPATH components which include `$ORIGIN` -are silently discarded. - -This can be worked around by defining -the `LD_ORIGIN_PATH` environment variable. -(which have I used to build and test OpenJDK so far.) - -IRC, freenode, #hurd, 2011-07-27: - - < jkoenig> if you have the latest hurd/libc in my repository, you should be - able to run /usr/lib/jvm/java-7-openjdk/bin/java without defining - LD_ORIGIN_PATH manually - < braunr> java: error while loading shared libraries: libjli.so: cannot - open shared object file: No such file or directory - < jkoenig> braunr, this one is expected, it's the symlink problem. - < braunr> oh ok - < jkoenig> (ie. thus far, if java is accessed as /usr/bin/java, the ld - origin ends up as /usr/bin) - - < jkoenig> *sigh*... it seems I'm going to have to reimplement realpath() - in elf/dl-origin.c. - < braunr> why ? - < jkoenig> using it from there results in duplicate symbols when linking - elf/librtld.map.o - < braunr> from where ? - < braunr> dl-origin ? - < jkoenig> apparently this part of the code uses a different allocator - (elf/dl-minimal.c) - < braunr> oh - < braunr> depndency issues ? - < braunr> or bootstrapping ones ? - < jkoenig> http://paste.debian.net/124310/ - < jkoenig> dl-origin is what provides the $ORIGIN value for RPATH (now - sysdeps/mach/hurd/dl-origin.c, in our case) - < braunr> but what's the problem ? - < braunr> what prevents you from using the existing implementation ? - < jkoenig> you mean copy-and-paste the code ? Well I'll end up doing that I - guess... not that it feels right. - < braunr> not really - < braunr> link against what provides it - < braunr> i'm really not familiar with glibc :/ - < jkoenig> also I'd like to understand what's happening precisely before I - resort to such blasphemy :-) - < braunr> :) - < jkoenig> maybe I could make {file,exec,_hurd}_exec_file_name() - canonicalize it instead. - < jkoenig> for some reason it does not feel right, though. - < braunr> why ? - < jkoenig> I'm not sure, loss of information maybe? - < jkoenig> (that I ran /usr/bin/java as opposed to /usr/lib/jvm/...) - < braunr> i guess you should explain the issue more clearly, i feel like - there is something i'm really missing :/ - < braunr> but it can wait - < jkoenig> that ld.so actually needs the canonical file name to substitute - $ORIGIN is its own problem, not that of exec or _hurd_exec_file_name.. - < jkoenig> Ok, so.. Initially the shell (indirectly) runs - _hurd_exec_file_name(..., "/usr/bin/java", ...), which then calls - file_exec_file_name() on the file in question, passing it its own - filename - < jkoenig> which is transmitted to exec_exec_file_name() - < jkoenig> (until now it's all pochu's patch) - < jkoenig> which then makes it available to the newly created process - through exec_startup_get_info_2() (my own addition) - < braunr> oh - < braunr> wasn't it available before oO ? - < jkoenig> no, exec only has access to a port to the executable file. - < braunr> how was argv[0] handled then ? - < jkoenig> argv[0] is handled like any other argument - < braunr> ok, so the file path is duplicated ? - < jkoenig> the shell (or whomever calls _hurd_exec) provide whatever they - want. - < braunr> ok - < jkoenig> well argv[0] is not necessarily the file path (at least not the - full path) - < braunr> right - < jkoenig> so exec() does some guesswork with $PATH but obviously that's - limited. - < braunr> so what you changed is that get_info_2 now receives a canonical - path ? - < jkoenig> right - < jkoenig> (or whatever was specified to _hurd_exec_file_name(), for this - reason and others we shouldn't use it for setuid programs.) - < jkoenig> well, not a canonical path. A path. (hence the problem) - < braunr> ok - < jkoenig> now both the filesystem and exec might run under another root so - they're not an option for canonicalization - < jkoenig> _hurd_exec_file_name (in libc) might be a better spot. - < braunr> resolution from the client, yes - -IRC, freenode, #hurd, 2011-08-03: - - < jkoenig> so my RPATH patches are polished and built, and I'll post them - soon, is the good news - -IRC, freenode, #hurd, 2011-08-17: - - < jkoenig> also fixed a fakeroot-induced deadlock in my dl-origin patches - (namely, under fakeroot, realpath() uses a socket (through stat), so we - need to use it when _hurd_dtable_lock is not held) - < jkoenig> also I'll post my dl-origin patches shortly - < youpi> dl-origin is about the environment variable that java needs, - right? - < jkoenig> about the environment variable it shouldn't need, yes :-) - < youpi> ah :) - < youpi> but ok, I vaguely remember what that refers to - < jkoenig> $LD_ORIGIN_PATH is used as an override (much like - LD_LIBRARY_PATH), but ideally ld.so uses whatever directory the loaded - binary is from. - < youpi> ok - < jkoenig> (as a substitution for $ORIGIN in RPATH) - - -#### Plans - -I intend to fix the RPATH issue -by building on [[pochu]]'s `file_exec_file_name()` -[patches](http://lists.gnu.org/archive/html/bug-hurd/2010-08/msg00023.html). - -I have succeeded in building a Hotspot-enabled `libjvm.so`, -although the current toolchain issues -([[toolchain/ELFOSABI_GNU]]; 2011-07-03: fix committed in binutils) -have so far prevented me from testing it. - -> It turns out the build fails later on in `hotspot/agent` -> because Hurd lack a `libthread_db.so`. -> Also, a Shark version builds, but the result does not work so far. -> -> In other news, Damien Raude-Morvan is -> [working on a kFreeBSD version](http://lists.debian.org/debian-java/2011/06/msg00124.html), -> so I intend to merge my current patches with his. -> -> --[[jkoenig]] 2011-06-29 - -IRC, freenode, #hurd, 2011-08-03: - - < jkoenig> and I'm battleing to update my OpenJDK patches to b147, and - merge the with the kFreeBSD ones. - < braunr> b147 ? - < jkoenig> but that thing is seriously huge and touches about everything, - so it's taking more time than I'd have hoped - < jkoenig> braunr, the latest release of IcedTea / OpenJDK 7 and the - current Debian version (in experimental of course) - < braunr> ok - < jkoenig> I'm trying to make this clean so that hopefully we can get them - integrated at some level of upstream (probably IcedTea, at least at - first) - -IRC, freenode, #hurd, 2011-08-10: - - < jkoenig> well actually I've finished merging my patches with the freebsd - ones, and updating them to the new openjdk-7, - < jkoenig> but now a new version of both is out :-P - - -##### Upstream Submission - -On 2011-07-15, *gnu_andrew* talked to us in the #hurd channel (freenode IRC), -who is a maintainer of IcedTea. He's supportive of the porting approach, and -is willing to review and integrate small patches for individual issues (rather -than some huge patchset). Send patches to <distro-pkg-dev@openjdk.java.net>. - -##### Open Items - - * [!] [[tschwinge]] to have a look at [[pochu]]'s `file_exec_file_name()` - patches, whether it's generally the right idea. - - * Assuming it is, continue with getting `$ORIGIN` working. - - * `libthread_db.so` issue. Likely, the Serviceability Agent is used by jdb - and the like only, so for now the goal should be to lose some functionality - by removing/avoiding this dependency. - - * [[java-access-bridge]] (not critical; JVM appears to work without) - - * IRC, freenode, #hurd, 2011-07-27: - - < jkoenig> there's a bug with java.nio when running javadoc, you might - run into it. - - * [[`SCM_CREDENTIALS`|open_issues/sendmsg/scm_creds]] - - IRC, freenode, #hurd, 2011-08-03: - - < jkoenig> wrt. peer credentials, openjdk also uses file modes for - security, and my guess is that it's sufficient, at least on Hurd, so - I've reduced my priority for this at least in the meantime - - * They seem to have a rather heavy-weight process for such projects: confer - <http://mail.openjdk.java.net/pipermail/announce/2011-January/000092.html>, - for example. Do we need this, too? - - > Probably not. - > My current approach (and Damien's wrt. the kFreeBSD patches) - > is to add preprocessor directives in the Linux code - > to make it more portable. - > --[[jkoenig]] 2011-06-29 - - * Eclipse - - OK for testing -- but I'd very much hope that it *just works* as soon as we - provide the required Java platform. But it may perhaps have some - Linux-specifics (needlessly?) in its basement. Is it available for Debian - GNU/kFreeBSD already? - - -### Java bindings for Mach - -The code is at <http://github.com/jeremie-koenig/hurd-java>. - -[[tschwinge]]'s notes for building with... - - * GCJ installed (due to the current Debian multilib confusion): - - $ tmp1=/usr/lib/gcc/i486-gnu/4.6 tmp2=/usr/lib/i386-gnu/gcc/i486-gnu/4.6 LIBRARY_PATH=$tmp2 COMPILER_PATH=$tmp1:$tmp2 C_INCLUDE_PATH=$tmp1/include make - - * OpenJDK installed (to have it find the shared library, and the jni.h header - file): - - $ jdk=/usr/lib/jvm/java-7-openjdk LD_LIBRARY_PATH=$jdk/jre/lib/i386/jli C_INCLUDE_PATH=$jdk/include make - -Doxygen-generated documentation is available at -<http://jk.fr.eu.org/hurd-java/doc/html/>; or run `make doc` yourself. - -IRC, freenode, #hurd, 2011-07-27: - - < jkoenig> I need to be able to read/write individual data items from - messages, in order to implement deallocation correctly, so I'm working on - that when I'm waiting for things to build, but it's not my primary focus - right now. - -IRC, freenode, #hurd, 2011-08-17: - - < jkoenig> so, weekly status report: I have made some progress on the java - bindings, I hope to have a safe version mach_msg soon, after which I can - begin experimenting with mig. - - -#### Plans - -(just started.) - - -##### Open Items - - * [[tschwinge]] has to read about RMI and CORBA. - - * MIG - - * Hacking [[microkernel/mach/MIG]] shouldn't be too difficult. - - * (Unless you want to make MIG's own code (that is, not the generated - code, but MIG itself) look a bit more nice, too.) ;-) - - * There are also alternatives to MIG. If there is interest, the following - could be considered: - - * FLICK ([[!GNU_Savannah_task 5723]]). [[tschwinge]] has no idea yet if - there would be any benefits over MIG, like better modularity (for the - backends)? If we feel like it, we could spend a little bit of time on - this. - - * For [[microkernel/Viengoos]], Neal has written a RPC stub generator - entirely in C Preprocessor macros. While this is obviously not - directly applicable, perhaps we can get some ideas from it. - - * Anything else that would be worth having a look at? (What are other - microkernels using?) - - * `mach_msg` - - * Seems like the right approach to [[tschwinge]], but he hasn't digested - all the pecularities yet. Will definitely need more time. - - -## Postponed - -Might get back to these as time/interest permits. - - -### GCJ - - * [[tschwinge]] has the feeling that Java in GCC (that is, GCJ) is mostly - dead? (True?) - - * Thus perhaps not too much effort should be spent with it. - - If the POSIX threads signal semantics makes it going, then great, otherwise - we should get a feeling what else is missing. - - -### Joe-E. diff --git a/user/jkoenig/java/discussion.mdwn b/user/jkoenig/java/discussion.mdwn deleted file mode 100644 index 352f6d62..00000000 --- a/user/jkoenig/java/discussion.mdwn +++ /dev/null @@ -1,559 +0,0 @@ -[[!meta copyright="Copyright © 2011 Free Software Foundation, Inc."]] - -[[!meta license="""[[!toggle id="license" text="GFDL 1.2+"]][[!toggleable -id="license" text="Permission is granted to copy, distribute and/or modify this -document under the terms of the GNU Free Documentation License, Version 1.2 or -any later version published by the Free Software Foundation; with no Invariant -Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license -is included in the section entitled [[GNU Free Documentation -License|/fdl]]."]]"""]] - -[[!toc]] - - -# General - -Some [[tschwinge]] comments regarding your proposal. Which is very good, if I -may say so again! :-) - -Of course, everyone is invited to contribute here! - -I want to give the following methodology a try, instead of only having -email/IRC discussions -- for the latter are again and again showing a tendency -to be dumped and deposited into their respective archives, and be forgotten -there. Of course, email/IRC discussions have their usefulness too, so we're -not going to replace them totally. For example, for conducting discussions -with a bunch of people (who may not even be following these pages here), email -(or, as applicable, the even more interactive IRC) will still be the medium of -choice. (And then, the executive summary should be posted here, or -incorporated into your proposal.) - -Also, if you disagree with this suggested procedure right away, or at some -later point begin to feel that this thing doesn't work out, or simply takes too -much time (I don't think so: writing emails takes time, too), just say so, and -we can reconsider. - -Of course, as this wiki is a passive medium rather than an active one as IRC -and email are, it is fine to send notices like: *I have updated the wiki page, -please have a look*. - -One idea is that your proposal evolves alongside with the ongoing work, and -represents (in more or less detail) what has been done and what will be done. -Also, we can hopefully use parts of it for documentation purposes, or as -recipes for similar work (enabling other programming languages on the Hurd, for -example). - -For this, I suggest the following procedure: as applicable, you can either -address any comments in here (for example, if they're wrong :-), or if they -require further discussion; think: *email discussion*), or you can address them -directly in your propoal and remove the comments from here at the same time -(think: *bug fix*). - -Generally, you can assume that for things I didn't comment on (within some -reasonable timeframe/upon asking me again) that I'm fine with them. Otherwise, -I might say: *I don't like this as is, but I'll need more time to think about -it.* - -There is also a possibility that parts of your proposal will be split off; in -cases where we think they're valuable to follow, but not at this time. (As you -know, your proposal is not really a trivial one, so it may just be too much for -one person's summer.) Such bits could be moved to [[open_issues]] pages, -either new ones or existing ones, as applicable. - - -# GSoC Site Discussion - - * Discussion items from - <http://www.google-melange.com/gsoc/proposal/review/google/gsoc2011/jkoenig/1> - should be copied here: - - * technical bits (obviously); - - * also the *why do we want Java bindings* reasoning; - - * CLISP findings should also be documented somewhere permanently. - - * We should probaby open up a *languages for Hurd* section on the web - pages ([[!taglink open_issue_documentation]]). - - -# Java Native Interface (JNI) - - * <http://en.wikipedia.org/wiki/Java_Native_Interface> - * <http://download.oracle.com/javase/7/docs/technotes/guides/jni/> - * <http://java.sun.com/products/jdk/faq/jnifaq.html> - * <http://java.sun.com/docs/books/jni/> - - -## Java Native Access (JNA) - - * <http://jna.java.net/> - * <https://github.com/twall/jna#readme> - -This is a different approach, and *while some attention is paid to performance, -correctness and ease of use take priority*. - -As we plan on only having a few native methods (for invoking `mach_msg`, -essentially), JNA is probably the wrong approach: portability and ease of use -is not important, but performance is. - -## Compiled Native Interface (CNI) - - * <http://gcc.gnu.org/onlinedocs/gcj/About-CNI.html> - * <http://per.bothner.com/papers/UsenixJVM01/CNI01.pdf> - -Probably faster than JNI, but only usable with GCJ. - -> Given that we have very few JNI calls, -> it might be interesting to take a "dual" approach -> if CNI actually improves performance -> when compiling to native code. -> --[[jkoenig]] 2011-07-20 - -# IRC, freenode, #hurd, 2011-07-13 - -[[!tag open_issue_documentation]] - - <jkoenig> Yes, I guess so. Maybe start investigating mig because it may - have repercussions on what the best approach would be for some aspects of - the Mach bindings. - <tschwinge> I still think that making MIG emit Java code is not too - difficult, once you have the required Java infrastructure (like what - you're writing at the moment). - <tschwinge> On the other hand, if there's another approach that you'd like - to use, I'm not trying to force using MIG. - <braunr> i still have a problem understanding your approach - <braunr> at which level are your bindings located ? - <jkoenig> I expect mig it will be the easiest route, but of course possibly - it won't. - <tschwinge> jkoenig: Yeah, be give some high-level to low-level overview? - <jkoenig> ok, so - <jkoenig> at the very core, low-level, we have a very thin amount of JNI - code to access (proper) system calls. - <jkoenig> by "proper" I mean things like mach_task_self, mach_msg and - mach_reply_port, which are actually system calls rather than RPCs to the - kernel. - <braunr> right - <jkoenig> at this level, we manipulate port names as integers, and the - message buffers for mach_msg are raw ByteBuffers (from the java.nio - package) - <jkoenig> actually, so-called /direct/ ByteBuffers, which are backed by - memory allocated outside of the Java heap, rather than as a byte[] array - <jkoenig> we can retreive the pointer from the JNI code and use the buffer - directly. - <jkoenig> (so, good for performance and it's also portable.) - <braunr> ok - <braunr> i'm more interested in the higher level bindings :) - <jkoenig> ok so, higher up. - <jkoenig> design goal from my proposal: "the memory safety of Java should - be maintained and extended to Mach primitives such as port names and - out-of-line memory regions" - <jkoenig> so integer port names are not "safe" in the sense that they can - be forged and misused in all kinds of way - <jkoenig> which is why I have a layer of Java code whose job is to wrap - this kind of low-level Mach stuff into safe abstractions - <jkoenig> and ideally the user should only use these safe abstractions. - <tschwinge> (Not to restrict the programmer, but to help him write correct - code.) - <jkoenig> right. - <braunr> so you can't use mach RPCs directly - <jkoenig> tschwinge, also to actually restrict them, in a Joe-E / - object-capability context, but that's not the primary concern right now - ;-) - <braunr> or you force your wrappers to have these abstractions as input - <jkoenig> braunr, well, actually at this level you still have Mach RPC - <jkoenig> but for instance, port names are encapsulated into "MachPort" - objects which ensure they are handled correcly - <tschwinge> As I understand it, you use these abstractions to prepare a - usual mach_msg message, and then invoke mach_msg. - <braunr> ok - <jkoenig> and message buffers are wrapped into "MachMsg" objects which both - help you write the messages into the ByteBuffer and prevent you from - doing funky stuff - <jkoenig> and ensure the ports which you send/receive/pseudo-receive after - an error/... are deallocated as required, etc. - <braunr> what's the interface to use IPC ? - <tschwinge> Is MIG doing that, too, I think? (And antrik once found some - error there, which is still to be reviewed...) - <jkoenig> braunr, so basically as a user you would be free to use either - one of these layers, or to use MIG-generated classes which would - construct and exchange messages for you using the second (safe) layer. - <braunr> ok, let's just finish with the low level layer before going - further please - <jkoenig> tschwinge, MIG does some type checking on the received message - and saves you the trouble of constructing/parsing them yourself, but I'm - not sure about how mach_msg errors are handled - <braunr> what are the main methods of MachMsg for example ? - <jkoenig> braunr, you may want to have a look at - http://jk.fr.eu.org/hurd-java/doc/html/classorg_1_1gnu_1_1mach_1_1MachMsg.html - <braunr> right, sorry - <braunr> grabbed the code at work and forgot here - <jkoenig> and also - https://github.com/jeremie-koenig/hurd-java/blob/master/HelloMach.java - which uses it - <jkoenig> but roughly, you'd use setRemotePort, setLocalPort, setId to - write your message's header - <jkoenig> then use one of the putFoo() methods to add data items to the - message - <braunr> ok, the mapping with the low level C interface is very clear - <braunr> that's good for me - <jkoenig> the putFoo() methods would write the appropriate type - descriptors, then the actual data. - <braunr> we can go on with the MiG part if you want :) - <jkoenig> right, - <jkoenig> so here you may want to look at the UML class diagram from - http://www.bddebian.com/~hurd-web/user/jkoenig/java/proposal/ - <jkoenig> so in the C case, mig generates 3 files - <jkoenig> a header file which has the prototypes of the mig-generated - stubs, - <jkoenig> a *User.c which has their actual implementation - <jkoenig> and a *Server.c which handles demultiplexing the incoming - messages and helps with implementing servers. - <jkoenig> so we would do something along these lines, more or less: - <jkoenig> mig would generate the code for a Java interface in lieu of the - *.h file. - <jkoenig> a generated FooUser class would implement this interface by doing - RPC - <jkoenig> (so basically you would pass a MachPort object to the - constructor, and then you could use the resulting object to do RPC with - whatever is on the other end) - <jkoenig> and the generated FooServer class would do the opposite, - <braunr> ok - <braunr> issues with threads ? - <jkoenig> you would pass an object implementing the Foo interface to the - constructor, - <braunr> i'm guessing the demux part may have to create threads, right ? - <jkoenig> and the resulting object would handle messages by using the - object you passed. - <jkoenig> braunr, right, so that would be more a libports kind of code, - <braunr> the libports-like library, i see - <jkoenig> to which you could pass Server objects (for instance the - FooServer above), and it would handle incoming messages. - <braunr> how is message content mapped to a java interface ? - <jkoenig> this would be determined from the .defs files and MIG would - generate the appropriate code, hopefully. - <braunr> so the demux part would handle rpc integer identifiers ? - <jkoenig> right. - <braunr> but hm - <jkoenig> also mapping .defs files to Java interfaces might prove to be - tricky. data types conversion and all - <antrik> tschwinge: my mamory is rather hazy. IIRC the issue was that the - MIG-generated stubs deallocate out-of-line port arrays after the - implementation returns, before returning to the dispatcher - <braunr> i'll just overlook this specific implementation detail - <jkoenig> but we could use some annotation-based system if we need to - provide more information to generate the java code. - <antrik> but the Hurd (or rather glibc) RPC handling also automatically - deallocates everything if an error occurs - <antrik> so I changed the MIG code to deallocate only when no error occurs - <braunr> jkoenig: ok, we'll talk about that when there is more progress and - you have a better view of the problem - <antrik> at that time I was pretty sure that this is a correctly working - solution, but it always seemed questionable conceptually... however, I - wasn't able to come up with a better one, and nobody else commented on it - <braunr> antrik: shouldn't the hurd be changed not to deallocate something - it didn't allocate in the first place ? - <antrik> braunr: no, the server has to deallocate stuff before returning to - the client. the request message is destroyed before returning the reply. - <tschwinge> jkoenig, braunr: That's what I had in mind where MIG might be a - bit awkward. Then we can indeed either add annotations to the .defs - files, or reproduce them in some other format. That's some work, but - it's mostly a one-time work. - <tschwinge> After all, the RPC interface is a binary one, and there may be - more than one API for creating these messages, etc. - <antrik> jkoenig: actually, at least in the Hurd, server-side and - client-side headers are separate -- so MIG actually creates four files - <jkoenig> tschwinge, wrt to annotations I was more thinking about Java - ones, such as: @MIGDefsFile("mach/task.defs") @MIGCType("task_t") public - interface Task { } - <jkoenig> antrik, oh, ok, it makes sense. - <braunr> jkoenig: anything else ? - <jkoenig> braunr, nothing that I can think of - <braunr> ok - <antrik> tschwinge: I think it would be a *very* bad idea to introduce - redundancy regarding RPC definitions - <braunr> thanks for the tour :) - <antrik> (the _request.defs/_reply.defs mess is bad enough...) - <jkoenig> did I speak about the "Unsafe" pseudo-exception? that's - interesting :-) - <tschwinge> jkoenig: Also, virtual memory abstractions? - <braunr> jkoenig: you didn't - <tschwinge> antrik: Well, then we could create some other super-format. - But that's just a detail IMO. - <jkoenig> ok, so wrt virtual memory, a page we received can be wrapped with - some JNI help into a (direct) ByteBuffer object. - <jkoenig> deallocating sent pages will be tricky, though. - <tschwinge> antrik: To put it this way: for me the .defs files are just one - way of expressing the RPC interfaces' contracts. (At the same time, they - happen to be the actual reference for these, too. But the specification - itself could just as well be a textual one.) - <jkoenig> on approach I've been thinking about would be to "wrap" the - ByteBuffer object into an object which has the sole reference to it, so - that when it's deallocated the reference can be replaced with "null", and - further attempts to access the buffer would throw exceptions. - <braunr> sounds reasonable - <jkoenig> but that's still in flux in my head, we may end up needing our - own implementation of ByteBuffer-like objects. - <tschwinge> The problem being that there is no mechanism to ``revoke'' an - object once a reference to it has been shared. - <jkoenig> right. - <tschwinge> A wrapper is one possibility indeed. - <antrik> tschwinge: they are called interface *definitions* for a reason - :-) - <tschwinge> This is a very similar problem as with capabilities when there - is no revoke operation for these, too. - <tschwinge> antrik: Yes, because they define MIG's input. :-P - <tschwinge> Isn't that what is called a membrane in the capability world? - <antrik> I do not say that we have to consider the format of the .defs to - be set in stone; but I do insist on using a canonical machine-parsable - source for all language bindings - <tschwinge> attenuation - <jkoenig> tschwinge, you mean the revokable proxy contruct ? (It's the same - principle indeed) - <tschwinge> A common design pattern in object-capability systems: given - one reference of an object, create another reference for a proxy object - with certain security restrictions, such as only permitting read-only - access or allowing revocation. The proxy object performs security checks - on messages that it receives and passes on any that are allowed. Deep - attenuation refers to the case where the same attenuation is applied - transitively to any - <tschwinge> objects obtained via the original attenuated object, - typically by use of a "membrane". - <tschwinge> http://en.wikipedia.org/wiki/Object-capability_model - <tschwinge> Yes. - <tschwinge> Good. I understood something. ;-) - <tschwinge> antrik: OKAY! :-P - <tschwinge> jkoenig: And hopefully the JVM will optimize away all the - additional indirection... :-D - <tschwinge> jkoenig: Is there anything more to say about the VM layer? - <jkoenig> tschwinge, "hopefully", yes :-) - <tschwinge> Like, the data that I'm sharing -- is it untyped, isn't it? - <jkoenig> tschwinge, you mean that within the received/sent pages ? - <tschwinge> Yes. - <tschwinge> But that'S how it is, indeed. - <jkoenig> well actually the type descriptor should indicate what they - contain. - <tschwinge> I cannot trust anything I receive from externally. - <jkoenig> it's most often used for MACH_MSG_TYPE_CHAR items I guess, and it - will be type checked when retreive - <tschwinge> Yeah, and that then just *is* arbitrary data, like a block read - from a disk file. - <jkoenig> you would have something like: ByteBuffer - MachMsg.getBuffer(MachMsg.Type expected), and MachMsg would check the - type descriptor against that which you specified - <tschwinge> Or a packet transmitted over the network. - <tschwinge> OK, yes. - <antrik> jkoenig: in theory ints should be used quite often too. the whole - purpose of the type descriptors is to allow byte order swapping when - messages are passed between hosts with different architecture... - <jkoenig> tschwinge, right, except for out-of-line port arrays, which need - to be handled differently obviously. - <antrik> (which is totally irrelevat for our purposes -- especially since - the actual network IPC code doesn't exist anymore ;-) ) - <jkoenig> antrik, oh, interesting - <tschwinge> Yes, that was one original idea. - <jkoenig> actually my litmus test for what the bindings should be, is you - should be able to implement such a proxy in Java :-) - <tschwinge> antrik: And hey, you now have processors that can switch - between different modes during runtime... :-) - <jkoenig> (although arguably that's a little bit ambitious) - <braunr> tschwinge: there should be bits in page tables to indicate the - endianness to use on a page .. :) - <tschwinge> Hehe! - <tschwinge> jkoenig: Don't worry -- you're already known for ambitious - projects. One more can't hurt. - <jkoenig> Also, actually the word size is not something that I've been able - to abstract so far, so I'll be hardcoding little-endian 32 bits for now. - <braunr> why is that ? - <antrik> some of the Hurd RPC break the idea anyways BTW - <jkoenig> the org.vmmagic package (from Jikes RVM and JNode) could help - with that, but GCJ does not support it unfortunately (not sure about - OpenJDK) - <jkoenig> braunr, Java does not allow us to define new unboxed types - <braunr> jkoenig: does it have its own definition of the word size ? - <jkoenig> braunr, nope. - <jkoenig> (although, maybe, and also we could use JNI to query it) - <braunr> even if virtual, i'd expect a machine to have such a defnition - <jkoenig> braunr, maybe it has, but basically in Java nothing depends on - the word size - <jkoenig> 'int' is 32 bits, 'long' is 64 and that's it. - <braunr> oh right, i remember most types are fixed size, right ? - <jkoenig> right. - <braunr> if not all - <jkoenig> now Jikes RVM's "org.vmmagic" provides an interface to defined - new unboxed types which can depend on the actual word size, but Jikes RVM - is its own JVM so obviously they can use and provide whatever extensions - they need :-) - <jkoenig> (but maybe they've implemented them in OpenJDK for bootstrap - purposes, I'm not sure) - <tschwinge> I'm missing this detail: where does the word size come into - play here? - <jkoenig> anyway, I _could_ indiscriminately use 'long' for port names, and - sparkle the code with word size tests but that would be very clumsy - <braunr> jkoenig: port names are actually ints :/ - <jkoenig> tschwinge, the actual format of the message header and type - descriptors, for instance. - <braunr> jkoenig: ok, got your point - <jkoenig> braunr, by 'long' I mean 64-bits integers (which they are on - 64-bits machines I think?) - <braunr> :) - <braunr> jkoenig: port names are as large as the word size - <braunr> but in C at least, they're int, not long - <braunr> it doesn't change many things, but you get lots of warnings if you - try with a long :) - <tschwinge> What is the reason that port names are an - architecture-dependent word size's width, and not simply 32 bit? - <jkoenig> "4 billions of port names should be enough for everyone" :-) - <braunr> tschwinge: an optimization is to use them as pointers in the - kernel - <antrik> tschwinge: the machine's native word size is what it can process - most efficiently, and what should be used for most normal - operations... it makes sense to define stuff as int, except for network - communication - <tschwinge> jkoenig: Well, yeah, but if you want to communicate with a - peer, you have to agree on the maximum number anyway (not for port names, - though, which are local). - <braunr> antrik: int isn't the word size everywhere - <braunr> antrik: the most common type matching the word size is long, at - least on ILP32/LP64 data models - <antrik> braunr: that's just because some idiots assumed int would always - be 32 bits, and consequently when 64 architectures came up the compiler - guys chickened out ;-) - <braunr> without int, you wouldn't have a 32 bits type - <antrik> that's not true for all architectures and/or operating systems - though AFAIK - <braunr> or a 16 bits one - <braunr> antrik: windows guys got even more scared, so windows 64 is LLP64 - <antrik> BTW, I haven't checked, but it's quite possible that 32 bit - numbers are actually preferable even on AMD64... - <tschwinge> jkoenig: So, back on track. :-) - <tschwinge> jkoenig: You didn't find anything yet in Mach's VM interfaces - as well a MemoryObject, etc., that can't be used/implemented in the Java - world? - <braunr> antrik: they consume less memory, but don't have much effect on - performance - <jkoenig> tschwinge, once we have the basic system calls and the - corresponding abstractions in place, I don't think anything else - fundamentally problematic could possibly show up - <antrik> braunr: if you really *need* a type of a certain bit size, you - should use stdint types. so not having a 16 or 32 bit type in the - short/int/long canon is *not* an excuse - <tschwinge> jkoenig: That speaks for the Mach designers! - <braunr> antrik: right - <jkoenig> tschwinge, on trick is that for instance, mach_task_self would - still be unsafe even if it returned a nicely wrapped Task object, because - you could still wreck your own address space and threads with it. So we - would need the "attenuation" pattern mentionned above to provide a safe - one. - <jkoenig> (which would disallow thinks such as the port/thread/vm calls) - <braunr> jkoenig: you mentioned the unsafe pseudo exception earlier - <jkoenig> braunr, right, so the issue is with distinguishing safe from - unsafe methods - <antrik> braunr: BTW, the Windows guys actually broke a lot of stuff by - fixing long at 32 bits -- this way long doesn't match size_t and pointer - types anymore, which was an assumption that was true for pretty much any - system so far... - <tschwinge> jkoenig: Yes. (And again hope for the JVM to optim...) - <braunr> antrik: that's right :) - <braunr> antrik: that's LLP64 - <braunr> antrik: long long and pointers - <jkoenig> braunr, so basically the idea is that unsafe methods are declared - as "throws Unsafe" - <jkoenig> the effect is that if you use such a method you must either - "throw Unsafe" yourself, - <jkoenig> or if you're building a safe abstraction on top of Unsafe - methods, you'll "catch" the "exception" in question to tell the compiler - that it's okay. - <jkoenig> it's more or less inspired from the "semantic regimes" idea from - the org.vmmagic paper which is referenced in my original proposal, - <jkoenig> only implementing by hijacking the exception checking machinery, - which has a behaviour similar to what we want. - <braunr> ok - <braunr> but hmm this seems pretty normal, what's the tricky part ? :) - <tschwinge> braunr: The idea is that the programmer explicitly has to - acknowledge if he'S using an unsafe interface. - <braunr> tschwinge: sounds pretty normal too - <jkoenig> braunr, the trick is that you would not usually declare - exceptions which are never actually thrown (and actually since the - compiler does not know it's never thrown, I need to work around it in a - few places) - <braunr> oh, ok - <braunr> jkoenig: that's interesting indeed - <jkoenig> braunr, the org.vmmagic paper provides an example which uses some - annotations called @UncheckedMemoryAccess and @AssertSafe to the same - effect (which is kind of cleaner), but it would be a headache to - implement without help from the compiler I think (as far as I can tell - the annotation processor would have to inspect the bytecode) - <braunr> but hm - <braunr> what's the true problem about this ? - <jkoenig> (the paper advocates "high-level low-level programming" and is a - very interesting read I think, - http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.151.5253&rep=rep1&type=pdf, - for what it's worth) - <braunr> what's wrong if you just declare your methods unsafe and don't - alter anything else ? - <tschwinge> Yes, I read it and it is interesting. Unfortunately, it seems - I forgot most of it again... - <jkoenig> braunr, declare? alter? - <jkoenig> you mean just tag them with an annotation? - <braunr> just stating a method "throws Unsafe" - <jkoenig> braunr, well some compiler will output a warning because they can - tell there's no way the method is going to throw such an exception. - <jkoenig> and then some other compiler will complain that my - @SuppressWarnings("unused") does not serve any purpose to them :-) - <jkoenig> also, when initializing final fields, I need to work around the - fact that the compiler thinks "Unsafe" might be thrown. - <jkoenig> see for instance MachPort.DEAD - <braunr> jkoenig: ok - <jkoenig> braunr, but I'm more than willing to accept this in exchange for - a clear, compiler-enforced materialization of the border between safe an - unsafe code. - <jkoenig> actually another question I have is the amount of static typing I - should add to the safe version, for instance should I subclass MachPort - into MachSendRight, MachReceiveRight and so on. I don't want to depart - from the C inteface too much but it could be useful. - <braunr> jkoenig: can't answer that :) - <braunr> jkoenig: keep them in mind for later i think - <tschwinge> jkoenig: What's the safety concern w.r.t. having MachPort (not) - final? - <jkoenig> tschwinge, actually I'm partly wrong in that we only need name() - and a couple other methods to be final - <tschwinge> jkoenig: That's what I was thinking. :-) - <tschwinge> I though I'm missing something here. - <jkoenig> tschwinge, the idea is that the user (ie., the adversary :-) - could extend MachPort and inject their own fake port name into messages - <jkoenig> by overriding name() or clear() - <tschwinge> Yeah, but if these are final, that's not possible. - <jkoenig> right. - <tschwinge> And that *should* be enough, I think. - <tschwinge> Unless I'm missing something. - <jkoenig> I don't think so. Also I hope it is, because as mentionned above - there might be some value in subclassing MachPort. - <tschwinge> Yep. - <jkoenig> incidentally, declaring the class or the method final will allow - the JVM to inline them I think. - <tschwinge> It will help the JVM, yes. It can also figure that out without - final, though. (And may have to de-optimize the code again in case there - are additional classes loaded during run-time.) - <tschwinge> jkoenig: The reference counting in MachPort. I think I'm - beginning to understand this. - <jkoenig> oh ok - <jkoenig> tschwinge, yes the javadoc is maybe a bit obscure so far. - <jkoenig> but basically you don't want the port name you acquire to become - invalid before you're done using it. - <tschwinge> But how is this different from the C world? - <jkoenig> here my goal is to provide some guarantees if you use only safe - methods - <jkoenig> like, you can't forge a port name and things like that - <jkoenig> so basically it should never be possible to include an invalid - port name in a message if you use only safe methods. - <tschwinge> Ah, I see! - <tschwinge> Now that does make sense. - <jkoenig> but the mechanism in itself is similar to the Hurd port cells and - user_link structures - <tschwinge> It's again ``only'' helping the programmer. - <jkoenig> right, no object-capability ulterior motives :-) - <jkoenig> another assumption which the javadoc does not state yet it that - basically there should be exactly one MachPort object for each mach-level - port name reference (in the sense of mach_port_mod_refs) - <tschwinge> Yes, I figured out that bit. diff --git a/user/jkoenig/java/java-access-bridge.mdwn b/user/jkoenig/java/java-access-bridge.mdwn deleted file mode 100644 index 57c87068..00000000 --- a/user/jkoenig/java/java-access-bridge.mdwn +++ /dev/null @@ -1,92 +0,0 @@ -[[!meta copyright="Copyright © 2011 Free Software Foundation, Inc."]] - -[[!meta license="""[[!toggle id="license" text="GFDL 1.2+"]][[!toggleable -id="license" text="Permission is granted to copy, distribute and/or modify this -document under the terms of the GNU Free Documentation License, Version 1.2 or -any later version published by the Free Software Foundation; with no Invariant -Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license -is included in the section entitled [[GNU Free Documentation -License|/fdl]]."]]"""]] - -[[!tag open_issue_porting]] - -Debian's *openjdk-7-jre* package depends on *libaccess-bridge-java-jni* (source -package: *java-access-bridge*). - -The latter one has *openjdk-6-jdk* as a build dependency, but that can be -hacked around: - - # ln -s java-7-openjdk /usr/lib/jvm/java-6-openjdk - -Trying to build it: - - $ LD_LIBRARY_PATH=/usr/lib/jvm/java-7-openjdk/jre/lib/i386/jli dpkg-buildpackage -b -uc -d - [...] - make[3]: Entering directory `/media/erich/home/thomas/tmp/libaccess-bridge-java-jni/java-access-bridge-1.26.2/idlgen' - /usr/lib/jvm/java-6-openjdk/bin/idlj \ - -pkgPrefix Bonobo org.GNOME \ - -pkgPrefix Accessibility org.GNOME \ - -emitAll -i /usr/share/idl/bonobo-activation-2.0 -i /usr/share/idl/at-spi-1.0 -i /usr/share/idl/bonobo-2.0 \ - -fallTie /usr/share/idl/at-spi-1.0/Accessibility.idl - /usr/share/idl/at-spi-1.0/Accessibility_Collection.idl (line 66): WARNING: Identifier `object' collides with a keyword; use an escaped identifier to ensure future compatibility. - boolean isAncestorOf (in Accessible object); - ^ - /usr/share/idl/at-spi-1.0/Accessibility_Component.idl (line 83): WARNING: Identifier `Component' collides with a keyword; use an escaped identifier to ensure future compatibility. - interface Component : Bonobo::Unknown { - ^ - Exception in thread "main" java.lang.AssertionError: Platform not recognized - at sun.nio.fs.DefaultFileSystemProvider.create(DefaultFileSystemProvider.java:71) - at java.nio.file.FileSystems$DefaultFileSystemHolder.getDefaultProvider(FileSystems.java:108) - at java.nio.file.FileSystems$DefaultFileSystemHolder.access$000(FileSystems.java:89) - at java.nio.file.FileSystems$DefaultFileSystemHolder$1.run(FileSystems.java:98) - at java.nio.file.FileSystems$DefaultFileSystemHolder$1.run(FileSystems.java:96) - at java.security.AccessController.doPrivileged(Native Method) - at java.nio.file.FileSystems$DefaultFileSystemHolder.defaultFileSystem(FileSystems.java:95) - at java.nio.file.FileSystems$DefaultFileSystemHolder.<clinit>(FileSystems.java:90) - at java.nio.file.FileSystems.getDefault(FileSystems.java:176) - at sun.util.calendar.ZoneInfoFile$1.run(ZoneInfoFile.java:489) - at sun.util.calendar.ZoneInfoFile$1.run(ZoneInfoFile.java:480) - at java.security.AccessController.doPrivileged(Native Method) - at sun.util.calendar.ZoneInfoFile.<clinit>(ZoneInfoFile.java:479) - at sun.util.calendar.ZoneInfo.getTimeZone(ZoneInfo.java:658) - at java.util.TimeZone.getTimeZone(TimeZone.java:559) - at java.util.TimeZone.setDefaultZone(TimeZone.java:656) - at java.util.TimeZone.getDefaultRef(TimeZone.java:623) - at java.util.TimeZone.getDefault(TimeZone.java:610) - at java.text.SimpleDateFormat.initializeCalendar(SimpleDateFormat.java:682) - at java.text.SimpleDateFormat.<init>(SimpleDateFormat.java:619) - at java.text.DateFormat.get(DateFormat.java:772) - at java.text.DateFormat.getDateTimeInstance(DateFormat.java:547) - at com.sun.tools.corba.se.idl.toJavaPortable.Util.writeProlog(Util.java:1139) - at com.sun.tools.corba.se.idl.toJavaPortable.Skeleton.writeHeading(Skeleton.java:145) - at com.sun.tools.corba.se.idl.toJavaPortable.Skeleton.generate(Skeleton.java:102) - at com.sun.tools.corba.se.idl.toJavaPortable.InterfaceGen.generateSkeleton(InterfaceGen.java:159) - at com.sun.tools.corba.se.idl.toJavaPortable.InterfaceGen.generate(InterfaceGen.java:108) - at com.sun.tools.corba.se.idl.InterfaceEntry.generate(InterfaceEntry.java:110) - at com.sun.tools.corba.se.idl.toJavaPortable.ModuleGen.generate(ModuleGen.java:75) - at com.sun.tools.corba.se.idl.ModuleEntry.generate(ModuleEntry.java:83) - at com.sun.tools.corba.se.idl.Compile.generate(Compile.java:324) - at com.sun.tools.corba.se.idl.toJavaPortable.Compile.start(Compile.java:169) - at com.sun.tools.corba.se.idl.toJavaPortable.Compile.main(Compile.java:146) - make[3]: *** [org/GNOME/Accessibility/Accessible.java] Error 1 - make[3]: Leaving directory `/media/erich/home/thomas/tmp/libaccess-bridge-java-jni/java-access-bridge-1.26.2/idlgen' - make[2]: *** [all-recursive] Error 1 - make[2]: Leaving directory `/media/erich/home/thomas/tmp/libaccess-bridge-java-jni/java-access-bridge-1.26.2/idlgen' - make[1]: *** [all-recursive] Error 1 - make[1]: Leaving directory `/media/erich/home/thomas/tmp/libaccess-bridge-java-jni/java-access-bridge-1.26.2' - make: *** [debian/stamp-makefile-build] Error 2 - dpkg-buildpackage: error: debian/rules build gave error exit status 2 - - -IRC, freenode, #hurd, 2011-08-10: - - < jkoenig> and with my latest fix (hardwire os.name as "Linux"), - java-access-bridge actually built \o/ - < youpi> I wouldn't call it a "fix" :) - < jkoenig> true, but pretty much everything assumes we're either solaris, - linux or windows :-/ - < jkoenig> also we're actually using the Linux code which it is used to - select throughout the JDK - < jkoenig> if it's any consolation, os.version stays "GNU-Mach - 1.3.99/Hurd-0.3" :-) - < youpi> ideally it should simply be changed to "GNU" diff --git a/user/jkoenig/java/proposal.mdwn b/user/jkoenig/java/proposal.mdwn deleted file mode 100644 index feb7e9dc..00000000 --- a/user/jkoenig/java/proposal.mdwn +++ /dev/null @@ -1,629 +0,0 @@ -[[!tag stable_URL]] - -# Java for Hurd (and vice versa) - -Contact information: - - * Full name: Jérémie Koenig - * Email: jk@jk.fr.eu.org - * IRC: jkoenig on Freenode and OFTC - -## Introductions - -I am a first year M.Sc. student -in Computer Science at University of Strasbourg (France). -My interests include capability-based security, -programming languages and formal methods -(in particular, object-capability languages and proof-carrying code). - -### Proposal summary - -This project would consist in improving Java support on Hurd. -The first part would consist in -fixing bugs and porting Java-related packages. -The second part would consist in -creating low-level Java bindings for the Hurd interfaces, -as well as libraries to make translator development easier. - -### Previous involvement - -I started contributing to Hurd last summer, -during which I participated to Google Summer of Code -as a student for the Debian project. -I worked on porting Debian-Installer to Hurd. -This project was mostly a success, -although we still have to use a special mirror for installation -with a few modified packages -and tweaked priorities -to work around some uninstallable packages -with Priority: standard. - -Shortly afterwards, -I rewrote the procfs translator -to fix some issues with memory leaks, -make it more reliable, -and improve compatibility with Linux-based tools -such as `procps` or `htop`. - -Although I have not had as much time -as I would have liked to dedicate to the Hurd -since that time, -I have continued to maintain the mirror in question, -and I have started to work -on implementing POSIX threads signal semantics in glibc. - -### Project-related skills and interests - -I have used Java mostly for university assignments. -This includes non-trivial projects -using threads and distributed programming frameworks -such as Java RMI or CORBA. -I have also used it to experiment with -Google App Engine -(web applications) -and Google Web Toolkit -(a compiler from Java to Javascript which helps with AJAX code), -and I have some limited experience with JNI -(the Java Native Interface, to link Java with C code). - -My knowledge of the Hurd and Debian GNU/Hurd is reasonable, -as the Debian-Installer and procfs projects -gave me the opportunity to fiddle with many parts of the system. - -Initially, -I started working on this project because I wanted to use -[Joe-E](http://code.google.com/p/joe-e/) -(a subset of Java) -to investigate the potential -[[applications of object-capability languages|objcap]] -in a Hurd context. -I also believe that improving Java support on Hurd -would be an important milestone. - -### Organisational matters - -I am subscribed to bug-hurd@g.o and -I do have a permanent internet connexion. - -I would be able to attend the regular IRC meetings, -and otherwise communicate with my mentor -through any means they would prefer -(though I expect email and IRC would be the most practical). -Since I'm already familiar with the Hurd, -I don't expect I would require too much time from them. - -My exams end on May 20 so I would be able to start coding -right at the beginning of the GSoC period. -Next year's term would probably begin around September 15, -so that would not be an issue either. -I expect I would work around 40 hours per week, -and my waking hours would be flexible. - -I don't have any other plans for the summer -and would not make any if my project were to be accepted. - -Full disclosure: -I also submitted a proposal to the Jikes RVM project -(which is a research-oriented Java Virtual Machine, -itself written in Java) -for implementing a new garbage collector into the MMTk subsystem. - -## Improve Java support - -### Justification - -Java is a popular language and platform used by many desktop and web -applications (mostly on the server side). As a consequence, competitive Java -support is important for any general-purpose operating system. -Better Java support would also be a prerequisite -for the second part of my proposal. - -### Current situation - -Java is currently supported on Hurd with the GNU Java suite: - - * [GCJ](http://gcc.gnu.org/java/), - the GNU Compiler for Java, is part of GCC and can compile Java - source code to Java bytecode, and both source code and bytecode to - native code; - * libgcj is the implementation of the Java runtime which GCJ uses. - It is based on [GNU Classpath](http://www.gnu.org/software/classpath/). - It includes a bytecode interpreter which enables - Java applications compiled to native code to dynamically load and execute - Java bytecode from class files. - * The gij command is a wrapper around the above-mentioned virtual machine - functionality of libgcj and can be used as a replacement for the java - command. - -However, GCJ does not work flawlessly on Hurd.r -For instance, some parts of libgcj relies on -the POSIX threads signal semantics, which are not yet implemented. -In particular, this makes ant hang waiting for child processes, -which makes some packages fail to build on Hurd -(“ant” is the “make” of the Java world). - -### Tasks - - * **Finish implementing POSIX thread semantics** in glibc (high priority). - According to POSIX, signal dispositions should be global to a process, - while signal blocking masks should be thread-specific. Signals sent to the - process as a whole are to be delivered to any thread which does not block - them. By contrast, Hurd has per-thread signal dispositions and signals - sent to a process are delivered to the main thread only. I have been - working on refactoring the glibc signal code and implementing the POSIX - semantics as a per-thread option. However, due to lack of time I have not - yet been able to test and debug my code properly. Finishing this work - would be my first task. - * **Fix further problems with GCJ on Hurd** (high priority). While I’m not - aware of any other problems with GCJ at the moment, I suspect some might - turn up as I progress with the other tasks. Fixing these problems would - also be a high-priority task. - * **Port OpenJDK 6** (medium priority). While GCJ is fine, it is not yet - 100% complete. It is also slower than OpenJDK on architectures where a - just-in-time compiler is available. Porting OpenJDK would therefore - improve Java support on Hurd in scope and quality. Besides, it would also - be a good way to test GCJ, which is used for bootstrapping by the Debian - OpenJDK packages. Also note that OpenJDK 6 is now the default Java - Runtime Environment on all released Linux-based Debian architectures; - bringing Hurd in line with this would probably be a good thing. - * **Port Eclipse and other Java applications** (low priority). Eclipse is a - popular, state-of-the-art IDE and tool suite used for Java and other - languages. It is a dependency of the Joe-E verifier (see part 3 of this - proposal). Porting Eclipse would be a good opportunity to test GCJ and - OpenJDK. - -### Deliverables - - * The glibc pthreads patch and any other fixes on the Hurd side - would be submitted upstream - * Patches against Debian source packages - required to make them build on Hurd would be submitted - to the [Debian bug tracking system](http://bugs.debian.org/). - - -## Create Java bindings for the Hurd interfaces - -### Justification - -Java is used for many applications and often taught to -introduce object-oriented programming. The fact that Java is a -garbage-collected language makes it easier to use, especially for the less -experienced programmers. Besides, its object-oriented nature is a -natural fit for the capability-based design of Hurd. -The JVM is also used as a target for many other languages, -all of which would benefit from the access provided by these bindings. - -Advantages over other garbage-collected, object-oriented languages include -performance, type safety and the possibility to compile a Java translator to -native code and -[link it statically](http://gcc.gnu.org/wiki/Statically_linking_libgcj) -using GCJ, should anyone want to use a -translator written in Java for booting. -Note that Java is -[being](http://www.linuxjournal.com/article/8757) -[used](http://oss.readytalk.com/avian/) -in this manner for embedded development. -Since GCJ can take bytecode as its input, -this expect this possibility would apply to any JVM-based language. - -Java bindings would lower the bar for newcomers -to begin experimenting with what makes Hurd unique -without being faced right away with the complexity of -low-level systems programming. - -### Tasks summary - - * Implement Java bindings for Mach - * Implement a libports-like library for Java - * Modify MIG to output Java code - * Implement libfoofs-like Java libraries - -### Design principles - -The principles I would use to guide the design -of these Java bindings would be the following ones: - - * The system should be hooked into at a low level, - to ensure that Java is a "first class citizen" - as far as the access to the Hurd's interfaces is concerned. - * At the same time, the memory safety of Java should be maintained - and extended to Mach primitives such as port names and - out-of-line memory regions. - * Higher-level interfaces should be provided as well - in order to make translator development - as easy as possible. - * A minimum amount of JNI code (ie. C code) should be used. - Most of the system should be built using Java itself - on top of a few low-level primitives. - * Hurd objects would map to Java objects. - * Using the same interfaces, - objects corresponding to local ports would be accessed directly, - and remote objects would be accessed over IPC. - -One approach used previously to interface programming languages with the Hurd -has been to create bindings for helper libraries such as libtrivfs. Instead, -for Java I would like to take a lower-level approach by providing access to -Mach primitives and extending MIG to generate Java code from the interface -description files. - -This approach would be initially more involved, and would introduces several -issues related to overcoming the "impedance mismatch" between Java and Mach. -However, once an initial implementation is done it would be easier to maintain -in the long run and we would be able to provide Java bindings for a large -percentage of the Hurd’s interfaces. - -### Bindings for Mach system calls - -In this low-level approach, my intention is to enable Java code to use Mach -system calls (in particular, mach_msg) more or less directly. This would -ensure full access to the system from Java code, but it raises a number of -issues: - - * the Java code must be able to manipulate Mach-level entities, such as port - rights or page-aligned buffers mapped outside of the garbage-collected - heap (for out-of-line transfers); - * putting together IPC messages requires control of the low-level - representation of data. - -In order to address these concerns, classes would be encapsulating these -low-level entities so that they can be referenced through normal, safe objects -from standard Java code. Bindings for Mach system calls can then be provided -in terms of these classes. Their implementation would use C code through the -Java Native Interface (JNI). - -More specifically, this functionality would be provided by the `org.gnu.mach` -package, which would contain at least the following classes: - - * `MachPort` would encapsulate a `mach_port_t`. (Some of) its constructors - would act as an interface for the `mach_port_allocate()` system call. - `MachPort` objects would also be instantiated from other parts of the JNI - C code to represent port rights received through IPC. The `deallocate()` - method would call `mach_port_deallocate()` and replace the encapsulated - port name with `MACH_PORT_DEAD`. We would recommend that users call it - when a port is no longer used, but the finalizer would also deallocate the - port when the `MachPort` object is garbage collected. - * `Buffer` would represent a page-aligned buffer allocated outside of the - Java heap, to be transferred (or having been received) as out-of-line - memory. The JNI code would would provide methods to read and write data at - an arbitrary offset (but within bounds) and would use `vm_allocate()` and - `vm_deallocate()` in the same spirit as for `MachPort` objects. - * `Message` would allow Java code to put together Mach messages. The - constructor would allocate a `byte[]` member array of a given size. - Additional methods would be provided to fill in or query the information - in the message header and additional data items, including `MachPort` and - `Buffer` objects which would be translated to the corresponding port names - and out-of-line pointers. - A global map from port names to the corresponding `MachPort` object - would probably be needed to ensure that there is a one-to-one - correspondence. - * `Syscall` would provide static JNI methods for performing system calls not - covered by the above classes, such as `mach_msg()` or - `mach_thread_self()`. These methods would accept or return `MachPort`, - `Buffer` and `Message` objects when appropriate. The associated C code - would access the contents of such objects directly in order to perform the - required unsafe operations, such as constructing `MachPort` and `Buffer` - objects directly from port names and C pointers. - -Note that careful consideration should be given to the interfaces of these -classes to avoid “safety leaks” which would compromise the safety guarantees -provided by Java. Potential problematic scenarios include the following -examples: - - * It must not be possible to write an integer at some position in a - `Message` object, and to read it back as a `MachPort` or `Buffer` object, - since this would allow unsafe access to arbitrary memory addresses and - mach port names. - * Providing the `mach_task_self()` system call would also provide access to - arbitrary addresses and ports by using the `vm_*` family of RPC operations - with the returned `MachPort` object. This means that the relevant task - operations should be provided by the `Syscall` class instead. - -Finally, access should be provided to the initial ports and file descriptors -in `_hurd_ports` and provided by the `getdport()` function, -for instance through static methods such as -`getCRDir()`, `getCWDir()`, `getProc()`, ... in a dedicated class such as -`org.gnu.hurd.InitPorts`. - -A realistic example of code based on such interfaces would be: - - import org.gnu.mach.MsgType; - import org.gnu.mach.MachPort; - import org.gnu.mach.Buffer; - import org.gnu.mach.Message; - import org.gnu.mach.Syscall; - import org.gnu.hurd.InitPorts; - - public class Hello - { - public static main(String argv[]) - /* Parent class for all Mach-related exceptions */ - throws org.gnu.mach.MachException - { - /* Allocate a reply port */ - MachPort reply = new MachPort(); - - /* Allocate an out-of-line buffer */ - Buffer data = new Buffer(MsgType.CHAR, 13); - data.writeString(0, "Hello, World!"); - - /* Craft an io_write message */ - Message msg = new Message(1024); - msg.setRemotePort(InitPorts.getdport(1)); - msg.setLocalPort(reply, Message.Type.MAKE_SEND_ONCE); - msg.setId(21000); - msg.addBuffer(data); - - /* Make the call, MACH_MSG_SEND | MACH_MSG_RECEIVE */ - Syscall.machMsg(msg, true, true, reply); - - /* Extract the returned value */ - msg.assertId(21100); - int retCode = msg.readInt(0); - int amount = msg.readInt(1); - } - } - -Should this paradigm prove insufficient, -more ideas could be borrowed from the -[`org.vmmagic`](http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.151.5253&rep=rep1&type=pdf) -package used by [Jikes RVM](http://jikesrvm.org/), -a research Java virtual machine itself written in Java. - -### Generating Java stubs with MIG - -Once the basic machinery is in place to interface with Mach, Java programs -have more or less equal access to the system functionality without resorting -to more JNI code. However, as illustrated above, this access is far from -convenient. - -As a solution I would modify MIG to add the option to output Java code. MIG -would emit a Java interface, a client class able to implement the interface -given a Mach port send right, an a server class which would be able to handle -incoming messages. The class diagram below, although it is by no means -complete or exempt of any problem, illustrates the general idea: - -[[gsoc2011_classes.png]] - -This structure is somewhat reminiscent of -[Java RMI](http://en.wikipedia.org/wiki/Java_remote_method_invocation) -or similar systems, -which aim to provide more or less transparent access to remote objects. -The exact way the Java code would be generated still needs to be determined, -but basically: - - * An interface, corresponding to the header files generated by MIG, would - enumerate the operations listed in a given .defs files. Method names would - be transformed to adhere to Java conventions (for instance, - `some_random_identifier` would become `someRandomIdentifier`). - * A user class, corresponding to the `*User.c` files, - would implement this interface by doing RPC over a given MachPort object. - * A server class, corresponding to `*Server.c`, would be able to handle - incoming messages using a user-provided implementation of the interface. - (Possibly, a skeleton class providing methods which would raise - `NotImplementedException`s would be provided as well. - Users would derive from this class and override the relevant methods. - This would allow them not to implement some operations, - and would avoid pre-existing code from breaking when new operations are - introduced.) - -In order to help with the implementation of servers, some kind of library -would be needed to associate Mach receive rights with server objects and to -handle incoming messages on dedicated threads, in the spirit of libports. -This would probably require support for port sets at the level of the Mach -primitives described in the previous section. - -When possible, operations involving the transmission of send rights -of some kind would be expressed in terms of the MIG-generated interfaces -instead of `MachPort` objects. -Upon reception of a send right, -a `FooUser` object would be created -and associated with the corresponding `MachPort` object. -If the received send right corresponds to a local port -to which a server object has been associated, -this object would be used instead. -This way, -subsequent operations on the received send right -would be handled as direct method calls -instead of going through RPC mechanisms. - -Some issues will still need to be solved regarding how MIG will convert -interface description files to Java interfaces. For instance: - - * `.defs` files are not explicitly associated with a type. For instance in - the example above, MIG would have to somehow infer that io_t corresponds - to `this` in the `Io` interface. - * More generally, a correspondence between MIG and Java types would have - to be determined. Ideally this would be automated and not hardcoded - too much. - * Initially, reply port parameters would be ignored. However they may be - needed for some applications. - -So the details would need to be flushed out during the community bonding -period and as the implementation progresses. However I’m confident that a -satisfactory solution can be designed. - -Using these new features, the example above could be rewritten as: - - import org.gnu.hurd.InitPorts; - import org.gnu.hurd.Io; - import org.gnu.hurd.IoUser; - - class Hello { - static void main(String argv[]) throws ... - { - Io stdout = new IoUser(InitPorts.getdport(1)); - String hello = “Hello, World!\n”; - - int amount = stdout.write(hello.getBytes(), -1); - - /* (A retCode corresponding to an error - would be signalled as an exception.) */ - } - } - -An example of server implementation would be: - - import org.gnu.hurd.Io; - import java.util.Arrays; - - class HelloIo implements Io { - final byte[] contents = “Hello, World!\n”.getBytes(); - - int write(byte[] data, int offset) { - return SOME_ERROR_CODE; - } - - byte[] read(int offset, int amount) { - return Arrays.copyOfRange(contents, offset, - offset + amount - 1); - } - - /* ... */ - } - -A new server object could then be created with `new IoServer(new HelloIo())`, -and associated with some receive right at the level of the ports management -library. - -### Base classes for common types of translators - -Once MIG can target Java code, and a libports equivalent is available, -creating new translators in Java would be greatly facilitated. However, -we would probably want to introduce basic implementations of file system -translators in the spirit of libtrivfs or libnetfs. They could take the form -of base classes implementing the relevant MIG-generated interfaces which -would then be derived by users, -or could define a simpler interface -which would then be used by adapter classes -to implement the required ones. - -I would draw inspiration from libtrivfs and libnetfs -to design and implement similar solutions for Java. - -### Deliverables - - * A hurd-java package would contain the Java code developed - in the context of this project. - * The Java code would be documented using javadoc - and a tutorial for writing translators would be written as well. - * Modifications to MIG would be submitted upstream, - or a patched MIG package would be made available. - -The Java libraries resulting from this work, -including any MIG support classes -as well as the class files built from the MIG-generated code -for the Mach and Hurd interface definition files, -would be provided as single `hurd-java` package for -Debian GNU/Hurd. -This package would be separate from both Hurd and Mach, -so as not to impose unreasonable build dependencies on them. - -I expect I would be able to act as its maintainer in the foreseeable future, -either as an individual or as a part of the Hurd team. -Hopefully, -my code would be claimed by the Hurd project as their own, -and consequently the modifications to MIG -(which would at least conceptually depend on the Mach Java package) -could be integrated upstream. - -Since by design, -the Java code would use only a small number of stable interfaces, -it would not be subject to excessive amounts of bitrot. -Consequently, -maintenance would primarily consist in -fixing bugs as they are reported, -and adding new features as they are requested. -A large number of such requests -would mean the package is useful, -so I expect that the overall amount of work -would be correlated with the willingness of more people -to help with maintenance -should I become overwhelmed or get hit by a bus. - - -## Timeline - -The dates listed are deadlines for the associated tasks. - - * *Community bonding period.* - Discuss, refine and complete the design of the Java bindings - (in particular the MIG and "libports" parts) - * *May 23.* - Coding starts. - * *May 30.* - Finish implementing pthread signal semantics. - * *June 5.* - Port OpenJDK - * *June 12.* - Fix the remaining problems with GCJ and/or OpenJDK, - possibly port Eclipse or other big Java packages. - * *June 19.* - Create the bindings for Mach. - * *June 26.* - Work on some kind of basic Java libports - to handle receive rights. - * *July 3.* - Test, write some documentation and examples. - * *July 17 (two weeks).* - Add the Java target to MIG. - * *July 24.* - Test, write some documentation and examples. - * *August 7 (two weeks).* - Implement a modular libfoofs to help with translator development. - Try to write a basic but non-trivial translator - to evaluate the performance and ease of use of the result, - rectify any rough edges this would uncover. - * *August 22. (last two weeks)* - Polish the code and packaging, - finish writing the documentation. - - -## Conclusion - -This project is arguably ambitious. -However, I have been thinking about it for some time now -and I'm confident I would be able to accomplish most of it. - -In the event multiple language bindings projects -would be accepted, -some work could probably be done in common. -In particular, -[ArneBab](http://www.bddebian.com/~hurd-web/community/weblogs/ArneBab/2011-04-06-application-pyhurd/) -seems to favor a low-level approach for his Python bindings as I do for Java, -and I would be happy to discuss API design and coordinate MIG changes with him. -I would also have an extra month after the end of the GSoC period -before I go back to school, -which I would be able to use to finish the project -if there is some remaining work. -(Last year's rewrite of procfs was done during this period.) - -As for the project's benefits, -I believe that good support for Java -is a must-have for the Hurd. -Java bindings would also further the Hurd's agenda -of user freedom by extending this freedom to more people: -I expect the set of developers -who would be able to write Java code against a well-written libfoofs -is much larger than -those who master the intricacies of low-level systems C programming. -From a more strategic point of view, -this would also help recruit new contributors -by providing an easier path to learning the inner workings of the Hurd. - -Further developments -which would build on the results of this project -include my planned [[experiment with Joe-E|objcap]] -(which I would possibly take on as a university project next year). -Another possibility would be to reimplement some parts -of the Java standard library -directly in terms of the Hurd interfaces -instead of using the POSIX ones through glibc. -This would possibly improve the performance -of some Java applications (though probably not by much), -and would otherwise be a good project -for someone trying to get acquainted with Hurd. - -Overall, I believe this project would be fun, interesting and useful. -I hope that you will share this sentiment -and give me the opportunity to spend another summer working on Hurd. - diff --git a/user/jkoenig/java/report.mdwn b/user/jkoenig/java/report.mdwn deleted file mode 100644 index cb1acda9..00000000 --- a/user/jkoenig/java/report.mdwn +++ /dev/null @@ -1,136 +0,0 @@ -[[!meta copyright="Copyright © 2011 Free Software Foundation, Inc."]] - -[[!meta license="""[[!toggle id="license" text="GFDL 1.2+"]][[!toggleable -id="license" text="Permission is granted to copy, distribute and/or modify this -document under the terms of the GNU Free Documentation License, Version 1.2 or -any later version published by the Free Software Foundation; with no Invariant -Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license -is included in the section entitled [[GNU Free Documentation -License|/fdl]]."]]"""]] - -# GSoC 2011 final report (Java on Hurd) - -This is my final report regarding my work on Java for Hurd -as a Google Summer of Code student for the GNU project. -The work is going on, -for recent status updates, see my [[java]] page. - -## Global signal dispositions and SA_SIGINFO - -Signal delivery was implemented in Hurd before POSIX threads were -defined. As a consequence the current semantics differ from the POSIX -prescriptions, which libgcj relies on. - -On the Hurd, each thread has its own signal dispositions and -process-wide signals are always received by the main thread. -In contrast, POSIX specifies signal dispositions to be global to the -process (although there is still a per-thread blocking mask), and a -global signal can be delivered to any thread which does not block it. - -To further complicate the matter, the Hurd currently has two options for -threads: the cthread library, still used by most of the Hurd code, and -libpthread which was introduced later for compatibility purposes. To -avoid breaking existing code, cthread programs should continue to run -with the historical Hurd signal semantics whereas pthread programs are -expected to rely on the POSIX behavior. - -To address this, the patch series I wrote allows selecting a per-thread -behavior: by default, newly created threads provide historical -semantics, but they can be marked by libpthread as global signal -receivers using the new function `_hurd_sigstate_set_global_rcv()`. -In addition, I refactored some of the signal code to improve -readability, and fixed a couple of bugs I came across in the process. - -Another improvement which was required by OpenJDK was the implementation -of the `SA_SIGINFO` flag for signal handlers. My signal patch series -provides the basic infrastructure. However it is not yet complete, as -some of the information provided by `siginfo_t` structures is not -available to glibc. Making this information available would require a -change in the `msg_sig_post()` RPC. - -### Related Debian changes - -In Debian GNU/Hurd, libpthread is provided the `hurd` package. Hurd also -uses extern inline functions from glibc which are affected by the new -symbols. This means that newer Hurd packages which take advantage of -glibc's support for global signal dispositions cannot run on older C -libraries and some thought had to be given to the way we could ensure -smooth upgrades. - -An early attempt at using weak symbols proved to be impractical. As a -consequence I modified the eglibc source package to enable -dpkg-gensymbols on hurd-i386. This means that packages which are built -against a newer libc and make use of the new symbols will automatically -get an appropriately versionned dependency on libc0.3. - -### Status as of 2012-01-28 - -The patch series has not yet been merged upstream. However, it is now -being used for the Debian package of glibc. - -## $ORIGIN substitution in RPATH - -Another feature used by OpenJDK which was not implemented in Hurd is the -substitution of the special string `$ORIGIN` within the ELF `RPATH` -header. `RPATH` is a per-executable library search path, within which -`$ORIGIN` should be substituted by the directory part of the binary's -canonical file name. - -Currently, a newly executed program has no way of figuring out which -binary it was created from. Actually, even the `_hurd_exec()` function, -which is used in glibc to implement the `exec*()` family, is never -passed the file name of the executable, but only a port to it. -Likewise, the `file_exec()`, `exec_exec()` and `exec_startup_get_info()` -RPCs do not provide a path to transmit the file name from the shell to -the file system server, to the exec server, to the executed program. - -Last year, Emilio Pozuelo Monfort submitted a patch series which fixes -this problem, up to the exec server. The series' original purpose was to -replace the guesswork done by `exec` when running shell scripts. It -provides new versions of `file_exec()` and `exec_exec()` which allow for -passing the file name. I extended Emilio's patches to add the missing -link, namely a new `exec_startup_get_info_2()` RPC. New code in glibc -takes advantage of it to retrieve the file name and use it in a -Hurd-specific `dl-origin.c` to allow for `RPATH` `$ORIGIN` substitution. - -### Status as of 2012-01-28 - -The (hurd and glibc) patch series for `$ORIGIN` are mostly complete. -However, there is still an issue related to the canonicalization of the -executable's file name. Doing it in the dynamic linker (where `$ORIGIN` -is expanded) is complicated due to the limited set of available -functions (`realpath()` is not). Unfortunately canonicalizing in -`_hurd_exec_file_name()` is not an option either because many shell -scripts use `argv[0]` to alter their behavior, but `argv[0]` is replaced -by the shell with the file name it's passed. - -Another issue is that the patches use a fixed-length string buffer to -transmit the file name through RPC. - -## OpenJDK 7 - -With the groundwork above being taken care of, I was able to build -OpenJDK 7 on Hurd, although heavy portability patching was also -necessary. A similar effort for Debian GNU/kFreeBSD was undertaken -around the same time by Damien Raude-Morvan, so I intend to submit a -more general set of "non-Linux" patches. - -Due to the lack of a `libpthread_db` library on the Hurd, I was only -able to build a Zero (interpreter only) virtual machine so far. However, -it should be possible to disable the debugging agent and build Hotspot. - -### Status as of 2012-01-28 - -I have put together generic `nonlinux-*.diff` patches for the `openjdk7` -Debian package, however I have not yet tested them on Linux and kFreeBSD. - -## Java bindings - -Besides improving Java support on Hurd, my original proposal also -included the creation of Java bindings for the Hurd interfaces. -My progress on this front has not been as fast as I would have liked. -However I have started some of the work required to provide safe Java -bindings for Mach system calls. - -See https://github.com/jeremie-koenig/hurd-java. - diff --git a/user/jkoenig/objcap.mdwn b/user/jkoenig/objcap.mdwn deleted file mode 100644 index e4cd20e8..00000000 --- a/user/jkoenig/objcap.mdwn +++ /dev/null @@ -1,85 +0,0 @@ - -# Potential applications of object-capability languages - -The work discussed is this last part would have -fewer immediate benefits for the Hurd project -and has more of a research orientation. -It is also unlikely that there would be any time remaining -to work on it at the end of the summer. -(Though it could work as some kind of reward -if I somehow managed to do a prefect job of all the rest -within the allocated time :-) ). -As a consequence, -I don't really consider this a part of my application. - -This being said, -to some extent the project discussed here -will informed the way I design the Java bindings, -since it depends on them -and I intend to work on this at some point in the future. -I also believe it touches on some interesting ideas, -and a Summer of Code application is probably -as good an occasion as any to discuss them. - -### Justification - -The primary advantage of multi-server operating systems is the ability to -break what used to be the kernel into small pieces which can be isolated -from each others. This makes sense from an engineering perspective, as -smaller components can be swapped with different implementations and reduce -the impact of bugs. -A capability-based approach also ensures that the -authority wielded by components is clear and reduced to the minimum required -for them to function. -These properties are crucial to the Hurd's agenda of user freedom, -since in order to allow them to plug their own code into the system -[FIXME: développer] - -However, this flexibility has a cost. In a system where the isolation of -components relies on running them inside different address spaces, -communication between them must be done through IPC calls. -This introduces a trade-off between the size of the modules -and performance as well as practicality, -which imposes a limit to the granularity with which the system -can be decomposed and the principle of least authority applied -(to the code within a given process, a Mach port is ambient authority). - -Another issue is that of the threading structure of the system as a whole. -In systems based on a monolithic kernel, user threads execute the kernel -code themselves, which is then intrinsically concurrent. By contrast, in a -system based on a “client-server” paradigm, each server must be explicitly -multi-threaded if it is to serve requests concurrently. - -### Object-capability languages - -An object-capability language is an object-oriented language which is -restricted enough so that object references are themselves capabilities. - -One such language is Joe-E (FIXME: lien), -which is an object-capability subset of Java: -global state and static methods are mostly forbidden; -careful white-listing of the objects and methods -provided by the Java standard library -ensures that compliant code cannot not access ambient autority. -Ways in which object references can be transferred -are restricted to the most obvious ones -(for instance, exceptions are carefully restricted). - -As a result, untrusted Joe-E code can be executed without any further -isolation and its autority can be controlled by carefully limiting the -object references which are passed to it. -This would allow to load and execute translators written in Joe-E -in a single address space. - -### Bundling translators into a single process - -[mechanisme pour transmettre le code Joe-E -et les port initiaux au serveur] -[émulation des différentes tâches] - -### Challenges and further work - -[proof-carrying code / typed assembly, -resource accounting (passer en revue la conception de Viengoos?)] - - |