X-Git-Url: http://git.osdn.jp/view?a=blobdiff_plain;ds=sidebyside;f=libhb%2Fports.c;h=7e5421da1bdad7b2eacd64199d972b2add7fd3d8;hb=4b72a63eb61a01275493c4bfb51ba02152d1c5e1;hp=bdeadc1f89688f22b2e3bfba2a869d59c120f6a0;hpb=45529a284d3aeedad92d7149f36dda0f06083b6a;p=handbrake-jp%2Fhandbrake-jp-git.git
diff --git a/libhb/ports.c b/libhb/ports.c
index bdeadc1f..7e5421da 100644
--- a/libhb/ports.c
+++ b/libhb/ports.c
@@ -1,32 +1,71 @@
/* $Id: ports.c,v 1.15 2005/10/15 18:05:03 titer Exp $
This file is part of the HandBrake source code.
- Homepage: .
+ Homepage: .
It may be used under the terms of the GNU General Public License. */
-#include
-#include
+#ifdef USE_PTHREAD
+#ifdef SYS_LINUX
+#define _GNU_SOURCE
+#include
+#endif
+#include
+#endif
-#if defined( SYS_BEOS )
-#include
-#include
-#elif defined( SYS_CYGWIN )
+#ifdef SYS_BEOS
+#include
+#endif
+
+#if defined(SYS_DARWIN) || defined(SYS_FREEBSD)
+#include
+#include
+#endif
+
+#ifdef SYS_OPENBSD
+#include
+#include
+#include
+#endif
+
+#ifdef SYS_CYGWIN
#include
#endif
-#if USE_PTHREAD
+#ifdef SYS_MINGW
#include
+#include
+#endif
+
+#ifdef SYS_SunOS
+#include
#endif
-//#ifdef SYS_CYGWIN
-//#include
-//#include
-//#else
+#include
+#include
+
+
+#ifdef SYS_MINGW
+#include
+#include
+#else
#include
#include
#include
#include
-//#endif
+#endif
+
+#if defined( SYS_LINUX )
+#include
+#include
+#include
+#elif defined( SYS_OPENBSD )
+#include
+#include
+#include
+#endif
+
+#include
+#include
#include "hb.h"
@@ -54,6 +93,40 @@ int gettimeofday( struct timeval * tv, struct timezone * tz )
#endif
*/
+int hb_dvd_region(char *device, int *region_mask)
+{
+#if defined( DVD_LU_SEND_RPC_STATE ) && defined( DVD_AUTH )
+ struct stat st;
+ dvd_authinfo ai;
+ int fd, ret;
+
+ fd = open( device, O_RDONLY );
+ if ( fd < 0 )
+ return -1;
+ if ( fstat( fd, &st ) < 0 )
+ {
+ close( fd );
+ return -1;
+ }
+ if ( !( S_ISBLK( st.st_mode ) || S_ISCHR( st.st_mode ) ) )
+ {
+ close( fd );
+ return -1;
+ }
+
+ ai.type = DVD_LU_SEND_RPC_STATE;
+ ret = ioctl(fd, DVD_AUTH, &ai);
+ close( fd );
+ if ( ret < 0 )
+ return ret;
+
+ *region_mask = ai.lrpcs.region_mask;
+ return 0;
+#else
+ return -1;
+#endif
+}
+
uint64_t hb_get_date()
{
struct timeval tv;
@@ -74,9 +147,9 @@ void hb_snooze( int delay )
}
#if defined( SYS_BEOS )
snooze( 1000 * delay );
-#elif defined( SYS_DARWIN ) || defined( SYS_LINUX ) || defined( SYS_FREEBSD )
+#elif defined( SYS_DARWIN ) || defined( SYS_LINUX ) || defined( SYS_FREEBSD) || defined( SYS_SunOS )
usleep( 1000 * delay );
-#elif defined( SYS_CYGWIN )
+#elif defined( SYS_CYGWIN ) || defined( SYS_MINGW )
Sleep( delay );
#endif
}
@@ -98,54 +171,52 @@ int hb_get_cpu_count()
}
cpu_count = 1;
-#if defined( SYS_BEOS )
- {
- system_info info;
- get_system_info( &info );
- cpu_count = info.cpu_count;
- }
-
-#elif defined( SYS_DARWIN ) || defined( SYS_FREEBSD )
- FILE * info;
- char buffer[16];
+#if defined(SYS_CYGWIN) || defined(SYS_MINGW)
+ SYSTEM_INFO cpuinfo;
+ GetSystemInfo( &cpuinfo );
+ cpu_count = cpuinfo.dwNumberOfProcessors;
- if( ( info = popen( "/usr/sbin/sysctl hw.ncpu", "r" ) ) )
+#elif defined(SYS_LINUX)
+ unsigned int bit;
+ cpu_set_t p_aff;
+ memset( &p_aff, 0, sizeof(p_aff) );
+ sched_getaffinity( 0, sizeof(p_aff), &p_aff );
+ for( cpu_count = 0, bit = 0; bit < sizeof(p_aff); bit++ )
+ cpu_count += (((uint8_t *)&p_aff)[bit / 8] >> (bit % 8)) & 1;
+
+#elif defined(SYS_BEOS)
+ system_info info;
+ get_system_info( &info );
+ cpu_count = info.cpu_count;
+
+#elif defined(SYS_DARWIN) || defined(SYS_FREEBSD) || defined(SYS_OPENBSD)
+ size_t length = sizeof( cpu_count );
+#ifdef SYS_OPENBSD
+ int mib[2] = { CTL_HW, HW_NCPU };
+ if( sysctl(mib, 2, &cpu_count, &length, NULL, 0) )
+#else
+ if( sysctlbyname("hw.ncpu", &cpu_count, &length, NULL, 0) )
+#endif
{
- memset( buffer, 0, 16 );
- if( fgets( buffer, 15, info ) )
- {
- if( sscanf( buffer, "hw.ncpu: %d", &cpu_count ) != 1 )
- {
- cpu_count = 1;
- }
- }
- fclose( info );
+ cpu_count = 1;
}
-#elif defined( SYS_LINUX )
+#elif defined( SYS_SunOS )
{
- FILE * info;
- char buffer[8];
+ processorid_t cpumax;
+ int i,j=0;
- if( ( info = popen( "grep -c '^processor' /proc/cpuinfo",
- "r" ) ) )
+ cpumax = sysconf(_SC_CPUID_MAX);
+
+ for(i = 0; i <= cpumax; i++ )
{
- memset( buffer, 0, 8 );
- if( fgets( buffer, 7, info ) )
+ if(p_online(i, P_STATUS) != -1)
{
- if( sscanf( buffer, "%d", &cpu_count ) != 1 )
- {
- cpu_count = 1;
- }
+ j++;
}
- fclose( info );
}
+ cpu_count=j;
}
-
-#elif defined( SYS_CYGWIN )
- SYSTEM_INFO cpuinfo;
- GetSystemInfo( &cpuinfo );
- cpu_count = cpuinfo.dwNumberOfProcessors;
#endif
cpu_count = MAX( 1, cpu_count );
@@ -155,14 +226,14 @@ int hb_get_cpu_count()
}
/************************************************************************
- * Get a tempory directory for HB
+ * Get a temporary directory for HB
***********************************************************************/
-void hb_get_tempory_directory( hb_handle_t * h, char path[512] )
+void hb_get_temporary_directory( char path[512] )
{
char base[512];
/* Create the base */
-#ifdef SYS_CYGWIN
+#if defined( SYS_CYGWIN ) || defined( SYS_MINGW )
char *p;
int i_size = GetTempPath( 512, base );
if( i_size <= 0 || i_size >= 512 )
@@ -181,7 +252,7 @@ void hb_get_tempory_directory( hb_handle_t * h, char path[512] )
if( base[strlen(base)-1] == '/' )
base[strlen(base)-1] = '\0';
- snprintf( path, 512, "%s/hb.%d", base, hb_get_pid( h ) );
+ snprintf( path, 512, "%s/hb.%d", base, getpid() );
}
/************************************************************************
@@ -192,9 +263,9 @@ void hb_get_tempory_filename( hb_handle_t * h, char name[1024],
{
va_list args;
- hb_get_tempory_directory( h, name );
+ hb_get_temporary_directory( name );
strcat( name, "/" );
-
+
va_start( args, fmt );
vsnprintf( &name[strlen(name)], 1024 - strlen(name), fmt, args );
va_end( args );
@@ -208,11 +279,11 @@ void hb_get_tempory_filename( hb_handle_t * h, char name[1024],
***********************************************************************/
void hb_mkdir( char * name )
{
-//#ifdef SYS_CYGWIN
-// mkdir( name );
-//#else
+#ifdef SYS_MINGW
+ mkdir( name );
+#else
mkdir( name, 0755 );
-//#endif
+#endif
}
/************************************************************************
@@ -237,6 +308,27 @@ struct hb_thread_s
#endif
};
+/* Get a unique identifier to thread and represent as 64-bit unsigned.
+ * If unsupported, the value 0 is be returned.
+ * Caller should use result only for display/log purposes.
+ */
+static uint64_t hb_thread_to_integer( const hb_thread_t* t )
+{
+#if defined( USE_PTHREAD )
+ #if defined( SYS_CYGWIN )
+ return (uint64_t)t->thread;
+ #elif defined( _WIN32 ) || defined( __MINGW32__ )
+ return (uint64_t)(ptrdiff_t)t->thread.p;
+ #elif defined( SYS_DARWIN )
+ return (unsigned long)t->thread;
+ #else
+ return (uint64_t)t->thread;
+ #endif
+#else
+ return 0;
+#endif
+}
+
/************************************************************************
* hb_thread_func()
************************************************************************
@@ -267,7 +359,7 @@ static void hb_thread_func( void * _t )
t->function( t->arg );
/* Inform that the thread can be joined now */
- hb_log( "thread %d exited (\"%s\")", t->thread, t->name );
+ hb_deep_log( 2, "thread %"PRIx64" exited (\"%s\")", hb_thread_to_integer( t ), t->name );
hb_lock( t->lock );
t->exited = 1;
hb_unlock( t->lock );
@@ -312,7 +404,7 @@ hb_thread_t * hb_thread_init( char * name, void (* function)(void *),
// SetThreadPriority( GetCurrentThread(), THREAD_PRIORITY_BELOW_NORMAL );
#endif
- hb_log( "thread %d started (\"%s\")", t->thread, t->name );
+ hb_deep_log( 2, "thread %"PRIx64" started (\"%s\")", hb_thread_to_integer( t ), t->name );
return t;
}
@@ -329,21 +421,20 @@ void hb_thread_close( hb_thread_t ** _t )
#if defined( SYS_BEOS )
long exit_value;
wait_for_thread( t->thread, &exit_value );
-
+
#elif USE_PTHREAD
pthread_join( t->thread, NULL );
//#elif defined( SYS_CYGWIN )
// WaitForSingleObject( t->thread, INFINITE );
#endif
-
- hb_log( "thread %d joined (\"%s\")",
- t->thread, t->name );
+
+ hb_deep_log( 2, "thread %"PRIx64" joined (\"%s\")", hb_thread_to_integer( t ), t->name );
hb_lock_close( &t->lock );
free( t->name );
free( t );
- *_t = NULL;
+ *_t = NULL;
}
/************************************************************************
@@ -391,7 +482,15 @@ hb_lock_t * hb_lock_init()
#if defined( SYS_BEOS )
l->sem = create_sem( 1, "sem" );
#elif USE_PTHREAD
- pthread_mutex_init( &l->mutex, NULL );
+ pthread_mutexattr_t mta;
+
+ pthread_mutexattr_init(&mta);
+
+#if defined( SYS_CYGWIN )
+ pthread_mutexattr_settype(&mta, PTHREAD_MUTEX_NORMAL);
+#endif
+
+ pthread_mutex_init( &l->mutex, &mta );
//#elif defined( SYS_CYGWIN )
// l->mutex = CreateMutex( 0, FALSE, 0 );
#endif
@@ -506,6 +605,35 @@ void hb_cond_wait( hb_cond_t * c, hb_lock_t * lock )
#endif
}
+void hb_clock_gettime( struct timespec *tp )
+{
+ struct timeval tv;
+ time_t sec;
+
+ sec = time( NULL );
+ gettimeofday( &tv, NULL );
+ tp->tv_sec = tv.tv_sec;
+ tp->tv_nsec = tv.tv_usec * 1000;
+}
+
+void hb_cond_timedwait( hb_cond_t * c, hb_lock_t * lock, int msec )
+{
+#if defined( SYS_BEOS )
+ c->thread = find_thread( NULL );
+ release_sem( lock->sem );
+ suspend_thread( c->thread );
+ acquire_sem( lock->sem );
+ c->thread = -1;
+#elif USE_PTHREAD
+ struct timespec ts;
+ hb_clock_gettime(&ts);
+ ts.tv_nsec += (msec % 1000) * 1000000;
+ ts.tv_sec += msec / 1000 + (ts.tv_nsec / 1000000000);
+ ts.tv_nsec %= 1000000000;
+ pthread_cond_timedwait( &c->cond, &lock->mutex, &ts );
+#endif
+}
+
void hb_cond_signal( hb_cond_t * c )
{
#if defined( SYS_BEOS )
@@ -530,6 +658,13 @@ void hb_cond_signal( hb_cond_t * c )
#endif
}
+void hb_cond_broadcast( hb_cond_t * c )
+{
+#if USE_PTHREAD
+ pthread_cond_broadcast( &c->cond );
+#endif
+}
+
/************************************************************************
* Network
***********************************************************************/
@@ -546,6 +681,23 @@ hb_net_t * hb_net_open( char * address, int port )
struct sockaddr_in sock;
struct hostent * host;
+#ifdef SYS_MINGW
+ WSADATA wsaData;
+ int iResult, winsock_init = 0;
+
+ // Initialize Winsock
+ if (!winsock_init)
+ {
+ iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
+ if (iResult != 0)
+ {
+ hb_log("WSAStartup failed: %d", iResult);
+ return NULL;
+ }
+ winsock_init = 1;
+ }
+#endif
+
/* TODO: find out why this doesn't work on Win32 */
if( !( host = gethostbyname( address ) ) )
{
@@ -573,7 +725,7 @@ hb_net_t * hb_net_open( char * address, int port )
free( n );
return NULL;
}
-
+
return n;
}
@@ -595,3 +747,29 @@ void hb_net_close( hb_net_t ** _n )
*_n = NULL;
}
+#ifdef SYS_MINGW
+char *strtok_r(char *s, const char *delim, char **save_ptr)
+{
+ char *token;
+
+ if (s == NULL) s = *save_ptr;
+
+ /* Scan leading delimiters. */
+ s += strspn(s, delim);
+ if (*s == '\0') return NULL;
+
+ /* Find the end of the token. */
+ token = s;
+ s = strpbrk(token, delim);
+ if (s == NULL)
+ /* This token finishes the string. */
+ *save_ptr = strchr(token, '\0');
+ else {
+ /* Terminate the token and make *SAVE_PTR point past it. */
+ *s = '\0';
+ *save_ptr = s + 1;
+ }
+
+ return token;
+}
+#endif