001: /*
002: * Copyright (c) 2000 by Matt Welsh and The Regents of the University of
003: * California. All rights reserved.
004: *
005: * Permission to use, copy, modify, and distribute this software and its
006: * documentation for any purpose, without fee, and without written agreement is
007: * hereby granted, provided that the above copyright notice and the following
008: * two paragraphs appear in all copies of this software.
009: *
010: * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR
011: * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT
012: * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF
013: * CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
014: *
015: * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES,
016: * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
017: * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
018: * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO
019: * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
020: *
021: * Author: Matt Welsh <mdw@cs.berkeley.edu>
022: *
023: */
024:
025: package seda.sandStorm.lib.aDisk;
026:
027: import seda.sandStorm.api.*;
028: import seda.sandStorm.api.internal.*;
029: import seda.sandStorm.core.*;
030: import seda.sandStorm.internal.*;
031: import seda.sandStorm.main.*;
032:
033: /**
034: * The AFileMgr is an internal class used to provide an interface between
035: * the Sandstorm runtime and the aDisk library. Applications should not
036: * make use of this class.
037: *
038: * @author Matt Welsh
039: */
040: public class AFileMgr {
041:
042: private static final boolean DEBUG = false;
043:
044: static final int THREADPOOL_IMPL = 0;
045: private static int IMPL_TO_USE;
046:
047: private static ThreadManagerIF aFileTM;
048: private static boolean initialized = false;
049: private static Object init_lock = new Object();
050:
051: static {
052: // Eventually test for JAIO
053: IMPL_TO_USE = THREADPOOL_IMPL;
054: }
055:
056: /**
057: * Called at startup time by the Sandstorm runtime.
058: */
059: public static void initialize(ManagerIF mgr, SystemManagerIF sysmgr)
060: throws Exception {
061: synchronized (init_lock) {
062: switch (IMPL_TO_USE) {
063: case THREADPOOL_IMPL:
064: // XXX Could replace with a TPSThreadManager - but need to augment
065: // TPSTM to start with an initial number of threads per stage
066: //
067: // We also want the threads to poll across the event queues
068: // for each file (going to sleep if none of the event queues have
069: // events) which is closer to the TPPTM behavior. I think it's easier
070: // to do this with a separate thread manager rather than bastardizing
071: // an existing one.
072: aFileTM = new AFileTPTM(mgr, sysmgr);
073: break;
074: default:
075: throw new LinkageError(
076: "Error: AFileMgr has bad value for IMPL_TO_USE; this is a bug - please contact <mdw@cs.berkeley.edu>");
077: }
078: initialized = true;
079: }
080: }
081:
082: /**
083: * Called when initialized in standalone mode.
084: */
085: static synchronized void initialize() {
086: synchronized (init_lock) {
087: if (initialized)
088: return;
089: Sandstorm ss = Sandstorm.getSandstorm();
090: if (ss != null) {
091: // There is a Sandstorm running, but we weren't initialized
092: // at startup time
093: try {
094: initialize(ss.getManager(), ss.getSystemManager());
095: } catch (Exception e) {
096: System.err
097: .println("Warning: AFileMgr.initialize() got exception: "
098: + e);
099: }
100: } else {
101: // No Sandstorm running yet, so create one
102: try {
103: SandstormConfig cfg = new SandstormConfig();
104: cfg.putBoolean("global.profile.enable", false);
105: ss = new Sandstorm(cfg);
106: } catch (Exception e) {
107: System.err
108: .println("AFileMgr: Warning: Initialization failed: "
109: + e);
110: e.printStackTrace();
111: return;
112: }
113: }
114: }
115: }
116:
117: /**
118: * Return the code for the implementation being used.
119: */
120: static int getImpl() {
121: return IMPL_TO_USE;
122: }
123:
124: /**
125: * Return the ThreadManagerIF corresponding to the chosen implementation.
126: */
127: static ThreadManagerIF getTM() {
128: return aFileTM;
129: }
130:
131: }
|