BackgroundParser.h 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. //-------------------------------------------------------------------------------------------------------
  2. // Copyright (C) Microsoft. All rights reserved.
  3. // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
  4. //-------------------------------------------------------------------------------------------------------
  5. #pragma once
  6. #if ENABLE_NATIVE_CODEGEN
  7. typedef DList<ParseNode*, ArenaAllocator> NodeDList;
  8. struct BackgroundParseItem sealed : public JsUtil::Job
  9. {
  10. BackgroundParseItem(JsUtil::JobManager *const manager, Parser *const parser, ParseNodeFnc *parseNode, bool defer);
  11. ParseContext *GetParseContext() { return &parseContext; }
  12. ParseNodeFnc *GetParseNode() const { return parseNode; }
  13. CompileScriptException *GetPSE() const { return pse; }
  14. HRESULT GetHR() const { return hr; }
  15. bool IsStrictMode() const { return strictMode; }
  16. bool Succeeded() const { return hr == S_OK; }
  17. bool IsInParseQueue() const { return inParseQueue; }
  18. bool IsDeferred() const { return isDeferred;}
  19. void SetHR(HRESULT hr) { this->hr = hr; }
  20. void SetCompleted(bool has) { completed = has; }
  21. void SetPSE(CompileScriptException *pse) { this->pse = pse; }
  22. uint GetMaxBlockId() const { return maxBlockId; }
  23. void SetMaxBlockId(uint blockId) { maxBlockId = blockId; }
  24. Parser *GetParser() const { return parser; }
  25. void SetParser(Parser *p) { parser = p; }
  26. BackgroundParseItem *GetNext() const { return nextItem; }
  27. void SetNext(BackgroundParseItem *item) { nextItem = item; }
  28. BackgroundParseItem *GetNextUnprocessedItem() const { return nextUnprocessedItem; }
  29. void SetNextUnprocessedItem(BackgroundParseItem *item) { nextUnprocessedItem = item; }
  30. BackgroundParseItem *GetPrevUnprocessedItem() const { return prevUnprocessedItem; }
  31. void SetPrevUnprocessedItem(BackgroundParseItem *item) { prevUnprocessedItem = item; }
  32. DList<ParseNode*, ArenaAllocator>* RegExpNodeList() { return regExpNodes; }
  33. void OnAddToParseQueue();
  34. void OnRemoveFromParseQueue();
  35. void AddRegExpNode(ParseNode *const pnode, ArenaAllocator *alloc);
  36. private:
  37. ParseContext parseContext;
  38. Parser *parser;
  39. BackgroundParseItem *nextItem;
  40. BackgroundParseItem *nextUnprocessedItem;
  41. BackgroundParseItem *prevUnprocessedItem;
  42. ParseNodeFnc *parseNode;
  43. CompileScriptException *pse;
  44. NodeDList* regExpNodes;
  45. HRESULT hr;
  46. uint maxBlockId;
  47. bool isDeferred;
  48. bool strictMode;
  49. bool inParseQueue;
  50. bool completed;
  51. };
  52. class BackgroundParser sealed : public JsUtil::WaitableJobManager
  53. {
  54. public:
  55. BackgroundParser(Js::ScriptContext *scriptContext);
  56. ~BackgroundParser();
  57. static BackgroundParser * New(Js::ScriptContext *scriptContext);
  58. static void Delete(BackgroundParser *backgroundParser);
  59. volatile uint* GetPendingBackgroundItemsPtr() const { return (volatile uint*)&pendingBackgroundItems; }
  60. virtual bool Process(JsUtil::Job *const job, JsUtil::ParallelThreadData *threadData) override;
  61. virtual void JobProcessed(JsUtil::Job *const job, const bool succeeded) override;
  62. virtual void OnDecommit(JsUtil::ParallelThreadData *threadData) override;
  63. bool Process(JsUtil::Job *const job, Parser *parser, CompileScriptException *pse);
  64. bool ParseBackgroundItem(Parser *parser, ParseNodeFnc *parseNode, bool isDeferred);
  65. BackgroundParseItem * NewBackgroundParseItem(Parser *parser, ParseNodeFnc *parseNode, bool isDeferred);
  66. BackgroundParseItem *GetJob(BackgroundParseItem *item) const;
  67. bool WasAddedToJobProcessor(JsUtil::Job *const job) const;
  68. void BeforeWaitForJob(BackgroundParseItem *const item) const;
  69. void AfterWaitForJob(BackgroundParseItem *const item) const;
  70. BackgroundParseItem *GetNextUnprocessedItem() const;
  71. void AddUnprocessedItem(BackgroundParseItem *const item);
  72. void RemoveFromUnprocessedItems(BackgroundParseItem *const item);
  73. void SetFailedBackgroundParseItem(BackgroundParseItem *item) { failedBackgroundParseItem = item; }
  74. BackgroundParseItem *GetFailedBackgroundParseItem() const { return failedBackgroundParseItem; }
  75. bool HasFailedBackgroundParseItem() const { return failedBackgroundParseItem != nullptr; }
  76. private:
  77. void AddToParseQueue(BackgroundParseItem *const item, bool prioritize, bool lock);
  78. private:
  79. Js::ScriptContext *scriptContext;
  80. uint pendingBackgroundItems;
  81. BackgroundParseItem *failedBackgroundParseItem;
  82. BackgroundParseItem *unprocessedItemsHead;
  83. BackgroundParseItem *unprocessedItemsTail;
  84. #if DBG
  85. ThreadContextId mainThreadId;
  86. #endif
  87. };
  88. #endif