//通过结构成员获得成员所在结构的地址的例子
#define list_entry(ptr, type, member) \
container_of(ptr, type, member)
#define list_for_each(pos, head) \
for (pos = (head)->next; pos != (head); \
pos = pos->next)
struct list_head {
struct list_head *next, *prev;
};
typedef struct HiBUS_srv_struct{
char ID[32];/*HiBUS_ID*/
char addr[32];/*HiBUS_ADDR*/
void *user;/*user application pointer*/
HiBUS_cb_f cb;/*event callback function*/
/*the following is srv internal members*/
struct list_head srv_list;/*link into srv_list_head*/
int is_cbed;/*is any async event incoming and cb is called*/
int event_ID;/*event ID*/
int shoud_free;
}HiBUS_srv_t;
/*********************************/
/* definitions for linux flavour */
/*********************************/
#define container_of(ptr, type, member) ({ \
const typeof( ((type *)0)->member ) *__mptr = (ptr); \
(type *)( (char *)__mptr - offsetof(type,member) );})
static int HiBUS_srv_callback(const char *ID, int event_ID,const char *para)
{
struct list_head *entry;
HiBUS_srv_t *srv_p;
//pthread_mutex_lock(&HiBUS_srv_locker);
hxSDK_mutex_lock(&HiBUS_srv_locker);//edit by hanln
list_for_each(entry,&HiBUS_srv_list_head)
{
srv_p = list_entry(entry,HiBUS_srv_t, srv_list);
if(!strcmp(srv_p->ID,ID))
{
DBG("HiBUS_srv ID %s is callback......",ID);
srv_p->cb(event_ID,srv_p->user,(void*)para);
srv_p->event_ID = event_ID;
srv_p->is_cbed = 1;
break;//add by phj 2009.2.11
}
}
//pthread_mutex_unlock(&HiBUS_srv_locker);
hxSDK_mutex_unlock(&HiBUS_srv_locker);//edit by hanln
return 0;
}