[Mplayerxp-cvslog] SF.net SVN: mplayerxp:[289] mplayerxp
Brought to you by:
olov
From: <nic...@us...> - 2012-11-03 14:41:39
|
Revision: 289 http://mplayerxp.svn.sourceforge.net/mplayerxp/?rev=289&view=rev Author: nickols_k Date: 2012-11-03 14:41:33 +0000 (Sat, 03 Nov 2012) Log Message: ----------- print source lines in backtracer if addr2line is available Modified Paths: -------------- DOCS/mplayerxp.1 mplayerxp/configure mplayerxp/mp_msg.c mplayerxp/mp_msg.h mplayerxp/mplayer.c mplayerxp/osdep/mp_malloc.c mplayerxp/osdep/mplib.h mplayerxp/xmpcore/xmp_core.h Modified: DOCS/mplayerxp.1 =================================================================== --- DOCS/mplayerxp.1 2012-11-03 14:39:31 UTC (rev 288) +++ DOCS/mplayerxp.1 2012-11-03 14:41:33 UTC (rev 289) @@ -41,7 +41,7 @@ .TP .B \-core.xp\ Specifies number cpus to use for playback. - 0 : not playback possible. (Immediate exit) + 0 : no playback possible. (Immediate exit) 1 : build multi-thread model for Uni-Processor systems 2 : build multi-thread model for Dual-Processors systems 3 : build multi-thread model for Tripple-Processors systems Modified: mplayerxp/configure =================================================================== --- mplayerxp/configure 2012-11-03 14:39:31 UTC (rev 288) +++ mplayerxp/configure 2012-11-03 14:41:33 UTC (rev 289) @@ -570,7 +570,7 @@ enabled opengl && require2 opengl "windows.h GL/gl.h" wglCreateContext -lopengl32 -lgdi32 else disabled x11 && disable opengl -enabled opengl && require2 opengl "GL/gl.h GL/glx.h GL/glut.h" glutInitWindowSize -lglut -lGL +enabled opengl && require2 opengl "GL/gl.h GL/glx.h GL/glut.h" glutInitWindowSize -lglut -lGL -lGLU fi print_config HAVE_ mp_config.h mp_config.mak opengl enabled opengl && vomodules="opengl $vomodules" || novomodules="opengl $novomodules" Modified: mplayerxp/mp_msg.c =================================================================== --- mplayerxp/mp_msg.c 2012-11-03 14:39:31 UTC (rev 288) +++ mplayerxp/mp_msg.c 2012-11-03 14:41:33 UTC (rev 289) @@ -84,8 +84,9 @@ "POSTPR" }; -void mp_msg_c( unsigned x, const char *format, ... ){ +int mp_msg_c( unsigned x, const char *format, ... ){ /* TODO: more useful usage of module_id */ + int rc=0; priv_t*priv=NULL; va_list va; char sbuf[0xFFFFF]; @@ -117,14 +118,15 @@ if(strcmp(nls_get_screen_cp(),"UTF-8")!=0) { char *obuf; obuf=nls_recode2screen_cp("UTF-8",sbuf,ssize); - fputs(obuf,stderr); + rc=fputs(obuf,stderr); mp_free(obuf); } - else fputs(sbuf,stderr); + else rc=fputs(sbuf,stderr); if(format[strlen(format)-1]=='\n') was_eol=1; else was_eol=0; fflush(stderr); if(priv) pthread_mutex_unlock(&priv->mp_msg_mutex); + return rc; } void mp_msg_flush(void) { fflush(stderr); } Modified: mplayerxp/mp_msg.h =================================================================== --- mplayerxp/mp_msg.h 2012-11-03 14:39:31 UTC (rev 288) +++ mplayerxp/mp_msg.h 2012-11-03 14:41:33 UTC (rev 289) @@ -54,10 +54,10 @@ void mp_msg_init(int verbose); void mp_msg_uninit(void); void mp_msg_flush(void); -void mp_msg_c( unsigned x, const char *format, ... ); +int mp_msg_c( unsigned x, const char *format, ... ); #ifdef __GNUC__ -static inline void mp_msg_dummy(void) {} +static inline int mp_msg_dummy(void) {return 0; } #define mp_msg(mod,lev, args... ) ((lev<(mp_conf.verbose+MSGL_V))?(mp_msg_c(((lev&0xF)<<28)|(mod&0x0FFFFFFF),## args)):(mp_msg_dummy())) #else #define mp_msg(mod,lev, ... ) mp_msg_c(((lev&0xF)<<28)|(mod&0x0FFFFFFF),__VA_ARGS__) @@ -68,18 +68,18 @@ #endif #ifdef __va_arg_pack /* requires gcc-4.3.x */ -static __always_inline void MSG_INFO(const char* args,...) { mp_msg(MSGT_CLASS,MSGL_INFO,args,__va_arg_pack ()); } -static __always_inline void MSG_FATAL(const char* args,...) { mp_msg(MSGT_CLASS,MSGL_FATAL,args,__va_arg_pack ()); } -static __always_inline void MSG_WARN(const char* args,...) { mp_msg(MSGT_CLASS,MSGL_WARN,args,__va_arg_pack ()); } -static __always_inline void MSG_ERR(const char* args,...) { mp_msg(MSGT_CLASS,MSGL_ERR,args,__va_arg_pack ()); } -static __always_inline void MSG_V(const char* args,...) { mp_msg(MSGT_CLASS,MSGL_V,args,__va_arg_pack ()); } -static __always_inline void MSG_OK(const char* args,...) { mp_msg(MSGT_CLASS,MSGL_OK,args,__va_arg_pack ()); } -static __always_inline void MSG_HINT(const char* args,...) { mp_msg(MSGT_CLASS,MSGL_HINT,args,__va_arg_pack ()); } -static __always_inline void MSG_STATUS(const char* args,...) { mp_msg(MSGT_CLASS,MSGL_STATUS,args,__va_arg_pack ()); } +static __always_inline int MSG_INFO(const char* args,...) { return mp_msg(MSGT_CLASS,MSGL_INFO,args,__va_arg_pack ()); } +static __always_inline int MSG_FATAL(const char* args,...) { return mp_msg(MSGT_CLASS,MSGL_FATAL,args,__va_arg_pack ()); } +static __always_inline int MSG_WARN(const char* args,...) { return mp_msg(MSGT_CLASS,MSGL_WARN,args,__va_arg_pack ()); } +static __always_inline int MSG_ERR(const char* args,...) { return mp_msg(MSGT_CLASS,MSGL_ERR,args,__va_arg_pack ()); } +static __always_inline int MSG_V(const char* args,...) { return mp_msg(MSGT_CLASS,MSGL_V,args,__va_arg_pack ()); } +static __always_inline int MSG_OK(const char* args,...) { return mp_msg(MSGT_CLASS,MSGL_OK,args,__va_arg_pack ()); } +static __always_inline int MSG_HINT(const char* args,...) { return mp_msg(MSGT_CLASS,MSGL_HINT,args,__va_arg_pack ()); } +static __always_inline int MSG_STATUS(const char* args,...) { return mp_msg(MSGT_CLASS,MSGL_STATUS,args,__va_arg_pack ()); } #ifdef MP_DEBUG -static __always_inline void MSG_DBG2(const char* args,...) { mp_msg(MSGT_CLASS,MSGL_DBG3,args,__va_arg_pack ()); } -static __always_inline void MSG_DBG3(const char* args,...) { mp_msg(MSGT_CLASS,MSGL_DBG4,args,__va_arg_pack ()); } +static __always_inline int MSG_DBG2(const char* args,...) { return mp_msg(MSGT_CLASS,MSGL_DBG3,args,__va_arg_pack ()); } +static __always_inline int MSG_DBG3(const char* args,...) { return mp_msg(MSGT_CLASS,MSGL_DBG4,args,__va_arg_pack ()); } #else #define MSG_DBG2(args...) #define MSG_DBG3(args...) Modified: mplayerxp/mplayer.c =================================================================== --- mplayerxp/mplayer.c 2012-11-03 14:39:31 UTC (rev 288) +++ mplayerxp/mplayer.c 2012-11-03 14:41:33 UTC (rev 289) @@ -1653,7 +1653,7 @@ int forced_subs_only=0; seek_args_t seek_args = { 0, DEMUX_SEEK_CUR|DEMUX_SEEK_SECONDS }; - mp_init_malloc(1000,10,MPA_FLG_RANDOMIZER); // MPA_FLG_BACKTRACE + mp_init_malloc(argv[0],1000,10,MPA_FLG_RANDOMIZER); // MPA_FLG_BACKTRACE mpxp_init_structs(); priv_t*priv=mp_data->priv; Modified: mplayerxp/osdep/mp_malloc.c =================================================================== --- mplayerxp/osdep/mp_malloc.c 2012-11-03 14:39:31 UTC (rev 288) +++ mplayerxp/osdep/mp_malloc.c 2012-11-03 14:41:33 UTC (rev 289) @@ -22,6 +22,7 @@ }mp_slot_t; typedef struct priv_s { + const char* argv0; unsigned rnd_limit; unsigned every_nth_call; enum mp_malloc_e flags; @@ -181,7 +182,7 @@ rp=realloc(ptr,size); if(rp) { slot=prot_find_slot(ptr); - if(!slot) MSG_WARN("Internal error! Can't find slot for address: %p\n",ptr); + if(!slot) MSG_WARN("BT Internal error! Can't find slot for address: %p\n",ptr); else { slot->page_ptr=rp; // update address after realloc slot->size=size; @@ -192,12 +193,75 @@ static __always_inline void bt_free(any_t*ptr) { mp_slot_t* slot=prot_find_slot(ptr); - if(!slot) MSG_WARN("Internal error! Can't find slot for address: %p\n",ptr); + if(!slot) MSG_WARN("BT Internal error! Can't find slot for address: %p\n",ptr); prot_free_slot(ptr); free(ptr); } +/*======== STATISTICS =======*/ +typedef struct bt_cache_entry_s { + any_t* addr; + char* str; +}bt_cache_entry_t; + +typedef struct bt_cache_s { + bt_cache_entry_t* entry; + unsigned num_entries; +}bt_cache_t; + +static bt_cache_t* init_bt_cache(void) { return calloc(1,sizeof(bt_cache_t)); } + +static void uninit_bt_cache(bt_cache_t* cache) { + unsigned i; + for(i=0;i<cache->num_entries;i++) free(cache->entry[i].str); + free(cache->entry); + free(cache); +} + +static char* bt_find_cache(bt_cache_t* cache,any_t* ptr) { + unsigned i; + for(i=0;i<cache->num_entries;i++) if(cache->entry[i].addr==ptr) return cache->entry[i].str; + return NULL; +} + +static bt_cache_entry_t* bt_append_cache(bt_cache_t* cache,any_t* ptr,const char *str) { + if(!cache->entry) cache->entry=malloc(sizeof(bt_cache_entry_t)); + else cache->entry=realloc(cache->entry,sizeof(bt_cache_entry_t)*(cache->num_entries+1)); + cache->entry[cache->num_entries].addr=ptr; + cache->entry[cache->num_entries].str=strdup(str); + cache->num_entries++; + return &cache->entry[cache->num_entries-1]; +} + +static char * addr2line(bt_cache_t* cache,any_t*ptr) { + char *rs; + if(priv->argv0) { + bt_cache_entry_t* centry; + unsigned i; + char cmd[4096],result[4096]; + char ch; + if((rs=bt_find_cache(cache,ptr))!=NULL) return rs; + sprintf(cmd,"addr2line -s -e %s %p\n",priv->argv0,ptr); + FILE* in=popen(cmd,"r"); + if(!in) return NULL; + i=0; + while(1) { + ch=fgetc(in); + if(feof(in)) break; + if(ch=='\n') break; + result[i++]=ch; + if(i>=sizeof(result)-1) break; + } + result[i]='\0'; + pclose(in); + centry=bt_append_cache(cache,ptr,result); + return centry->str; + } + return NULL; +} + static void bt_print_slots(void) { + bt_cache_t* cache=init_bt_cache(); size_t i,j; for(i=0;i<priv->nslots;i++) { char *s; @@ -216,16 +280,18 @@ } MSG_INFO("\n"); for(j=0;j<priv->slots[i].ncalls;j++) { - MSG_INFO(" %p\n",priv->slots[i].calls[j]); + MSG_INFO("%s%p -> %s\n",j==0?"bt=>":" ",priv->slots[i].calls[j],addr2line(cache,priv->slots[i].calls[j])); } } - MSG_HINT("For source lines print in (gdb): list *0xADDRESS\n"); + MSG_HINT("For source lines you may also print in (gdb): list *0xADDRESS\n"); + uninit_bt_cache(cache); } /* ================== HEAD FUNCTIONS ======================= */ -void mp_init_malloc(unsigned rnd_limit,unsigned every_nth_call,enum mp_malloc_e flags) +void mp_init_malloc(const char *argv0,unsigned rnd_limit,unsigned every_nth_call,enum mp_malloc_e flags) { if(!priv) priv=malloc(sizeof(priv_t)); memset(priv,0,sizeof(priv_t)); + priv->argv0=argv0; priv->rnd_limit=rnd_limit; priv->every_nth_call=every_nth_call; priv->flags=flags; @@ -246,7 +312,7 @@ any_t* mp_malloc(size_t __size) { any_t* rb,*rnd_buff=NULL; - if(!priv) mp_init_malloc(1000,10,MPA_FLG_RANDOMIZER); + if(!priv) mp_init_malloc(NULL,1000,10,MPA_FLG_RANDOMIZER); if(priv->every_nth_call && priv->rnd_limit && !priv->flags) { if(priv->total_calls%priv->every_nth_call==0) { rnd_buff=malloc(rand()%priv->rnd_limit); @@ -264,7 +330,7 @@ any_t* mp_memalign (size_t boundary, size_t __size) { any_t* rb; - if(!priv) mp_init_malloc(1000,10,MPA_FLG_RANDOMIZER); + if(!priv) mp_init_malloc(NULL,1000,10,MPA_FLG_RANDOMIZER); if(priv->flags&(MPA_FLG_BOUNDS_CHECK|MPA_FLG_BEFORE_CHECK)) rb=prot_memalign(boundary,__size); else if(priv->flags&MPA_FLG_BACKTRACE) rb=bt_memalign(boundary,__size); else rb=memalign(boundary,__size); @@ -281,7 +347,7 @@ void mp_free(any_t*__ptr) { - if(!priv) mp_init_malloc(1000,10,MPA_FLG_RANDOMIZER); + if(!priv) mp_init_malloc(NULL,1000,10,MPA_FLG_RANDOMIZER); if(__ptr) { if(priv->flags&(MPA_FLG_BOUNDS_CHECK|MPA_FLG_BEFORE_CHECK)) prot_free(__ptr); Modified: mplayerxp/osdep/mplib.h =================================================================== --- mplayerxp/osdep/mplib.h 2012-11-03 14:39:31 UTC (rev 288) +++ mplayerxp/osdep/mplib.h 2012-11-03 14:41:33 UTC (rev 289) @@ -42,7 +42,7 @@ MPA_FLG_BEFORE_CHECK = 0x00000002, MPA_FLG_BACKTRACE = 0x00000004 }; -extern void __FASTCALL__ mp_init_malloc(unsigned rnd_limit,unsigned every_nth_call,enum mp_malloc_e flags); +extern void __FASTCALL__ mp_init_malloc(const char *argv0,unsigned rnd_limit,unsigned every_nth_call,enum mp_malloc_e flags); extern void __FASTCALL__ mp_uninit_malloc(int verbose); extern any_t* __FASTCALL__ mp_malloc(size_t __size); Modified: mplayerxp/xmpcore/xmp_core.h =================================================================== --- mplayerxp/xmpcore/xmp_core.h 2012-11-03 14:39:31 UTC (rev 288) +++ mplayerxp/xmpcore/xmp_core.h 2012-11-03 14:41:33 UTC (rev 289) @@ -101,7 +101,7 @@ }xp_core_t; extern xp_core_t *xp_core; -static inline int xmp_test_model(unsigned value) { return (xp_core->flags&value)!=0; } +static inline int xmp_test_model(xmp_model_e value) { return (xp_core->flags&value)!=0; } extern void xmp_init(void); extern void xmp_uninit(void); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |