Merge branch 'master' into app_server

Conflicts:
	src/kits/app/Roster.cpp
This commit is contained in:
Julian Harnath
2015-09-01 20:07:21 +02:00
193 changed files with 6182 additions and 2245 deletions
+1 -1
View File
@@ -26,7 +26,7 @@ SYSTEM_BIN = [ FFilterByBuildFeatures
route route
safemode screen_blanker screeninfo screenmode setarch setmime settype safemode screen_blanker screeninfo screenmode setarch setmime settype
setversion setvolume shutdown setversion setvolume shutdown
strace su sysinfo strace su sysinfo system_time
tcptester telnet telnetd top tcptester telnet telnetd top
traceroute trash traceroute trash
unchop unmount unchop unmount
-1
View File
@@ -21,7 +21,6 @@ AddFilesToPackage develop lib : kernel.so : _KERNEL_ ;
# additional libraries # additional libraries
local developmentLibs = local developmentLibs =
<revisioned>libroot_debug.so <revisioned>libroot_debug.so
<revisioned>libroot_guarded.so
; ;
AddFilesToPackage lib : $(developmentLibs) ; AddFilesToPackage lib : $(developmentLibs) ;
+20 -15
View File
@@ -22,7 +22,7 @@ RemotePackageRepository HaikuPorts
apr_util_devel-1.4.1-4 apr_util_devel-1.4.1-4
autoconf-2.69-6 autoconf-2.69-6
automake-1.13.1-4 automake-1.13.1-4
bash-4.3.39-1 bash-4.3.42-1
beam-1.2-1 beam-1.2-1
bepdf-1.2.0-1 bepdf-1.2.0-1
bescreencapture-1.9.4-1 bescreencapture-1.9.4-1
@@ -37,12 +37,12 @@ RemotePackageRepository HaikuPorts
clang-3.4-3 clang-3.4-3
clang_analysis-3.4-3 clang_analysis-3.4-3
clipdinger-0.4-1 clipdinger-0.4-1
cmake-3.0.0_rc3-1 cmake-3.3.1-1
coreutils-8.24-1 coreutils-8.24-1
cpio-2.10-1 cpio-2.10-1
ctags-5.8-3 ctags-5.8-3
curl-7.43.0-1 curl-7.44.0-1
curl_devel-7.43.0-1 curl_devel-7.44.0-1
cvs-1.12.13.1-6 cvs-1.12.13.1-6
cvsps-2.2b1-1 cvsps-2.2b1-1
diffutils-3.3-2 diffutils-3.3-2
@@ -90,8 +90,8 @@ RemotePackageRepository HaikuPorts
gutenprint-5.2.10-1 gutenprint-5.2.10-1
gutenprint_devel-5.2.10-1 gutenprint_devel-5.2.10-1
gzip-1.6-2 gzip-1.6-2
haikuwebkit-1.4.10-1 haikuwebkit-1.4.12-1
haikuwebkit_devel-1.4.10-1 haikuwebkit_devel-1.4.12-1
help2man-1.46.6-1 help2man-1.46.6-1
htmldoc-1.8.27-3 htmldoc-1.8.27-3
icu-55.1-4 icu-55.1-4
@@ -124,8 +124,8 @@ RemotePackageRepository HaikuPorts
liblayout_devel-1.4.2-1 liblayout_devel-1.4.2-1
libogg-1.3.0-2 libogg-1.3.0-2
libogg_devel-1.3.0-2 libogg_devel-1.3.0-2
libpcap-1.7.3-1 libpcap-1.7.4-1
libpcap_devel-1.7.3-1 libpcap_devel-1.7.4-1
libpcre-8.21-5 libpcre-8.21-5
libpcre_devel-8.21-5 libpcre_devel-8.21-5
libpng-1.5.22-1 libpng-1.5.22-1
@@ -175,12 +175,14 @@ RemotePackageRepository HaikuPorts
mpc_devel-1.0.3-1 mpc_devel-1.0.3-1
mpfr-3.1.3-1 mpfr-3.1.3-1
mpfr_devel-3.1.3-1 mpfr_devel-3.1.3-1
mpg123-1.22.3-1 mpg123-1.22.4-1
mpg123_devel-1.22.3-1 mpg123_devel-1.22.4-1
nano-2.4.2-1 nano-2.4.2-1
nasm-2.11.08-1 nasm-2.11.08-1
ncurses-5.9-10 ncurses-5.9-10
ncurses_devel-5.9-10 ncurses_devel-5.9-10
ncurses6-6.0-1
ncurses6_devel-6.0-1
neon-0.29.6-7 neon-0.29.6-7
neon_devel-0.29.6-7 neon_devel-0.29.6-7
netcat-1.10-1 netcat-1.10-1
@@ -218,7 +220,7 @@ RemotePackageRepository HaikuPorts
subversion-1.6.18-6 subversion-1.6.18-6
subversion_devel-1.6.18-6 subversion_devel-1.6.18-6
tar-1.27.1-2 tar-1.27.1-2
tcpdump-4.7.4-1 tcpdump-4.7.4-2
texinfo-4.13a-7 texinfo-4.13a-7
tiff-3.9.6-2 tiff-3.9.6-2
tiff_devel-3.9.6-2 tiff_devel-3.9.6-2
@@ -226,7 +228,7 @@ RemotePackageRepository HaikuPorts
tinyxml-2.6.2-1 tinyxml-2.6.2-1
tinyxml_devel-2.6.2-1 tinyxml_devel-2.6.2-1
transmission-2.84-3 transmission-2.84-3
unrar-5.1.5-1 unrar-5.3.2-1
unzip-6.0-2 unzip-6.0-2
vision-0.9.7.r949-3 vision-0.9.7.r949-3
vim-7.4-1 vim-7.4-1
@@ -236,7 +238,7 @@ RemotePackageRepository HaikuPorts
xml_parser-2.36-1 xml_parser-2.36-1
xz_utils-5.0.8-2 xz_utils-5.0.8-2
xz_utils_devel-5.0.8-2 xz_utils_devel-5.0.8-2
yasm-1.2.0-3 yasm-1.3.0-1
zip-3.0-2 zip-3.0-2
zlib-1.2.8-4 zlib-1.2.8-4
zlib_devel-1.2.8-4 zlib_devel-1.2.8-4
@@ -245,8 +247,8 @@ RemotePackageRepository HaikuPorts
binutils_x86_gcc2-2.17_2013_04_21-2 binutils_x86_gcc2-2.17_2013_04_21-2
bzip2_x86_gcc2-1.0.6-5 bzip2_x86_gcc2-1.0.6-5
bzip2_x86_gcc2_devel-1.0.6-5 bzip2_x86_gcc2_devel-1.0.6-5
curl_x86_gcc2-7.43.0-1 curl_x86_gcc2-7.44.0-1
curl_x86_gcc2_devel-7.43.0-1 curl_x86_gcc2_devel-7.44.0-1
expat_x86_gcc2-2.1.0-1 expat_x86_gcc2-2.1.0-1
expat_x86_gcc2_devel-2.1.0-1 expat_x86_gcc2_devel-2.1.0-1
ffmpeg_x86_gcc2-0.10.2-4 ffmpeg_x86_gcc2-0.10.2-4
@@ -303,6 +305,8 @@ RemotePackageRepository HaikuPorts
mesa_x86_gcc2_swrast-7.9.2-5 mesa_x86_gcc2_swrast-7.9.2-5
ncurses_x86_gcc2-5.9-10 ncurses_x86_gcc2-5.9-10
ncurses_x86_gcc2_devel-5.9-10 ncurses_x86_gcc2_devel-5.9-10
ncurses6_x86_gcc2-6.0-1
ncurses6_x86_gcc2_devel-6.0-1
openssl_x86_gcc2-1.0.0s-1 openssl_x86_gcc2-1.0.0s-1
openssl_x86_gcc2_devel-1.0.0s-1 openssl_x86_gcc2_devel-1.0.0s-1
pkgconfig_x86_gcc2-0.27.1-2 pkgconfig_x86_gcc2-0.27.1-2
@@ -419,6 +423,7 @@ RemotePackageRepository HaikuPorts
nano nano
nasm nasm
ncurses ncurses
ncurses6
neon neon
netcat netcat
openssh openssh
+39 -19
View File
@@ -23,7 +23,7 @@ RemotePackageRepository HaikuPorts
apr_util_devel-1.5.4-1 apr_util_devel-1.5.4-1
autoconf-2.69-6 autoconf-2.69-6
automake-1.13.1-4 automake-1.13.1-4
bash-4.3.39-1 bash-4.3.42-1
# bepdf-1.1.1~beta5_2013_04_28-1 # bepdf-1.1.1~beta5_2013_04_28-1
binutils-2.25_12015_07_31-1 binutils-2.25_12015_07_31-1
bison-2.6.5-1 bison-2.6.5-1
@@ -59,13 +59,13 @@ RemotePackageRepository HaikuPorts
clang-3.5.1-1 clang-3.5.1-1
clang_analysis-3.5.1-1 clang_analysis-3.5.1-1
clipdinger-0.4-1 clipdinger-0.4-1
cmake-3.2.3-1 cmake-3.3.1-1
coreutils-8.24-1 coreutils-8.24-1
cppunit-1.12.1-2 cppunit-1.12.1-2
cppunit_devel-1.12.1-2 cppunit_devel-1.12.1-2
ctags-5.8-3 ctags-5.8-3
curl-7.43.0-1 curl-7.44.0-1
curl_devel-7.43.0-1 curl_devel-7.44.0-1
cvs-1.12.13.1-6 cvs-1.12.13.1-6
diffutils-3.3-2 diffutils-3.3-2
dos2unix-7.2.2-1 dos2unix-7.2.2-1
@@ -88,8 +88,9 @@ RemotePackageRepository HaikuPorts
fontconfig-2.11.1-3 fontconfig-2.11.1-3
fontconfig_devel-2.11.1-3 fontconfig_devel-2.11.1-3
fossil-1.33-1 fossil-1.33-1
freetype-2.6-1 freeciv-2.5.1-1
freetype_devel-2.6-1 freetype-2.6-2
freetype_devel-2.6-2
fribidi-0.19.6-2 fribidi-0.19.6-2
fribidi_devel-0.19.6-2 fribidi_devel-0.19.6-2
gawk-4.1.0-2 gawk-4.1.0-2
@@ -128,17 +129,17 @@ RemotePackageRepository HaikuPorts
gutenprint-5.2.10-1 gutenprint-5.2.10-1
gutenprint_devel-5.2.10-1 gutenprint_devel-5.2.10-1
gzip-1.6-2 gzip-1.6-2
haikuwebkit-1.4.10-1 haikuwebkit-1.4.12-1
haikuwebkit_devel-1.4.10-1 haikuwebkit_devel-1.4.12-1
handbrake-0.10.1-1 handbrake-0.10.1-1
harfbuzz-0.9.40-1 harfbuzz-0.9.40-1
harfbuzz_devel-0.9.40-1 harfbuzz_devel-0.9.40-1
help2man-1.46.6-1 help2man-1.46.6-1
htmldoc-1.8.27-3 htmldoc-1.8.27-3
icu-55.1-3 icu-55.1-5
icu_devel-55.1-3 icu_devel-55.1-5
icu54-54.1-1 icu54-54.1-2
icu54_devel-54.1-1 icu54_devel-54.1-2
intltool-0.40.6-4 intltool-0.40.6-4
jam-2.5_2012_10_12-2 jam-2.5_2012_10_12-2
jasper-1.900.1-4 jasper-1.900.1-4
@@ -153,6 +154,8 @@ RemotePackageRepository HaikuPorts
lcms-2.7-1 lcms-2.7-1
lcms_devel-2.7-1 lcms_devel-2.7-1
less-451-4 less-451-4
libasr-1.0.2-1
libasr_devel-1.0.2-1
libass-0.12.2-1 libass-0.12.2-1
libass_devel-0.12.2-1 libass_devel-0.12.2-1
libassuan-2.2.0-1 libassuan-2.2.0-1
@@ -177,6 +180,10 @@ RemotePackageRepository HaikuPorts
libicns_devel-0.8.1-1 libicns_devel-0.8.1-1
libiconv-1.13.1-6 libiconv-1.13.1-6
libiconv_devel-1.13.1-6 libiconv_devel-1.13.1-6
libmad-0.15.1b-2
libmad_devel-0.15.1b-2
libmikmod-3.3.7-1
libmikmod_devel-3.3.7-1
libmkv-0.6.5.1-3 libmkv-0.6.5.1-3
libmkv_devel-0.6.5.1-3 libmkv_devel-0.6.5.1-3
libmp4v2-2.0.0-2 libmp4v2-2.0.0-2
@@ -185,8 +192,8 @@ RemotePackageRepository HaikuPorts
libmpeg2_devel-0.5.1-3 libmpeg2_devel-0.5.1-3
libogg-1.3.0-2 libogg-1.3.0-2
libogg_devel-1.3.0-2 libogg_devel-1.3.0-2
libpcap-1.7.3-1 libpcap-1.7.4-1
libpcap_devel-1.7.3-1 libpcap_devel-1.7.4-1
libpcre-8.21-5 libpcre-8.21-5
libpcre_devel-8.21-5 libpcre_devel-8.21-5
libpng-1.5.22-1 libpng-1.5.22-1
@@ -248,12 +255,14 @@ RemotePackageRepository HaikuPorts
mpc_devel-1.0.3-1 mpc_devel-1.0.3-1
mpfr-3.1.3-1 mpfr-3.1.3-1
mpfr_devel-3.1.3-1 mpfr_devel-3.1.3-1
mpg123-1.22.3-1 mpg123-1.22.4-1
mpg123_devel-1.22.3-1 mpg123_devel-1.22.4-1
nano-2.4.2-1 nano-2.4.2-1
nasm-2.11.08-1 nasm-2.11.08-1
ncurses-5.9-10 ncurses-5.9-10
ncurses_devel-5.9-10 ncurses_devel-5.9-10
ncurses6-6.0-1
ncurses6_devel-6.0-1
neon-0.29.6-7 neon-0.29.6-7
neon_devel-0.29.6-7 neon_devel-0.29.6-7
netcat-1.10-1 netcat-1.10-1
@@ -285,6 +294,10 @@ RemotePackageRepository HaikuPorts
sdl_gfx_devel-2.0.25-2 sdl_gfx_devel-2.0.25-2
sdl_image-1.2.12-5 sdl_image-1.2.12-5
sdl_image_devel-1.2.12-5 sdl_image_devel-1.2.12-5
sdl_mixer-1.2.12-6
sdl_mixer_devel-1.2.12-6
sdl_ttf-2.0.11-2
sdl_ttf_devel-2.0.11-2
sed-4.2.1-6 sed-4.2.1-6
serf-1.3.7-1 serf-1.3.7-1
serf_devel-1.3.7-1 serf_devel-1.3.7-1
@@ -298,7 +311,7 @@ RemotePackageRepository HaikuPorts
subversion-1.8.11-1 subversion-1.8.11-1
subversion_devel-1.8.11-1 subversion_devel-1.8.11-1
tar-1.27.1-2 tar-1.27.1-2
tcpdump-4.7.4-1 tcpdump-4.7.4-2
texinfo-4.13a-7 texinfo-4.13a-7
tiff-3.9.6-2 tiff-3.9.6-2
tiff_devel-3.9.6-2 tiff_devel-3.9.6-2
@@ -306,7 +319,7 @@ RemotePackageRepository HaikuPorts
tinyxml-2.6.2-1 tinyxml-2.6.2-1
tinyxml_devel-2.6.2-1 tinyxml_devel-2.6.2-1
transmission-2.84-3 transmission-2.84-3
unrar-5.1.5-1 unrar-5.3.2-1
unzip-6.0-2 unzip-6.0-2
vim-7.4-2 vim-7.4-2
vision-0.9.7.r949-3 vision-0.9.7.r949-3
@@ -318,7 +331,7 @@ RemotePackageRepository HaikuPorts
x264_devel-20140308-1 x264_devel-20140308-1
xz_utils-5.0.8-2 xz_utils-5.0.8-2
xz_utils_devel-5.0.8-2 xz_utils_devel-5.0.8-2
yasm-1.2.0-3 yasm-1.3.0-1
zip-3.0-2 zip-3.0-2
zlib-1.2.8-4 zlib-1.2.8-4
zlib_devel-1.2.8-4 zlib_devel-1.2.8-4
@@ -358,6 +371,7 @@ RemotePackageRepository HaikuPorts
flex flex
fontconfig fontconfig
fossil fossil
freeciv
freetype freetype
fribidi fribidi
gawk gawk
@@ -392,6 +406,7 @@ RemotePackageRepository HaikuPorts
lame lame
lcms lcms
less less
libasr
libass libass
libassuan libassuan
libbluray libbluray
@@ -404,6 +419,8 @@ RemotePackageRepository HaikuPorts
libgpg_error libgpg_error
libicns libicns
libiconv libiconv
libmad
libmikmod
libmkv libmkv
libmp4v2 libmp4v2
libmpeg2 libmpeg2
@@ -444,6 +461,7 @@ RemotePackageRepository HaikuPorts
nano nano
nasm nasm
ncurses ncurses
ncurses6
neon neon
netcat netcat
ninja ninja
@@ -466,6 +484,8 @@ RemotePackageRepository HaikuPorts
scons scons
sdl_gfx sdl_gfx
sdl_image sdl_image
sdl_mixer
sdl_ttf
sed sed
serf serf
sharutils sharutils
+55 -26
View File
@@ -14,6 +14,8 @@ RemotePackageRepository HaikuPorts
droid-113-1 droid-113-1
flare_x86_data-0.19-3 flare_x86_data-0.19-3
freedroidrpg_x86_data-0.15.1-1 freedroidrpg_x86_data-0.15.1-1
gws-0.1.8-1
haikuporter-1.0.0-1
hub-1.12.4-1 hub-1.12.4-1
openttd_gfx-0.4.7-1 openttd_gfx-0.4.7-1
openttd_msx-0.3.1-1 openttd_msx-0.3.1-1
@@ -43,7 +45,7 @@ RemotePackageRepository HaikuPorts
autoconf-2.69-5 autoconf-2.69-5
automake-1.13.1-4 automake-1.13.1-4
avra-1.3.0-1 avra-1.3.0-1
bash-4.3.39-1 bash-4.3.42-1
beae-1.2-3 beae-1.2-3
beam-1.2-1 beam-1.2-1
becjk-1.0.1-1 becjk-1.0.1-1
@@ -52,7 +54,7 @@ RemotePackageRepository HaikuPorts
belife-1.0.0-2 belife-1.0.0-2
bemines-1.0b2-1 bemines-1.0b2-1
bepdf-1.2.0-1 bepdf-1.2.0-1
bepodder-1.3.0-1 bepodder-1.3.0-2
bescreencapture-1.9.4-1 bescreencapture-1.9.4-1
bezilla-2.0.0.22-1 bezilla-2.0.0.22-1
binutils-2.17_2013_04_21-2 binutils-2.17_2013_04_21-2
@@ -79,8 +81,8 @@ RemotePackageRepository HaikuPorts
ctags-5.8-3 ctags-5.8-3
colors-2.3-1 colors-2.3-1
coreutils-8.24-1 coreutils-8.24-1
curl-7.43.0-1 curl-7.44.0-1
curl_devel-7.43.0-1 curl_devel-7.44.0-1
cvs-1.12.13.1-6 cvs-1.12.13.1-6
d52-3.4.1-1 d52-3.4.1-1
desknotes-1.1-4 desknotes-1.1-4
@@ -162,6 +164,7 @@ RemotePackageRepository HaikuPorts
gperf-3.0.4-1 gperf-3.0.4-1
gpgme-1.5.2-2 gpgme-1.5.2-2
gpgme_devel-1.5.2-2 gpgme_devel-1.5.2-2
grafx2-2.5-2
grep-2.20-1 grep-2.20-1
groff-1.20.1-3 groff-1.20.1-3
gtk_doc-1.20-1 gtk_doc-1.20-1
@@ -182,6 +185,7 @@ RemotePackageRepository HaikuPorts
imagemagick_devel-6.8.9_8-1 imagemagick_devel-6.8.9_8-1
intltool-0.40.6-4 intltool-0.40.6-4
itstool-2.0.2-1 itstool-2.0.2-1
jabber4haiku-1.2.1-1
jam-2.5_2012_10_12-2 jam-2.5_2012_10_12-2
jasper-1.900.1-4 jasper-1.900.1-4
jasper_devel-1.900.1-4 jasper_devel-1.900.1-4
@@ -260,8 +264,8 @@ RemotePackageRepository HaikuPorts
libogg_devel-1.3.0-2 libogg_devel-1.3.0-2
libpaper-1.1.24-1 libpaper-1.1.24-1
libpaper_devel-1.1.24-1 libpaper_devel-1.1.24-1
libpcap-1.7.3-1 libpcap-1.7.4-1
libpcap_devel-1.7.3-1 libpcap_devel-1.7.4-1
libpcre-8.21-5 libpcre-8.21-5
libpcre_devel-8.21-5 libpcre_devel-8.21-5
libpng-1.5.22-1 libpng-1.5.22-1
@@ -308,15 +312,15 @@ RemotePackageRepository HaikuPorts
libxml2-2.8.0-9 libxml2-2.8.0-9
libxml2_devel-2.8.0-9 libxml2_devel-2.8.0-9
libxml2_python-2.8.0-9 libxml2_python-2.8.0-9
libxslt-1.1.28-4 libxslt-1.1.28-5
libxslt_devel-1.1.28-4 libxslt_devel-1.1.28-5
libzip-0.11.2-1 libzip-0.11.2-1
libzip_devel-0.11.2-1 libzip_devel-0.11.2-1
lighttpd-1.4.35-2 lighttpd-1.4.35-2
lighttpd_devel-1.4.35-2 lighttpd_devel-1.4.35-2
links-2.8-1 links-2.8-1
lmarbles-1.0.8-2 lmarbles-1.0.8-2
lnlauncher-1.1.2-1 lnlauncher-1.1.2-2
ltris-1.0.19-1 ltris-1.0.19-1
lua-5.2.1-6 lua-5.2.1-6
lua_devel-5.2.1-6 lua_devel-5.2.1-6
@@ -343,8 +347,8 @@ RemotePackageRepository HaikuPorts
moe-1.1.2-1 moe-1.1.2-1
mog-0.63.1548-1 mog-0.63.1548-1
most-pre5.1_15-1 most-pre5.1_15-1
mpg123-1.22.3-1 mpg123-1.22.4-1
mpg123_devel-1.22.3-1 mpg123_devel-1.22.4-1
mtr-0.73-1 mtr-0.73-1
multitalk-1.4-1 multitalk-1.4-1
mupdf-1.7-1 mupdf-1.7-1
@@ -356,6 +360,8 @@ RemotePackageRepository HaikuPorts
nasm-2.11.08-1 nasm-2.11.08-1
ncurses-5.9-9 ncurses-5.9-9
ncurses_devel-5.9-9 ncurses_devel-5.9-9
ncurses6-6.0-1
ncurses6_devel-6.0-1
neon-0.29.6-6 neon-0.29.6-6
neon_devel-0.29.6-6 neon_devel-0.29.6-6
netcat-1.10-1 netcat-1.10-1
@@ -464,7 +470,7 @@ RemotePackageRepository HaikuPorts
tar-1.26-6 tar-1.26-6
tcl-8.5.18-1 tcl-8.5.18-1
tcl_devel-8.5.18-1 tcl_devel-8.5.18-1
tcpdump-4.7.4-1 tcpdump-4.7.4-2
texinfo-4.13a-7 texinfo-4.13a-7
tiff-3.9.6-2 tiff-3.9.6-2
tiff_devel-3.9.6-2 tiff_devel-3.9.6-2
@@ -474,7 +480,7 @@ RemotePackageRepository HaikuPorts
twolame-0.3.13-1 twolame-0.3.13-1
twolame_devel-0.3.13-1 twolame_devel-0.3.13-1
ubertuber-0.9.11-1 ubertuber-0.9.11-1
unrar-5.2.6-1 unrar-5.3.2-1
unzip-6.0-2 unzip-6.0-2
util_macros-1.19.0-2 util_macros-1.19.0-2
vasm-1.7c-1 vasm-1.7c-1
@@ -499,7 +505,7 @@ RemotePackageRepository HaikuPorts
xrick-021212-2 xrick-021212-2
yab-1.7.5-2 yab-1.7.5-2
yab_ide-2.2.5-1 yab_ide-2.2.5-1
yasm-1.2.0-3 yasm-1.3.0-1
zip-3.0-2 zip-3.0-2
zlib-1.2.8-4 zlib-1.2.8-4
zlib_devel-1.2.8-4 zlib_devel-1.2.8-4
@@ -547,14 +553,16 @@ RemotePackageRepository HaikuPorts
burnitnow_x86-0.1.0-1 burnitnow_x86-0.1.0-1
bzip2_x86-1.0.6-5 bzip2_x86-1.0.6-5
bzip2_x86_devel-1.0.6-5 bzip2_x86_devel-1.0.6-5
cairo_x86-1.12.18-1
cairo_x86_devel-1.12.18-1
capstone_x86-3.0.4-1 capstone_x86-3.0.4-1
capstone_x86_devel-3.0.4-1 capstone_x86_devel-3.0.4-1
cmake_x86-3.2.3-1 cmake_x86-3.3.1-1
confuse_x86-2.7-2 confuse_x86-2.7-2
confuse_x86_devel-2.7-2 confuse_x86_devel-2.7-2
copynametoclipboard-1.0.1-2 copynametoclipboard-1.0.1-2
curl_x86-7.43.0-1 curl_x86-7.44.0-1
curl_x86_devel-7.43.0-1 curl_x86_devel-7.44.0-1
cvsps_x86-2.2b1-1 cvsps_x86-2.2b1-1
dbus_x86-1.8.6-1 dbus_x86-1.8.6-1
dbus_x86_devel-1.8.6-1 dbus_x86_devel-1.8.6-1
@@ -584,8 +592,8 @@ RemotePackageRepository HaikuPorts
flare_x86-0.19-3 flare_x86-0.19-3
fluidsynth_x86-1.1.6-2 fluidsynth_x86-1.1.6-2
fluidsynth_x86_devel-1.1.6-2 fluidsynth_x86_devel-1.1.6-2
fontconfig_x86-2.11.1-2 fontconfig_x86-2.11.1-3
fontconfig_x86_devel-2.11.1-2 fontconfig_x86_devel-2.11.1-3
freedroidrpg_x86-0.15.1-1 freedroidrpg_x86-0.15.1-1
freetype_x86-2.6-1 freetype_x86-2.6-1
freetype_x86_devel-2.6-1 freetype_x86_devel-2.6-1
@@ -595,6 +603,8 @@ RemotePackageRepository HaikuPorts
gcc_x86_syslibs-4.8.5_2015_07_11-2 gcc_x86_syslibs-4.8.5_2015_07_11-2
gcc_x86_syslibs_devel-4.8.5_2015_07_11-2 gcc_x86_syslibs_devel-4.8.5_2015_07_11-2
gcc6809_x86-4.6.1-2 gcc6809_x86-4.6.1-2
gdk_pixbuf_x86-2.31.5-1
gdk_pixbuf_x86_devel-2.31.5-1
gettext_x86-0.18.1.1-6 gettext_x86-0.18.1.1-6
gettext_x86_libintl-0.18.1.1-6 gettext_x86_libintl-0.18.1.1-6
giflib_x86-5.1.0-1 giflib_x86-5.1.0-1
@@ -616,8 +626,8 @@ RemotePackageRepository HaikuPorts
graphite2_x86_devel-1.2.4-1 graphite2_x86_devel-1.2.4-1
guilib_x86-1.2.1-1 guilib_x86-1.2.1-1
guilib_x86_devel-1.2.1-1 guilib_x86_devel-1.2.1-1
haikuwebkit_x86-1.4.11-1 haikuwebkit_x86-1.4.12-1
haikuwebkit_x86_devel-1.4.11-1 haikuwebkit_x86_devel-1.4.12-1
harfbuzz_x86-0.9.39-1 harfbuzz_x86-0.9.39-1
harfbuzz_x86_devel-0.9.39-1 harfbuzz_x86_devel-0.9.39-1
icu_x86-55.1-1 icu_x86-55.1-1
@@ -721,6 +731,8 @@ RemotePackageRepository HaikuPorts
libtheora_x86_devel-1.1.1-2 libtheora_x86_devel-1.1.1-2
libtool_x86-2.4.2-1 libtool_x86-2.4.2-1
libtool_x86_libltdl-2.4.2-1 libtool_x86_libltdl-2.4.2-1
libtorrent_rasterbar_x86-1.0.6-1
libtorrent_rasterbar_x86_devel-1.0.6-1
libusb_x86-1.0.18-1 libusb_x86-1.0.18-1
libusb_x86_devel-1.0.18-1 libusb_x86_devel-1.0.18-1
libuuid_x86-1.0.3-2 libuuid_x86-1.0.3-2
@@ -733,8 +745,8 @@ RemotePackageRepository HaikuPorts
libwebp_x86_devel-0.4.1-1 libwebp_x86_devel-0.4.1-1
libxml2_x86-2.9.2-1 libxml2_x86-2.9.2-1
libxml2_x86_devel-2.9.2-1 libxml2_x86_devel-2.9.2-1
libxslt_x86-1.1.28-2 libxslt_x86-1.1.28-5
libxslt_x86_devel-1.1.28-2 libxslt_x86_devel-1.1.28-5
libzip_x86-0.11.2-1 libzip_x86-0.11.2-1
libzip_x86_devel-0.11.2-1 libzip_x86_devel-0.11.2-1
llvm_x86-3.5.2-1 llvm_x86-3.5.2-1
@@ -759,8 +771,8 @@ RemotePackageRepository HaikuPorts
mpd_x86-0.18.12_git-1 mpd_x86-0.18.12_git-1
mpfr_x86-3.1.3-1 mpfr_x86-3.1.3-1
mpfr_x86_devel-3.1.3-1 mpfr_x86_devel-3.1.3-1
mpg123_x86-1.22.3-1 mpg123_x86-1.22.4-1
mpg123_x86_devel-1.22.3-1 mpg123_x86_devel-1.22.4-1
mplayer_x86-1.1.1-3 mplayer_x86-1.1.1-3
mupdf_x86-1.7-1 mupdf_x86-1.7-1
mupdf_x86_devel-1.7-1 mupdf_x86_devel-1.7-1
@@ -768,6 +780,8 @@ RemotePackageRepository HaikuPorts
musicpc_x86-0.26-1 musicpc_x86-0.26-1
ncurses_x86-5.9-9 ncurses_x86-5.9-9
ncurses_x86_devel-5.9-9 ncurses_x86_devel-5.9-9
ncurses6_x86-6.0-1
ncurses6_x86_devel-6.0-1
ninja_x86-1.5.1-2 ninja_x86-1.5.1-2
ocp_x86-0.1.21_git-1 ocp_x86-0.1.21_git-1
openal_x86-1.13.0-2 openal_x86-1.13.0-2
@@ -780,6 +794,8 @@ RemotePackageRepository HaikuPorts
openssl_x86-1.0.0s-1 openssl_x86-1.0.0s-1
openssl_x86_devel-1.0.0s-1 openssl_x86_devel-1.0.0s-1
openttd_x86-1.3.3-1 openttd_x86-1.3.3-1
pango_x86-1.37.0-1
pango_x86_devel-1.37.0-1
pciutils_x86-3.2.1-1 pciutils_x86-3.2.1-1
pciutils_x86_devel-3.2.1-1 pciutils_x86_devel-3.2.1-1
physfs_x86-2.0.3-1 physfs_x86-2.0.3-1
@@ -792,6 +808,7 @@ RemotePackageRepository HaikuPorts
protrekkr_x86-2.5.4-2 protrekkr_x86-2.5.4-2
popt_x86-1.16-1 popt_x86-1.16-1
popt_x86_devel-1.16-1 popt_x86_devel-1.16-1
qbittorrent_x86-3.2.3-2
qemu_x86-2.1.2-1 qemu_x86-2.1.2-1
qca2_x86-2.0.3-1 qca2_x86-2.0.3-1
qca2_x86_devel-2.0.3-1 qca2_x86_devel-2.0.3-1
@@ -799,7 +816,7 @@ RemotePackageRepository HaikuPorts
qjson_x86_devel-0.8.1-1 qjson_x86_devel-0.8.1-1
qmplay2_x86-15.05.30-2 qmplay2_x86-15.05.30-2
quassel_x86-0.10.0-2 quassel_x86-0.10.0-2
quicklaunch-0.9.10-1 quicklaunch-0.9.11-1
qupzilla_x86-1.8.6-1 qupzilla_x86-1.8.6-1
radare2_x86-0.9.9-1 radare2_x86-0.9.9-1
radare2_x86_devel-0.9.9-1 radare2_x86_devel-0.9.9-1
@@ -854,6 +871,8 @@ RemotePackageRepository HaikuPorts
vacuum_x86-1.2.5-1 vacuum_x86-1.2.5-1
vcmi_x86-0.94-1 vcmi_x86-0.94-1
wizznic_x86-0.9.9-2 wizznic_x86-0.9.9-2
xmlroff_x86-0.6.2-2
xmlroff_x86_devel-0.6.2-2
xz_utils_x86-5.0.8-2 xz_utils_x86-5.0.8-2
xz_utils_x86_devel-5.0.8-2 xz_utils_x86_devel-5.0.8-2
zlib_x86-1.2.8-4 zlib_x86-1.2.8-4
@@ -908,6 +927,7 @@ RemotePackageRepository HaikuPorts
burnitnow_x86 burnitnow_x86
bzip2 bzip2
bzr bzr
cairo_x86
canna canna
capitalbe capitalbe
capstone_x86 capstone_x86
@@ -988,6 +1008,7 @@ RemotePackageRepository HaikuPorts
gettext gettext
gettext_x86 gettext_x86
gdb gdb
gdk_pixbuf_x86
giflib giflib
git git
glew glew
@@ -1002,6 +1023,7 @@ RemotePackageRepository HaikuPorts
gperf gperf
gpgme gpgme
gpgme_x86 gpgme_x86
grafx2
graphite2_x86 graphite2_x86
grep grep
groff groff
@@ -1010,6 +1032,7 @@ RemotePackageRepository HaikuPorts
gutenprint gutenprint
gyp gyp
gzip gzip
haikuporter
haikuwebkit_x86 haikuwebkit_x86
harfbuzz_x86 harfbuzz_x86
help2man help2man
@@ -1021,6 +1044,7 @@ RemotePackageRepository HaikuPorts
imagemagick imagemagick
intltool intltool
itstool itstool
jabber4haiku
jam jam
jasper jasper
jbig2dec jbig2dec
@@ -1106,6 +1130,7 @@ RemotePackageRepository HaikuPorts
libtheora libtheora
libtool libtool
libtool_x86 libtool_x86
libtorrent_rasterbar_x86
libunistring libunistring
libusb libusb
libusb_x86 libusb_x86
@@ -1172,6 +1197,7 @@ RemotePackageRepository HaikuPorts
nano nano
nasm nasm
ncurses ncurses
ncurses6
neon neon
netcat netcat
netpulse netpulse
@@ -1189,6 +1215,7 @@ RemotePackageRepository HaikuPorts
openttd_x86 openttd_x86
p7zip p7zip
paladin paladin
pango_x86
paragui paragui
patch patch
pciutils pciutils
@@ -1217,6 +1244,7 @@ RemotePackageRepository HaikuPorts
python_setuptools python_setuptools
python_twisted python_twisted
python_zope.interface python_zope.interface
qbittorrent_x86
qemacs qemacs
qemu_x86 qemu_x86
qca2_x86 qca2_x86
@@ -1305,6 +1333,7 @@ RemotePackageRepository HaikuPorts
yasm yasm
youtube_dl youtube_dl
xcb_proto xcb_proto
xmlroff_x86
xmlto xmlto
xml_parser xml_parser
xproto xproto
@@ -2,7 +2,7 @@
Enable query support BFS_Initialize_Parameter Activer le support des requêtes Enable query support BFS_Initialize_Parameter Activer le support des requêtes
2048 (Recommended) BFS_Initialize_Parameter 2048 (Recommandé) 2048 (Recommended) BFS_Initialize_Parameter 2048 (Recommandé)
8192 (Mostly large files) BFS_Initialize_Parameter 8192 (Surtout des gros fichiers) 8192 (Mostly large files) BFS_Initialize_Parameter 8192 (Surtout des gros fichiers)
Disabling query support may speed up certain file system operations, but should only be used if one is absolutely certain that one will not need queries.\nAny volume that is intended for booting Haiku must have query support enabled. BFS_Initialize_Parameter Désactiver le support des requête peut accélérer certaines opérations du système de fichiers, mais vous devez être certains de ne jamais avoir besoin des requêtes.\nTout volume destiné à amorcer Haiku doit avoir le support des requête activé. Disabling query support may speed up certain file system operations, but should only be used if one is absolutely certain that one will not need queries.\nAny volume that is intended for booting Haiku must have query support enabled. BFS_Initialize_Parameter Désactiver le support des requêtes peut accélérer certaines opérations du système de fichiers, mais vous devez être certain de ne jamais avoir besoin des requêtes.\nTout volume destiné à amorcer Haiku doit avoir le support des requêtes activé.
1024 (Mostly small files) BFS_Initialize_Parameter 1024 (Surtout des petits fichiers) 1024 (Mostly small files) BFS_Initialize_Parameter 1024 (Surtout des petits fichiers)
Blocksize: BFS_Initialize_Parameter Taille de bloc : Blocksize: BFS_Initialize_Parameter Taille de bloc :
Name: BFS_Initialize_Parameter Nom : Name: BFS_Initialize_Parameter Nom :
@@ -7,7 +7,7 @@ Output mapping AudioMixer Correspondances de sorties
Allow input channel remapping AudioMixer Autoriser la réassignation des canaux dentrées Allow input channel remapping AudioMixer Autoriser la réassignation des canaux dentrées
Resampling algorithm AudioMixer Algorithme de ré-échantillonnage Resampling algorithm AudioMixer Algorithme de ré-échantillonnage
Attenuate mixer output by 3dB (like BeOS R5) AudioMixer Atténuer la sortie du mélangeur de 3 dB (comme BeOS R5) Attenuate mixer output by 3dB (like BeOS R5) AudioMixer Atténuer la sortie du mélangeur de 3 dB (comme BeOS R5)
Display balance control for stereo connections AudioMixer Afficher le contrôle de balance pour des connexions stéréo Display balance control for stereo connections AudioMixer Afficher le contrôle de balance pour les connexions stéréo
To output AudioMixer Vers la sortie To output AudioMixer Vers la sortie
not connected AudioMixer débranché not connected AudioMixer débranché
Refuse input format changes AudioMixer Refuser les changements de formats dentrées Refuse input format changes AudioMixer Refuser les changements de formats dentrées
@@ -17,11 +17,11 @@ dB AudioMixer dB
Gain controls AudioMixer Contrôles de gain Gain controls AudioMixer Contrôles de gain
Input mapping AudioMixer Correspondances dentrées Input mapping AudioMixer Correspondances dentrées
Mute AudioMixer Sourdine Mute AudioMixer Sourdine
Input channel destinations AudioMixer Destination des canaux dentrées Input channel destinations AudioMixer Destinations des canaux dentrées
To master AudioMixer Vers la sortie principale To master AudioMixer Vers la sortie principale
Master output AudioMixer Sortie principale Master output AudioMixer Sortie principale
Setup AudioMixer Réglages Setup AudioMixer Réglages
Use non linear gain sliders (like BeOS R5) AudioMixer Utiliser les curseurs de gain non-linéaire (comme BeOS R5) Use non linear gain sliders (like BeOS R5) AudioMixer Utiliser les curseurs de gain non-linéaires (comme BeOS R5)
Gain AudioMixer Gain Gain AudioMixer Gain
Allow output channel remapping AudioMixer Autoriser la réassignation des canaux de sorties Allow output channel remapping AudioMixer Autoriser la réassignation des canaux de sorties
Physical input channels AudioMixer Canaux dentrées physiques Physical input channels AudioMixer Canaux dentrées physiques
@@ -1,2 +1,10 @@
1 hungarian x-vnd.Haiku-DNSClientService 3886749326 1 hungarian x-vnd.Haiku-DNSClientService 2825577357
DNS settings DNSClientServiceAddOn DNS-beállítások
Move down DNSSettingsView Mozgatás lefelé
DNS settings DNSSettingsView DNS-beállítások
Remove DNSSettingsView Eltávolítás
Domain: DNSSettingsView Tartomány: Domain: DNSSettingsView Tartomány:
Add DNSSettingsView Hozzáad
Server: DNSSettingsView Kiszolgáló:
Move up DNSSettingsView Mozgatás felfelé
Apply DNSSettingsView Alkalmaz
@@ -0,0 +1,2 @@
1 hungarian x-vnd.Haiku-IPv4Interface 2854844856
IPv4 IPv4InterfaceAddOn IPv4
@@ -0,0 +1,2 @@
1 hungarian x-vnd.Haiku-IPv6Interface 1391114020
IPv6 IPv6InterfaceAddOn IPv6
+3 -1
View File
@@ -1,4 +1,4 @@
1 russian x-vnd.Haiku-About 14540716 1 russian x-vnd.Haiku-About 3251436090
Copyright © 1999-2010 by the authors of Gutenprint. All rights reserved. AboutView Все права защищены © 1999-2010 авторы Gutenprint. Copyright © 1999-2010 by the authors of Gutenprint. All rights reserved. AboutView Все права защищены © 1999-2010 авторы Gutenprint.
Copyright © 1996-2002, 2006 David Turner, Robert Wilhelm and Werner Lemberg. AboutView Все права защищены © 1996-2002, 2006 David Turner, Robert Wilhelm и Werner Lemberg. Copyright © 1996-2002, 2006 David Turner, Robert Wilhelm and Werner Lemberg. AboutView Все права защищены © 1996-2002, 2006 David Turner, Robert Wilhelm и Werner Lemberg.
Past website & marketing:\n AboutView Старый вебсайт и маркетинг:\n Past website & marketing:\n AboutView Старый вебсайт и маркетинг:\n
@@ -8,6 +8,7 @@ Copyright © 1996-2005 Julian R Seward. All rights reserved. AboutView Все
%d MiB total AboutView Всего %d МБ %d MiB total AboutView Всего %d МБ
Michael Phipps (project founder)\n\n AboutView Michael Phipps (основателю проекта)\n\n Michael Phipps (project founder)\n\n AboutView Michael Phipps (основателю проекта)\n\n
%d MiB used (%d%%) AboutView %d МБ использовано (%d%%) %d MiB used (%d%%) AboutView %d МБ использовано (%d%%)
Contains software from the GNU Project, released under the GPL and LGPL licenses:\nGNU C Library, GNU coretools, diffutils, findutils, sharutils, gawk, bison, m4, make, wget, ncurses, termcap, Bourne Again Shell.\nCopyright © The Free Software Foundation. AboutView Содержит программное обеспечение из проекта GNU, выпущен под лицензиями GPL и LGPL:\nGNU библиотека, GNU coretools, diffutils, findutils, sharutils, gawk, bison, m4, make, wget, ncurses, termcap, Bourne Again Shell.\n\nВсе права защищены © Фонд свободного программного обеспечения.
AboutSystem System name О системе AboutSystem System name О системе
Copyright © 2003 Peter Hanappe and others. AboutView Все права защищены © 2003 Peter Hanappe и другие. Copyright © 2003 Peter Hanappe and others. AboutView Все права защищены © 2003 Peter Hanappe и другие.
Copyright © 1994-1997 Mark Kilgard. All rights reserved. AboutView Все права защищены © 1994-1997 Mark Kilgard. Copyright © 1994-1997 Mark Kilgard. All rights reserved. AboutView Все права защищены © 1994-1997 Mark Kilgard.
@@ -40,6 +41,7 @@ Copyright © 1996-1997 Jeff Prosise. All rights reserved. AboutView Все пр
Copyright © 2006-2012 Kentaro Fukuchi AboutView Все права защищены © 2006-2012 Kentaro Fukuchi Copyright © 2006-2012 Kentaro Fukuchi AboutView Все права защищены © 2006-2012 Kentaro Fukuchi
Copyright © 1994-2009, Thomas G. Lane, Guido Vollbeding. This software is based in part on the work of the Independent JPEG Group. AboutView Все права защищены © 1994-2009, Thomas G. Lane, Guido Vollbeding. Это программное обеспечение частично основано на работе Independent JPEG Group. Copyright © 1994-2009, Thomas G. Lane, Guido Vollbeding. This software is based in part on the work of the Independent JPEG Group. AboutView Все права защищены © 1994-2009, Thomas G. Lane, Guido Vollbeding. Это программное обеспечение частично основано на работе Independent JPEG Group.
Past maintainers:\n AboutView Предыдущие разработчики:\n Past maintainers:\n AboutView Предыдущие разработчики:\n
Contains software from the FreeBSD Project, released under the BSD license:\nftpd, ping, telnet, telnetd, traceroute\nCopyright © 1994-2008 The FreeBSD Project. All rights reserved. AboutView Содержит программное обеспечение из проекта FreeBSD, выпущен под лицензией BSD:\ncal, ftpd, ping, telnet, telnetd, tracerout\nВсе права защищены © 1994-2008 Проект FreeBSD.
GNU GPL v3 AboutWindow GNU GPL v3 GNU GPL v3 AboutWindow GNU GPL v3
\n\nSpecial thanks to:\n AboutView \n\nОсобая благодарность:\n \n\nSpecial thanks to:\n AboutView \n\nОсобая благодарность:\n
\n…and probably some more we forgot to mention (sorry!)\n\n AboutView \n…а также те, кого мы забыли упомянуть (простите!)\n\n \n…and probably some more we forgot to mention (sorry!)\n\n AboutView \n…а также те, кого мы забыли упомянуть (простите!)\n\n
+2 -1
View File
@@ -1,4 +1,4 @@
1 russian x-vnd.Haiku-DriveSetup 1450212098 1 russian x-vnd.Haiku-DriveSetup 2321187933
DriveSetup System name Разметка диска DriveSetup System name Разметка диска
Could not acquire partitioning information. MainWindow Невозможно получить информацию о разделах. Could not acquire partitioning information. MainWindow Невозможно получить информацию о разделах.
Cancel AbstractParametersPanel Отмена Cancel AbstractParametersPanel Отмена
@@ -44,6 +44,7 @@ Change ChangeParametersPanel Изменить
Are you sure you want to write the changes back to disk now?\n\nAll data on the disk %s will be irretrievably lost if you do so! MainWindow Вы уверены, что хотите записать изменения на диск прямо сейчас?\n\nВсе данные на диске %s будут безвозвратно потеряны, если вы продолжите! Are you sure you want to write the changes back to disk now?\n\nAll data on the disk %s will be irretrievably lost if you do so! MainWindow Вы уверены, что хотите записать изменения на диск прямо сейчас?\n\nВсе данные на диске %s будут безвозвратно потеряны, если вы продолжите!
Are you sure you want to delete the selected partition?\n\nAll data on the partition will be irretrievably lost if you do so! MainWindow Вы уверены, что хотите удалить выбранный раздел?\n\nВсе данные на этом разделе будут безвозвратно потеряны, если вы продолжите! Are you sure you want to delete the selected partition?\n\nAll data on the partition will be irretrievably lost if you do so! MainWindow Вы уверены, что хотите удалить выбранный раздел?\n\nВсе данные на этом разделе будут безвозвратно потеряны, если вы продолжите!
Create… MainWindow Создать… Create… MainWindow Создать…
Are you sure you want to format a raw disk? (Most people initialize the disk with a partitioning system first) You will be asked again before changes are written to the disk. MainWindow Вы уверены, что хотите отформатировать весь диск? (Обычно на диске сначала создаются разделы) Повторный запрос будет выдан непосредственно перед записью изменений на диск.
The disk has been successfully initialized.\n MainWindow Диск был успешно инициализирован.\n The disk has been successfully initialized.\n MainWindow Диск был успешно инициализирован.\n
Could not unmount partition %s. MainWindow Невозможно отключить раздел %s. Could not unmount partition %s. MainWindow Невозможно отключить раздел %s.
Failed to change the parameters of the partition. No changes have been written to disk. MainWindow Не удалось изменить параметры раздела. Изменения не были записаны на диск. Failed to change the parameters of the partition. No changes have been written to disk. MainWindow Не удалось изменить параметры раздела. Изменения не были записаны на диск.
+2 -1
View File
@@ -1,4 +1,4 @@
1 portuguese (brazil) x-vnd.Haiku-HaikuDepot 3134988464 1 portuguese (brazil) x-vnd.Haiku-HaikuDepot 4123398005
Name PackageListView Nome Name PackageListView Nome
Available packages MainWindow Pacotes disponíveis Available packages MainWindow Pacotes disponíveis
Open %DeskbarLink% PackageManager Abrir %DeskbarLink% Open %DeskbarLink% PackageManager Abrir %DeskbarLink%
@@ -133,6 +133,7 @@ If you do not provide an email address, you will not be able to reset your passw
Authentication failed. Connection to the service failed. UserLoginWindow Autenticação falhou. Conexão ao serviço falhou. Authentication failed. Connection to the service failed. UserLoginWindow Autenticação falhou. Conexão ao serviço falhou.
Cancel RatePackageWindow Cancelar Cancel RatePackageWindow Cancelar
Package action failed PackageInfoView Ação do pacote falhou Package action failed PackageInfoView Ação do pacote falhou
OK UserLoginWindow OK
Send RatePackageWindow Enviar Send RatePackageWindow Enviar
Failed to create account UserLoginWindow Falhou ao criar conta Failed to create account UserLoginWindow Falhou ao criar conta
There are problems with the data you entered:\n\n UserLoginWindow Existem problemas com os dados que você inseriu:\n\n There are problems with the data you entered:\n\n UserLoginWindow Existem problemas com os dados que você inseriu:\n\n
+4 -1
View File
@@ -1,4 +1,4 @@
1 russian x-vnd.Haiku-HaikuDepot 3588353727 1 russian x-vnd.Haiku-HaikuDepot 4273323974
Name PackageListView Имя Name PackageListView Имя
Available packages MainWindow Доступные пакеты Available packages MainWindow Доступные пакеты
Open %DeskbarLink% PackageManager Открыть %DeskbarLink% Open %DeskbarLink% PackageManager Открыть %DeskbarLink%
@@ -53,6 +53,7 @@ The user name needs to be at least 3 letters long. UserLoginWindow Имя по
Log in UserLoginWindow Войти… Log in UserLoginWindow Войти…
Repeat pass phrase: UserLoginWindow Повторить пароль: Repeat pass phrase: UserLoginWindow Повторить пароль:
Ratings PackageInfoView Оценки Ratings PackageInfoView Оценки
But none could be listed here, sorry. UserLoginWindow Но не удалось определить с какими именно, извините.
System & Utilities Model Система и утилиты System & Utilities Model Система и утилиты
Inactive PackageListView Неактивный Inactive PackageListView Неактивный
Refresh depots MainWindow Обновить склады Refresh depots MainWindow Обновить склады
@@ -89,6 +90,7 @@ Failed to create or update rating: %s\n RatePackageWindow Не удалось
You need to be logged into an account before you can rate packages. MainWindow Вы должны войти в свою учётную запись перед тем как оценить пакет. You need to be logged into an account before you can rate packages. MainWindow Вы должны войти в свою учётную запись перед тем как оценить пакет.
It responded with: RatePackageWindow Он ответил так: It responded with: RatePackageWindow Он ответил так:
User name: UserLoginWindow Имя пользователя: User name: UserLoginWindow Имя пользователя:
User Menu MainWindow Меню пользователя
Unstable but usable RatePackageWindow Нестабилен, но пригодный для использования Unstable but usable RatePackageWindow Нестабилен, но пригодный для использования
The email address appears to be malformed. UserLoginWindow Некорректный адрес электронной почты. The email address appears to be malformed. UserLoginWindow Некорректный адрес электронной почты.
Games Model Игры Games Model Игры
@@ -131,6 +133,7 @@ If you do not provide an email address, you will not be able to reset your passw
It responded with: UserLoginWindow Он ответил так: It responded with: UserLoginWindow Он ответил так:
Authentication failed. Connection to the service failed. UserLoginWindow Неверный логин/пароль. Соединение с сервисом прервано. Authentication failed. Connection to the service failed. UserLoginWindow Неверный логин/пароль. Соединение с сервисом прервано.
Cancel RatePackageWindow Отмена Cancel RatePackageWindow Отмена
Package action failed PackageInfoView Действие с пакетом не удалось.
OK UserLoginWindow OK OK UserLoginWindow OK
Send RatePackageWindow Отправить Send RatePackageWindow Отправить
- no package size - - no package size -
+2 -1
View File
@@ -1,4 +1,4 @@
1 hungarian x-vnd.Be-MAIL 233997769 1 hungarian x-vnd.Be-MAIL 1310033600
View Mail Nézet View Mail Nézet
%d - Date Mail %d - dátum %d - Date Mail %d - dátum
Attach attributes: Mail Jellemzők csatolása: Attach attributes: Mail Jellemzők csatolása:
@@ -146,6 +146,7 @@ Open attachment Mail Megnyitás
sent B_USER_DIRECTORY/mail/sent Elküldött sent B_USER_DIRECTORY/mail/sent Elküldött
(Date unavailable) Mail (A dátum nem elérhető) (Date unavailable) Mail (A dátum nem elérhető)
Put your favorite e-mail queries and query templates in this folder. Mail Helyezze a kedvenc lekérdezéseket és a lekérdezési sablonokat ebbe a mappába. Put your favorite e-mail queries and query templates in this folder. Mail Helyezze a kedvenc lekérdezéseket és a lekérdezési sablonokat ebbe a mappába.
Spam Mail Levélszemét
Reply Mail Válasz Reply Mail Válasz
From: Mail Feladó: From: Mail Feladó:
Couldn't open this signature. Sorry. Mail Sajnálom, de nem nyitható meg ez az aláírás. Couldn't open this signature. Sorry. Mail Sajnálom, de nem nyitható meg ez az aláírás.
+2 -1
View File
@@ -1,4 +1,4 @@
1 polish x-vnd.Be-MAIL 233997769 1 polish x-vnd.Be-MAIL 1310033600
View Mail Widok View Mail Widok
%d - Date Mail %d - Data %d - Date Mail %d - Data
Attach attributes: Mail Dołączaj atrybuty: Attach attributes: Mail Dołączaj atrybuty:
@@ -146,6 +146,7 @@ Open attachment Mail Otwórz załącznik
sent B_USER_DIRECTORY/mail/sent sent sent B_USER_DIRECTORY/mail/sent sent
(Date unavailable) Mail (Data niedostępna) (Date unavailable) Mail (Data niedostępna)
Put your favorite e-mail queries and query templates in this folder. Mail Umieść swoje ulubione zapytania wiadomości i szablony zapytań w tym katalogu. Put your favorite e-mail queries and query templates in this folder. Mail Umieść swoje ulubione zapytania wiadomości i szablony zapytań w tym katalogu.
Spam Mail Spam
Reply Mail Odpowiedz Reply Mail Odpowiedz
From: Mail Od: From: Mail Od:
Couldn't open this signature. Sorry. Mail Nie można otworzyć tej sygnaturki. Przepraszamy. Couldn't open this signature. Sorry. Mail Nie można otworzyć tej sygnaturki. Przepraszamy.
+2 -1
View File
@@ -1,4 +1,4 @@
1 russian x-vnd.Be-MAIL 233997769 1 russian x-vnd.Be-MAIL 1310033600
View Mail Вид View Mail Вид
%d - Date Mail %d - Дата %d - Date Mail %d - Дата
Attach attributes: Mail Прикрепление атрибутов: Attach attributes: Mail Прикрепление атрибутов:
@@ -146,6 +146,7 @@ Open attachment Mail Открыть вложение
sent B_USER_DIRECTORY/mail/sent Отправленные sent B_USER_DIRECTORY/mail/sent Отправленные
(Date unavailable) Mail (Дата недоступна) (Date unavailable) Mail (Дата недоступна)
Put your favorite e-mail queries and query templates in this folder. Mail Перенесите в эту папку ваши почтовые запросы. Put your favorite e-mail queries and query templates in this folder. Mail Перенесите в эту папку ваши почтовые запросы.
Spam Mail Спам
Reply Mail Ответить Reply Mail Ответить
From: Mail От: From: Mail От:
Couldn't open this signature. Sorry. Mail Невозможно открыть эту подпись. Извините. Couldn't open this signature. Sorry. Mail Невозможно открыть эту подпись. Извините.
+3 -1
View File
@@ -1,6 +1,8 @@
1 russian x-vnd.Haiku-MediaConverter 3111641182 1 russian x-vnd.Haiku-MediaConverter 341686525
Video using parameters form settings MediaConverter Видео использует параметры из настроек Video using parameters form settings MediaConverter Видео использует параметры из настроек
{0, plural, one{The file was not recognized as a supported media file:} other{# files were not recognized as supported media files:}} MediaConverter {0, plural, one{Файл не был распознан как поддерживаемый медиафайл:} few{# файла не были распознаны как поддерживаемые медиафайлы:} other{# файлов не было распознано как поддерживаемые медиафайлы:}}
Video encoding: MediaConverter Кодирование видео: Video encoding: MediaConverter Кодирование видео:
%u x %u, %.2ffps MediaFileInfo Width x Height, fps %u x %u, %.2fкадр/с
Error read audio frame %lld MediaConverter Ошибка чтения аудио кадра %lld Error read audio frame %lld MediaConverter Ошибка чтения аудио кадра %lld
No audio Audio codecs list Без аудио No audio Audio codecs list Без аудио
Error MediaConverter Ошибка Error MediaConverter Ошибка
+3 -1
View File
@@ -1,4 +1,4 @@
1 russian x-vnd.Haiku-Terminal 235954604 1 russian x-vnd.Haiku-Terminal 2918699501
Not found. Terminal TermWindow Текст не найден Not found. Terminal TermWindow Текст не найден
Switch Terminals Terminal TermWindow Переключить терминалы Switch Terminals Terminal TermWindow Переключить терминалы
Change directory Terminal TermView Сменить каталог Change directory Terminal TermView Сменить каталог
@@ -34,6 +34,7 @@ Settings Terminal TermWindow Настройки
Window size Terminal TermWindow Размер окна Window size Terminal TermWindow Размер окна
Selected text Terminal AppearancePrefView Выделенного текста Selected text Terminal AppearancePrefView Выделенного текста
Find Terminal FindWindow Найти Find Terminal FindWindow Найти
The pattern specifying the window titles. The following placeholders\ncan be used: Terminal AppearancePrefView Этот шаблон описывает заголовки окна.\nВозможно использовать следующие переменные:\n
Appearance Terminal PrefWindow Внешний вид Appearance Terminal PrefWindow Внешний вид
Tab title: Terminal AppearancePrefView Заголовок вкладки: Tab title: Terminal AppearancePrefView Заголовок вкладки:
OK Terminal SetTitleWindow ОК OK Terminal SetTitleWindow ОК
@@ -76,6 +77,7 @@ Midnight Terminal colors scheme Полночь
Decrease Terminal TermWindow Уменьшить Decrease Terminal TermWindow Уменьшить
Default Terminal colors scheme По умолчанию Default Terminal colors scheme По умолчанию
Create link here Terminal TermView Создать ссылку здесь Create link here Terminal TermView Создать ссылку здесь
The pattern specifying the tab titles. The following placeholders\ncan be used: Terminal AppearancePrefView Этот шаблон описывает заголовки вкладок.\nВозможно использовать следующие переменные:
Close Terminal TermWindow Закрыть Close Terminal TermWindow Закрыть
Text Terminal AppearancePrefView Текста Text Terminal AppearancePrefView Текста
Clear all Terminal TermWindow Очистить всё Clear all Terminal TermWindow Очистить всё
+2 -1
View File
@@ -1,4 +1,4 @@
1 german x-vnd.Haiku-libtracker 3987439873 1 german x-vnd.Haiku-libtracker 1787267522
OK WidgetAttributeText OK OK WidgetAttributeText OK
Add-ons FilePanelPriv Add-ons Add-ons FilePanelPriv Add-ons
Mount settings… ContainerWindow Einhänge-Einstellungen… Mount settings… ContainerWindow Einhänge-Einstellungen…
@@ -19,6 +19,7 @@ Modified QueryPoseView Geändert
Created ContainerWindow Erstellt Created ContainerWindow Erstellt
Error %error loading add-On %name. ContainerWindow Fehler %error beim Laden von Add-On %name. Error %error loading add-On %name. ContainerWindow Fehler %error beim Laden von Add-On %name.
If you %ifYouDoAction the settings folder, %osName may not behave properly!\n\nAre you sure you want to do this? FSUtils Wird der Settings-Ordner %ifYouDoAction, kann %osName vielleicht nicht mehr fehlerfrei arbeiten! If you %ifYouDoAction the settings folder, %osName may not behave properly!\n\nAre you sure you want to do this? FSUtils Wird der Settings-Ordner %ifYouDoAction, kann %osName vielleicht nicht mehr fehlerfrei arbeiten!
Skip all FSUtils Alle überspringen
contains SelectionWindow enthält contains SelectionWindow enthält
Sorry, you can't save things at the root of your system. FilePanelPriv Im Root-Verzeichnis des Systems kann leider nichts gespeichert werden. Sorry, you can't save things at the root of your system. FilePanelPriv Im Root-Verzeichnis des Systems kann leider nichts gespeichert werden.
Show shared volumes on Desktop SettingsView Netzwerk-Laufwerke auf dem Desktop zeigen Show shared volumes on Desktop SettingsView Netzwerk-Laufwerke auf dem Desktop zeigen
+2 -1
View File
@@ -1,4 +1,4 @@
1 french x-vnd.Haiku-libtracker 4204393626 1 french x-vnd.Haiku-libtracker 2004221275
OK WidgetAttributeText OK OK WidgetAttributeText OK
Add-ons FilePanelPriv Extensions Add-ons FilePanelPriv Extensions
Mount settings… ContainerWindow Réglages du montage… Mount settings… ContainerWindow Réglages du montage…
@@ -19,6 +19,7 @@ Modified QueryPoseView Modifié
Created ContainerWindow Créé Created ContainerWindow Créé
Error %error loading add-On %name. ContainerWindow Erreur %error au chargement de lextension %name. Error %error loading add-On %name. ContainerWindow Erreur %error au chargement de lextension %name.
If you %ifYouDoAction the settings folder, %osName may not behave properly!\n\nAre you sure you want to do this? FSUtils Si vous %ifYouDoAction le dossier des réglages, %osName pourrait ne pas se comporter correctement !\n\nÊtes vous sûr de vouloir effectuer cette opération ? If you %ifYouDoAction the settings folder, %osName may not behave properly!\n\nAre you sure you want to do this? FSUtils Si vous %ifYouDoAction le dossier des réglages, %osName pourrait ne pas se comporter correctement !\n\nÊtes vous sûr de vouloir effectuer cette opération ?
Skip all FSUtils Tout ignorer
contains SelectionWindow contient contains SelectionWindow contient
Sorry, you can't save things at the root of your system. FilePanelPriv Désolé, vous ne pouvez rien sauvegarder à la racine de votre système. Sorry, you can't save things at the root of your system. FilePanelPriv Désolé, vous ne pouvez rien sauvegarder à la racine de votre système.
Show shared volumes on Desktop SettingsView Afficher les volumes partagés sur le Bureau Show shared volumes on Desktop SettingsView Afficher les volumes partagés sur le Bureau
+2 -1
View File
@@ -1,4 +1,4 @@
1 hungarian x-vnd.Haiku-libtracker 4204393626 1 hungarian x-vnd.Haiku-libtracker 2004221275
OK WidgetAttributeText Rendben OK WidgetAttributeText Rendben
Add-ons FilePanelPriv Kiegészítők Add-ons FilePanelPriv Kiegészítők
Mount settings… ContainerWindow Csatolási beállítások… Mount settings… ContainerWindow Csatolási beállítások…
@@ -19,6 +19,7 @@ Modified QueryPoseView Módosítva
Created ContainerWindow Létrehozva Created ContainerWindow Létrehozva
Error %error loading add-On %name. ContainerWindow Hiba a bővítmény (%name) betöltése közben: %error. Error %error loading add-On %name. ContainerWindow Hiba a bővítmény (%name) betöltése közben: %error.
If you %ifYouDoAction the settings folder, %osName may not behave properly!\n\nAre you sure you want to do this? FSUtils Ha %ifYouDoAction a beállítások mappát, akkor lehet, hogy a %osName nem fog megfelelően működni!\n\nBiztosan folytatni akarja? If you %ifYouDoAction the settings folder, %osName may not behave properly!\n\nAre you sure you want to do this? FSUtils Ha %ifYouDoAction a beállítások mappát, akkor lehet, hogy a %osName nem fog megfelelően működni!\n\nBiztosan folytatni akarja?
Skip all FSUtils Mindet kihagyja
contains SelectionWindow tartalmaz contains SelectionWindow tartalmaz
Sorry, you can't save things at the root of your system. FilePanelPriv Sajnos nem lehet a rendszer gyökérmappájába menteni. Sorry, you can't save things at the root of your system. FilePanelPriv Sajnos nem lehet a rendszer gyökérmappájába menteni.
Show shared volumes on Desktop SettingsView Megosztott lemezek megjelenítése az Asztalon Show shared volumes on Desktop SettingsView Megosztott lemezek megjelenítése az Asztalon
+2 -1
View File
@@ -1,4 +1,4 @@
1 japanese x-vnd.Haiku-libtracker 4204393626 1 japanese x-vnd.Haiku-libtracker 2004221275
OK WidgetAttributeText OK OK WidgetAttributeText OK
Add-ons FilePanelPriv アドオン Add-ons FilePanelPriv アドオン
Mount settings… ContainerWindow マウント設定… Mount settings… ContainerWindow マウント設定…
@@ -19,6 +19,7 @@ Modified QueryPoseView 更新日時
Created ContainerWindow 作成日時 Created ContainerWindow 作成日時
Error %error loading add-On %name. ContainerWindow %nameアドオンの読み込み中に%errorエラーが発生 Error %error loading add-On %name. ContainerWindow %nameアドオンの読み込み中に%errorエラーが発生
If you %ifYouDoAction the settings folder, %osName may not behave properly!\n\nAre you sure you want to do this? FSUtils settings フォルダーを%ifYouDoActionした場合、%osName が正常に動作しなくなる可能性があります。\n\n続けますか? If you %ifYouDoAction the settings folder, %osName may not behave properly!\n\nAre you sure you want to do this? FSUtils settings フォルダーを%ifYouDoActionした場合、%osName が正常に動作しなくなる可能性があります。\n\n続けますか?
Skip all FSUtils すべてスキップ
contains SelectionWindow 含む contains SelectionWindow 含む
Sorry, you can't save things at the root of your system. FilePanelPriv システムのルートフォルダーに保存は許可されていません。 Sorry, you can't save things at the root of your system. FilePanelPriv システムのルートフォルダーに保存は許可されていません。
Show shared volumes on Desktop SettingsView 共有ディスクをデスクトップに表示する Show shared volumes on Desktop SettingsView 共有ディスクをデスクトップに表示する
+10
View File
@@ -316,6 +316,16 @@
entry_cache_add() function when it encounters an entry that might not yet entry_cache_add() function when it encounters an entry that might not yet
be known to the entry cache and entry_cache_remove() when a directory be known to the entry cache and entry_cache_remove() when a directory
entry has been removed. entry has been removed.
The entry cache can also be used for negative caching. If the file system
determines that the requested entry is not present during a lookup, it can
cache this lookup failure by calling entry_cache_add_missing(). Further
calls to fs_vnode_ops::lookup() for the missing entry will then be
avoided.
Note that it is safe to call entry_cache_add() and
entry_cache_add_missing() with the same directory/name pair previously
given to either function to update a cache entry, without needing to call
entry_cache_remove() first. It is also safe to call entry_cache_remove()
for pairs that have never been added to the cache.
*/ */
// TODO: // TODO:
+2 -2
View File
@@ -227,7 +227,7 @@ int32 button_index = alert->Go();
See button_width for details. See button_width for details.
\param spacing Determines how the buttons are spaced. Options are \param spacing Determines how the buttons are spaced. Options are
\li \c B_EVEN_SPACING \li \c B_EVEN_SPACING
\li \c B_OFFSET_SPACING \li \c B_OFFSET_SPACING
See button_spacing for details. See button_spacing for details.
\param type Constant that determines which alert icon is displayed. \param type Constant that determines which alert icon is displayed.
@@ -408,7 +408,7 @@ int32 button_index = alert->Go();
/*! /*!
\fn BTextView* BAlert::TextView() const \fn BTextView* BAlert::TextView() const
\brief Returns a TextView containing the text of the Alert. \brief Returns the Alert's TextView.
\since BeOS R3 \since BeOS R3
*/ */
+3 -1
View File
@@ -183,7 +183,9 @@ private:
const BList* messageList, int argc, const BList* messageList, int argc,
const char* const* args, const char* const* args,
const char** environment, const char** environment,
team_id* appTeam) const; team_id* appTeam,
thread_id* appThread,
bool launchSuspended) const;
status_t _UpdateActiveApp(team_id team) const; status_t _UpdateActiveApp(team_id team) const;
+2
View File
@@ -104,6 +104,8 @@ extern status_t file_map_translate(void *map, off_t offset, size_t size,
/* entry cache */ /* entry cache */
extern status_t entry_cache_add(dev_t mountID, ino_t dirID, const char* name, extern status_t entry_cache_add(dev_t mountID, ino_t dirID, const char* name,
ino_t nodeID); ino_t nodeID);
extern status_t entry_cache_add_missing(dev_t mountID, ino_t dirID,
const char* name);
extern status_t entry_cache_remove(dev_t mountID, ino_t dirID, extern status_t entry_cache_remove(dev_t mountID, ino_t dirID,
const char* name); const char* name);
+1 -2
View File
@@ -10,8 +10,7 @@ class BList;
class BMidiLocalProducer; class BMidiLocalProducer;
class BMidiLocalConsumer; class BMidiLocalConsumer;
class BMidi class BMidi {
{
public: public:
BMidi(); BMidi();
+2
View File
@@ -15,6 +15,8 @@
/* Synthesizer things */ /* Synthesizer things */
#define B_SYNTH_DIRECTORY B_SYSTEM_DATA_DIRECTORY #define B_SYNTH_DIRECTORY B_SYSTEM_DATA_DIRECTORY
/* Deprecated */
#define B_BIG_SYNTH_FILE "synth/big_synth.sy" #define B_BIG_SYNTH_FILE "synth/big_synth.sy"
#define B_LITTLE_SYNTH_FILE "synth/little_synth.sy" #define B_LITTLE_SYNTH_FILE "synth/little_synth.sy"
+1 -2
View File
@@ -9,8 +9,7 @@ class BMidiProducer;
namespace BPrivate { class BMidiPortGlue; } namespace BPrivate { class BMidiPortGlue; }
class BMidiPort : public BMidi class BMidiPort : public BMidi {
{
public: public:
BMidiPort(const char* name = NULL); BMidiPort(const char* name = NULL);
+1 -2
View File
@@ -12,8 +12,7 @@ class BFile;
class BList; class BList;
class BMidiEvent; class BMidiEvent;
class BMidiStore : public BMidi class BMidiStore : public BMidi {
{
public: public:
BMidiStore(); BMidiStore();
+1 -2
View File
@@ -9,8 +9,7 @@
class BSynth; class BSynth;
class BMidiSynth : public BMidi class BMidiSynth : public BMidi {
{
public: public:
BMidiSynth(); BMidiSynth();
+1 -2
View File
@@ -10,8 +10,7 @@ typedef void (*synth_file_hook)(int32 arg);
class BMidiStore; class BMidiStore;
class BMidiSynthFile : public BMidiSynth class BMidiSynthFile : public BMidiSynth {
{
public: public:
BMidiSynthFile(); BMidiSynthFile();
+1 -2
View File
@@ -6,8 +6,7 @@
#include <Midi.h> #include <Midi.h>
#include <stdio.h> #include <stdio.h>
class BMidiText : public BMidi class BMidiText : public BMidi {
{
public: public:
BMidiText(); BMidiText();
+11 -6
View File
@@ -3,19 +3,19 @@
* Distributed under the terms of the MIT License. * Distributed under the terms of the MIT License.
*/ */
/* Include guards are omitted, as assert.h is required /* Include guards are only on part of the file, as assert.h is required
to support being included multiple times. to support being included multiple times.
E.g. the following is required to be valid: E.g. the following is required to be valid:
#undef NDEBUG #undef NDEBUG
#include <assert.h> #include <assert.h>
assert(0); // this assertion will be triggered assert(0); // this assertion will be triggered
#define NDEBUG #define NDEBUG
#include <assert.h> #include <assert.h>
assert(0); // this assertion will not be triggered assert(0); // this assertion will not be triggered
*/ */
@@ -24,6 +24,9 @@
#ifndef NDEBUG #ifndef NDEBUG
/* defining NDEBUG disables assert() functionality */ /* defining NDEBUG disables assert() functionality */
#ifndef _ASSERT_H_
#define _ASSERT_H_
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
#endif #endif
@@ -40,6 +43,8 @@ extern void __assert_perror_fail(int error, const char *file,
} }
#endif #endif
#endif /* !_ASSERT_H_ */
#define assert(assertion) \ #define assert(assertion) \
((assertion) ? (void)0 : __assert_fail(#assertion, __FILE__, __LINE__, __PRETTY_FUNCTION__)) ((assertion) ? (void)0 : __assert_fail(#assertion, __FILE__, __LINE__, __PRETTY_FUNCTION__))
+3 -2
View File
@@ -30,9 +30,10 @@ class BRoster::Private {
status_t Launch(const char* mimeType, const entry_ref* ref, status_t Launch(const char* mimeType, const entry_ref* ref,
const BList* messageList, int argc, const char* const* args, const BList* messageList, int argc, const char* const* args,
const char** environment, team_id* appTeam) const char** environment, team_id* appTeam,
thread_id* appThread, bool launchSuspended)
{ return fRoster->_LaunchApp(mimeType, ref, messageList, argc, { return fRoster->_LaunchApp(mimeType, ref, messageList, argc,
args, environment, appTeam); } args, environment, appTeam, appThread, launchSuspended); }
status_t ShutDown(bool reboot, bool confirm, bool synchronous) status_t ShutDown(bool reboot, bool confirm, bool synchronous)
{ return fRoster->_ShutDown(reboot, confirm, synchronous); } { return fRoster->_ShutDown(reboot, confirm, synchronous); }
@@ -871,6 +871,7 @@
/* entry cache */ /* entry cache */
#define entry_cache_add fssh_entry_cache_add #define entry_cache_add fssh_entry_cache_add
#define entry_cache_add_missing fssh_entry_cache_add_missing
#define entry_cache_remove fssh_entry_cache_remove #define entry_cache_remove fssh_entry_cache_remove
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
+2
View File
@@ -126,6 +126,8 @@ extern fssh_status_t fssh_file_map_translate(void *_map, fssh_off_t offset,
extern fssh_status_t fssh_entry_cache_add(fssh_dev_t mountID, extern fssh_status_t fssh_entry_cache_add(fssh_dev_t mountID,
fssh_ino_t dirID, const char* name, fssh_ino_t dirID, const char* name,
fssh_ino_t nodeID); fssh_ino_t nodeID);
extern fssh_status_t fssh_entry_cache_add_missing(fssh_dev_t mountID,
fssh_ino_t dirID, const char* name);
extern fssh_status_t fssh_entry_cache_remove(fssh_dev_t mountID, extern fssh_status_t fssh_entry_cache_remove(fssh_dev_t mountID,
fssh_ino_t dirID, const char* name); fssh_ino_t dirID, const char* name);
+168
View File
@@ -0,0 +1,168 @@
/*
* Copyright 2004 DarkWyrm <[email protected]>
* Copyright 2013 FeemanLou
* Copyright 2014-2015 Haiku, Inc. All rights reserved.
*
* Distributed under the terms of the MIT license.
*
* Originally written by DarkWyrm <[email protected]>
* Updated by FreemanLou as part of Google GCI 2013
*
* Authors:
* DarkWyrm, [email protected]
* FeemanLou
* John Scipione, [email protected]
*/
#ifndef _ABSTRACT_SPINNER_H
#define _ABSTRACT_SPINNER_H
#include <Control.h>
typedef enum {
SPINNER_BUTTON_HORIZONTAL_ARROWS,
SPINNER_BUTTON_VERTICAL_ARROWS,
SPINNER_BUTTON_PLUS_MINUS
} spinner_button_style;
class BTextView;
class SpinnerButton;
class SpinnerTextView;
/*! BAbstractSpinner provides an input whose value can be nudged up or down
by way of two small buttons on the right.
*/
class BAbstractSpinner : public BControl {
public:
BAbstractSpinner(BRect frame, const char* name,
const char* label, BMessage* message,
uint32 resizingMode = B_FOLLOW_LEFT | B_FOLLOW_TOP,
uint32 flags = B_WILL_DRAW | B_NAVIGABLE);
BAbstractSpinner(const char* name, const char* label,
BMessage* message,
uint32 flags = B_WILL_DRAW | B_NAVIGABLE);
BAbstractSpinner(BMessage* data);
virtual ~BAbstractSpinner();
static BArchivable* Instantiate(BMessage* data);
virtual status_t Archive(BMessage* data, bool deep = true) const;
virtual status_t GetSupportedSuites(BMessage* message);
virtual BHandler* ResolveSpecifier(BMessage* message, int32 index,
BMessage* specifier, int32 form,
const char* property);
virtual void AttachedToWindow();
virtual void Draw(BRect updateRect);
virtual void FrameResized(float width, float height);
virtual void ValueChanged();
virtual void Decrement() = 0;
virtual void Increment() = 0;
virtual void MakeFocus(bool focus = true);
virtual void ResizeToPreferred();
virtual void SetFlags(uint32 flags);
virtual void WindowActivated(bool active);
alignment Alignment() const { return fAlignment; };
virtual void SetAlignment(alignment align);
spinner_button_style ButtonStyle() const { return fButtonStyle; };
virtual void SetButtonStyle(spinner_button_style buttonStyle);
float Divider() const { return fDivider; };
virtual void SetDivider(float position);
virtual void SetEnabled(bool enable);
virtual void SetLabel(const char* label);
virtual void SetValueFromText() = 0;
bool IsDecrementEnabled() const;
virtual void SetDecrementEnabled(bool enable);
bool IsIncrementEnabled() const;
virtual void SetIncrementEnabled(bool enable);
virtual BSize MinSize();
virtual BSize MaxSize();
virtual BSize PreferredSize();
virtual BAlignment LayoutAlignment();
BLayoutItem* CreateLabelLayoutItem();
BLayoutItem* CreateTextViewLayoutItem();
BTextView* TextView() const;
private:
// FBC padding
virtual void _ReservedAbstractSpinner20();
virtual void _ReservedAbstractSpinner19();
virtual void _ReservedAbstractSpinner18();
virtual void _ReservedAbstractSpinner17();
virtual void _ReservedAbstractSpinner16();
virtual void _ReservedAbstractSpinner15();
virtual void _ReservedAbstractSpinner14();
virtual void _ReservedAbstractSpinner13();
virtual void _ReservedAbstractSpinner12();
virtual void _ReservedAbstractSpinner11();
virtual void _ReservedAbstractSpinner10();
virtual void _ReservedAbstractSpinner9();
virtual void _ReservedAbstractSpinner8();
virtual void _ReservedAbstractSpinner7();
virtual void _ReservedAbstractSpinner6();
virtual void _ReservedAbstractSpinner5();
virtual void _ReservedAbstractSpinner4();
virtual void _ReservedAbstractSpinner3();
virtual void _ReservedAbstractSpinner2();
virtual void _ReservedAbstractSpinner1();
protected:
virtual status_t AllArchived(BMessage* into) const;
virtual status_t AllUnarchived(const BMessage* from);
virtual void LayoutInvalidated(bool descendants);
virtual void DoLayout();
private:
class LabelLayoutItem;
class TextViewLayoutItem;
struct LayoutData;
friend class SpinnerButton;
friend class SpinnerTextView;
friend class LabelLayoutItem;
friend class TextViewLayoutItem;
friend struct LayoutData;
void _DrawLabel(BRect updateRect);
void _DrawTextView(BRect updateRect);
void _InitObject();
void _LayoutTextView();
void _UpdateFrame();
void _UpdateTextViewColors(bool enable);
void _ValidateLayoutData();
BAbstractSpinner& operator=(const BAbstractSpinner& other);
alignment fAlignment;
spinner_button_style fButtonStyle;
float fDivider;
LayoutData* fLayoutData;
SpinnerTextView* fTextView;
SpinnerButton* fIncrement;
SpinnerButton* fDecrement;
// FBC padding
uint32 _reserved[20];
};
#endif // _ABSTRACT_SPINNER_H
@@ -0,0 +1,96 @@
/*
* Copyright 2015 Haiku, Inc. All rights reserved.
* Distributed under the terms of the MIT license.
*
* Authors:
* John Scipione, jscipione@gmail.com
*/
#ifndef _DECIMAL_SPINNER_H
#define _DECIMAL_SPINNER_H
#include <Spinner.h>
class BDecimalSpinner : public BAbstractSpinner {
public:
BDecimalSpinner(BRect frame, const char* name,
const char* label, BMessage* message,
uint32 resizingMode = B_FOLLOW_LEFT | B_FOLLOW_TOP,
uint32 flags = B_WILL_DRAW | B_NAVIGABLE);
BDecimalSpinner(const char* name, const char* label,
BMessage* message,
uint32 flags = B_WILL_DRAW | B_NAVIGABLE);
BDecimalSpinner(BMessage* data);
virtual ~BDecimalSpinner();
static BArchivable* Instantiate(BMessage* data);
virtual status_t Archive(BMessage* data, bool deep = true) const;
virtual status_t GetSupportedSuites(BMessage* message);
virtual void AttachedToWindow();
virtual void Increment();
virtual void Decrement();
virtual void SetEnabled(bool enable);
uint32 Precision() const { return fPrecision; };
virtual void SetPrecision(uint32 precision) { fPrecision = precision; };
double MaxValue() const { return fMaxValue; }
virtual void SetMaxValue(double max);
double MinValue() const { return fMinValue; }
virtual void SetMinValue(double min);
void Range(double* min, double* max);
virtual void SetRange(double min, double max);
double Step() const { return fStep; }
virtual void SetStep(double step) { fStep = step; };
double Value() const { return fValue; };
virtual void SetValue(int32 value);
virtual void SetValue(double value);
virtual void SetValueFromText();
private:
// FBC padding
virtual void _ReservedDecimalSpinner20();
virtual void _ReservedDecimalSpinner19();
virtual void _ReservedDecimalSpinner18();
virtual void _ReservedDecimalSpinner17();
virtual void _ReservedDecimalSpinner16();
virtual void _ReservedDecimalSpinner15();
virtual void _ReservedDecimalSpinner14();
virtual void _ReservedDecimalSpinner13();
virtual void _ReservedDecimalSpinner12();
virtual void _ReservedDecimalSpinner11();
virtual void _ReservedDecimalSpinner10();
virtual void _ReservedDecimalSpinner9();
virtual void _ReservedDecimalSpinner8();
virtual void _ReservedDecimalSpinner7();
virtual void _ReservedDecimalSpinner6();
virtual void _ReservedDecimalSpinner5();
virtual void _ReservedDecimalSpinner4();
virtual void _ReservedDecimalSpinner3();
virtual void _ReservedDecimalSpinner2();
virtual void _ReservedDecimalSpinner1();
private:
void _InitObject();
double fMinValue;
double fMaxValue;
double fStep;
double fValue;
uint32 fPrecision;
// FBC padding
uint32 _reserved[20];
};
#endif // _DECIMAL_SPINNER_H
+87
View File
@@ -0,0 +1,87 @@
/*
* Copyright 2015 Haiku, Inc. All rights reserved.
* Distributed under the terms of the MIT license.
*
* Authors:
* John Scipione, jscipione@gmail.com
*/
#ifndef _SPINNER_H
#define _SPINNER_H
#include <AbstractSpinner.h>
class BSpinner : public BAbstractSpinner {
public:
BSpinner(BRect frame, const char* name,
const char* label, BMessage* message,
uint32 resizingMode = B_FOLLOW_LEFT | B_FOLLOW_TOP,
uint32 flags = B_WILL_DRAW | B_NAVIGABLE);
BSpinner(const char* name, const char* label,
BMessage* message,
uint32 flags = B_WILL_DRAW | B_NAVIGABLE);
BSpinner(BMessage* data);
virtual ~BSpinner();
static BArchivable* Instantiate(BMessage* data);
virtual status_t Archive(BMessage* data, bool deep = true) const;
virtual void Increment();
virtual void Decrement();
virtual status_t GetSupportedSuites(BMessage* message);
virtual void AttachedToWindow();
virtual void SetEnabled(bool enable);
int32 MaxValue() const { return fMaxValue; }
virtual void SetMaxValue(int32 max);
int32 MinValue() const { return fMinValue; }
virtual void SetMinValue(int32 min);
void Range(int32* min, int32* max);
virtual void SetRange(int32 min, int32 max);
int32 Value() const { return fValue; };
virtual void SetValue(int32 value);
virtual void SetValueFromText();
private:
// FBC padding
virtual void _ReservedSpinner20();
virtual void _ReservedSpinner19();
virtual void _ReservedSpinner18();
virtual void _ReservedSpinner17();
virtual void _ReservedSpinner16();
virtual void _ReservedSpinner15();
virtual void _ReservedSpinner14();
virtual void _ReservedSpinner13();
virtual void _ReservedSpinner12();
virtual void _ReservedSpinner11();
virtual void _ReservedSpinner10();
virtual void _ReservedSpinner9();
virtual void _ReservedSpinner8();
virtual void _ReservedSpinner7();
virtual void _ReservedSpinner6();
virtual void _ReservedSpinner5();
virtual void _ReservedSpinner4();
virtual void _ReservedSpinner3();
virtual void _ReservedSpinner2();
virtual void _ReservedSpinner1();
private:
void _InitObject();
int32 fMinValue;
int32 fMaxValue;
int32 fValue;
// FBC padding
uint32 _reserved[20];
};
#endif // _SPINNER_H
+1 -1
View File
@@ -302,7 +302,7 @@ thread_is_blocked(Thread* thread)
especially with a client lock that uses the thread blocking API. After a especially with a client lock that uses the thread blocking API. After a
blocked thread has been interrupted or the the time out occurred it cannot blocked thread has been interrupted or the the time out occurred it cannot
acquire the client lock (or any other lock using the thread blocking API) acquire the client lock (or any other lock using the thread blocking API)
without first making sure that the thread doesn't still appears to be without first making sure that the thread doesn't still appear to be
waiting to other client code. Otherwise another thread could try to unblock waiting to other client code. Otherwise another thread could try to unblock
it which could erroneously unblock the thread while already waiting on the it which could erroneously unblock the thread while already waiting on the
client lock. So usually when interruptions or timeouts are possible a client lock. So usually when interruptions or timeouts are possible a
+1 -1
View File
@@ -453,7 +453,7 @@ struct Thread : TeamThreadIteratorEntry<thread_id>, KernelReferenceable {
// modified by the thread itself and // modified by the thread itself and
// thus freely readable by it // thus freely readable by it
void (*cancel_function)(int); void (*cancel_function)(int);
struct { struct {
uint8 parameters[SYSCALL_RESTART_PARAMETER_SIZE]; uint8 parameters[SYSCALL_RESTART_PARAMETER_SIZE];
+1 -1
View File
@@ -33,8 +33,8 @@ status_t __flatten_process_args(const char* const* args, int32 argCount,
char*** _flatArgs, size_t* _flatSize); char*** _flatArgs, size_t* _flatSize);
void _call_atexit_hooks_for_range(addr_t start, addr_t size); void _call_atexit_hooks_for_range(addr_t start, addr_t size);
void __init_env(const struct user_space_program_args *args); void __init_env(const struct user_space_program_args *args);
void __init_env_post_heap(void);
status_t __init_heap(void); status_t __init_heap(void);
void __init_heap_post_env(void);
void __heap_terminate_after(void); void __heap_terminate_after(void);
void __init_time(addr_t commPageTable); void __init_time(addr_t commPageTable);
+2
View File
@@ -37,6 +37,8 @@ public:
BMediaRosterEx(status_t* out_error); BMediaRosterEx(status_t* out_error);
virtual ~BMediaRosterEx(); virtual ~BMediaRosterEx();
virtual void Quit();
status_t SaveNodeConfiguration(BMediaNode* node); status_t SaveNodeConfiguration(BMediaNode* node);
status_t LoadNodeConfiguration(media_addon_id addonid, status_t LoadNodeConfiguration(media_addon_id addonid,
int32 flavorid, BMessage* out_msg); int32 flavorid, BMessage* out_msg);
+24
View File
@@ -0,0 +1,24 @@
/*
* Copyright 2015 Haiku, Inc. All rights reserved.
* Distributed under the terms of the MIT License.
*/
#ifndef MIDI_SETTINGS_PRIVATE_H_
#define MIDI_SETTINGS_PRIVATE_H_
#include <StorageDefs.h>
#include <SupportDefs.h>
namespace BPrivate {
struct midi_settings {
char soundfont_file[B_FILE_NAME_LENGTH];
};
status_t read_midi_settings(struct midi_settings* settings);
status_t write_midi_settings(struct midi_settings settings);
};
#endif /* MIDI_SETTINGS_PRIVATE_H_ */
+3 -3
View File
@@ -233,21 +233,21 @@ template<class Element, class ElementVec>
int32 int32
OpenHashTable<Element, ElementVec>::ArraySize() const OpenHashTable<Element, ElementVec>::ArraySize() const
{ {
return fArraySize; return fArraySize;
} }
template<class Element, class ElementVec> template<class Element, class ElementVec>
int32 int32
OpenHashTable<Element, ElementVec>::VectorSize() const OpenHashTable<Element, ElementVec>::VectorSize() const
{ {
return fElementVector->Size(); return fElementVector->Size();
} }
template<class Element, class ElementVec> template<class Element, class ElementVec>
int32 int32
OpenHashTable<Element, ElementVec>::CountElements() const OpenHashTable<Element, ElementVec>::CountElements() const
{ {
return fElementCount; return fElementCount;
} }
+83 -59
View File
@@ -29,20 +29,21 @@ enum {
CAP_SALP = (1 << 26), // Supports Aggressive Link Power Management CAP_SALP = (1 << 26), // Supports Aggressive Link Power Management
CAP_SAL = (1 << 25), // Supports Activity LED CAP_SAL = (1 << 25), // Supports Activity LED
CAP_SCLO = (1 << 24), // Supports Command List Override CAP_SCLO = (1 << 24), // Supports Command List Override
CAP_ISS_MASK = 0xf, // Interface Speed Support CAP_ISS_MASK = 0xf, // Interface Speed Support
CAP_ISS_SHIFT = 20, CAP_ISS_SHIFT = 20,
CAP_SNZO = (1 << 19), // Supports Non-Zero DMA Offsets CAP_SNZO = (1 << 19), // Supports Non-Zero DMA Offsets
CAP_SAM = (1 << 18), // Supports AHCI mode only CAP_SAM = (1 << 18), // Supports AHCI mode only
CAP_SPM = (1 << 17), // Supports Port Multiplier CAP_SPM = (1 << 17), // Supports Port Multiplier
CAP_FBSS = (1 << 16), // FIS-based Switching Supported CAP_FBSS = (1 << 16), // FIS-based Switching Supported
CAP_PMD = (1 << 15), // PIO Multiple DRQ Block CAP_PMD = (1 << 15), // PIO Multiple DRQ Block
CAP_SSC = (1 << 14), // Slumber State Capable CAP_SSC = (1 << 14), // Slumber State Capable
CAP_PSC = (1 << 13), // Partial State Capable CAP_PSC = (1 << 13), // Partial State Capable
CAP_NCS_MASK = 0x1f, // Number of Command Slots (zero-based number) CAP_NCS_MASK = 0x1f, // Number of Command Slots
// (zero-based number)
CAP_NCS_SHIFT = 8, CAP_NCS_SHIFT = 8,
CAP_CCCS = (1 << 7), // Command Completion Coalescing Supported CAP_CCCS = (1 << 7), // Command Completion Coalescing Supported
CAP_EMS = (1 << 6), // Enclosure Management Supported CAP_EMS = (1 << 6), // Enclosure Management Supported
CAP_SXS = (1 << 5), // Supports External SATA CAP_SXS = (1 << 5), // Supports External SATA
CAP_NP_MASK = 0x1f, // Number of Ports (zero-based number) CAP_NP_MASK = 0x1f, // Number of Ports (zero-based number)
CAP_NP_SHIFT = 0, CAP_NP_SHIFT = 0,
}; };
@@ -73,19 +74,40 @@ enum {
INT_SDB = (1 << 3), // Set Device Bits Interrupt/Enable INT_SDB = (1 << 3), // Set Device Bits Interrupt/Enable
INT_DS = (1 << 2), // DMA Setup FIS Interrupt/Enable INT_DS = (1 << 2), // DMA Setup FIS Interrupt/Enable
INT_PS = (1 << 1), // PIO Setup FIS Interrupt/Enable INT_PS = (1 << 1), // PIO Setup FIS Interrupt/Enable
INT_DHR = (1 << 0), // Device to Host Register FIS Interrupt/Enable INT_DHR = (1 << 0), // Device to Host Register FIS
// Interrupt/Enable
}; };
// Device Detection Initialization
#define SATA_CONTROL_DET_SHIFT 0
#define SATA_CONTROL_DET_MASK 0x0000000f
#define DET_NO_INITIALIZATION 0x0
#define DET_INITIALIZATION 0x1
// Speed Allowed
#define SATA_CONTROL_SPD_SHIFT 4
#define SATA_CONTROL_SPD_MASK 0x000000f0
// Interface Power Management Transitions Allowed
#define SATA_CONTROL_IPM_SHIFT 8
#define SATA_CONTROL_IPM_MASK 0x00000f00
#define IPM_TRANSITIONS_TO_PARTIAL_DISABLED 0x1
#define IPM_TRANSITIONS_TO_SLUMBER_DISABLED 0x2
typedef struct { typedef struct {
uint32 clb; // Command List Base Address (alignment 1024 byte) uint32 clb; // Command List Base Address
// (alignment 1024 byte)
uint32 clbu; // Command List Base Address Upper 32-Bits uint32 clbu; // Command List Base Address Upper 32-Bits
uint32 fb; // FIS Base Address (alignment 256 byte) uint32 fb; // FIS Base Address (alignment 256 byte)
uint32 fbu; // FIS Base Address Upper 32-Bits uint32 fbu; // FIS Base Address Upper 32-Bits
uint32 is; // Interrupt Status **RWC** uint32 is; // Interrupt Status **RWC**
uint32 ie; // Interrupt Enable uint32 ie; // Interrupt Enable
uint32 cmd; // Command and Status uint32 cmd; // Command and Status
uint32 res1; // Reserved uint32 res1; // Reserved
uint32 tfd; // Task File Data uint32 tfd; // Task File Data
uint32 sig; // Signature uint32 sig; // Signature
uint32 ssts; // Serial ATA Status (SCR0: SStatus) uint32 ssts; // Serial ATA Status (SCR0: SStatus)
@@ -102,9 +124,9 @@ typedef struct {
enum { enum {
PORT_CMD_ICC_ACTIVE = (1 << 28), // Interface Communication control PORT_CMD_ICC_ACTIVE = (1 << 28), // Interface Communication control
PORT_CMD_ICC_SLUMBER = (6 << 28), // Interface Communication control PORT_CMD_ICC_SLUMBER = (6 << 28), // Interface Communication control
PORT_CMD_ICC_MASK = (0xf<<28), // Interface Communication control PORT_CMD_ICC_MASK = (0xf<<28), // Interface Communication control
PORT_CMD_ATAPI = (1 << 24), // Device is ATAPI PORT_CMD_ATAPI = (1 << 24), // Device is ATAPI
PORT_CMD_CR = (1 << 15), // Command List Running (DMA active) PORT_CMD_CR = (1 << 15), // Command List Running (DMA active)
PORT_CMD_FR = (1 << 14), // FIS Receive Running PORT_CMD_FR = (1 << 14), // FIS Receive Running
@@ -136,17 +158,17 @@ enum {
PORT_INT_DHR = (1 << 0), // Device to Host Register FIS Interrupt PORT_INT_DHR = (1 << 0), // Device to Host Register FIS Interrupt
}; };
#define PORT_INT_ERROR (PORT_INT_TFE | PORT_INT_HBF | PORT_INT_HBD \ #define PORT_INT_ERROR (PORT_INT_TFE | PORT_INT_HBF | PORT_INT_HBD \
| PORT_INT_IF | PORT_INT_INF | PORT_INT_OF \ | PORT_INT_IF | PORT_INT_INF | PORT_INT_OF \
| PORT_INT_IPM | PORT_INT_PRC | PORT_INT_PC \ | PORT_INT_IPM | PORT_INT_PRC | PORT_INT_PC \
| PORT_INT_UF) | PORT_INT_UF)
#define PORT_INT_MASK (PORT_INT_ERROR | PORT_INT_DP | PORT_INT_SDB \ #define PORT_INT_MASK (PORT_INT_ERROR | PORT_INT_DP | PORT_INT_SDB \
| PORT_INT_DS | PORT_INT_PS | PORT_INT_DHR) | PORT_INT_DS | PORT_INT_PS | PORT_INT_DHR)
enum { enum {
ATA_BSY = 0x80, ATA_BSY = 0x80,
ATA_DF = 0x20, ATA_DF = 0x20,
ATA_DRQ = 0x08, ATA_DRQ = 0x08,
ATA_ERR = 0x01, ATA_ERR = 0x01,
}; };
@@ -154,11 +176,11 @@ enum {
enum { enum {
PORT_FBS_DWE_SHIFT = 16, // Device With Error PORT_FBS_DWE_SHIFT = 16, // Device With Error
PORT_FBS_DWE_MASK = 0xf, PORT_FBS_DWE_MASK = 0xf,
PORT_FBS_ADO_SHIFT = 12, // Active Device Optimization PORT_FBS_ADO_SHIFT = 12, // Active Device Optimization
PORT_FBS_ADO_MASK = 0xf, PORT_FBS_ADO_MASK = 0xf,
PORT_FBS_DEV_SHIFT = 8, // Device To Issue PORT_FBS_DEV_SHIFT = 8, // Device To Issue
PORT_FBS_DEV_MASK = 0xf, PORT_FBS_DEV_MASK = 0xf,
PORT_FBS_SDE = 0x04, // Single Device Error PORT_FBS_SDE = 0x04, // Single Device Error
PORT_FBS_DEC = 0x02, // Device Error Clear PORT_FBS_DEC = 0x02, // Device Error Clear
PORT_FBS_EN = 0x01, // Enable PORT_FBS_EN = 0x01, // Enable
@@ -167,7 +189,7 @@ enum {
enum { enum {
PORT_DEVSLP_DM_SHIFT = 25, // DITO Multiplier PORT_DEVSLP_DM_SHIFT = 25, // DITO Multiplier
PORT_DEVSLP_DM_MASK = 0xf, PORT_DEVSLP_DM_MASK = 0xf,
PORT_DEVSLP_DITO_SHIFT = 15, // Device Sleep Idle Timeout PORT_DEVSLP_DITO_SHIFT = 15, // Device Sleep Idle Timeout
PORT_DEVSLP_DITO_MASK = 0x3ff, PORT_DEVSLP_DITO_MASK = 0x3ff,
PORT_DEVSLP_MDAT_SHIFT = 10, // Minimum Device Sleep Assertion Time PORT_DEVSLP_MDAT_SHIFT = 10, // Minimum Device Sleep Assertion Time
@@ -180,12 +202,13 @@ enum {
enum { enum {
CAP2_DESO = (1 << 5), // DevSleep Entrance from Slumber Only CAP2_DESO = (1 << 5), // DevSleep Entrance from Slumber Only
CAP2_SADM = (1 << 4), // Supports Aggressive Device Sleep Management CAP2_SADM = (1 << 4), // Supports Aggressive Device Sleep
CAP2_SDS = (1 << 3), // Supports Device Sleep // Management
CAP2_APST = (1 << 2), // Automatic Partial to Slumber Transitions CAP2_SDS = (1 << 3), // Supports Device Sleep
CAP2_NVMP = (1 << 1), // NVMHCI Present CAP2_APST = (1 << 2), // Automatic Partial to Slumber Transitions
CAP2_BOH = (1 << 0), // BIOS/OS Handoff CAP2_NVMP = (1 << 1), // NVMHCI Present
CAP2_BOH = (1 << 0), // BIOS/OS Handoff
}; };
@@ -221,21 +244,22 @@ typedef struct {
typedef struct { typedef struct {
union { union {
struct { struct {
uint16 cfl : 5; // command FIS length uint16 cfl : 5; // command FIS length
uint16 a : 1; // ATAPI uint16 a : 1; // ATAPI
uint16 w : 1; // Write uint16 w : 1; // Write
uint16 p : 1; // Prefetchable uint16 p : 1; // Prefetchable
uint16 r : 1; // Reset uint16 r : 1; // Reset
uint16 b : 1; // Build In Self Test uint16 b : 1; // Build In Self Test
uint16 c : 1; // Clear Busy upon R_OK uint16 c : 1; // Clear Busy upon R_OK
uint16 : 1; uint16 : 1;
uint16 pmp : 4; // Port Multiplier Port uint16 pmp : 4; // Port Multiplier Port
uint16 prdtl; // physical region description table length; uint16 prdtl; // physical region description table
} _PACKED; // length;
uint32 prdtl_flags_cfl; } _PACKED;
} _PACKED; uint32 prdtl_flags_cfl;
} _PACKED;
uint32 prdbc; // PRD Byte Count uint32 prdbc; // PRD Byte Count
uint32 ctba; // command table desciptor base address uint32 ctba; // command table desciptor base address
// (alignment 128 byte) // (alignment 128 byte)
@@ -251,16 +275,16 @@ typedef struct {
// 1 - C bit (0x80) // 1 - C bit (0x80)
// 2 - Command // 2 - Command
// 3 - Features // 3 - Features
// 4 - Sector Number (LBA Low, bits 0-7) // 4 - Sector Number (LBA Low, bits 0-7)
// 5 - Cylinder Low (LBA Mid, bits 8-15) // 5 - Cylinder Low (LBA Mid, bits 8-15)
// 6 - Cylinder High (LBA High, bits 16-23) // 6 - Cylinder High (LBA High, bits 16-23)
// 7 - Device / Head (for 28-bit LBA commands, bits 24-27) // 7 - Device / Head (for 28-bit LBA commands, bits 24-27)
// 8 - Sector Number expanded (LBA Low-previous, bits 24-31) // 8 - Sector Number expanded (LBA Low-previous, bits 24-31)
// 9 - Cylinder Low expanded (LBA Mid-previous, bits 32-39) // 9 - Cylinder Low expanded (LBA Mid-previous, bits 32-39)
// 10 - Cylinder High expanded (LBA High-previous, bits 40-47) // 10 - Cylinder High expanded (LBA High-previous, bits 40-47)
// 11 - Features expanded // 11 - Features expanded
// 12 - Sector Count (Sector count, bits 0-7) // 12 - Sector Count (Sector count, bits 0-7)
// 13 - Sector Count expanded (Sector count, bits 8-15) // 13 - Sector Count expanded (Sector count, bits 8-15)
// 14 - Reserved (0) // 14 - Reserved (0)
// 15 - Control // 15 - Control
// 16 - Reserved (0) // 16 - Reserved (0)
@@ -1,5 +1,5 @@
/* /*
* Copyright 2008-2014 Haiku, Inc. All rights reserved. * Copyright 2008-2015 Haiku, Inc. All rights reserved.
* Copyright 2007-2009, Marcus Overhagen. All rights reserved. * Copyright 2007-2009, Marcus Overhagen. All rights reserved.
* Distributed under the terms of the MIT License. * Distributed under the terms of the MIT License.
*/ */
@@ -110,7 +110,9 @@ AHCIPort::Init1()
// prdt follows after command table // prdt follows after command table
// disable transitions to partial or slumber state // disable transitions to partial or slumber state
fRegs->sctl |= 0x300; fRegs->sctl = (fRegs->sctl & ~SATA_CONTROL_IPM_MASK)
| (IPM_TRANSITIONS_TO_PARTIAL_DISABLED
| IPM_TRANSITIONS_TO_SLUMBER_DISABLED) << SATA_CONTROL_IPM_SHIFT;
// clear IRQ status bits // clear IRQ status bits
fRegs->is = fRegs->is; fRegs->is = fRegs->is;
@@ -156,7 +158,12 @@ AHCIPort::Init2()
TRACE("is 0x%08" B_PRIx32 "\n", fRegs->is); TRACE("is 0x%08" B_PRIx32 "\n", fRegs->is);
TRACE("cmd 0x%08" B_PRIx32 "\n", fRegs->cmd); TRACE("cmd 0x%08" B_PRIx32 "\n", fRegs->cmd);
TRACE("ssts 0x%08" B_PRIx32 "\n", fRegs->ssts); TRACE("ssts 0x%08" B_PRIx32 "\n", fRegs->ssts);
TRACE("sctl 0x%08" B_PRIx32 "\n", fRegs->sctl); TRACE("sctl.ipm 0x%02" B_PRIx32 "\n",
(fRegs->sctl & SATA_CONTROL_IPM_MASK) >> SATA_CONTROL_IPM_SHIFT);
TRACE("sctl.spd 0x%02" B_PRIx32 "\n",
(fRegs->sctl & SATA_CONTROL_SPD_MASK) >> SATA_CONTROL_SPD_SHIFT);
TRACE("sctl.det 0x%02" B_PRIx32 "\n",
(fRegs->sctl & SATA_CONTROL_DET_MASK) >> SATA_CONTROL_DET_SHIFT);
TRACE("serr 0x%08" B_PRIx32 "\n", fRegs->serr); TRACE("serr 0x%08" B_PRIx32 "\n", fRegs->serr);
TRACE("sact 0x%08" B_PRIx32 "\n", fRegs->sact); TRACE("sact 0x%08" B_PRIx32 "\n", fRegs->sact);
TRACE("tfd 0x%08" B_PRIx32 "\n", fRegs->tfd); TRACE("tfd 0x%08" B_PRIx32 "\n", fRegs->tfd);
@@ -208,23 +215,13 @@ AHCIPort::Uninit()
void void
AHCIPort::ResetDevice() AHCIPort::ResetDevice()
{ {
if (fRegs->cmd & PORT_CMD_ST)
TRACE("AHCIPort::ResetDevice PORT_CMD_ST set, behaviour undefined\n");
// perform a hard reset // perform a hard reset
fRegs->sctl = (fRegs->sctl & ~0xf) | 1; _HardReset();
FlushPostedWrites();
spin(1100);
fRegs->sctl &= ~0xf;
FlushPostedWrites();
if (wait_until_set(&fRegs->ssts, 0x1, 100000) < B_OK) { if (wait_until_set(&fRegs->ssts, 0x1, 100000) < B_OK)
TRACE("AHCIPort::ResetDevice port %d no device detected\n", fIndex); TRACE("AHCIPort::ResetDevice port %d no device detected\n", fIndex);
}
// clear error bits _ClearErrorRegister();
fRegs->serr = fRegs->serr;
FlushPostedWrites();
if (fRegs->ssts & 1) { if (fRegs->ssts & 1) {
if (wait_until_set(&fRegs->ssts, 0x3, 500000) < B_OK) { if (wait_until_set(&fRegs->ssts, 0x3, 500000) < B_OK) {
@@ -233,9 +230,7 @@ AHCIPort::ResetDevice()
} }
} }
// clear error bits _ClearErrorRegister();
fRegs->serr = fRegs->serr;
FlushPostedWrites();
} }
@@ -364,10 +359,15 @@ AHCIPort::InterruptErrorHandler(uint32 is)
TRACE("AHCIPort::InterruptErrorHandler port %d, fCommandsActive 0x%08" TRACE("AHCIPort::InterruptErrorHandler port %d, fCommandsActive 0x%08"
B_PRIx32 ", is 0x%08" B_PRIx32 ", ci 0x%08" B_PRIx32 "\n", fIndex, B_PRIx32 ", is 0x%08" B_PRIx32 ", ci 0x%08" B_PRIx32 "\n", fIndex,
fCommandsActive, is, ci); fCommandsActive, is, ci);
TRACE("ssts 0x%08" B_PRIx32 "\n", fRegs->ssts);
TRACE("ssts 0x%08" B_PRIx32 ", sctl 0x%08" B_PRIx32 ", serr 0x%08" TRACE("sctl.ipm 0x%02" B_PRIx32 "\n",
B_PRIx32 ", sact 0x%08" B_PRIx32 "\n", (fRegs->sctl & SATA_CONTROL_IPM_MASK) >> SATA_CONTROL_IPM_SHIFT);
fRegs->ssts, fRegs->sctl, fRegs->serr, fRegs->sact); TRACE("sctl.spd 0x%02" B_PRIx32 "\n",
(fRegs->sctl & SATA_CONTROL_SPD_MASK) >> SATA_CONTROL_SPD_SHIFT);
TRACE("sctl.det 0x%02" B_PRIx32 "\n",
(fRegs->sctl & SATA_CONTROL_DET_MASK) >> SATA_CONTROL_DET_SHIFT);
TRACE("serr 0x%08" B_PRIx32 "\n", fRegs->serr);
TRACE("sact 0x%08" B_PRIx32 "\n", fRegs->sact);
} }
// read and clear SError // read and clear SError
@@ -413,7 +413,13 @@ AHCIPort::InterruptErrorHandler(uint32 is)
} }
if (is & PORT_INT_PC) { if (is & PORT_INT_PC) {
TRACE("Port Connect Change\n"); TRACE("Port Connect Change\n");
// fResetPort = true; // Spec v1.3, §6.2.2.3 Recovery of Unsolicited COMINIT
// perform a hard reset
_HardReset();
// clear error bits to clear PxSERR.DIAG.X
_ClearErrorRegister();
} }
if (is & PORT_INT_UF) { if (is & PORT_INT_UF) {
TRACE("Unknown FIS\n"); TRACE("Unknown FIS\n");
@@ -1224,3 +1230,31 @@ AHCIPort::ScsiGetRestrictions(bool* isATAPI, bool* noAutoSense,
"maxBlocks %" B_PRIu32 "\n", fIndex, *isATAPI, *noAutoSense, "maxBlocks %" B_PRIu32 "\n", fIndex, *isATAPI, *noAutoSense,
*maxBlocks); *maxBlocks);
} }
void
AHCIPort::_HardReset()
{
if ((fRegs->cmd & PORT_CMD_ST) != 0) {
// We shouldn't perform a reset, but at least document it
TRACE("AHCIPort::_HardReset() PORT_CMD_ST set, behaviour undefined\n");
}
fRegs->sctl = (fRegs->sctl & ~SATA_CONTROL_DET_MASK)
| DET_INITIALIZATION << SATA_CONTROL_DET_SHIFT;
FlushPostedWrites();
spin(1100);
// You must wait 1ms at minimum
fRegs->sctl = (fRegs->sctl & ~SATA_CONTROL_DET_MASK)
| DET_NO_INITIALIZATION << SATA_CONTROL_DET_SHIFT;
FlushPostedWrites();
}
void
AHCIPort::_ClearErrorRegister()
{
// clear error bits
fRegs->serr = fRegs->serr;
FlushPostedWrites();
}
@@ -51,6 +51,8 @@ private:
status_t WaitForTransfer(int *tfd, bigtime_t timeout); status_t WaitForTransfer(int *tfd, bigtime_t timeout);
void FinishTransfer(); void FinishTransfer();
inline void _HardReset();
inline void _ClearErrorRegister();
// uint8 * SetCommandFis(volatile command_list_entry *cmd, volatile fis *fis, const void *data, size_t dataSize); // uint8 * SetCommandFis(volatile command_list_entry *cmd, volatile fis *fis, const void *data, size_t dataSize);
status_t FillPrdTable(volatile prd *prdTable, int *prdCount, int prdMax, const void *data, size_t dataSize); status_t FillPrdTable(volatile prd *prdTable, int *prdCount, int prdMax, const void *data, size_t dataSize);
@@ -229,11 +229,12 @@ const struct supported_device {
{0x6767, 5, 0, RADEON_CAICOS, CHIP_STD, "Radeon HD Caicos"}, {0x6767, 5, 0, RADEON_CAICOS, CHIP_STD, "Radeon HD Caicos"},
{0x6768, 5, 0, RADEON_CAICOS, CHIP_STD, "Radeon HD Caicos"}, {0x6768, 5, 0, RADEON_CAICOS, CHIP_STD, "Radeon HD Caicos"},
{0x6770, 5, 0, RADEON_CAICOS, CHIP_STD, "Radeon HD 6400"}, {0x6770, 5, 0, RADEON_CAICOS, CHIP_STD, "Radeon HD 6400"},
{0x6778, 5, 0, RADEON_CAICOS, CHIP_STD, "Radeon HD Caicos"}, {0x6778, 5, 0, RADEON_CAICOS, CHIP_STD, "Radeon HD 7470/8470"},
{0x6779, 5, 0, RADEON_CAICOS, CHIP_STD, "Radeon HD 6450"}, {0x6779, 5, 0, RADEON_CAICOS, CHIP_STD, "Radeon HD 6450/7450/8450"},
{0x68fa, 5, 0, RADEON_CAICOS, CHIP_STD, "Radeon HD 7350"}, {0x68fa, 5, 0, RADEON_CAICOS, CHIP_STD, "Radeon HD 7350"},
{0x677b, 5, 0, RADEON_CAICOS, CHIP_STD, "Radeon HD 7400"}, {0x677b, 5, 0, RADEON_CAICOS, CHIP_STD, "Radeon HD 7400"},
{0x6772, 5, 0, RADEON_CAICOS, CHIP_APU, "Radeon HD 7400A"}, {0x6772, 5, 0, RADEON_CAICOS, CHIP_APU, "Radeon HD 7400A"},
{0x6771, 5, 0, RADEON_CAICOS, CHIP_STD, "Radeon HD 8490"},
// Turks // Turks
{0x6740, 5, 0, RADEON_TURKS, CHIP_MOBILE, "Radeon HD 6770M"}, {0x6740, 5, 0, RADEON_TURKS, CHIP_MOBILE, "Radeon HD 6770M"},
{0x6741, 5, 0, RADEON_TURKS, CHIP_MOBILE, "Radeon HD 6650M"}, {0x6741, 5, 0, RADEON_TURKS, CHIP_MOBILE, "Radeon HD 6650M"},
@@ -587,6 +587,9 @@ bfs_lookup(fs_volume* _volume, fs_vnode* _directory, const char* file,
status = tree->Find((uint8*)file, (uint16)strlen(file), _vnodeID); status = tree->Find((uint8*)file, (uint16)strlen(file), _vnodeID);
if (status != B_OK) { if (status != B_OK) {
//PRINT(("bfs_walk() could not find %Ld:\"%s\": %s\n", directory->BlockNumber(), file, strerror(status))); //PRINT(("bfs_walk() could not find %Ld:\"%s\": %s\n", directory->BlockNumber(), file, strerror(status)));
if (status == B_ENTRY_NOT_FOUND)
entry_cache_add_missing(volume->ID(), directory->ID(), file);
return status; return status;
} }
@@ -17,6 +17,13 @@ entry_cache_add(dev_t mountID, ino_t dirID, const char* name, ino_t nodeID)
} }
status_t
entry_cache_add_missing(dev_t mountID, ino_t dirID, const char* name)
{
return B_OK;
}
status_t status_t
entry_cache_remove(dev_t mountID, ino_t dirID, const char* name) entry_cache_remove(dev_t mountID, ino_t dirID, const char* name)
{ {
+30 -11
View File
@@ -445,6 +445,8 @@ InterfaceAddress::_Init(net_interface* netInterface, net_domain* netDomain)
Interface::Interface(const char* interfaceName, Interface::Interface(const char* interfaceName,
net_device_interface* deviceInterface) net_device_interface* deviceInterface)
:
fBusy(false)
{ {
TRACE("Interface %p: new \"%s\", device interface %p\n", this, TRACE("Interface %p: new \"%s\", device interface %p\n", this,
interfaceName, deviceInterface); interfaceName, deviceInterface);
@@ -933,13 +935,13 @@ Interface::SetDown()
if ((flags & IFF_UP) == 0) if ((flags & IFF_UP) == 0)
return; return;
// TODO: We acquire also the net_interfaces lock here
// to avoid a lock inversion in the ipv6 protocol implementation
// (see ticket #9377).
// A better solution would be to avoid locking the interface lock (fLock)
// when calling the lower layers.
RecursiveLocker interfacesLocker(sLock); RecursiveLocker interfacesLocker(sLock);
RecursiveLocker locker(fLock);
if (IsBusy())
return;
SetBusy(true);
interfacesLocker.Unlock();
DatalinkTable::Iterator iterator = fDatalinkTable.GetIterator(); DatalinkTable::Iterator iterator = fDatalinkTable.GetIterator();
while (domain_datalink* datalink = iterator.Next()) { while (domain_datalink* datalink = iterator.Next()) {
@@ -947,6 +949,8 @@ Interface::SetDown()
} }
flags &= ~IFF_UP; flags &= ~IFF_UP;
SetBusy(false);
} }
@@ -1076,10 +1080,11 @@ Interface::_SetUp()
if (status != B_OK) if (status != B_OK)
return status; return status;
RecursiveLocker interfacesLocker(sLock);
SetBusy(true);
interfacesLocker.Unlock();
// Propagate flag to all datalink protocols // Propagate flag to all datalink protocols
RecursiveLocker locker(fLock);
DatalinkTable::Iterator iterator = fDatalinkTable.GetIterator(); DatalinkTable::Iterator iterator = fDatalinkTable.GetIterator();
while (domain_datalink* datalink = iterator.Next()) { while (domain_datalink* datalink = iterator.Next()) {
status = datalink->first_info->interface_up(datalink->first_protocol); status = datalink->first_info->interface_up(datalink->first_protocol);
@@ -1097,6 +1102,7 @@ Interface::_SetUp()
} }
down_device_interface(fDeviceInterface); down_device_interface(fDeviceInterface);
SetBusy(false);
return status; return status;
} }
} }
@@ -1109,6 +1115,8 @@ Interface::_SetUp()
} }
flags |= IFF_UP; flags |= IFF_UP;
SetBusy(false);
return B_OK; return B_OK;
} }
@@ -1409,7 +1417,7 @@ get_interface(net_domain* domain, uint32 index)
interface = sInterfaces.First(); interface = sInterfaces.First();
else else
interface = find_interface(index); interface = find_interface(index);
if (interface == NULL) if (interface == NULL || interface->IsBusy())
return NULL; return NULL;
if (interface->CreateDomainDatalinkIfNeeded(domain) != B_OK) if (interface->CreateDomainDatalinkIfNeeded(domain) != B_OK)
@@ -1426,7 +1434,7 @@ get_interface(net_domain* domain, const char* name)
RecursiveLocker locker(sLock); RecursiveLocker locker(sLock);
Interface* interface = find_interface(name); Interface* interface = find_interface(name);
if (interface == NULL) if (interface == NULL || interface->IsBusy())
return NULL; return NULL;
if (interface->CreateDomainDatalinkIfNeeded(domain) != B_OK) if (interface->CreateDomainDatalinkIfNeeded(domain) != B_OK)
@@ -1445,6 +1453,8 @@ get_interface_for_device(net_domain* domain, uint32 index)
InterfaceList::Iterator iterator = sInterfaces.GetIterator(); InterfaceList::Iterator iterator = sInterfaces.GetIterator();
while (Interface* interface = iterator.Next()) { while (Interface* interface = iterator.Next()) {
if (interface->device->index == index) { if (interface->device->index == index) {
if (interface->IsBusy())
return NULL;
if (interface->CreateDomainDatalinkIfNeeded(domain) != B_OK) if (interface->CreateDomainDatalinkIfNeeded(domain) != B_OK)
return NULL; return NULL;
@@ -1470,6 +1480,8 @@ get_interface_for_link(net_domain* domain, const sockaddr* _linkAddress)
InterfaceList::Iterator iterator = sInterfaces.GetIterator(); InterfaceList::Iterator iterator = sInterfaces.GetIterator();
while (Interface* interface = iterator.Next()) { while (Interface* interface = iterator.Next()) {
if (interface->IsBusy())
continue;
// Test if the hardware address matches, or if the given interface // Test if the hardware address matches, or if the given interface
// matches, or if at least the index matches. // matches, or if at least the index matches.
if ((linkAddress.sdl_alen == interface->device->address.length if ((linkAddress.sdl_alen == interface->device->address.length
@@ -1479,6 +1491,8 @@ get_interface_for_link(net_domain* domain, const sockaddr* _linkAddress)
&& !strcmp(interface->name, (const char*)linkAddress.sdl_data)) && !strcmp(interface->name, (const char*)linkAddress.sdl_data))
|| (linkAddress.sdl_nlen == 0 && linkAddress.sdl_alen == 0 || (linkAddress.sdl_nlen == 0 && linkAddress.sdl_alen == 0
&& linkAddress.sdl_index == interface->index)) { && linkAddress.sdl_index == interface->index)) {
if (interface->IsBusy())
return NULL;
if (interface->CreateDomainDatalinkIfNeeded(domain) != B_OK) if (interface->CreateDomainDatalinkIfNeeded(domain) != B_OK)
return NULL; return NULL;
@@ -1516,6 +1530,9 @@ get_interface_address_for_destination(net_domain* domain,
InterfaceList::Iterator iterator = sInterfaces.GetIterator(); InterfaceList::Iterator iterator = sInterfaces.GetIterator();
while (Interface* interface = iterator.Next()) { while (Interface* interface = iterator.Next()) {
if (interface->IsBusy())
continue;
InterfaceAddress* address InterfaceAddress* address
= interface->AddressForDestination(domain, destination); = interface->AddressForDestination(domain, destination);
if (address != NULL) if (address != NULL)
@@ -1543,6 +1560,8 @@ get_interface_address_for_link(net_domain* domain, const sockaddr* address,
InterfaceList::Iterator iterator = sInterfaces.GetIterator(); InterfaceList::Iterator iterator = sInterfaces.GetIterator();
while (Interface* interface = iterator.Next()) { while (Interface* interface = iterator.Next()) {
if (interface->IsBusy())
continue;
// Test if the hardware address matches, or if the given interface // Test if the hardware address matches, or if the given interface
// matches, or if at least the index matches. // matches, or if at least the index matches.
if (linkAddress.sdl_alen == interface->device->address.length if (linkAddress.sdl_alen == interface->device->address.length
@@ -152,6 +152,9 @@ public:
domain_datalink* DomainDatalink(net_domain* domain) domain_datalink* DomainDatalink(net_domain* domain)
{ return DomainDatalink(domain->family); } { return DomainDatalink(domain->family); }
inline void SetBusy(bool busy) { atomic_set(&fBusy, busy ? 1 : 0); };
inline bool IsBusy() const { return atomic_get((int32*)&fBusy) == 1 ;};
#if ENABLE_DEBUGGER_COMMANDS #if ENABLE_DEBUGGER_COMMANDS
void Dump() const; void Dump() const;
#endif #endif
@@ -166,6 +169,7 @@ private:
private: private:
recursive_lock fLock; recursive_lock fLock;
int32 fBusy;
net_device_interface* fDeviceInterface; net_device_interface* fDeviceInterface;
AddressList fAddresses; AddressList fAddresses;
DatalinkTable fDatalinkTable; DatalinkTable fDatalinkTable;
@@ -57,6 +57,10 @@
// Otherwise the alternative code could simply be removed from this file. // Otherwise the alternative code could simply be removed from this file.
#endif #endif
#if LIBAVCODEC_VERSION_INT > ((54 << 16) | (50 << 8))
typedef AVCodecID CodecID;
#endif
struct wave_format_ex { struct wave_format_ex {
uint16 format_tag; uint16 format_tag;
@@ -409,10 +413,10 @@ AVCodecDecoder::_NegotiateAudioOutputFormat(media_format* inOutFormat)
if (fRawDecodedAudio->opaque == NULL) if (fRawDecodedAudio->opaque == NULL)
return B_NO_MEMORY; return B_NO_MEMORY;
TRACE(" bit_rate = %d, sample_rate = %d, channels = %d, init = %d, " TRACE(" bit_rate = %d, sample_rate = %d, channels = %d, "
"output frame size: %d, count: %ld, rate: %.2f\n", "output frame size: %d, count: %ld, rate: %.2f\n",
fContext->bit_rate, fContext->sample_rate, fContext->channels, fContext->bit_rate, fContext->sample_rate, fContext->channels,
result, fOutputFrameSize, fOutputFrameCount, fOutputFrameRate); fOutputFrameSize, fOutputFrameCount, fOutputFrameRate);
return B_OK; return B_OK;
} }
@@ -716,7 +720,7 @@ AVCodecDecoder::_DecodeNextAudioFrame()
dump_ffframe_audio(fRawDecodedAudio, "ffaudi"); dump_ffframe_audio(fRawDecodedAudio, "ffaudi");
#endif #endif
TRACE_AUDIO(" frame count: %lld current: %lld\n", TRACE_AUDIO(" frame count: %ld current: %lld\n",
fRawDecodedAudio->nb_samples, fFrame); fRawDecodedAudio->nb_samples, fFrame);
return B_OK; return B_OK;
@@ -1193,7 +1197,7 @@ AVCodecDecoder::_DecodeNextVideoFrame()
fRawDecodedPicture, &gotVideoFrame, &fTempPacket); fRawDecodedPicture, &gotVideoFrame, &fTempPacket);
if (encodedDataSizeInBytes < 0) { if (encodedDataSizeInBytes < 0) {
TRACE("[v] AVCodecDecoder: ignoring error in decoding frame %lld:" TRACE("[v] AVCodecDecoder: ignoring error in decoding frame %lld:"
" %d\n", fFrame, len); " %d\n", fFrame, encodedDataSizeInBytes);
// NOTE: An error from avcodec_decode_video2() is ignored by the // NOTE: An error from avcodec_decode_video2() is ignored by the
// FFMPEG 0.10.2 example decoding_encoding.c. Only the packet // FFMPEG 0.10.2 example decoding_encoding.c. Only the packet
// buffers are flushed accordingly // buffers are flushed accordingly
@@ -40,9 +40,9 @@ AVCodecEncoder::AVCodecEncoder(uint32 codecID, int bitRateScale)
: :
Encoder(), Encoder(),
fBitRateScale(bitRateScale), fBitRateScale(bitRateScale),
fCodecID((enum CodecID)codecID), fCodecID((CodecID)codecID),
fCodec(NULL), fCodec(NULL),
fOwnContext(avcodec_alloc_context()), fOwnContext(avcodec_alloc_context3(NULL)),
fContext(fOwnContext), fContext(fOwnContext),
fCodecInitStatus(CODEC_INIT_NEEDED), fCodecInitStatus(CODEC_INIT_NEEDED),
@@ -494,7 +494,7 @@ AVCodecEncoder::_OpenCodecIfNeeded()
fContext->strict_std_compliance = -2; fContext->strict_std_compliance = -2;
// Open the codec // Open the codec
int result = avcodec_open(fContext, fCodec); int result = avcodec_open2(fContext, fCodec, NULL);
if (result >= 0) if (result >= 0)
fCodecInitStatus = CODEC_INIT_DONE; fCodecInitStatus = CODEC_INIT_DONE;
else else
@@ -591,43 +591,78 @@ status_t
AVCodecEncoder::_EncodeAudio(const uint8* buffer, size_t bufferSize, AVCodecEncoder::_EncodeAudio(const uint8* buffer, size_t bufferSize,
int64 frameCount, media_encode_info* info) int64 frameCount, media_encode_info* info)
{ {
// Encode one audio chunk/frame. The bufferSize has already been adapted status_t ret;
// to the needed size for fContext->frame_size, or we are writing raw
// audio.
int usedBytes = avcodec_encode_audio(fContext, fChunkBuffer,
bufferSize, reinterpret_cast<const short*>(buffer));
if (usedBytes < 0) { // Encode one audio chunk/frame.
TRACE(" avcodec_encode_audio() failed: %d\n", usedBytes); AVPacket packet;
return B_ERROR; av_init_packet(&packet);
// By leaving these NULL, we let the encoder allocate memory as it needs.
// This way we don't risk iving a too small buffer.
packet.data = NULL;
packet.size = 0;
// We need to wrap our input data into an AVFrame structure.
AVFrame frame;
int gotPacket = 0;
if (buffer) {
avcodec_get_frame_defaults(&frame);
frame.nb_samples = frameCount;
ret = avcodec_fill_audio_frame(&frame, fContext->channels,
fContext->sample_fmt, (const uint8_t *) buffer, bufferSize, 1);
if (ret != 0)
return B_ERROR;
/* Set the presentation time of the frame */
frame.pts = (bigtime_t)(fFramesWritten * 1000000LL
/ fInputFormat.u.raw_audio.frame_rate);
fFramesWritten += frame.nb_samples;
ret = avcodec_encode_audio2(fContext, &packet, &frame, &gotPacket);
} else {
// If called with NULL, ask the encoder to flush any buffers it may
// have pending.
ret = avcodec_encode_audio2(fContext, &packet, NULL, &gotPacket);
} }
if (usedBytes == 0)
return B_OK;
// // Maybe we need to use this PTS to calculate start_time: if (buffer && frame.extended_data != frame.data)
// if (fContext->coded_frame->pts != kNoPTSValue) { av_freep(&frame.extended_data);
// TRACE(" codec frame PTS: %lld (codec time_base: %d/%d)\n",
// fContext->coded_frame->pts, fContext->time_base.num,
// fContext->time_base.den);
// } else {
// TRACE(" codec frame PTS: N/A (codec time_base: %d/%d)\n",
// fContext->time_base.num, fContext->time_base.den);
// }
// Setup media_encode_info, most important is the time stamp. if (ret != 0) {
info->start_time = (bigtime_t)(fFramesWritten * 1000000LL TRACE(" avcodec_encode_audio() failed: %ld\n", ret);
/ fInputFormat.u.raw_audio.frame_rate); return B_ERROR;
info->flags = B_MEDIA_KEY_FRAME;
// Write the chunk
status_t ret = WriteChunk(fChunkBuffer, usedBytes, info);
if (ret != B_OK) {
TRACE(" error writing chunk: %s\n", strerror(ret));
return ret;
} }
fFramesWritten += frameCount; fFramesWritten += frameCount;
if (gotPacket) {
if (fContext->coded_frame) {
// Store information about the coded frame in the context.
fContext->coded_frame->pts = packet.pts;
fContext->coded_frame->key_frame = !!(packet.flags & AV_PKT_FLAG_KEY);
}
// Setup media_encode_info, most important is the time stamp.
info->start_time = packet.pts;
if (packet.flags & AV_PKT_FLAG_KEY)
info->flags = B_MEDIA_KEY_FRAME;
else
info->flags = 0;
// We got a packet out of the encoder, write it to the output stream
ret = WriteChunk(packet.data, packet.size, info);
if (ret != B_OK) {
TRACE(" error writing chunk: %s\n", strerror(ret));
av_free_packet(&packet);
return ret;
}
}
av_free_packet(&packet);
return B_OK; return B_OK;
} }
@@ -17,6 +17,11 @@ extern "C" {
#include "EncoderPlugin.h" #include "EncoderPlugin.h"
#if LIBAVCODEC_VERSION_INT > ((54 << 16) | (50 << 8))
typedef AVCodecID CodecID;
#endif
class AVCodecEncoder : public Encoder { class AVCodecEncoder : public Encoder {
public: public:
AVCodecEncoder(uint32 codecID, AVCodecEncoder(uint32 codecID,
@@ -257,7 +257,7 @@ StreamBase::Open()
fContext->pb = fIOContext; fContext->pb = fIOContext;
// Allocate our context and probe the input format // Allocate our context and probe the input format
if (avformat_open_input(&fContext, "", NULL, NULL) < 0) { if (avformat_open_input(&fContext, ".mod", NULL, NULL) < 0) {
TRACE("StreamBase::Open() - avformat_open_input() failed!\n"); TRACE("StreamBase::Open() - avformat_open_input() failed!\n");
// avformat_open_input() frees the context in case of failure // avformat_open_input() frees the context in case of failure
fContext = NULL; fContext = NULL;
@@ -1505,7 +1505,7 @@ AVFormatReader::Sniff(int32* _streamCount)
streamDeleter.Detach(); streamDeleter.Detach();
#ifdef TRACE_AVFORMAT_READER #ifdef TRACE_AVFORMAT_READER
dump_format(const_cast<AVFormatContext*>(stream->Context()), 0, "", 0); av_dump_format(const_cast<AVFormatContext*>(stream->Context()), 0, "", 0);
#endif #endif
if (_streamCount != NULL) if (_streamCount != NULL)
@@ -53,6 +53,9 @@ static const size_t kIOBufferSize = 64 * 1024;
#define OPEN_CODEC_CONTEXT 1 #define OPEN_CODEC_CONTEXT 1
#define GET_CONTEXT_DEFAULTS 0 #define GET_CONTEXT_DEFAULTS 0
#if LIBAVCODEC_VERSION_INT > ((54 << 16) | (50 << 8))
typedef AVCodecID CodecID;
#endif
// #pragma mark - AVFormatWriter::StreamCookie // #pragma mark - AVFormatWriter::StreamCookie
@@ -109,7 +112,8 @@ AVFormatWriter::StreamCookie::Init(media_format* format,
BAutolock _(fStreamLock); BAutolock _(fStreamLock);
fPacket.stream_index = fContext->nb_streams; fPacket.stream_index = fContext->nb_streams;
fStream = av_new_stream(fContext, fPacket.stream_index); fStream = avformat_new_stream(fContext, NULL);
fStream->id = fPacket.stream_index;
if (fStream == NULL) { if (fStream == NULL) {
TRACE(" failed to add new stream\n"); TRACE(" failed to add new stream\n");
@@ -200,6 +204,10 @@ AVFormatWriter::StreamCookie::Init(media_format* format,
// Now negociate the actual format with the encoder // Now negociate the actual format with the encoder
// First check if the requested format is acceptable // First check if the requested format is acceptable
AVCodec* codec = avcodec_find_encoder(fStream->codec->codec_id); AVCodec* codec = avcodec_find_encoder(fStream->codec->codec_id);
if (codec == NULL)
return B_MEDIA_BAD_FORMAT;
const enum AVSampleFormat *p = codec->sample_fmts; const enum AVSampleFormat *p = codec->sample_fmts;
for (; *p != -1; p++) { for (; *p != -1; p++) {
if (*p == fStream->codec->sample_fmt) if (*p == fStream->codec->sample_fmt)
@@ -466,7 +474,7 @@ AVFormatWriter::CommitHeader()
AVCodecContext* codecContext = stream->codec; AVCodecContext* codecContext = stream->codec;
codecContext->strict_std_compliance = -2; codecContext->strict_std_compliance = -2;
AVCodec* codec = avcodec_find_encoder(codecContext->codec_id); AVCodec* codec = avcodec_find_encoder(codecContext->codec_id);
if (codec == NULL || avcodec_open(codecContext, codec) < 0) { if (codec == NULL || avcodec_open2(codecContext, codec, NULL) < 0) {
TRACE(" stream[%u] - failed to open AVCodecContext\n", i); TRACE(" stream[%u] - failed to open AVCodecContext\n", i);
} }
TRACE(" stream[%u] time_base: (%d/%d), codec->time_base: (%d/%d)\n", TRACE(" stream[%u] time_base: (%d/%d), codec->time_base: (%d/%d)\n",
@@ -11,9 +11,15 @@ extern "C" {
#include "avformat.h" #include "avformat.h"
} }
#if LIBAVCODEC_VERSION_INT > ((54 << 16) | (50 << 8))
typedef AVCodecID CodecID;
#endif
//XXX: newer versions have it in libavformat/internal.h //XXX: newer versions have it in libavformat/internal.h
typedef struct AVCodecTag { typedef struct AVCodecTag {
enum CodecID id; CodecID id;
unsigned int tag; unsigned int tag;
} AVCodecTag; } AVCodecTag;
@@ -13,6 +13,11 @@ extern "C" {
} }
#if LIBAVCODEC_VERSION_INT > ((54 << 16) | (50 << 8))
typedef AVCodecID CodecID;
#endif
struct EncoderDescription { struct EncoderDescription {
media_codec_info codec_info; media_codec_info codec_info;
media_format_family format_family; media_format_family format_family;
@@ -53,7 +53,7 @@ manage_locks(void** _lock, enum AVLockOp operation)
case AV_LOCK_CREATE: case AV_LOCK_CREATE:
TRACE(" AV_LOCK_CREATE\n"); TRACE(" AV_LOCK_CREATE\n");
*lock = new(std::nothrow) BLocker("FFmpeg lock"); *lock = new(std::nothrow) BLocker("FFmpeg lock");
if (*lock == NULL) if (*lock == NULL)
return 1; return 1;
break; break;
@@ -318,6 +318,62 @@ const media_file_format gMuxerTable[] = {
"webm", "webm",
{ 0 } { 0 }
}, },
{
media_file_format::B_READABLE
| media_file_format::B_KNOWS_RAW_AUDIO
| media_file_format::B_KNOWS_ENCODED_AUDIO,
{ 0 },
B_MISC_FORMAT_FAMILY,
100,
{ 0 },
"audio/xm",
"Fast Tracker eXtended Module",
"xm",
"xm",
{ 0 }
},
{
media_file_format::B_READABLE
| media_file_format::B_KNOWS_RAW_AUDIO
| media_file_format::B_KNOWS_ENCODED_AUDIO,
{ 0 },
B_MISC_FORMAT_FAMILY,
100,
{ 0 },
"audio/s3m",
"Scream Tracker 3",
"s3m",
"s3m",
{ 0 }
},
{
media_file_format::B_READABLE
| media_file_format::B_KNOWS_RAW_AUDIO
| media_file_format::B_KNOWS_ENCODED_AUDIO,
{ 0 },
B_MISC_FORMAT_FAMILY,
100,
{ 0 },
"audio/it",
"Impulse Tracker",
"it",
"it",
{ 0 }
},
{
media_file_format::B_READABLE
| media_file_format::B_KNOWS_RAW_AUDIO
| media_file_format::B_KNOWS_ENCODED_AUDIO,
{ 0 },
B_MISC_FORMAT_FAMILY,
100,
{ 0 },
"audio/x-mod",
"Protracker MOD",
"mod",
"mod",
{ 0 }
},
}; };
const size_t gMuxerCount = sizeof(gMuxerTable) / sizeof(media_file_format); const size_t gMuxerCount = sizeof(gMuxerTable) / sizeof(media_file_format);
+4 -4
View File
@@ -38,11 +38,11 @@ printf("ReadyToRun()\n");
PostMessage(B_QUIT_REQUESTED); PostMessage(B_QUIT_REQUESTED);
} }
virtual void ArgvReceived(int32 argc, char** argv) virtual void ArgvReceived(int32 argc, char** argv)
{ {
printf("ArgvReceived()\n"); printf("ArgvReceived()\n");
for (int32 i = 0; i < argc; i++) for (int32 i = 0; i < argc; i++)
printf(" arg %ld: \"%s\"\n", i, argv[i]); printf(" arg %" B_PRId32 ": \"%s\"\n", i, argv[i]);
for (int32 i = 1; i < argc; i++) { for (int32 i = 1; i < argc; i++) {
PathDataSource* dataSource = new(std::nothrow) PathDataSource; PathDataSource* dataSource = new(std::nothrow) PathDataSource;
@@ -59,7 +59,7 @@ BigtimeChartAxisLegendSource::GetAxisLegends(const ChartDataRange& range,
decomposed_bigtime decomposed; decomposed_bigtime decomposed;
decompose_time(time, decomposed); decompose_time(time, decomposed);
char buffer[128]; char buffer[128];
snprintf(buffer, sizeof(buffer), "%02lld:%02d:%02d.%06d", snprintf(buffer, sizeof(buffer), "%02" B_PRIu64 ":%02d:%02d.%06d",
decomposed.hours, decomposed.minutes, decomposed.seconds, decomposed.hours, decomposed.minutes, decomposed.seconds,
decomposed.micros); decomposed.micros);
// TODO: Drop superfluous micro seconds digits, or even microseconds and seconds // TODO: Drop superfluous micro seconds digits, or even microseconds and seconds
@@ -89,7 +89,7 @@ LegendChartAxis::_FilterLegends(int32 totalSize, int32 spacing,
// Filter out all higher level legends colliding with lower level or // Filter out all higher level legends colliding with lower level or
// preceeding same-level legends. We iterate backwards from the lower to // preceeding same-level legends. We iterate backwards from the lower to
// the higher levels // the higher levels
for (int32 level = std::max(minLevel, 0L); level <= maxLevel;) { for (int32 level = std::max(minLevel, (int32)0); level <= maxLevel;) {
legendCount = fLegends.CountItems(); legendCount = fLegends.CountItems();
// get the first legend position/end // get the first legend position/end
@@ -60,7 +60,7 @@ NanotimeChartAxisLegendSource::GetAxisLegends(const ChartDataRange& range,
decomposed_nanotime decomposed; decomposed_nanotime decomposed;
decompose_time(time, decomposed); decompose_time(time, decomposed);
char buffer[128]; char buffer[128];
snprintf(buffer, sizeof(buffer), "%02lld:%02d:%02d.%09d", snprintf(buffer, sizeof(buffer), "%02" B_PRId64 ":%02d:%02d.%09d",
decomposed.hours, decomposed.minutes, decomposed.seconds, decomposed.hours, decomposed.minutes, decomposed.seconds,
decomposed.nanos); decomposed.nanos);
// TODO: Drop superfluous nanoseconds digits, or even nanoseconds and seconds // TODO: Drop superfluous nanoseconds digits, or even nanoseconds and seconds
@@ -68,11 +68,11 @@ MainWindow::GeneralPage::SetModel(Model* model)
fIdleTimeView->SetText(buffer); fIdleTimeView->SetText(buffer);
// team count // team count
snprintf(buffer, sizeof(buffer), "%ld", fModel->CountTeams()); snprintf(buffer, sizeof(buffer), "%" B_PRId32, fModel->CountTeams());
fTeamCountView->SetText(buffer); fTeamCountView->SetText(buffer);
// threads // threads
snprintf(buffer, sizeof(buffer), "%ld", fModel->CountThreads()); snprintf(buffer, sizeof(buffer), "%" B_PRId32, fModel->CountThreads());
fThreadCountView->SetText(buffer); fThreadCountView->SetText(buffer);
} else { } else {
fDataSourceView->SetText(""); fDataSourceView->SetText("");
@@ -318,7 +318,7 @@ protected:
int32 lineHeight = (int32)fFontInfo.lineHeight; int32 lineHeight = (int32)fFontInfo.lineHeight;
minLine = (int32)rect.top / lineHeight; minLine = (int32)rect.top / lineHeight;
maxLine = ((int32)ceilf(rect.bottom) + lineHeight - 1) / lineHeight; maxLine = ((int32)ceilf(rect.bottom) + lineHeight - 1) / lineHeight;
minLine = std::max(minLine, 0L); minLine = std::max(minLine, (int32)0);
maxLine = std::min(maxLine, CountLines() - 1); maxLine = std::min(maxLine, CountLines() - 1);
} }
@@ -1449,7 +1449,8 @@ printf("failed to read event!\n");
Model::ThreadSchedulingState* thread = fState.LookupThread( Model::ThreadSchedulingState* thread = fState.LookupThread(
event->thread); event->thread);
if (thread == NULL) { if (thread == NULL) {
printf("Schedule event for unknown thread: %ld\n", event->thread); printf("Schedule event for unknown thread: %" B_PRId32 "\n",
event->thread);
return; return;
} }
@@ -1464,8 +1465,8 @@ printf("failed to read event!\n");
thread = fState.LookupThread(event->previous_thread); thread = fState.LookupThread(event->previous_thread);
if (thread == NULL) { if (thread == NULL) {
printf("Schedule event for unknown previous thread: %ld\n", printf("Schedule event for unknown previous thread: %" B_PRId32
event->previous_thread); "\n", event->previous_thread);
return; return;
} }
@@ -1529,8 +1530,8 @@ printf("failed to read event!\n");
Model::ThreadSchedulingState* thread = fState.LookupThread( Model::ThreadSchedulingState* thread = fState.LookupThread(
event->thread); event->thread);
if (thread == NULL) { if (thread == NULL) {
printf("Enqueued in run queue event for unknown thread: %ld\n", printf("Enqueued in run queue event for unknown thread: %" B_PRId32
event->thread); "\n", event->thread);
return; return;
} }
@@ -1559,8 +1560,8 @@ printf("failed to read event!\n");
Model::ThreadSchedulingState* thread = fState.LookupThread( Model::ThreadSchedulingState* thread = fState.LookupThread(
event->thread); event->thread);
if (thread == NULL) { if (thread == NULL) {
printf("Removed from run queue event for unknown thread: %ld\n", printf("Removed from run queue event for unknown thread: %" B_PRId32
event->thread); "\n", event->thread);
return; return;
} }
@@ -51,8 +51,8 @@ public:
{ {
char buffer[128]; char buffer[128];
Model::Team* team = thread->GetTeam(); Model::Team* team = thread->GetTeam();
snprintf(buffer, sizeof(buffer), "%s (%ld)", team->Name(), snprintf(buffer, sizeof(buffer), "%s (%" B_PRId32 ")",
team->ID()); team->Name(), team->ID());
value.SetTo(buffer); value.SetTo(buffer);
return true; return true;
} }
@@ -55,7 +55,7 @@ ThreadWindow::GeneralPage::SetModel(Model* model, Model::Thread* thread)
// ID // ID
char buffer[128]; char buffer[128];
snprintf(buffer, sizeof(buffer), "%ld", fThread->ID()); snprintf(buffer, sizeof(buffer), "%" B_PRId32, fThread->ID());
fThreadIDView->SetText(buffer); fThreadIDView->SetText(buffer);
// team // team
@@ -65,28 +65,28 @@ ThreadWindow::GeneralPage::SetModel(Model* model, Model::Thread* thread)
char timeBuffer[64]; char timeBuffer[64];
format_nanotime(fThread->TotalRunTime(), timeBuffer, format_nanotime(fThread->TotalRunTime(), timeBuffer,
sizeof(timeBuffer)); sizeof(timeBuffer));
snprintf(buffer, sizeof(buffer), "%s (%lld)", timeBuffer, snprintf(buffer, sizeof(buffer), "%s (%" B_PRId64 ")", timeBuffer,
fThread->Runs()); fThread->Runs());
fRunTimeView->SetText(buffer); fRunTimeView->SetText(buffer);
// wait time // wait time
format_nanotime(fThread->TotalWaitTime(), timeBuffer, format_nanotime(fThread->TotalWaitTime(), timeBuffer,
sizeof(timeBuffer)); sizeof(timeBuffer));
snprintf(buffer, sizeof(buffer), "%s (%lld)", timeBuffer, snprintf(buffer, sizeof(buffer), "%s (%" B_PRId64 ")", timeBuffer,
fThread->Waits()); fThread->Waits());
fWaitTimeView->SetText(buffer); fWaitTimeView->SetText(buffer);
// latencies // latencies
format_nanotime(fThread->TotalLatency(), timeBuffer, format_nanotime(fThread->TotalLatency(), timeBuffer,
sizeof(timeBuffer)); sizeof(timeBuffer));
snprintf(buffer, sizeof(buffer), "%s (%lld)", timeBuffer, snprintf(buffer, sizeof(buffer), "%s (%" B_PRId64 ")", timeBuffer,
fThread->Latencies()); fThread->Latencies());
fLatencyView->SetText(buffer); fLatencyView->SetText(buffer);
// preemptions // preemptions
format_nanotime(fThread->TotalRerunTime(), timeBuffer, format_nanotime(fThread->TotalRerunTime(), timeBuffer,
sizeof(timeBuffer)); sizeof(timeBuffer));
snprintf(buffer, sizeof(buffer), "%s (%lld)", timeBuffer, snprintf(buffer, sizeof(buffer), "%s (%" B_PRId64 ")", timeBuffer,
fThread->Preemptions()); fThread->Preemptions());
fPreemptionView->SetText(buffer); fPreemptionView->SetText(buffer);
@@ -27,8 +27,8 @@ static BString
get_window_name(Model::Thread* thread) get_window_name(Model::Thread* thread)
{ {
char buffer[1024]; char buffer[1024];
snprintf(buffer, sizeof(buffer), "Thread: %s (%ld)", thread->Name(), snprintf(buffer, sizeof(buffer), "Thread: %s (%" B_PRId32 ")",
thread->ID()); thread->Name(), thread->ID());
return BString(buffer); return BString(buffer);
} }
+3 -3
View File
@@ -785,7 +785,7 @@ Model::AddTeam(const system_profiler_team_added* event, nanotime_t time)
{ {
Team* team = TeamByID(event->team); Team* team = TeamByID(event->team);
if (team != NULL) { if (team != NULL) {
fprintf(stderr, "Duplicate team: %ld\n", event->team); fprintf(stderr, "Duplicate team: %" B_PRId32 "\n", event->team);
// TODO: User feedback! // TODO: User feedback!
return team; return team;
} }
@@ -830,7 +830,7 @@ Model::AddThread(const system_profiler_thread_added* event, nanotime_t time)
// check whether we do already know the thread // check whether we do already know the thread
Thread* thread = ThreadByID(event->thread); Thread* thread = ThreadByID(event->thread);
if (thread != NULL) { if (thread != NULL) {
fprintf(stderr, "Duplicate thread: %ld\n", event->thread); fprintf(stderr, "Duplicate thread: %" B_PRId32 "\n", event->thread);
// TODO: User feedback! // TODO: User feedback!
return thread; return thread;
} }
@@ -838,7 +838,7 @@ Model::AddThread(const system_profiler_thread_added* event, nanotime_t time)
// get its team // get its team
Team* team = TeamByID(event->team); Team* team = TeamByID(event->team);
if (team == NULL) { if (team == NULL) {
fprintf(stderr, "No team for thread: %ld\n", event->thread); fprintf(stderr, "No team for thread: %" B_PRId32 "\n", event->thread);
return NULL; return NULL;
} }
@@ -721,9 +721,9 @@ ModelLoader::_ProcessEvent(uint32 event, uint32 cpu, const void* buffer,
break; break;
default: default:
printf("unsupported event type %lu, size: %lu\n", event, size); printf("unsupported event type %" B_PRIu32 ", size: %" B_PRIuSIZE
return B_BAD_DATA; "\n", event, size);
break; return B_BAD_DATA;
} }
return B_OK; return B_OK;
@@ -889,8 +889,10 @@ ModelLoader::_HandleTeamRemoved(system_profiler_team_removed* event)
{ {
if (Model::Team* team = fModel->TeamByID(event->team)) if (Model::Team* team = fModel->TeamByID(event->team))
team->SetDeletionTime(fState->LastEventTime()); team->SetDeletionTime(fState->LastEventTime());
else else {
printf("Warning: Removed event for unknown team: %ld\n", event->team); printf("Warning: Removed event for unknown team: %" B_PRId32 "\n",
event->team);
}
} }
@@ -913,7 +915,7 @@ ModelLoader::_HandleThreadRemoved(system_profiler_thread_removed* event)
{ {
ExtendedThreadSchedulingState* thread = fState->LookupThread(event->thread); ExtendedThreadSchedulingState* thread = fState->LookupThread(event->thread);
if (thread == NULL) { if (thread == NULL) {
printf("Warning: Removed event for unknown thread: %ld\n", printf("Warning: Removed event for unknown thread: %" B_PRId32 "\n",
event->thread); event->thread);
thread = _AddUnknownThread(event->thread); thread = _AddUnknownThread(event->thread);
} }
@@ -931,7 +933,7 @@ ModelLoader::_HandleThreadScheduled(uint32 cpu,
ExtendedThreadSchedulingState* thread = fState->LookupThread(event->thread); ExtendedThreadSchedulingState* thread = fState->LookupThread(event->thread);
if (thread == NULL) { if (thread == NULL) {
printf("Warning: Schedule event for unknown thread: %ld\n", printf("Warning: Schedule event for unknown thread: %" B_PRId32 "\n",
event->thread); event->thread);
thread = _AddUnknownThread(event->thread); thread = _AddUnknownThread(event->thread);
return; return;
@@ -966,8 +968,8 @@ ModelLoader::_HandleThreadScheduled(uint32 cpu,
thread = fState->LookupThread(event->previous_thread); thread = fState->LookupThread(event->previous_thread);
if (thread == NULL) { if (thread == NULL) {
printf("Warning: Schedule event for unknown previous thread: %ld\n", printf("Warning: Schedule event for unknown previous thread: %" B_PRId32
event->previous_thread); "\n", event->previous_thread);
thread = _AddUnknownThread(event->previous_thread); thread = _AddUnknownThread(event->previous_thread);
} }
@@ -1035,8 +1037,8 @@ ModelLoader::_HandleThreadEnqueuedInRunQueue(
ExtendedThreadSchedulingState* thread = fState->LookupThread(event->thread); ExtendedThreadSchedulingState* thread = fState->LookupThread(event->thread);
if (thread == NULL) { if (thread == NULL) {
printf("Warning: Enqueued in run queue event for unknown thread: %ld\n", printf("Warning: Enqueued in run queue event for unknown thread: %"
event->thread); B_PRId32 "\n", event->thread);
thread = _AddUnknownThread(event->thread); thread = _AddUnknownThread(event->thread);
} }
@@ -1073,7 +1075,7 @@ ModelLoader::_HandleThreadRemovedFromRunQueue(uint32 cpu,
ExtendedThreadSchedulingState* thread = fState->LookupThread(event->thread); ExtendedThreadSchedulingState* thread = fState->LookupThread(event->thread);
if (thread == NULL) { if (thread == NULL) {
printf("Warning: Removed from run queue event for unknown thread: " printf("Warning: Removed from run queue event for unknown thread: "
"%ld\n", event->thread); "%" B_PRId32 "\n", event->thread);
thread = _AddUnknownThread(event->thread); thread = _AddUnknownThread(event->thread);
} }
@@ -1112,8 +1114,8 @@ ModelLoader::_HandleIOSchedulerAdded(system_profiler_io_scheduler_added* event)
{ {
Model::IOScheduler* scheduler = fModel->IOSchedulerByID(event->scheduler); Model::IOScheduler* scheduler = fModel->IOSchedulerByID(event->scheduler);
if (scheduler != NULL) { if (scheduler != NULL) {
printf("Warning: Duplicate added event for I/O scheduler %ld\n", printf("Warning: Duplicate added event for I/O scheduler %" B_PRId32
event->scheduler); "\n", event->scheduler);
return; return;
} }
@@ -1134,12 +1136,13 @@ ModelLoader::_HandleIORequestScheduled(io_request_scheduled* event)
ExtendedThreadSchedulingState* thread = fState->LookupThread(event->thread); ExtendedThreadSchedulingState* thread = fState->LookupThread(event->thread);
if (thread == NULL) { if (thread == NULL) {
printf("Warning: I/O request for unknown thread %ld\n", event->thread); printf("Warning: I/O request for unknown thread %" B_PRId32 "\n",
event->thread);
thread = _AddUnknownThread(event->thread); thread = _AddUnknownThread(event->thread);
} }
if (fModel->IOSchedulerByID(event->scheduler) == NULL) { if (fModel->IOSchedulerByID(event->scheduler) == NULL) {
printf("Warning: I/O requests for unknown scheduler %ld\n", printf("Warning: I/O requests for unknown scheduler %" B_PRId32 "\n",
event->scheduler); event->scheduler);
// TODO: Add state for unknown scheduler, as we do for threads. // TODO: Add state for unknown scheduler, as we do for threads.
return; return;
@@ -1307,8 +1310,8 @@ ModelLoader::_AddThreadWaitObject(ExtendedThreadSchedulingState* thread,
= fModel->WaitObjectGroupFor(type, object); = fModel->WaitObjectGroupFor(type, object);
if (waitObjectGroup == NULL) { if (waitObjectGroup == NULL) {
// The algorithm should prevent this case. // The algorithm should prevent this case.
printf("ModelLoader::_AddThreadWaitObject(): Unknown wait object: type: %lu, " printf("ModelLoader::_AddThreadWaitObject(): Unknown wait object: type:"
"object: %#lx\n", type, object); " %" B_PRIu32 ", " "object: %#" B_PRIxADDR "\n", type, object);
return; return;
} }
@@ -114,9 +114,9 @@ ThreadModelLoader::_Load()
// create the groups // create the groups
int32 waitObjectCount = waitObjects.CountItems(); int32 waitObjectCount = waitObjects.CountItems();
printf("%ld wait objects\n", waitObjectCount); printf("%" B_PRId32 " wait objects\n", waitObjectCount);
for (int32 i = 0; i < waitObjectCount;) { for (int32 i = 0; i < waitObjectCount;) {
printf("new wait object group at %ld\n", i); printf("new wait object group at %" B_PRId32 "\n", i);
// collect the objects for this group // collect the objects for this group
Model::ThreadWaitObject* firstObject = waitObjects.ItemAt(i); Model::ThreadWaitObject* firstObject = waitObjects.ItemAt(i);
int32 k = i + 1; int32 k = i + 1;
+104 -4
View File
@@ -1,6 +1,6 @@
/* /*
* Copyright 2009-2012, Ingo Weinhold, ingo_weinhold@gmx.de. * Copyright 2009-2012, Ingo Weinhold, ingo_weinhold@gmx.de.
* Copyright 2011-2014, Rene Gollent, rene@gollent.com. * Copyright 2011-2015, Rene Gollent, rene@gollent.com.
* Distributed under the terms of the MIT License. * Distributed under the terms of the MIT License.
*/ */
@@ -26,6 +26,7 @@
#include "GraphicalUserInterface.h" #include "GraphicalUserInterface.h"
#include "ImageDebugLoadingStateHandlerRoster.h" #include "ImageDebugLoadingStateHandlerRoster.h"
#include "MessageCodes.h" #include "MessageCodes.h"
#include "ReportUserInterface.h"
#include "SettingsManager.h" #include "SettingsManager.h"
#include "SignalSet.h" #include "SignalSet.h"
#include "StartTeamWindow.h" #include "StartTeamWindow.h"
@@ -143,7 +144,6 @@ parse_arguments(int argc, const char* const* argv, bool noOutput,
case 's': case 's':
{ {
options.useCLI = true;
options.saveReport = true; options.saveReport = true;
options.reportPath = optarg; options.reportPath = optarg;
break; break;
@@ -393,6 +393,21 @@ private:
}; };
class ReportDebugger : private TeamDebugger::Listener {
public:
ReportDebugger();
~ReportDebugger();
bool Run(const Options& options);
private:
// TeamDebugger::Listener
virtual void TeamDebuggerStarted(TeamDebugger* debugger);
virtual void TeamDebuggerRestartRequested(
TeamDebugger* debugger);
virtual void TeamDebuggerQuit(TeamDebugger* debugger);
};
// #pragma mark - Debugger application class // #pragma mark - Debugger application class
@@ -723,8 +738,7 @@ CliDebugger::Run(const Options& options)
// create the command line UI // create the command line UI
CommandLineUserInterface* userInterface CommandLineUserInterface* userInterface
= new(std::nothrow) CommandLineUserInterface(options.saveReport, = new(std::nothrow) CommandLineUserInterface();
options.reportPath, options.thread);
if (userInterface == NULL) { if (userInterface == NULL) {
fprintf(stderr, "Error: Out of memory!\n"); fprintf(stderr, "Error: Out of memory!\n");
return false; return false;
@@ -774,6 +788,89 @@ CliDebugger::TeamDebuggerQuit(TeamDebugger* debugger)
} }
// #pragma mark - ReportDebugger
ReportDebugger::ReportDebugger()
{
}
ReportDebugger::~ReportDebugger()
{
}
bool
ReportDebugger::Run(const Options& options)
{
// initialize global objects and settings manager
status_t error = global_init();
if (error != B_OK) {
fprintf(stderr, "Error: Global initialization failed: %s\n",
strerror(error));
return false;
}
SettingsManager settingsManager;
error = settingsManager.Init();
if (error != B_OK) {
fprintf(stderr, "Error: Settings manager initialization failed: "
"%s\n", strerror(error));
return false;
}
// create the report UI
ReportUserInterface* userInterface
= new(std::nothrow) ReportUserInterface(options.thread, options.reportPath);
if (userInterface == NULL) {
fprintf(stderr, "Error: Out of memory!\n");
return false;
}
BReference<UserInterface> userInterfaceReference(userInterface, true);
// get/run the program to be debugged and start the team debugger
DebuggedProgramInfo programInfo;
if (!get_debugged_program(options, programInfo))
return false;
TeamDebugger* teamDebugger = start_team_debugger(programInfo.team,
&settingsManager, this, programInfo.thread,
programInfo.commandLineArgc, programInfo.commandLineArgv,
programInfo.stopInMain, userInterface);
if (teamDebugger == NULL)
return false;
thread_id teamDebuggerThread = teamDebugger->Thread();
// run the input loop
userInterface->Run();
// wait for the team debugger thread to terminate
wait_for_thread(teamDebuggerThread, NULL);
return true;
}
void
ReportDebugger::TeamDebuggerStarted(TeamDebugger* debugger)
{
}
void
ReportDebugger::TeamDebuggerRestartRequested(TeamDebugger* debugger)
{
}
void
ReportDebugger::TeamDebuggerQuit(TeamDebugger* debugger)
{
}
// #pragma mark - // #pragma mark -
@@ -792,6 +889,9 @@ main(int argc, const char* const* argv)
if (options.useCLI) { if (options.useCLI) {
CliDebugger debugger; CliDebugger debugger;
return debugger.Run(options) ? 0 : 1; return debugger.Run(options) ? 0 : 1;
} else if (options.saveReport) {
ReportDebugger debugger;
return debugger.Run(options) ? 0 : 1;
} }
Debugger app; Debugger app;
+4
View File
@@ -46,6 +46,7 @@ SEARCH_SOURCE += [ FDirName $(SUBDIR) user_interface gui teams_window ] ;
SEARCH_SOURCE += [ FDirName $(SUBDIR) user_interface gui utility_windows ] ; SEARCH_SOURCE += [ FDirName $(SUBDIR) user_interface gui utility_windows ] ;
SEARCH_SOURCE += [ FDirName $(SUBDIR) user_interface gui util ] ; SEARCH_SOURCE += [ FDirName $(SUBDIR) user_interface gui util ] ;
SEARCH_SOURCE += [ FDirName $(SUBDIR) user_interface gui value ] ; SEARCH_SOURCE += [ FDirName $(SUBDIR) user_interface gui value ] ;
SEARCH_SOURCE += [ FDirName $(SUBDIR) user_interface report ] ;
SEARCH_SOURCE += [ FDirName $(SUBDIR) user_interface util ] ; SEARCH_SOURCE += [ FDirName $(SUBDIR) user_interface util ] ;
SEARCH_SOURCE += [ FDirName $(SUBDIR) util ] ; SEARCH_SOURCE += [ FDirName $(SUBDIR) util ] ;
SEARCH_SOURCE += [ FDirName $(SUBDIR) value ] ; SEARCH_SOURCE += [ FDirName $(SUBDIR) value ] ;
@@ -321,6 +322,9 @@ local sources =
TableCellValueRenderer.cpp TableCellValueRenderer.cpp
TableCellValueRendererUtils.cpp TableCellValueRendererUtils.cpp
# user_interface/report
ReportUserInterface.cpp
# user_interface/util # user_interface/util
UiUtils.cpp UiUtils.cpp
+39 -15
View File
@@ -13,6 +13,7 @@
#include <new> #include <new>
#include <Entry.h> #include <Entry.h>
#include <InterfaceDefs.h>
#include <Message.h> #include <Message.h>
#include <StringList.h> #include <StringList.h>
@@ -1369,10 +1370,37 @@ TeamDebugger::UserInterfaceQuitRequested(QuitOption quitOption)
} }
void
TeamDebugger::JobStarted(Job* job)
{
BString description(job->GetDescription());
if (!description.IsEmpty()) {
description.Append(B_UTF8_ELLIPSIS);
fUserInterface->NotifyBackgroundWorkStatus(description.String());
}
}
void void
TeamDebugger::JobDone(Job* job) TeamDebugger::JobDone(Job* job)
{ {
TRACE_JOBS("TeamDebugger::JobDone(%p)\n", job); TRACE_JOBS("TeamDebugger::JobDone(%p)\n", job);
_ResetUserBackgroundStatusIfNeeded();
}
void
TeamDebugger::JobWaitingForInput(Job* job)
{
LoadImageDebugInfoJob* infoJob = dynamic_cast<LoadImageDebugInfoJob*>(job);
if (infoJob == NULL)
return;
BMessage message(MSG_DEBUG_INFO_NEEDS_USER_INPUT);
message.AddPointer("job", infoJob);
message.AddPointer("state", infoJob->GetLoadingState());
PostMessage(&message);
} }
@@ -1381,6 +1409,7 @@ TeamDebugger::JobFailed(Job* job)
{ {
TRACE_JOBS("TeamDebugger::JobFailed(%p)\n", job); TRACE_JOBS("TeamDebugger::JobFailed(%p)\n", job);
// TODO: notify user // TODO: notify user
_ResetUserBackgroundStatusIfNeeded();
} }
@@ -1390,20 +1419,7 @@ TeamDebugger::JobAborted(Job* job)
TRACE_JOBS("TeamDebugger::JobAborted(%p)\n", job); TRACE_JOBS("TeamDebugger::JobAborted(%p)\n", job);
// TODO: For a stack frame source loader thread we should reset the // TODO: For a stack frame source loader thread we should reset the
// loading state! Asynchronously due to locking order. // loading state! Asynchronously due to locking order.
} _ResetUserBackgroundStatusIfNeeded();
void
TeamDebugger::ImageDebugInfoJobNeedsUserInput(Job* job,
ImageDebugInfoLoadingState* state)
{
TRACE_JOBS("TeamDebugger::DebugInfoJobNeedsUserInput(%p, %p)\n",
job, state);
BMessage message(MSG_DEBUG_INFO_NEEDS_USER_INPUT);
message.AddPointer("job", job);
message.AddPointer("state", state);
PostMessage(&message);
} }
@@ -1908,7 +1924,6 @@ TeamDebugger::_HandleImageDebugInfoChanged(image_id imageID)
bool handlePostExecSetup = fExecPending && image->Type() == B_APP_IMAGE bool handlePostExecSetup = fExecPending && image->Type() == B_APP_IMAGE
&& state != IMAGE_DEBUG_INFO_LOADING; && state != IMAGE_DEBUG_INFO_LOADING;
// this needs to be done first so that breakpoints are loaded. // this needs to be done first so that breakpoints are loaded.
// otherwise, UpdateImageBreakpoints() won't find the appropriate // otherwise, UpdateImageBreakpoints() won't find the appropriate
// UserBreakpoints to create/install instances for. // UserBreakpoints to create/install instances for.
@@ -1922,6 +1937,7 @@ TeamDebugger::_HandleImageDebugInfoChanged(image_id imageID)
if (state == IMAGE_DEBUG_INFO_LOADED if (state == IMAGE_DEBUG_INFO_LOADED
|| state == IMAGE_DEBUG_INFO_UNAVAILABLE) { || state == IMAGE_DEBUG_INFO_UNAVAILABLE) {
// update breakpoints in the image // update breakpoints in the image
fBreakpointManager->UpdateImageBreakpoints(image); fBreakpointManager->UpdateImageBreakpoints(image);
@@ -2486,6 +2502,14 @@ TeamDebugger::_NotifyUser(const char* title, const char* text,...)
} }
void
TeamDebugger::_ResetUserBackgroundStatusIfNeeded()
{
if (!fWorker->HasPendingJobs())
fUserInterface->NotifyBackgroundWorkStatus("Ready.");
}
// #pragma mark - Listener // #pragma mark - Listener
+8 -5
View File
@@ -32,8 +32,7 @@ class WatchpointManager;
class TeamDebugger : public BLooper, private UserInterfaceListener, class TeamDebugger : public BLooper, private UserInterfaceListener,
private JobListener, private ImageDebugInfoJobListener, private JobListener, private Team::Listener {
private Team::Listener {
public: public:
class Listener; class Listener;
@@ -134,13 +133,12 @@ private:
QuitOption quitOption); QuitOption quitOption);
// JobListener // JobListener
virtual void JobStarted(Job* job);
virtual void JobDone(Job* job); virtual void JobDone(Job* job);
virtual void JobWaitingForInput(Job* job);
virtual void JobFailed(Job* job); virtual void JobFailed(Job* job);
virtual void JobAborted(Job* job); virtual void JobAborted(Job* job);
virtual void ImageDebugInfoJobNeedsUserInput(Job* job,
ImageDebugInfoLoadingState* state);
// Team::Listener // Team::Listener
virtual void ThreadStateChanged( virtual void ThreadStateChanged(
const ::Team::ThreadEvent& event); const ::Team::ThreadEvent& event);
@@ -235,6 +233,11 @@ private:
void _NotifyUser(const char* title, void _NotifyUser(const char* title,
const char* text,...); const char* text,...);
void _ResetUserBackgroundStatusIfNeeded();
// updates user interface to
// ready/completed message
// for background work status
private: private:
Listener* fListener; Listener* fListener;
SettingsManager* fSettingsManager; SettingsManager* fSettingsManager;
@@ -76,14 +76,13 @@ private:
ThreadHandler::ThreadHandler(Thread* thread, Worker* worker, ThreadHandler::ThreadHandler(Thread* thread, Worker* worker,
DebuggerInterface* debuggerInterface, DebuggerInterface* debuggerInterface, JobListener* jobListener,
ImageDebugInfoJobListener* listener,
BreakpointManager* breakpointManager) BreakpointManager* breakpointManager)
: :
fThread(thread), fThread(thread),
fWorker(worker), fWorker(worker),
fDebuggerInterface(debuggerInterface), fDebuggerInterface(debuggerInterface),
fDebugInfoJobListener(listener), fJobListener(jobListener),
fBreakpointManager(breakpointManager), fBreakpointManager(breakpointManager),
fStepMode(STEP_NONE), fStepMode(STEP_NONE),
fStepStatement(NULL), fStepStatement(NULL),
@@ -113,7 +112,7 @@ void
ThreadHandler::Init() ThreadHandler::Init()
{ {
fWorker->ScheduleJob(new(std::nothrow) GetThreadStateJob(fDebuggerInterface, fWorker->ScheduleJob(new(std::nothrow) GetThreadStateJob(fDebuggerInterface,
fThread)); fThread), fJobListener);
fConditionWaitSem = create_sem(0, "breakpoint condition waiter"); fConditionWaitSem = create_sem(0, "breakpoint condition waiter");
} }
@@ -458,7 +457,8 @@ ThreadHandler::HandleThreadStateChanged()
if (fThread->State() == THREAD_STATE_STOPPED if (fThread->State() == THREAD_STATE_STOPPED
&& fThread->GetCpuState() == NULL) { && fThread->GetCpuState() == NULL) {
fWorker->ScheduleJob( fWorker->ScheduleJob(
new(std::nothrow) GetCpuStateJob(fDebuggerInterface, fThread)); new(std::nothrow) GetCpuStateJob(fDebuggerInterface, fThread),
fJobListener);
} }
} }
@@ -475,8 +475,8 @@ ThreadHandler::HandleCpuStateChanged()
if (fThread->GetCpuState() != NULL && fThread->GetStackTrace() == NULL) { if (fThread->GetCpuState() != NULL && fThread->GetStackTrace() == NULL) {
fWorker->ScheduleJob( fWorker->ScheduleJob(
new(std::nothrow) GetStackTraceJob(fDebuggerInterface, new(std::nothrow) GetStackTraceJob(fDebuggerInterface,
fDebugInfoJobListener, fDebuggerInterface->GetArchitecture(), fJobListener, fDebuggerInterface->GetArchitecture(),
fThread)); fThread), fJobListener);
} }
} }
@@ -954,7 +954,8 @@ ThreadHandler::_HandleBreakpointConditionIfNeeded(CpuState* cpuState)
status_t error = fWorker->ScheduleJob( status_t error = fWorker->ScheduleJob(
new(std::nothrow) ExpressionEvaluationJob(fThread->GetTeam(), new(std::nothrow) ExpressionEvaluationJob(fThread->GetTeam(),
fDebuggerInterface, language, expressionInfo, frame, fThread)); fDebuggerInterface, language, expressionInfo, frame, fThread),
fJobListener);
BPrivate::ObjectDeleter<ExpressionEvaluationListener> deleter( BPrivate::ObjectDeleter<ExpressionEvaluationListener> deleter(
listener); listener);
@@ -20,6 +20,7 @@ class BreakpointManager;
class DebuggerInterface; class DebuggerInterface;
class ExpressionResult; class ExpressionResult;
class ImageDebugInfoJobListener; class ImageDebugInfoJobListener;
class JobListener;
class StackFrame; class StackFrame;
class Statement; class Statement;
class Worker; class Worker;
@@ -30,7 +31,7 @@ class ThreadHandler : public BReferenceable, private ImageDebugInfoProvider,
public: public:
ThreadHandler(Thread* thread, Worker* worker, ThreadHandler(Thread* thread, Worker* worker,
DebuggerInterface* debuggerInterface, DebuggerInterface* debuggerInterface,
ImageDebugInfoJobListener* listener, JobListener* listener,
BreakpointManager* breakpointManager); BreakpointManager* breakpointManager);
~ThreadHandler(); ~ThreadHandler();
@@ -117,7 +118,7 @@ private:
Thread* fThread; Thread* fThread;
Worker* fWorker; Worker* fWorker;
DebuggerInterface* fDebuggerInterface; DebuggerInterface* fDebuggerInterface;
ImageDebugInfoJobListener* fDebugInfoJobListener; JobListener* fJobListener;
BreakpointManager* fBreakpointManager; BreakpointManager* fBreakpointManager;
uint32 fStepMode; uint32 fStepMode;
Statement* fStepStatement; Statement* fStepStatement;
@@ -9,6 +9,7 @@
#include <sys/wait.h> #include <sys/wait.h>
#include <Entry.h> #include <Entry.h>
#include <InterfaceDefs.h>
#include <Path.h> #include <Path.h>
#include <package/solver/Solver.h> #include <package/solver/Solver.h>
#include <package/solver/SolverPackage.h> #include <package/solver/SolverPackage.h>
@@ -108,6 +109,10 @@ DwarfLoadingStateHandler::HandleState(
BString command; BString command;
command.SetToFormat("/bin/pkgman install -y %s", command.SetToFormat("/bin/pkgman install -y %s",
requiredPackage.String()); requiredPackage.String());
BString notification;
notification.SetToFormat("Installing package %s" B_UTF8_ELLIPSIS,
requiredPackage.String());
interface->NotifyBackgroundWorkStatus(notification);
int error = system(command.String()); int error = system(command.String());
if (interface->IsInteractive()) { if (interface->IsInteractive()) {
if (WIFEXITED(error)) { if (WIFEXITED(error)) {
+6 -4
View File
@@ -18,12 +18,11 @@
GetStackTraceJob::GetStackTraceJob(DebuggerInterface* debuggerInterface, GetStackTraceJob::GetStackTraceJob(DebuggerInterface* debuggerInterface,
ImageDebugInfoJobListener* listener, Architecture* architecture, JobListener* listener, Architecture* architecture, Thread* thread)
Thread* thread)
: :
fKey(thread, JOB_TYPE_GET_STACK_TRACE), fKey(thread, JOB_TYPE_GET_STACK_TRACE),
fDebuggerInterface(debuggerInterface), fDebuggerInterface(debuggerInterface),
fDebugInfoJobListener(listener), fJobListener(listener),
fArchitecture(architecture), fArchitecture(architecture),
fThread(thread) fThread(thread)
{ {
@@ -32,6 +31,9 @@ GetStackTraceJob::GetStackTraceJob(DebuggerInterface* debuggerInterface,
fCpuState = fThread->GetCpuState(); fCpuState = fThread->GetCpuState();
if (fCpuState != NULL) if (fCpuState != NULL)
fCpuState->AcquireReference(); fCpuState->AcquireReference();
SetDescription("Retrieving stack trace for thread %" B_PRId32, fThread->ID());
} }
@@ -84,7 +86,7 @@ GetStackTraceJob::GetImageDebugInfo(Image* image, ImageDebugInfo*& _info)
// schedule a job, if not loaded // schedule a job, if not loaded
ImageDebugInfo* info; ImageDebugInfo* info;
status_t error = LoadImageDebugInfoJob::ScheduleIfNecessary(GetWorker(), status_t error = LoadImageDebugInfoJob::ScheduleIfNecessary(GetWorker(),
image, fDebugInfoJobListener, &info); image, fJobListener, &info);
if (error != B_OK) if (error != B_OK)
return error; return error;
+7 -19
View File
@@ -92,19 +92,11 @@ private:
}; };
class ImageDebugInfoJobListener {
public:
virtual ~ImageDebugInfoJobListener();
virtual void ImageDebugInfoJobNeedsUserInput(Job* job,
ImageDebugInfoLoadingState* state);
};
class GetStackTraceJob : public Job, private ImageDebugInfoProvider { class GetStackTraceJob : public Job, private ImageDebugInfoProvider {
public: public:
GetStackTraceJob( GetStackTraceJob(
DebuggerInterface* debuggerInterface, DebuggerInterface* debuggerInterface,
ImageDebugInfoJobListener* listener, JobListener* jobListener,
Architecture* architecture, Thread* thread); Architecture* architecture, Thread* thread);
virtual ~GetStackTraceJob(); virtual ~GetStackTraceJob();
@@ -119,7 +111,7 @@ private:
private: private:
SimpleJobKey fKey; SimpleJobKey fKey;
DebuggerInterface* fDebuggerInterface; DebuggerInterface* fDebuggerInterface;
ImageDebugInfoJobListener* fDebugInfoJobListener; JobListener* fJobListener;
Architecture* fArchitecture; Architecture* fArchitecture;
Thread* fThread; Thread* fThread;
CpuState* fCpuState; CpuState* fCpuState;
@@ -128,8 +120,7 @@ private:
class LoadImageDebugInfoJob : public Job { class LoadImageDebugInfoJob : public Job {
public: public:
LoadImageDebugInfoJob(Image* image, LoadImageDebugInfoJob(Image* image);
ImageDebugInfoJobListener* listener);
virtual ~LoadImageDebugInfoJob(); virtual ~LoadImageDebugInfoJob();
virtual const JobKey& Key() const; virtual const JobKey& Key() const;
@@ -137,7 +128,7 @@ public:
static status_t ScheduleIfNecessary(Worker* worker, static status_t ScheduleIfNecessary(Worker* worker,
Image* image, Image* image,
ImageDebugInfoJobListener* listener, JobListener* jobListener,
ImageDebugInfo** _imageDebugInfo = NULL); ImageDebugInfo** _imageDebugInfo = NULL);
// If already loaded returns a // If already loaded returns a
// reference, if desired. If not loaded // reference, if desired. If not loaded
@@ -146,19 +137,16 @@ public:
// if scheduling the job failed, or the // if scheduling the job failed, or the
// debug info already failed to load // debug info already failed to load
// earlier. // earlier.
private:
void NotifyUserInputListener();
private:
typedef BObjectList<ImageDebugInfoJobListener> ListenerList;
ImageDebugInfoLoadingState*
GetLoadingState()
{ return &fState; }
private: private:
SimpleJobKey fKey; SimpleJobKey fKey;
Image* fImage; Image* fImage;
ImageDebugInfoLoadingState ImageDebugInfoLoadingState
fState; fState;
ImageDebugInfoJobListener* fListener;
}; };
@@ -14,33 +14,19 @@
#include "Team.h" #include "Team.h"
// #pragma mark - ImageDebugInfoJobListener
ImageDebugInfoJobListener::~ImageDebugInfoJobListener()
{
}
void
ImageDebugInfoJobListener::ImageDebugInfoJobNeedsUserInput(Job* job,
ImageDebugInfoLoadingState* state)
{
}
// #pragma mark - LoadImageDebugInfoJob // #pragma mark - LoadImageDebugInfoJob
LoadImageDebugInfoJob::LoadImageDebugInfoJob(Image* image, LoadImageDebugInfoJob::LoadImageDebugInfoJob(Image* image)
ImageDebugInfoJobListener* listener)
: :
fKey(image, JOB_TYPE_LOAD_IMAGE_DEBUG_INFO), fKey(image, JOB_TYPE_LOAD_IMAGE_DEBUG_INFO),
fImage(image), fImage(image),
fState(), fState()
fListener(listener)
{ {
fImage->AcquireReference(); fImage->AcquireReference();
SetDescription("Loading debugging information for %s",
fImage->Name().String());
} }
@@ -74,7 +60,6 @@ LoadImageDebugInfoJob::Do()
locker.Lock(); locker.Lock();
if (fState.UserInputRequired()) { if (fState.UserInputRequired()) {
NotifyUserInputListener();
return WaitForUserInput(); return WaitForUserInput();
} else if (error == B_OK) { } else if (error == B_OK) {
error = fImage->SetImageDebugInfo(debugInfo, IMAGE_DEBUG_INFO_LOADED); error = fImage->SetImageDebugInfo(debugInfo, IMAGE_DEBUG_INFO_LOADED);
@@ -88,7 +73,7 @@ LoadImageDebugInfoJob::Do()
/*static*/ status_t /*static*/ status_t
LoadImageDebugInfoJob::ScheduleIfNecessary(Worker* worker, Image* image, LoadImageDebugInfoJob::ScheduleIfNecessary(Worker* worker, Image* image,
ImageDebugInfoJobListener* listener, ImageDebugInfo** _imageDebugInfo) JobListener* listener, ImageDebugInfo** _imageDebugInfo)
{ {
AutoLocker<Team> teamLocker(image->GetTeam()); AutoLocker<Team> teamLocker(image->GetTeam());
@@ -113,12 +98,12 @@ LoadImageDebugInfoJob::ScheduleIfNecessary(Worker* worker, Image* image,
return B_ERROR; return B_ERROR;
// schedule a job // schedule a job
LoadImageDebugInfoJob* job = new(std::nothrow) LoadImageDebugInfoJob(image, LoadImageDebugInfoJob* job = new(std::nothrow) LoadImageDebugInfoJob(
listener); image);
if (job == NULL) if (job == NULL)
return B_NO_MEMORY; return B_NO_MEMORY;
status_t error = worker->ScheduleJob(job); status_t error = worker->ScheduleJob(job, listener);
if (error != B_OK) { if (error != B_OK) {
image->SetImageDebugInfo(NULL, IMAGE_DEBUG_INFO_UNAVAILABLE); image->SetImageDebugInfo(NULL, IMAGE_DEBUG_INFO_UNAVAILABLE);
return error; return error;
@@ -130,12 +115,3 @@ LoadImageDebugInfoJob::ScheduleIfNecessary(Worker* worker, Image* image,
*_imageDebugInfo = NULL; *_imageDebugInfo = NULL;
return B_OK; return B_OK;
} }
void
LoadImageDebugInfoJob::NotifyUserInputListener()
{
if (fListener != NULL)
fListener->ImageDebugInfoJobNeedsUserInput(this, &fState);
}
@@ -30,6 +30,9 @@ LoadSourceCodeJob::LoadSourceCodeJob(
fLoadForFunction(loadForFunction) fLoadForFunction(loadForFunction)
{ {
fFunctionInstance->AcquireReference(); fFunctionInstance->AcquireReference();
SetDescription("Loading source code for function %s",
fFunctionInstance->PrettyName().String());
} }
@@ -66,6 +66,15 @@ public:
virtual void NotifyUser(const char* title, virtual void NotifyUser(const char* title,
const char* message, const char* message,
user_notification_type type) = 0; user_notification_type type) = 0;
virtual void NotifyBackgroundWorkStatus(const char* message)
= 0;
// this is used to inform the user about
// background processing work, but doesn't
// otherwise require any form of
// user interaction, i.e. for a status bar
// to indicate that debug information is
// being parsed.
virtual int32 SynchronouslyAskUser(const char* title, virtual int32 SynchronouslyAskUser(const char* title,
const char* message, const char* choice1, const char* message, const char* choice1,
const char* choice2, const char* choice3) const char* choice2, const char* choice3)
@@ -1,5 +1,5 @@
/* /*
* Copyright 2012-2014, Rene Gollent, rene@gollent.com. * Copyright 2012-2015, Rene Gollent, rene@gollent.com.
* Copyright 2012, Ingo Weinhold, ingo_weinhold@gmx.de. * Copyright 2012, Ingo Weinhold, ingo_weinhold@gmx.de.
* Distributed under the terms of the MIT License. * Distributed under the terms of the MIT License.
*/ */
@@ -98,7 +98,6 @@ CliContext::CliContext()
fInputLoopWaitingForEvents(0), fInputLoopWaitingForEvents(0),
fEventsOccurred(0), fEventsOccurred(0),
fInputLoopWaiting(false), fInputLoopWaiting(false),
fInteractive(true),
fTerminating(false), fTerminating(false),
fCurrentThread(NULL), fCurrentThread(NULL),
fCurrentStackTrace(NULL), fCurrentStackTrace(NULL),
@@ -219,13 +218,6 @@ CliContext::Terminating()
} }
void
CliContext::SetInteractive(bool interactive)
{
fInteractive = interactive;
}
thread_id thread_id
CliContext::CurrentThreadID() const CliContext::CurrentThreadID() const
{ {
@@ -415,6 +407,7 @@ CliContext::ProcessPendingEvents()
switch (event->Type()) { switch (event->Type()) {
case EVENT_QUIT: case EVENT_QUIT:
case EVENT_DEBUG_REPORT_CHANGED:
case EVENT_USER_INTERRUPT: case EVENT_USER_INTERRUPT:
break; break;
case EVENT_THREAD_ADDED: case EVENT_THREAD_ADDED:
@@ -453,13 +446,6 @@ CliContext::ProcessPendingEvents()
if (fExpressionValue != NULL) if (fExpressionValue != NULL)
fExpressionValue->AcquireReference(); fExpressionValue->AcquireReference();
break; break;
case EVENT_DEBUG_REPORT_CHANGED:
if (!IsInteractive()) {
Terminating();
QuitSession(true);
}
break;
} }
} }
} }
@@ -1,6 +1,6 @@
/* /*
* Copyright 2012, Ingo Weinhold, ingo_weinhold@gmx.de. * Copyright 2012, Ingo Weinhold, ingo_weinhold@gmx.de.
* Copyright 2014, Rene Gollent, rene@gollent.com. * Copyright 2014-2015, Rene Gollent, rene@gollent.com.
* Distributed under the terms of the MIT License. * Distributed under the terms of the MIT License.
*/ */
#ifndef CLI_CONTEXT_H #ifndef CLI_CONTEXT_H
@@ -57,9 +57,6 @@ public:
bool IsTerminating() const { return fTerminating; } bool IsTerminating() const { return fTerminating; }
bool IsInteractive() const { return fInteractive; }
void SetInteractive(bool interactive);
// service methods for the input loop thread follow // service methods for the input loop thread follow
Team* GetTeam() const { return fTeam; } Team* GetTeam() const { return fTeam; }
@@ -150,7 +147,6 @@ private:
uint32 fInputLoopWaitingForEvents; uint32 fInputLoopWaitingForEvents;
uint32 fEventsOccurred; uint32 fEventsOccurred;
bool fInputLoopWaiting; bool fInputLoopWaiting;
bool fInteractive;
volatile bool fTerminating; volatile bool fTerminating;
Thread* fCurrentThread; Thread* fCurrentThread;
@@ -1,5 +1,5 @@
/* /*
* Copyright 2011-2014, Rene Gollent, rene@gollent.com. * Copyright 2011-2015, Rene Gollent, rene@gollent.com.
* Copyright 2012, Ingo Weinhold, ingo_weinhold@gmx.de. * Copyright 2012, Ingo Weinhold, ingo_weinhold@gmx.de.
* Distributed under the terms of the MIT License. * Distributed under the terms of the MIT License.
*/ */
@@ -93,13 +93,9 @@ private:
// #pragma mark - CommandLineUserInterface // #pragma mark - CommandLineUserInterface
CommandLineUserInterface::CommandLineUserInterface(bool saveReport, CommandLineUserInterface::CommandLineUserInterface()
const char* reportPath, thread_id reportTargetThread)
: :
fCommands(20, true), fCommands(20, true),
fReportPath(reportPath),
fSaveReport(saveReport),
fReportTargetThread(reportTargetThread),
fShowSemaphore(-1), fShowSemaphore(-1),
fShown(false), fShown(false),
fTerminating(false) fTerminating(false)
@@ -128,8 +124,6 @@ CommandLineUserInterface::Init(Team* team, UserInterfaceListener* listener)
if (error != B_OK) if (error != B_OK)
return error; return error;
fContext.SetInteractive(!fSaveReport);
error = _RegisterCommands(); error = _RegisterCommands();
if (error != B_OK) if (error != B_OK)
return error; return error;
@@ -138,8 +132,6 @@ CommandLineUserInterface::Init(Team* team, UserInterfaceListener* listener)
if (fShowSemaphore < 0) if (fShowSemaphore < 0)
return fShowSemaphore; return fShowSemaphore;
team->AddListener(this);
return B_OK; return B_OK;
} }
@@ -176,9 +168,7 @@ CommandLineUserInterface::Terminate()
bool bool
CommandLineUserInterface::IsInteractive() const CommandLineUserInterface::IsInteractive() const
{ {
// if we were invoked solely for the purpose of saving a crash report, return true;
// then we're not taking user input into account.
return !fSaveReport;
} }
@@ -203,6 +193,12 @@ CommandLineUserInterface::NotifyUser(const char* title, const char* message,
} }
void
CommandLineUserInterface::NotifyBackgroundWorkStatus(const char* message)
{
}
int32 int32
CommandLineUserInterface::SynchronouslyAskUser(const char* title, CommandLineUserInterface::SynchronouslyAskUser(const char* title,
const char* message, const char* choice1, const char* choice2, const char* message, const char* choice1, const char* choice2,
@@ -231,43 +227,12 @@ CommandLineUserInterface::Run()
if (error != B_OK) if (error != B_OK)
return; return;
if (fSaveReport) {
ArgumentVector args;
char buffer[256];
const char* parseErrorLocation;
if (_ReportTargetThreadStopNeeded()) {
snprintf(buffer, sizeof(buffer), "stop %" B_PRId32,
fReportTargetThread);
args.Parse(buffer, &parseErrorLocation);
_ExecuteCommand(args.ArgumentCount(), args.Arguments());
} else
_SubmitSaveReport();
}
_InputLoop(); _InputLoop();
// Release the Show() semaphore to signal Terminate(). // Release the Show() semaphore to signal Terminate().
release_sem(fShowSemaphore); release_sem(fShowSemaphore);
} }
void
CommandLineUserInterface::ThreadStateChanged(const Team::ThreadEvent& event)
{
if (fSaveReport) {
Thread* thread = event.GetThread();
// If we were asked to attach/report on a specific thread
// rather than a team, and said thread was still
// running, when we attached, we need to wait for its corresponding
// stop state before generating a report, else we might not get its
// stack trace.
if (thread->ID() == fReportTargetThread
&& thread->State() == THREAD_STATE_STOPPED) {
_SubmitSaveReport();
}
}
}
/*static*/ status_t /*static*/ status_t
CommandLineUserInterface::_InputLoopEntry(void* data) CommandLineUserInterface::_InputLoopEntry(void* data)
{ {
@@ -467,32 +432,3 @@ CommandLineUserInterface::_CompareCommandEntries(const CommandEntry* command1,
{ {
return ::Compare(command1->Name(), command2->Name()); return ::Compare(command1->Name(), command2->Name());
} }
bool
CommandLineUserInterface::_ReportTargetThreadStopNeeded() const
{
if (fReportTargetThread < 0)
return false;
Team* team = fContext.GetTeam();
AutoLocker<Team> teamLocker(team);
Thread* thread = team->ThreadByID(fReportTargetThread);
if (thread == NULL)
return false;
return thread->State() != THREAD_STATE_STOPPED;
}
void
CommandLineUserInterface::_SubmitSaveReport()
{
ArgumentVector args;
char buffer[256];
const char* parseErrorLocation;
snprintf(buffer, sizeof(buffer), "save-report %s",
fReportPath != NULL ? fReportPath : "");
args.Parse(buffer, &parseErrorLocation);
_ExecuteCommand(args.ArgumentCount(), args.Arguments());
}
@@ -1,5 +1,5 @@
/* /*
* Copyright 2011-2014, Rene Gollent, rene@gollent.com. * Copyright 2011-2015, Rene Gollent, rene@gollent.com.
* Copyright 2012, Ingo Weinhold, ingo_weinhold@gmx.de. * Copyright 2012, Ingo Weinhold, ingo_weinhold@gmx.de.
* Distributed under the terms of the MIT License. * Distributed under the terms of the MIT License.
*/ */
@@ -17,12 +17,9 @@
class CliCommand; class CliCommand;
class CommandLineUserInterface : public UserInterface, class CommandLineUserInterface : public UserInterface {
public ::Team::Listener {
public: public:
CommandLineUserInterface(bool saveReport, CommandLineUserInterface();
const char* reportPath,
thread_id reportTargetThread);
virtual ~CommandLineUserInterface(); virtual ~CommandLineUserInterface();
virtual const char* ID() const; virtual const char* ID() const;
@@ -42,6 +39,8 @@ public:
virtual void NotifyUser(const char* title, virtual void NotifyUser(const char* title,
const char* message, const char* message,
user_notification_type type); user_notification_type type);
virtual void NotifyBackgroundWorkStatus(
const char* message);
virtual int32 SynchronouslyAskUser(const char* title, virtual int32 SynchronouslyAskUser(const char* title,
const char* message, const char* choice1, const char* message, const char* choice1,
const char* choice2, const char* choice3); const char* choice2, const char* choice3);
@@ -52,10 +51,6 @@ public:
// everything has been set up. Enters the // everything has been set up. Enters the
// input loop. // input loop.
// Team::Listener
virtual void ThreadStateChanged(
const Team::ThreadEvent& event);
private: private:
struct CommandEntry; struct CommandEntry;
typedef BObjectList<CommandEntry> CommandList; typedef BObjectList<CommandEntry> CommandList;
@@ -80,15 +75,9 @@ private:
const CommandEntry* command1, const CommandEntry* command1,
const CommandEntry* command2); const CommandEntry* command2);
bool _ReportTargetThreadStopNeeded() const;
void _SubmitSaveReport();
private: private:
CliContext fContext; CliContext fContext;
CommandList fCommands; CommandList fCommands;
const char* fReportPath;
bool fSaveReport;
thread_id fReportTargetThread;
sem_id fShowSemaphore; sem_id fShowSemaphore;
bool fShown; bool fShown;
volatile bool fTerminating; volatile bool fTerminating;
@@ -248,6 +248,13 @@ GraphicalUserInterface::NotifyUser(const char* title, const char* message,
} }
void
GraphicalUserInterface::NotifyBackgroundWorkStatus(const char* message)
{
fTeamWindow->DisplayBackgroundStatus(message);
}
int32 int32
GraphicalUserInterface::SynchronouslyAskUser(const char* title, GraphicalUserInterface::SynchronouslyAskUser(const char* title,
const char* message, const char* choice1, const char* choice2, const char* message, const char* choice1, const char* choice2,
@@ -1,6 +1,6 @@
/* /*
* Copyright 2009, Ingo Weinhold, ingo_weinhold@gmx.de. * Copyright 2009, Ingo Weinhold, ingo_weinhold@gmx.de.
* Copyright 2014, Rene Gollent, rene@gollent.com. * Copyright 2014-2015, Rene Gollent, rene@gollent.com.
* Distributed under the terms of the MIT License. * Distributed under the terms of the MIT License.
*/ */
#ifndef GRAPHICAL_USER_INTERFACE_H #ifndef GRAPHICAL_USER_INTERFACE_H
@@ -38,6 +38,8 @@ public:
virtual void NotifyUser(const char* title, virtual void NotifyUser(const char* title,
const char* message, const char* message,
user_notification_type type); user_notification_type type);
virtual void NotifyBackgroundWorkStatus(
const char* message);
virtual int32 SynchronouslyAskUser(const char* title, virtual int32 SynchronouslyAskUser(const char* title,
const char* message, const char* choice1, const char* message, const char* choice1,
const char* choice2, const char* choice3); const char* choice2, const char* choice3);
@@ -74,7 +74,8 @@ enum {
MSG_LOCATE_SOURCE_IF_NEEDED = 'lsin', MSG_LOCATE_SOURCE_IF_NEEDED = 'lsin',
MSG_SOURCE_ENTRY_QUERY_COMPLETE = 'seqc', MSG_SOURCE_ENTRY_QUERY_COMPLETE = 'seqc',
MSG_CLEAR_STACK_TRACE = 'clst', MSG_CLEAR_STACK_TRACE = 'clst',
MSG_HANDLE_LOAD_SETTINGS = 'hlst' MSG_HANDLE_LOAD_SETTINGS = 'hlst',
MSG_UPDATE_STATUS_BAR = 'upsb'
}; };
@@ -133,6 +134,7 @@ TeamWindow::TeamWindow(::Team* team, UserInterfaceListener* listener)
fStepOutButton(NULL), fStepOutButton(NULL),
fMenuBar(NULL), fMenuBar(NULL),
fSourcePathView(NULL), fSourcePathView(NULL),
fStatusBarView(NULL),
fConsoleOutputView(NULL), fConsoleOutputView(NULL),
fFunctionSplitView(NULL), fFunctionSplitView(NULL),
fSourceSplitView(NULL), fSourceSplitView(NULL),
@@ -525,6 +527,13 @@ TeamWindow::MessageReceived(BMessage* message)
_LoadSettings(settings); _LoadSettings(settings);
break; break;
} }
case MSG_UPDATE_STATUS_BAR:
{
const char* messageText;
if (message->FindString("message", &messageText) == B_OK)
fStatusBarView->SetText(messageText);
break;
}
case MSG_TEAM_RENAMED: case MSG_TEAM_RENAMED:
{ {
_UpdateTitle(); _UpdateTitle();
@@ -725,6 +734,15 @@ TeamWindow::SaveSettings(GuiTeamUiSettings* settings)
} }
void
TeamWindow::DisplayBackgroundStatus(const char* message)
{
BMessage updateMessage(MSG_UPDATE_STATUS_BAR);
updateMessage.AddString("message", message);
PostMessage(&updateMessage);
}
void void
TeamWindow::ThreadSelectionChanged(::Thread* thread) TeamWindow::ThreadSelectionChanged(::Thread* thread)
{ {
@@ -995,7 +1013,11 @@ TeamWindow::_Init()
.SetInsets(0.0) .SetInsets(0.0)
.Add(fConsoleOutputView = ConsoleOutputView::Create()) .Add(fConsoleOutputView = ConsoleOutputView::Create())
.End() .End()
.End(); .End()
.Add(fStatusBarView = new BStringView("status", "Ready."));
fStatusBarView->SetExplicitMinSize(BSize(50.0, B_SIZE_UNSET));
fStatusBarView->SetExplicitMaxSize(BSize(B_SIZE_UNLIMITED, B_SIZE_UNSET));
// add source view // add source view
sourceScrollView->SetTarget(fSourceView = SourceView::Create(fTeam, this)); sourceScrollView->SetTarget(fSourceView = SourceView::Create(fTeam, this));
@@ -71,6 +71,8 @@ public:
status_t SaveSettings( status_t SaveSettings(
GuiTeamUiSettings* settings); GuiTeamUiSettings* settings);
void DisplayBackgroundStatus(const char* message);
private: private:
enum ActiveSourceObject { enum ActiveSourceObject {
@@ -228,6 +230,7 @@ private:
BButton* fStepOutButton; BButton* fStepOutButton;
BMenuBar* fMenuBar; BMenuBar* fMenuBar;
BStringView* fSourcePathView; BStringView* fSourcePathView;
BStringView* fStatusBarView;
ConsoleOutputView* fConsoleOutputView; ConsoleOutputView* fConsoleOutputView;
BSplitView* fFunctionSplitView; BSplitView* fFunctionSplitView;
BSplitView* fSourceSplitView; BSplitView* fSourceSplitView;
@@ -0,0 +1,233 @@
/*
* Copyright 2015, Rene Gollent, rene@gollent.com.
* Distributed under the terms of the MIT License.
*/
#include "ReportUserInterface.h"
#include <stdio.h>
#include <Entry.h>
#include <FindDirectory.h>
#include <Path.h>
#include <AutoLocker.h>
#include "MessageCodes.h"
#include "UiUtils.h"
ReportUserInterface::ReportUserInterface(thread_id targetThread,
const char* reportPath)
:
fTeam(NULL),
fListener(NULL),
fTargetThread(targetThread),
fReportPath(reportPath),
fShowSemaphore(-1),
fReportSemaphore(-1),
fShown(false),
fTerminating(false)
{
}
ReportUserInterface::~ReportUserInterface()
{
if (fShowSemaphore >= 0)
delete_sem(fShowSemaphore);
fTeam->RemoveListener(this);
}
const char*
ReportUserInterface::ID() const
{
return "ReportUserInterface";
}
status_t
ReportUserInterface::Init(Team* team, UserInterfaceListener* listener)
{
fShowSemaphore = create_sem(0, "show report");
if (fShowSemaphore < 0)
return fShowSemaphore;
fReportSemaphore = create_sem(0, "report generator wait");
if (fReportSemaphore < 0)
return fReportSemaphore;
fTeam = team;
fListener = listener;
fTeam->AddListener(this);
return B_OK;
}
void
ReportUserInterface::Show()
{
fShown = true;
release_sem(fShowSemaphore);
}
void
ReportUserInterface::Terminate()
{
fTerminating = true;
}
bool
ReportUserInterface::IsInteractive() const
{
return false;
}
status_t
ReportUserInterface::LoadSettings(const TeamUiSettings* settings)
{
return B_OK;
}
status_t
ReportUserInterface::SaveSettings(TeamUiSettings*& settings) const
{
return B_OK;
}
void
ReportUserInterface::NotifyUser(const char* title, const char* message,
user_notification_type type)
{
}
void
ReportUserInterface::NotifyBackgroundWorkStatus(const char* message)
{
}
int32
ReportUserInterface::SynchronouslyAskUser(const char* title,
const char* message, const char* choice1, const char* choice2,
const char* choice3)
{
return -1;
}
status_t
ReportUserInterface::SynchronouslyAskUserForFile(entry_ref* _ref)
{
return B_UNSUPPORTED;
}
void
ReportUserInterface::Run()
{
// Wait for the Show() semaphore to be released.
status_t error;
do {
error = acquire_sem(fShowSemaphore);
} while (error == B_INTERRUPTED);
if (error != B_OK)
return;
bool waitNeeded = false;
if (fTargetThread > 0) {
AutoLocker< ::Team> teamLocker(fTeam);
::Thread* thread = fTeam->ThreadByID(fTargetThread);
if (thread == NULL)
waitNeeded = true;
else if (thread->State() != THREAD_STATE_STOPPED) {
waitNeeded = true;
fListener->ThreadActionRequested(fTargetThread, MSG_THREAD_STOP);
}
}
if (waitNeeded) {
do {
error = acquire_sem(fShowSemaphore);
} while (error == B_INTERRUPTED);
if (error != B_OK)
return;
}
entry_ref ref;
if (fReportPath != NULL && fReportPath[0] == '/') {
error = get_ref_for_path(fReportPath, &ref);
} else {
char filename[B_FILE_NAME_LENGTH];
if (fReportPath != NULL)
strlcpy(filename, fReportPath, sizeof(filename));
else
UiUtils::ReportNameForTeam(fTeam, filename, sizeof(filename));
BPath path;
error = find_directory(B_DESKTOP_DIRECTORY, &path);
if (error == B_OK)
error = path.Append(filename);
if (error == B_OK)
error = get_ref_for_path(path.Path(), &ref);
}
if (error != B_OK)
printf("Unable to get ref for report path %s\n", strerror(error));
else {
fListener->DebugReportRequested(&ref);
do {
error = acquire_sem(fReportSemaphore);
} while (error == B_INTERRUPTED);
}
fListener->UserInterfaceQuitRequested(
UserInterfaceListener::QUIT_OPTION_ASK_KILL_TEAM);
}
void
ReportUserInterface::ThreadAdded(const Team::ThreadEvent& event)
{
::Thread* thread = event.GetThread();
if (thread->ID() != fTargetThread)
return;
if (thread->State() != THREAD_STATE_STOPPED)
fListener->ThreadActionRequested(thread->ID(), MSG_THREAD_STOP);
else
release_sem(fShowSemaphore);
}
void
ReportUserInterface::ThreadStateChanged(const Team::ThreadEvent& event)
{
::Thread* thread = event.GetThread();
if (thread->ID() != fTargetThread)
return;
else if (thread->State() == THREAD_STATE_STOPPED)
release_sem(fShowSemaphore);
}
void
ReportUserInterface::DebugReportChanged(const Team::DebugReportEvent& event)
{
printf("Debug report saved to %s\n", event.GetReportPath());
release_sem(fReportSemaphore);
}
@@ -0,0 +1,66 @@
/*
* Copyright 2015, Rene Gollent, rene@gollent.com.
* Distributed under the terms of the MIT License.
*/
#ifndef REPORT_USER_INTERFACE_H
#define REPORT_USER_INTERFACE_H
#include <ObjectList.h>
#include <String.h>
#include "UserInterface.h"
#include "Team.h"
class ReportUserInterface : public UserInterface,
private Team::Listener {
public:
ReportUserInterface(thread_id targetThread,
const char* reportPath);
virtual ~ReportUserInterface();
virtual const char* ID() const;
virtual status_t Init(Team* team,
UserInterfaceListener* listener);
virtual void Show();
virtual void Terminate();
virtual bool IsInteractive() const;
virtual status_t LoadSettings(const TeamUiSettings* settings);
virtual status_t SaveSettings(TeamUiSettings*& settings) const;
virtual void NotifyUser(const char* title,
const char* message,
user_notification_type type);
virtual void NotifyBackgroundWorkStatus(
const char* message);
virtual int32 SynchronouslyAskUser(const char* title,
const char* message, const char* choice1,
const char* choice2, const char* choice3);
virtual status_t SynchronouslyAskUserForFile(entry_ref* _ref);
void Run();
// Team::Listener
virtual void ThreadAdded(const Team::ThreadEvent& event);
virtual void ThreadStateChanged(
const Team::ThreadEvent& event);
virtual void DebugReportChanged(
const Team::DebugReportEvent& event);
private:
::Team* fTeam;
UserInterfaceListener* fListener;
thread_id fTargetThread;
const char* fReportPath;
sem_id fShowSemaphore;
sem_id fReportSemaphore;
bool fShown;
volatile bool fTerminating;
};
#endif // REPORT_USER_INTERFACE_H
+38
View File
@@ -70,12 +70,24 @@ JobListener::~JobListener()
} }
void
JobListener::JobStarted(Job* job)
{
}
void void
JobListener::JobDone(Job* job) JobListener::JobDone(Job* job)
{ {
} }
void
JobListener::JobWaitingForInput(Job* job)
{
}
void void
JobListener::JobFailed(Job* job) JobListener::JobFailed(Job* job)
{ {
@@ -121,6 +133,15 @@ Job::WaitForUserInput()
} }
void
Job::SetDescription(const char* format, ...)
{
va_list args;
va_start(args, format);
fDescription.SetToFormatVarArgs(format, args);
}
void void
Job::SetWorker(Worker* worker) Job::SetWorker(Worker* worker)
{ {
@@ -179,6 +200,13 @@ Job::NotifyListeners()
for (int32 i = count - 1; i >= 0; i--) { for (int32 i = count - 1; i >= 0; i--) {
JobListener* listener = fListeners.ItemAt(i); JobListener* listener = fListeners.ItemAt(i);
switch (fState) { switch (fState) {
case JOB_STATE_ACTIVE:
listener->JobStarted(this);
break;
case JOB_STATE_WAITING:
if (fWaitStatus == JOB_USER_INPUT_WAITING)
listener->JobWaitingForInput(this);
break;
case JOB_STATE_SUCCEEDED: case JOB_STATE_SUCCEEDED:
listener->JobDone(this); listener->JobDone(this);
break; break;
@@ -342,6 +370,14 @@ Worker::ResumeJob(Job* job)
} }
bool
Worker::HasPendingJobs()
{
AutoLocker<Worker> locker(this);
return !fJobs.IsEmpty();
}
status_t status_t
Worker::AddListener(const JobKey& key, JobListener* listener) Worker::AddListener(const JobKey& key, JobListener* listener)
{ {
@@ -395,6 +431,7 @@ Worker::WaitForUserInput(Job* waitingJob)
return B_INTERRUPTED; return B_INTERRUPTED;
waitingJob->SetWaitStatus(JOB_USER_INPUT_WAITING); waitingJob->SetWaitStatus(JOB_USER_INPUT_WAITING);
waitingJob->NotifyListeners();
fSuspendedJobs.Add(waitingJob); fSuspendedJobs.Add(waitingJob);
return B_OK; return B_OK;
@@ -451,6 +488,7 @@ Worker::_ProcessJobs()
// process the next job // process the next job
if (Job* job = fUnscheduledJobs.RemoveHead()) { if (Job* job = fUnscheduledJobs.RemoveHead()) {
job->SetState(JOB_STATE_ACTIVE); job->SetState(JOB_STATE_ACTIVE);
job->NotifyListeners();
locker.Unlock(); locker.Unlock();
status_t error = job->Do(); status_t error = job->Do();
+10
View File
@@ -10,6 +10,7 @@
#include <ObjectList.h> #include <ObjectList.h>
#include <Referenceable.h> #include <Referenceable.h>
#include <String.h>
#include <util/DoublyLinkedList.h> #include <util/DoublyLinkedList.h>
#include <util/OpenHashTable.h> #include <util/OpenHashTable.h>
@@ -69,7 +70,9 @@ class JobListener {
public: public:
virtual ~JobListener(); virtual ~JobListener();
virtual void JobStarted(Job* job);
virtual void JobDone(Job* job); virtual void JobDone(Job* job);
virtual void JobWaitingForInput(Job* job);
virtual void JobFailed(Job* job); virtual void JobFailed(Job* job);
virtual void JobAborted(Job* job); virtual void JobAborted(Job* job);
}; };
@@ -89,9 +92,13 @@ public:
Worker* GetWorker() const { return fWorker; } Worker* GetWorker() const { return fWorker; }
job_state State() const { return fState; } job_state State() const { return fState; }
const BString& GetDescription() const
{ return fDescription; }
protected: protected:
job_wait_status WaitFor(const JobKey& key); job_wait_status WaitFor(const JobKey& key);
status_t WaitForUserInput(); status_t WaitForUserInput();
void SetDescription(const char* format, ...);
private: private:
friend class Worker; friend class Worker;
@@ -122,6 +129,7 @@ private:
JobList fDependentJobs; JobList fDependentJobs;
job_wait_status fWaitStatus; job_wait_status fWaitStatus;
ListenerList fListeners; ListenerList fListeners;
BString fDescription;
public: public:
Job* fNext; Job* fNext;
@@ -149,6 +157,8 @@ public:
// only valid for jobs that are // only valid for jobs that are
// suspended pending user input // suspended pending user input
bool HasPendingJobs();
status_t AddListener(const JobKey& key, status_t AddListener(const JobKey& key,
JobListener* listener); JobListener* listener);
void RemoveListener(const JobKey& key, void RemoveListener(const JobKey& key,

Some files were not shown because too many files have changed in this diff Show More