#include <dirent.h>
#include <string.h>
#include <errno.h>
+#include <assert.h>
#include <pthread.h>
#include <tbm_bufmgr.h>
+#include <tbm_bo.h>
#include <tbm_surface.h>
#include <tbm_surface_internal.h>
#include <tbm_bufmgr_backend.h>
#include <tbm_surface_queue.h>
-
-#define DEBUG
-#ifdef DEBUG
-extern int bDebug;
-
-#define TBM_DBG(...) { if (bDebug&0x1) TBM_LOG_D(__VA_ARGS__); }
-#define TBM_DBG_LOCK(...) { if (bDebug&0x2) TBM_LOG_D(__VA_ARGS__); }
-#else
-#define TBM_DBG(...)
-#define TBM_DBG_LOCK(...)
-#endif /* DEBUG */
-
-#define TRACE
-#ifdef TRACE
-extern int bTrace;
-#endif /* TRACE */
-
-extern int b_dump_queue;
-
-#ifdef HAVE_DLOG
+#include <tbm_log.h>
#include <dlog.h>
-extern int bDlog;
-
-#ifdef LOG_TAG
-#undef LOG_TAG
-#endif
-
-#define LOG_TAG "TBM"
-
-#define TBM_LOG_D(fmt, ...) {\
- if (bDlog) {\
- LOGD("[TBM:D] " fmt, ##__VA_ARGS__);\
- } \
- else {\
- fprintf(stderr, "[TBM:D(%d)(%s:%d)] " fmt, getpid(), __func__, __LINE__, ##__VA_ARGS__);\
- } \
-}
-
-#define TBM_LOG_I(fmt, ...) {\
- if (bDlog) {\
- LOGI("[TBM:I] " fmt, ##__VA_ARGS__);\
- } \
- else {\
- fprintf(stderr, "[TBM:I(%d)(%s:%d)] " fmt, getpid(), __func__, __LINE__, ##__VA_ARGS__);\
- } \
-}
-
-#define TBM_LOG_W(fmt, ...) {\
- if (bDlog) {\
- LOGW("[TBM:W] " fmt, ##__VA_ARGS__);\
- } \
- else {\
- fprintf(stderr, "[TBM:W(%d)(%s:%d)] " fmt, getpid(), __func__, __LINE__, ##__VA_ARGS__);\
- } \
-}
-
-#define TBM_LOG_E(fmt, ...) {\
- if (bDlog) {\
- LOGE("[TBM:E] " fmt, ##__VA_ARGS__);\
- } \
- else {\
- fprintf(stderr, "[TBM:E(%d)(%s:%d)] " fmt, getpid(), __func__, __LINE__, ##__VA_ARGS__);\
- } \
-}
-
-#define TBM_DEBUG(fmt, ...) {\
- if (bDlog) {\
- LOGE("[TBM_DEBUG] " fmt, ##__VA_ARGS__);\
- } \
- else {\
- fprintf(stderr, "[TBM:DEBUG(%d)] " fmt, getpid(), ##__VA_ARGS__);\
- } \
-}
-
-#ifdef TRACE
-#define TBM_TRACE(fmt, ...) {\
- if (bDlog) {\
- if (bTrace&0x1) LOGE("[TBM:TRACE] " fmt, ##__VA_ARGS__);\
- } \
- else {\
- if (bTrace&0x1) fprintf(stderr, "[TBM:TRACE(%d)(%s:%d)] " fmt, getpid(), __func__, __LINE__, ##__VA_ARGS__);\
- } \
-}
-#else
-#define TBM_TRACE(fmt, ...)
-#endif /* TRACE */
-
-#else
-#define TBM_LOG_D(fmt, ...) fprintf(stderr, "[TBM:D(%d)(%s:%d)] " fmt, getpid(), __func__, __LINE__, ##__VA_ARGS__)
-#define TBM_LOG_I(fmt, ...) fprintf(stderr, "[TBM:I(%d)(%s:%d)] " fmt, getpid(), __func__, __LINE__, ##__VA_ARGS__)
-#define TBM_LOG_W(fmt, ...) fprintf(stderr, "[TBM:W(%d)(%s:%d)] " fmt, getpid(), __func__, __LINE__, ##__VA_ARGS__)
-#define TBM_LOG_E(fmt, ...) fprintf(stderr, "[TBM:E(%d)(%s:%d)] " fmt, getpid(), __func__, __LINE__, ##__VA_ARGS__)
-#define TBM_DEBUG(fmt, ...) fprintf(stderr, "[TBM:DEBUG(%d)] " fmt, getpid(), ##__VA_ARGS__)
-#ifdef TRACE
-#define TBM_TRACE(fmt, ...) { if (bTrace&0x1) fprintf(stderr, "[TBM:TRACE(%d)(%s:%d)] " fmt, getpid(), __func__, __LINE__, ##__VA_ARGS__); }
-#else
-#define TBM_TRACE(fmt, ...)
-#endif /* TRACE */
-#endif /* HAVE_DLOG */
+extern tbm_bufmgr gBufMgr;
+extern int b_dump_queue;
+extern int trace_mask;
/* check condition */
#define TBM_RETURN_IF_FAIL(cond) {\
if (!(cond)) {\
- TBM_LOG_E("'%s' failed.\n", #cond);\
+ TBM_ERR("'%s' failed.\n", #cond);\
return;\
} \
}
#define TBM_RETURN_VAL_IF_FAIL(cond, val) {\
if (!(cond)) {\
- TBM_LOG_E("'%s' failed.\n", #cond);\
+ TBM_ERR("'%s' failed.\n", #cond);\
return val;\
} \
}
#define TBM_GOTO_VAL_IF_FAIL(cond, val) {\
if (!(cond)) {\
- TBM_LOG_E("'%s' failed.\n", #cond);\
+ TBM_ERR("'%s' failed.\n", #cond);\
goto val;\
} \
}
} \
}
+#define TBM_TRACE_BO(fmt, args...) \
+ do { \
+ if (trace_mask&TBM_BUFGMR_DEBUG_TRACE_BO) { \
+ struct timespec ts; \
+ clock_gettime(CLOCK_MONOTONIC, &ts); \
+ tbm_log_print(TBM_LOG_LEVEL_INFO, "[%5d.%06d][%d][%s %d](TRACE)"fmt, \
+ (int)ts.tv_sec, (int)ts.tv_nsec / 1000, \
+ (int)syscall(SYS_gettid), __FUNCTION__, __LINE__, ##args); \
+ } \
+ } while (0)
+
+#define TBM_TRACE_SURFACE_INTERNAL(fmt, args...) \
+ do { \
+ if (trace_mask&TBM_BUFGMR_DEBUG_TRACE_SURFACE_INTERNAL) { \
+ struct timespec ts; \
+ clock_gettime(CLOCK_MONOTONIC, &ts); \
+ tbm_log_print(TBM_LOG_LEVEL_INFO, "[%5d.%06d][%d][%s %d](TRACE)"fmt, \
+ (int)ts.tv_sec, (int)ts.tv_nsec / 1000, \
+ (int)syscall(SYS_gettid), __FUNCTION__, __LINE__, ##args); \
+ } \
+ } while (0)
+
+#define TBM_TRACE_SURFACE(fmt, args...) \
+ do { \
+ if (trace_mask&TBM_BUFGMR_DEBUG_TRACE_SURFACE) { \
+ struct timespec ts; \
+ clock_gettime(CLOCK_MONOTONIC, &ts); \
+ tbm_log_print(TBM_LOG_LEVEL_INFO, "[%5d.%06d][%d][%s %d](TRACE)"fmt, \
+ (int)ts.tv_sec, (int)ts.tv_nsec / 1000, \
+ (int)syscall(SYS_gettid), __FUNCTION__, __LINE__, ##args); \
+ } \
+ } while (0)
+
+#define TBM_TRACE_SURFACE_QUEUE(fmt, args...) \
+ do { \
+ if (trace_mask&TBM_BUFGMR_DEBUG_TRACE_SURFACE_QUEUE) { \
+ struct timespec ts; \
+ clock_gettime(CLOCK_MONOTONIC, &ts); \
+ tbm_log_print(TBM_LOG_LEVEL_INFO, "[%5d.%06d][%d][%s %d](TRACE)"fmt, \
+ (int)ts.tv_sec, (int)ts.tv_nsec / 1000, \
+ (int)syscall(SYS_gettid), __FUNCTION__, __LINE__, ##args); \
+ } \
+ } while (0)
+
+#define TBM_TRACE(fmt, args...) \
+ do { \
+ if (trace_mask&0x1) { \
+ struct timespec ts; \
+ clock_gettime(CLOCK_MONOTONIC, &ts); \
+ tbm_log_print(TBM_LOG_LEVEL_INFO, "[%5d.%06d][%d][%s %d](TRACE)"fmt, \
+ (int)ts.tv_sec, (int)ts.tv_nsec / 1000, \
+ (int)syscall(SYS_gettid), __FUNCTION__, __LINE__, ##args); \
+ } \
+ } while (0)
+
+
/* check validation */
-#define TBM_BUFMGR_IS_VALID(mgr) (mgr)
+#define TBM_BUFMGR_IS_VALID(mgr) (mgr && mgr == gBufMgr)
#define TBM_BO_IS_VALID(bo) (bo && \
TBM_BUFMGR_IS_VALID(bo->bufmgr) && \
bo->item_link.next && \
surf->item_link.next->prev == &surf->item_link)
-#define TBM_SNPRINTF(p, len, fmt, ARG...) \
+#define TBM_SNRPRINTF(p, len, count, fmt, ARG...) \
do { \
- if (p && len && *len > 0) { \
- int s = snprintf(p, *len, fmt, ##ARG); \
- p += s; \
- *len -= s; \
- } \
- else { \
- TBM_DEBUG(fmt, ##ARG);\
+ if (p) { \
+ int rest = len - count; \
+ int s = snprintf(&p[count], rest, fmt, ##ARG); \
+ while (s >= rest) { \
+ len *= 2; \
+ p = realloc(p, len); \
+ rest = len - count; \
+ s = snprintf(&p[count], rest, fmt, ##ARG); \
+ } \
+ count += s; \
} \
} while (0)
-
struct list_head {
struct list_head *prev;
struct list_head *next;
* @brief tbm_bo : buffer object of Tizen Buffer Manager
*/
struct _tbm_bo {
- tbm_bufmgr bufmgr; /* tbm buffer manager */
-
- int ref_cnt; /* ref count of bo */
-
- int flags; /* TBM_BO_FLAGS :bo memory type */
-
- struct list_head user_data_list; /* list of the user_date in bo */
-
- void *priv; /* bo private */
-
- struct list_head item_link; /* link of bo */
-
- tbm_surface_h surface; /* tbm_surface */
-
- int lock_cnt; /* lock count of bo */
-
- unsigned int map_cnt; /* device map count */
+ tbm_bufmgr bufmgr; /* tbm buffer manager */
+ int ref_cnt; /* ref count of bo */
+ int flags; /* TBM_BO_FLAGS :bo memory type */
+ struct list_head user_data_list; /* list of the user_date in bo */
+ void *priv; /* bo private */
+ struct list_head item_link; /* link of bo */
+ tbm_surface_h surface; /* tbm_surface */
+ int lock_cnt; /* lock count of bo */
+ unsigned int map_cnt; /* device map count */
};
/**
*
*/
struct _tbm_bufmgr {
- pthread_mutex_t lock; /* mutex lock */
-
- int ref_count; /*reference count */
-
- int fd; /* bufmgr fd */
-
- int lock_type; /* lock_type of bufmgr */
-
- int capabilities; /* capabilities of bufmgr */
-
- unsigned int bo_cnt; /* number of bos */
-
- struct list_head bo_list; /* list of bos belonging to bufmgr */
-
- struct list_head surf_list; /* list of surfaces belonging to bufmgr */
-
+ pthread_mutex_t lock; /* mutex lock */
+ int ref_count; /* reference count */
+ int fd; /* bufmgr fd */
+ tbm_bufmgr_bo_lock_type bo_lock_type; /* lock_type of bufmgr */
+ int capabilities; /* capabilities of bufmgr */
+ unsigned int bo_cnt; /* number of bos */
+ struct list_head bo_list; /* list of bos belonging to bufmgr */
+ struct list_head surf_list; /* list of surfaces belonging to bufmgr */
struct list_head surf_queue_list; /* list of surface queues belonging to bufmgr */
-
- struct list_head debug_key_list; /* list of debug data key list belonging to bufmgr */
-
+ struct list_head debug_key_list; /* list of debug data key list belonging to bufmgr */
void *module_data;
-
- tbm_bufmgr_backend backend; /* bufmgr backend */
+ tbm_bufmgr_backend backend; /* bufmgr backend */
+ int display_server; /* used by display server */
};
/**
tbm_bufmgr _tbm_bufmgr_get_bufmgr(void);
int _tbm_bo_set_surface(tbm_bo bo, tbm_surface_h surface);
int _tbm_surface_is_valid(tbm_surface_h surface);
+void _tbm_bo_free(tbm_bo bo);
/* functions for mutex */
int tbm_surface_internal_get_info(tbm_surface_h surface, int opt,
tbm_data_free data_free_func);
void user_data_delete(tbm_user_data *user_data);
+int tbm_bufmgr_get_fd_limit(void);
+tbm_bufmgr tbm_bufmgr_get(void);
#endif /* _TBM_BUFMGR_INT_H_ */