llpluginprocessparent.h
上传用户:king477883
上传日期:2021-03-01
资源大小:9553k
文件大小:6k
源码类别:

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llpluginprocessparent.h
  3.  * @brief LLPluginProcessParent handles the parent side of the external-process plugin API.
  4.  *
  5.  * @cond
  6.  * $LicenseInfo:firstyear=2008&license=viewergpl$
  7.  * 
  8.  * Copyright (c) 2008-2010, Linden Research, Inc.
  9.  * 
  10.  * Second Life Viewer Source Code
  11.  * The source code in this file ("Source Code") is provided by Linden Lab
  12.  * to you under the terms of the GNU General Public License, version 2.0
  13.  * ("GPL"), unless you have obtained a separate licensing agreement
  14.  * ("Other License"), formally executed by you and Linden Lab.  Terms of
  15.  * the GPL can be found in doc/GPL-license.txt in this distribution, or
  16.  * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
  17.  * 
  18.  * There are special exceptions to the terms and conditions of the GPL as
  19.  * it is applied to this Source Code. View the full text of the exception
  20.  * in the file doc/FLOSS-exception.txt in this software distribution, or
  21.  * online at
  22.  * http://secondlifegrid.net/programs/open_source/licensing/flossexception
  23.  * 
  24.  * By copying, modifying or distributing this software, you acknowledge
  25.  * that you have read and understood your obligations described above,
  26.  * and agree to abide by those obligations.
  27.  * 
  28.  * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
  29.  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  30.  * COMPLETENESS OR PERFORMANCE.
  31.  * $/LicenseInfo$
  32.  * @endcond
  33.  */
  34. #ifndef LL_LLPLUGINPROCESSPARENT_H
  35. #define LL_LLPLUGINPROCESSPARENT_H
  36. #include "llapr.h"
  37. #include "llprocesslauncher.h"
  38. #include "llpluginmessage.h"
  39. #include "llpluginmessagepipe.h"
  40. #include "llpluginsharedmemory.h"
  41. #include "lliosocket.h"
  42. class LLPluginProcessParentOwner
  43. {
  44. public:
  45. virtual ~LLPluginProcessParentOwner();
  46. virtual void receivePluginMessage(const LLPluginMessage &message) = 0;
  47. // This will only be called when the plugin has died unexpectedly 
  48. virtual void pluginLaunchFailed() {};
  49. virtual void pluginDied() {};
  50. };
  51. class LLPluginProcessParent : public LLPluginMessagePipeOwner
  52. {
  53. LOG_CLASS(LLPluginProcessParent);
  54. public:
  55. LLPluginProcessParent(LLPluginProcessParentOwner *owner);
  56. ~LLPluginProcessParent();
  57. void init(const std::string &launcher_filename, const std::string &plugin_filename, bool debug, const std::string &user_data_path);
  58. void idle(void);
  59. // returns true if the plugin is on its way to steady state
  60. bool isLoading(void);
  61. // returns true if the plugin is in the steady state (processing messages)
  62. bool isRunning(void);
  63. // returns true if the process has exited or we've had a fatal error
  64. bool isDone(void);
  65. void killSockets(void);
  66. // Go to the proper error state
  67. void errorState(void);
  68. void setSleepTime(F64 sleep_time, bool force_send = false);
  69. F64 getSleepTime(void) const { return mSleepTime; };
  70. void sendMessage(const LLPluginMessage &message);
  71. void receiveMessage(const LLPluginMessage &message);
  72. // Inherited from LLPluginMessagePipeOwner
  73. void receiveMessageRaw(const std::string &message);
  74. // This adds a memory segment shared with the client, generating a name for the segment.  The name generated is guaranteed to be unique on the host.
  75. // The caller must call removeSharedMemory first (and wait until getSharedMemorySize returns 0 for the indicated name) before re-adding a segment with the same name.
  76. std::string addSharedMemory(size_t size);
  77. // Negotiates for the removal of a shared memory segment.  It is the caller's responsibility to ensure that nothing touches the memory
  78. // after this has been called, since the segment will be unmapped shortly thereafter.
  79. void removeSharedMemory(const std::string &name);
  80. size_t getSharedMemorySize(const std::string &name);
  81. void *getSharedMemoryAddress(const std::string &name);
  82. // Returns the version string the plugin indicated for the message class, or an empty string if that class wasn't in the list.
  83. std::string getMessageClassVersion(const std::string &message_class);
  84. std::string getPluginVersion(void);
  85. bool getDisableTimeout() { return mDisableTimeout; };
  86. void setDisableTimeout(bool disable) { mDisableTimeout = disable; };
  87. void setLaunchTimeout(F32 timeout) { mPluginLaunchTimeout = timeout; };
  88. void setLockupTimeout(F32 timeout) { mPluginLockupTimeout = timeout; };
  89. F64 getCPUUsage() { return mCPUUsage; };
  90. private:
  91. enum EState
  92. {
  93. STATE_UNINITIALIZED,
  94. STATE_INITIALIZED, // init() has been called
  95. STATE_LISTENING, // listening for incoming connection
  96. STATE_LAUNCHED, // process has been launched
  97. STATE_CONNECTED, // process has connected
  98. STATE_HELLO, // first message from the plugin process has been received
  99. STATE_LOADING, // process has been asked to load the plugin
  100. STATE_RUNNING, // 
  101. STATE_LAUNCH_FAILURE, // Failure before plugin loaded
  102. STATE_ERROR, // generic bailout state
  103. STATE_CLEANUP, // clean everything up
  104. STATE_EXITING, // Tried to kill process, waiting for it to exit
  105. STATE_DONE //
  106. };
  107. EState mState;
  108. void setState(EState state);
  109. bool pluginLockedUp();
  110. bool pluginLockedUpOrQuit();
  111. bool accept();
  112. LLSocket::ptr_t mListenSocket;
  113. LLSocket::ptr_t mSocket;
  114. U32 mBoundPort;
  115. LLProcessLauncher mProcess;
  116. std::string mPluginFile;
  117. std::string mUserDataPath;
  118. LLPluginProcessParentOwner *mOwner;
  119. typedef std::map<std::string, LLPluginSharedMemory*> sharedMemoryRegionsType;
  120. sharedMemoryRegionsType mSharedMemoryRegions;
  121. LLSD mMessageClassVersions;
  122. std::string mPluginVersionString;
  123. LLTimer mHeartbeat;
  124. F64 mSleepTime;
  125. F64 mCPUUsage;
  126. bool mDisableTimeout;
  127. bool mDebug;
  128. LLProcessLauncher mDebugger;
  129. F32 mPluginLaunchTimeout; // Somewhat longer timeout for initial launch.
  130. F32 mPluginLockupTimeout; // If we don't receive a heartbeat in this many seconds, we declare the plugin locked up.
  131. };
  132. #endif // LL_LLPLUGINPROCESSPARENT_H