のねのBlog

パソコンの問題や、ソフトウェアの開発で起きた問題など書いていきます。よろしくお願いします^^。

GraphicBufferMapper registerBuffer failed -14 (Bad address)

W/GraphicBufferMapper( 636): registerBuffer(0x8b080ae8) failed -14 (Bad address)

strerrorの14がBad addressなので、

     49 status_t GraphicBufferMapper::registerBuffer(buffer_handle_t handle)
     50 {
     51     ATRACE_CALL();
     52     status_t err;
     53 
     54     err = mAllocMod->registerBuffer(mAllocMod, handle); <=mAllocModは下記のクラス
     55 
     56     ALOGW_IF(err, "registerBuffer(%p) failed %d (%s)",
     57             handle, err, strerror(-err));
     58     return err;
     59 }
     60 
     36 class GraphicBufferMapper : public Singleton<GraphicBufferMapper>
     37 {
     38 public:
     39     static inline GraphicBufferMapper& get() { return getInstance(); }
     40 
     41     status_t registerBuffer(buffer_handle_t handle);
     42 
     43     status_t unregisterBuffer(buffer_handle_t handle);
     44 
     45     status_t lock(buffer_handle_t handle,
     46             int usage, const Rect& bounds, void** vaddr);
     47 
     48     status_t unlock(buffer_handle_t handle);
     49 
     50     // dumps information about the mapping of this handle
     51     void dump(buffer_handle_t handle);
     52 
     53 private:
     54     friend class Singleton<GraphicBufferMapper>;
     55     GraphicBufferMapper();
     56     gralloc_module_t const *mAllocMod; <=== これ
     57 };
    118 typedef struct gralloc_module_t {
    119     struct hw_module_t common;
    136     int (*registerBuffer)(struct gralloc_module_t const* module,
    137             buffer_handle_t handle);       <= レジスタ関数へのポインタ
    151     int (*unregisterBuffer)(struct gralloc_module_t const* module,
    152             buffer_handle_t handle);       <=アンレジスタ関数へのポインタ
    185     int (*lock)(struct gralloc_module_t const* module,
    186             buffer_handle_t handle, int usage,
    187             int l, int t, int w, int h,
    188             void** vaddr);                <=ロック関数へのポインタ
    196     int (*unlock)(struct gralloc_module_t const* module,
    197             buffer_handle_t handle);      <=アンロック関数へのポインタ
    200     /* reserved for future use */
    201     int (*perform)(struct gralloc_module_t const* module,
    202             int operation, ... );
    204     /* reserved for future use */
    205     void* reserved_proc[7];
    206 } gralloc_module_t;

じゃあ、どこで関数を登録するんだろ?
もう、ハードウェアのドライバを呼ぶのかな。

     38 GraphicBufferMapper::GraphicBufferMapper()
     39     : mAllocMod(0)
     40 {
     41     hw_module_t const* module;
     42     int err = hw_get_module(GRALLOC_HARDWARE_MODULE_ID, &module);
     43     ALOGE_IF(err, "FATAL: can't find the %s module", GRALLOC_HARDWARE_MODULE_ID);
     44     if (err == 0) {
     45         mAllocMod = (gralloc_module_t const *)module; <=ここで、関数へのポインタごともらうのかな?
     46     }
     47 }

FrameBufferのときは、こっちなのかな。

     78 struct private_module_t HAL_MODULE_INFO_SYM = {
     79     base: {
     80         common: {
     81             tag: HARDWARE_MODULE_TAG,
     82             version_major: 1,
     83             version_minor: 0,
     84             id: GRALLOC_HARDWARE_MODULE_ID,
     85             name: "Graphics Memory Allocator Module",
     86             author: "The Android Open Source Project",
     87             methods: &gralloc_module_methods
     88         },
     89         registerBuffer: gralloc_register_buffer,        <= 登録
     90         unregisterBuffer: gralloc_unregister_buffer,    <=
     91         lock: gralloc_lock,                             <=
     92         unlock: gralloc_unlock,                         <=
     93     },
     94     framebuffer: 0,
     95     flags: 0,
     96     numBuffers: 0,
     97     bufferMask: 0,
     98     lock: PTHREAD_MUTEX_INITIALIZER,
     99     currentBuffer: 0,
    100 };

14:Bad address

gralloc_module_t const *mAllocMod;

110 typedef struct gralloc_module_t {