>>>>> "Peter" == Peter Pilgrim <[EMAIL PROTECTED]> writes:

    Peter> `JavaUnix' is a portable extension API

Please note that some of these functions are not that portable -- not
even between JVMs on Linux.

E.g.

    Peter> (*)  Access to UNIX account identification:
    Peter>      `getuid()' / `setuid()'

The attached test program gives the following output with 1.3 green
threads:

        % java -green UIDTest 1000
        Thread[main,5,main]  0
        Thread[second,5,main]  0
        Setting UID to 1000
        Thread[main,5,main]  1000
        Thread[second,5,main]  1000

with the classic native threads VM or HotSpot it deadlocks:

        % java -client UIDTest 1000
        Thread[main,5,main]  0
        Thread[second,5,main]  0
        Setting UID to 1000
        Thread[main,5,main]  1000
        # 'second' doesn't wake up

If the test wouldn't hang the last line would be

        Thread[second,5,main]  0

because UIDs are per-thread with LinuxThreads.


        Juergen

PS: Some stuff I've noticed
    * Building only works if "." is in PATH
    * jar packaging doesn't work
    * "extern pid_t getsid(pid_t pid);" should be "extern "C" ..."
      (if you define _GNU_SOURCE you don't need this at all)

import javaunix.*;

public class UIDTest
{
    static Object lock = new Object();
    static boolean started = false;
    static boolean goon = false;

    public static void main(String[] args)
        throws Throwable
    {
        System.out.println(Thread.currentThread() + 
                           "  " + 
                           UnixSystem.getUid());

        Thread t = new Thread(new Runnable() {
            public void run()
            {
                System.out.println(Thread.currentThread() + 
                                   "  " + 
                                   UnixSystem.getUid());
                synchronized (lock) {
                    started = true;
                    lock.notify();
        
                    while (!goon) {
                        try {
                            lock.wait();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }

                System.out.println(Thread.currentThread() + 
                                   "  " + 
                                   UnixSystem.getUid());
            }
        }, "second");
        t.start();

        synchronized (lock) {
            while (!started) {
                lock.wait();
            }

            int uid = Integer.parseInt(args[0]);
            System.out.println("Setting UID to " + uid);
        
            UnixSystem.setUid(uid);
        
            System.out.println(Thread.currentThread() + 
                               "  " + 
                               UnixSystem.getUid());

            goon = true;
            lock.notify();
        }
        t.join();
    }
}


-- 
Juergen Kreileder, Blackdown Java-Linux Team
http://www.blackdown.org/java-linux.html
JVM'01: http://www.usenix.org/events/jvm01/

Reply via email to