Home | History | Annotate | Download | only in ipc
      1 //
      2 //  Copyright (C) 2015 Google, Inc.
      3 //
      4 //  Licensed under the Apache License, Version 2.0 (the "License");
      5 //  you may not use this file except in compliance with the License.
      6 //  You may obtain a copy of the License at:
      7 //
      8 //  http://www.apache.org/licenses/LICENSE-2.0
      9 //
     10 //  Unless required by applicable law or agreed to in writing, software
     11 //  distributed under the License is distributed on an "AS IS" BASIS,
     12 //  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13 //  See the License for the specific language governing permissions and
     14 //  limitations under the License.
     15 //
     16 
     17 #pragma once
     18 
     19 #include <atomic>
     20 
     21 #include <base/files/file_path.h>
     22 #include <base/files/scoped_file.h>
     23 #include <base/macros.h>
     24 #include <base/threading/thread.h>
     25 
     26 #include "service/ipc/ipc_handler.h"
     27 #include "service/ipc/ipc_manager.h"
     28 
     29 namespace base {
     30 class SingleThreadTaskRunner;
     31 }  // namespace base
     32 
     33 namespace ipc {
     34 
     35 // Implements a Linux sequential packet domain-socket based IPCHandler
     36 class IPCHandlerLinux : public IPCHandler {
     37  public:
     38   IPCHandlerLinux(bluetooth::Adapter* adapter,
     39                  IPCManager::Delegate* delegate);
     40   ~IPCHandlerLinux() override;
     41 
     42   // IPCHandler overrides:
     43   bool Run() override;
     44   void Stop() override;
     45 
     46  private:
     47   IPCHandlerLinux() = default;
     48 
     49   // Starts listening for incoming connections. Posted on |thread_| by Run().
     50   void StartListeningOnThread();
     51 
     52   // Stops the IPC thread. This helper is needed since base::Thread requires
     53   // threads to be stopped on the thread that started them.
     54   void ShutDownOnOriginThread();
     55 
     56   // Notifies the delegate that we started or stoppedlistening for incoming
     57   // connections.
     58   void NotifyStartedOnOriginThread();
     59   void NotifyStartedOnCurrentThread();
     60   void NotifyStoppedOnOriginThread();
     61   void NotifyStoppedOnCurrentThread();
     62 
     63   // True, if the IPC mechanism is running.
     64   bool running_;
     65 
     66   // The server socket on which we listen to incoming connections.
     67   base::ScopedFD socket_;
     68 
     69   // The file path to |socket_|. This is only set if we create and manage the
     70   // life time of the socket.
     71   base::FilePath socket_path_;
     72 
     73   // We use a dedicated thread for listening to incoming connections and
     74   // polling from the socket to avoid blocking the main thread.
     75   base::Thread thread_;
     76 
     77   // Whether or not the listening thread should continue to run.
     78   std::atomic<bool> keep_running_;
     79 
     80   // The origin thread's task runner.
     81   scoped_refptr<base::SingleThreadTaskRunner> origin_task_runner_;
     82 
     83   DISALLOW_COPY_AND_ASSIGN(IPCHandlerLinux);
     84 };
     85 
     86 }  // namespace ipc
     87