sequenceDiagram participant ClientApp ClientApp->PluginManager: Initialize(cfile) loop ForEachNativePlugin(N) N->N: CreateAdapterTable() N->>PluginManager: Register(AdapterTable) end PluginManager->PluginManager: ParseConfig(cfile) loop ForEachPlugin(P) PluginManager->>PluginLoader: LoadPlugin(A) P->P: CreateAdapterTable() Note over P: Map Plugin FN Ptrs P->>PluginManager: Register(AdapterTable) PluginLoader->>P: Configure(cdata) PluginLoader->>P: Initialize() end ClientApp->>PluginManager: fpgaEnumerate Note over PluginManager: ForEachAdapterTable PluginManager->>PluginA: fpgaEnumerate() PluginA-->>PluginManager: ReturnTokenList(PluginA) loop ForEachToken(PluginA) PluginManager->>PluginManager: tag(Token, PluginA) end PluginManager->>PluginManager: ExtendTokenList(TokensA) PluginManager->>ProxyPlugin: fpgaEnumerate() ProxyPlugin->>RemoteEndpoint: send_msg(enumerate, filter) RemoteEndpoint->>ProxyPlugin: recv_msg(tokens) loop ForEachToken ProxyPlugin->ProxyPlugin:deserialize(messageToken, fpga_token) ProxyPlugin->ProxyPlugin:associate(fpga_token, endpoint_connection) end ProxyPlugin-->>PluginManager: ReturnTokenList(ProxyPlugin) loop ForEachToken(ProxyPlugin) PluginManager->>PluginManager: tag(Token, ProxyPlugin) end PluginManager->>PluginManager: ExtendTokenList(TokensB) PluginManager-->>ClientApp: ReturnAllTokenList ClientApp->>PluginManager: fpgaOpen(Token) PluginManager->>PluginManager: untag(Token, AdapterTableB) PluginManager->>ProxyPlugin: fpgaOpen(Token) ProxyPlugin->>RemoteEndpoint: send_msg(open, token) RemoteEndpoint-->>ProxyPlugin: recv_msg(handle) ProxyPlugin->>ProxyPlugin: make_fpga_handle(handle) Note over ProxyPlugin: associate handle to endpoint ProxyPlugin-->>PluginManager: return FPGA_OK, handle Note over PluginManager: associate handle to ProxyPlugin