src/share/vm/services/attachListener.hpp

Thu, 12 Mar 2009 18:16:36 -0700

author
trims
date
Thu, 12 Mar 2009 18:16:36 -0700
changeset 1063
7bb995fbd3c0
parent 435
a61af66fc99e
child 1907
c18cbe5936b8
permissions
-rw-r--r--

Merge

     1 /*
     2  * Copyright 2005-2006 Sun Microsystems, Inc.  All Rights Reserved.
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     4  *
     5  * This code is free software; you can redistribute it and/or modify it
     6  * under the terms of the GNU General Public License version 2 only, as
     7  * published by the Free Software Foundation.
     8  *
     9  * This code is distributed in the hope that it will be useful, but WITHOUT
    10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    12  * version 2 for more details (a copy is included in the LICENSE file that
    13  * accompanied this code).
    14  *
    15  * You should have received a copy of the GNU General Public License version
    16  * 2 along with this work; if not, write to the Free Software Foundation,
    17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    18  *
    19  * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
    20  * CA 95054 USA or visit www.sun.com if you need additional information or
    21  * have any questions.
    22  *
    23  */
    25 // The AttachListener thread services a queue of operations that are enqueued
    26 // by client tools. Each operation is identified by a name and has up to 3
    27 // arguments. The operation name is mapped to a function which performs the
    28 // operation. The function is called with an outputStream which is can use to
    29 // write any result data (for examples the properties command serializes
    30 // properties names and values to the output stream). When the function
    31 // complets the result value and any result data is returned to the client
    32 // tool.
    34 #ifndef SERVICES_KERNEL
    36 class AttachOperation;
    38 typedef jint (*AttachOperationFunction)(AttachOperation* op, outputStream* out);
    40 struct AttachOperationFunctionInfo {
    41   const char* name;
    42   AttachOperationFunction func;
    43 };
    44 #endif // SERVICES_KERNEL
    46 class AttachListener: AllStatic {
    47  public:
    48   static void init()  KERNEL_RETURN;
    49   static void abort() KERNEL_RETURN;
    51   // invoke to perform clean-up tasks when all clients detach
    52   static void detachall() KERNEL_RETURN;
    54   // indicates if the Attach Listener needs to be created at startup
    55   static bool init_at_startup() KERNEL_RETURN_(return false;);
    57   // indicates if we have a trigger to start the Attach Listener
    58   static bool is_init_trigger() KERNEL_RETURN_(return false;);
    60 #ifdef SERVICES_KERNEL
    61   static bool is_attach_supported()             { return false; }
    62 #else // SERVICES_KERNEL
    63  private:
    64   static volatile bool _initialized;
    66  public:
    67   static bool is_initialized()                  { return _initialized; }
    68   static void set_initialized()                 { _initialized = true; }
    70   // indicates if this VM supports attach-on-demand
    71   static bool is_attach_supported()             { return !DisableAttachMechanism; }
    73   // platform specific initialization
    74   static int pd_init();
    76   // platform specific operation
    77   static AttachOperationFunctionInfo* pd_find_operation(const char* name);
    79   // platform specific flag change
    80   static jint pd_set_flag(AttachOperation* op, outputStream* out);
    82   // platform specific detachall
    83   static void pd_detachall();
    85   // platform specific data dump
    86   static void pd_data_dump();
    88   // dequeue the next operation
    89   static AttachOperation* dequeue();
    90 #endif // SERVICES_KERNEL
    91 };
    93 #ifndef SERVICES_KERNEL
    94 class AttachOperation: public CHeapObj {
    95  public:
    96   enum {
    97     name_length_max = 16,       // maximum length of  name
    98     arg_length_max = 1024,      // maximum length of argument
    99     arg_count_max = 3           // maximum number of arguments
   100   };
   102   // name of special operation that can be enqueued when all
   103   // clients detach
   104   static char* detachall_operation_name() { return (char*)"detachall"; }
   106  private:
   107   char _name[name_length_max+1];
   108   char _arg[arg_count_max][arg_length_max+1];
   110  public:
   111   const char* name() const                      { return _name; }
   113   // set the operation name
   114   void set_name(char* name) {
   115     assert(strlen(name) <= name_length_max, "exceeds maximum name length");
   116     strcpy(_name, name);
   117   }
   119   // get an argument value
   120   const char* arg(int i) const {
   121     assert(i>=0 && i<arg_count_max, "invalid argument index");
   122     return _arg[i];
   123   }
   125   // set an argument value
   126   void set_arg(int i, char* arg) {
   127     assert(i>=0 && i<arg_count_max, "invalid argument index");
   128     if (arg == NULL) {
   129       _arg[i][0] = '\0';
   130     } else {
   131       assert(strlen(arg) <= arg_length_max, "exceeds maximum argument length");
   132       strcpy(_arg[i], arg);
   133     }
   134   }
   136   // create an operation of a given name
   137   AttachOperation(char* name) {
   138     set_name(name);
   139     for (int i=0; i<arg_count_max; i++) {
   140       set_arg(i, NULL);
   141     }
   142   }
   144   // complete operation by sending result code and any result data to the client
   145   virtual void complete(jint result, bufferedStream* result_stream) = 0;
   146 };
   147 #endif // SERVICES_KERNEL

mercurial