Combined: Thread Pool + Command + Active Object + Proxy sp < ISurface > Client:: createSurface ( ISurfaceComposerClient :: surface_data_t * params , const String8& name, uint32_t w, uint32_t h, PixelFormat format, uint32_t flags) { class MessageCreateLayer : public MessageBase { public : MessageCreateLayer (SurfaceFlinger* flinger, ISurfaceComposerClient :: surface_data_t * params , const String8& name, Client* client, uint32_t w, uint32_t h, PixelFormat format, uint32_t flags) : flinger(flinger), params ( params ), client(client), name(name), w(w), h(h), format(format), flags(flags) { } sp < ISurface > getResult () const { return result; } virtual bool handler() { result = flinger-> createLayer ( params , name, client, w, h, format, flags); return true; } }; sp < MessageBase > msg = new MessageCreateLayer ( mFlinger.get (), params , name, this, w, h, format, flags); mFlinger -> postMessageSync ( msg ); return static_cast < MessageCreateLayer *>( msg.get () )-> getResult (); }