X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=glib%2Fglib.h;h=f485552fee5707c2c5cab968fb858551c9c672f3;hb=7633908c9396ff0b45d3f09c898781adb4caab84;hp=3b3b4c2365e5eaddd2f2ebf5a5561b1e2f3f39dd;hpb=55cd16c99323958546409e5feb60bdd6363583d6;p=platform%2Fupstream%2Fglib.git diff --git a/glib/glib.h b/glib/glib.h index 3b3b4c2..f485552 100644 --- a/glib/glib.h +++ b/glib/glib.h @@ -178,11 +178,11 @@ extern "C" { */ #if !defined (G_VA_COPY) # if defined (__GNUC__) && defined (__PPC__) && (defined (_CALL_SYSV) || defined (_WIN32)) -# define G_VA_COPY(ap1, ap2) (*(ap1) = *(ap2)) +# define G_VA_COPY(ap1, ap2) (*(ap1) = *(ap2)) # elif defined (G_VA_COPY_AS_ARRAY) -# define G_VA_COPY(ap1, ap2) g_memmove ((ap1), (ap2), sizeof (va_list)) +# define G_VA_COPY(ap1, ap2) g_memmove ((ap1), (ap2), sizeof (va_list)) # else /* va_list is a pointer */ -# define G_VA_COPY(ap1, ap2) ((ap1) = (ap2)) +# define G_VA_COPY(ap1, ap2) ((ap1) = (ap2)) # endif /* va_list is a pointer */ #endif /* !G_VA_COPY */ @@ -205,47 +205,42 @@ extern "C" { * *capable* to do function inlining, in which case inline function bodys * do make sense. we also define G_INLINE_FUNC to properly export the * function prototypes if no inlining can be performed. - * we special case most of the stuff, so inline functions can have a normal - * implementation by defining G_INLINE_FUNC to extern and G_CAN_INLINE to 1. + * inline function bodies have to be special cased with G_CAN_INLINE and a + * .c file specific macro to allow one compiled instance with extern linkage + * of the functions by defining G_IMPLEMENT_INLINES and the .c file macro. */ +#ifdef G_IMPLEMENT_INLINES +# define G_INLINE_FUNC extern +# undef G_CAN_INLINE +#endif #ifndef G_INLINE_FUNC # define G_CAN_INLINE 1 #endif -#ifdef G_HAVE_INLINE -# if defined (__GNUC__) && defined (__STRICT_ANSI__) -# undef inline -# define inline __inline__ -# endif -#else /* !G_HAVE_INLINE */ +#if defined (G_HAVE_INLINE) && defined (__GNUC__) && defined (__STRICT_ANSI__) +# undef inline +# define inline __inline__ +#elif !defined (G_HAVE_INLINE) # undef inline # if defined (G_HAVE___INLINE__) # define inline __inline__ -# else /* !inline && !__inline__ */ -# if defined (G_HAVE___INLINE) -# define inline __inline -# else /* !inline && !__inline__ && !__inline */ -# define inline /* don't inline, then */ -# ifndef G_INLINE_FUNC -# undef G_CAN_INLINE -# endif +# elif defined (G_HAVE___INLINE) +# define inline __inline +# else /* !inline && !__inline__ && !__inline */ +# define inline /* don't inline, then */ +# ifndef G_INLINE_FUNC +# undef G_CAN_INLINE # endif # endif #endif #ifndef G_INLINE_FUNC -# ifdef __GNUC__ -# ifdef __OPTIMIZE__ -# define G_INLINE_FUNC extern inline -# else -# undef G_CAN_INLINE -# define G_INLINE_FUNC extern -# endif -# else /* !__GNUC__ */ -# ifdef G_CAN_INLINE -# define G_INLINE_FUNC static inline -# else -# define G_INLINE_FUNC extern -# endif -# endif /* !__GNUC__ */ +# if defined (__GNUC__) && (__OPTIMIZE__) +# define G_INLINE_FUNC extern inline +# elif defined (G_CAN_INLINE) && !defined (__GNUC__) +# define G_INLINE_FUNC static inline +# else /* can't inline */ +# define G_INLINE_FUNC extern +# undef G_CAN_INLINE +# endif #endif /* !G_INLINE_FUNC */ @@ -276,6 +271,13 @@ extern "C" { /* Provide macros to feature the GCC function attribute. */ +#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96) +#define G_GNUC_PURE \ + __attribute__((pure)) +#else +#define G_GNUC_PURE +#endif + #if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ > 4) #define G_GNUC_PRINTF( format_idx, arg_idx ) \ __attribute__((format (printf, format_idx, arg_idx))) @@ -323,13 +325,41 @@ extern "C" { * Actual use is strongly deprecated of course ;) */ #if defined (__i386__) && defined (__GNUC__) && __GNUC__ >= 2 -#define G_BREAKPOINT() G_STMT_START{ __asm__ __volatile__ ("int $03"); }G_STMT_END +# define G_BREAKPOINT() G_STMT_START{ __asm__ __volatile__ ("int $03"); }G_STMT_END #elif defined (__alpha__) && defined (__GNUC__) && __GNUC__ >= 2 -#define G_BREAKPOINT() G_STMT_START{ __asm__ __volatile__ ("bpt"); }G_STMT_END +# define G_BREAKPOINT() G_STMT_START{ __asm__ __volatile__ ("bpt"); }G_STMT_END #else /* !__i386__ && !__alpha__ */ -#define G_BREAKPOINT() +# define G_BREAKPOINT() G_STMT_START{ raise (5 /* SIGTRAP */); }G_STMT_END #endif /* __i386__ */ +/* g_alloca handling */ +#ifdef GLIB_HAVE_ALLOCA_H +#include +#endif + +#include +#ifdef __GNUC__ +/* glibc already does this for us */ +#ifndef alloca +# define alloca(size) __builtin_alloca (size) +#endif +#else +# ifdef _MSC_VER +# include +# define alloca _alloca +# else +# ifdef _AIX + #pragma alloca +# else +# ifndef alloca /* predefined by HP cc +Olibcalls */ +char *alloca (); +# endif +# endif +# endif +#endif + +#define g_alloca(size) alloca (size) +/* End g_alloca handling */ /* Provide macros for easily allocating memory. The macros * will cast the allocated memory to the specified type @@ -544,13 +574,6 @@ typedef unsigned short gushort; typedef unsigned long gulong; typedef unsigned int guint; -#define G_GSHORT_FORMAT "hi" -#define G_GUSHORT_FORMAT "hu" -#define G_GINT_FORMAT "i" -#define G_GUINT_FORMAT "u" -#define G_GLONG_FORMAT "li" -#define G_GULONG_FORMAT "lu" - typedef float gfloat; typedef double gdouble; @@ -941,6 +964,15 @@ struct _GTuples guint len; }; +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#include + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ /* IEEE Standard 754 Single Precision Storage Format (gfloat): * @@ -1483,7 +1515,7 @@ GLogLevelFlags g_log_set_always_fatal (GLogLevelFlags fatal_mask); #define g_warning(...) g_log (G_LOG_DOMAIN, \ G_LOG_LEVEL_WARNING, \ __VA_ARGS__) -#elif defined (__GNUC__) +#elif __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 4) #define g_error(format...) g_log (G_LOG_DOMAIN, \ G_LOG_LEVEL_ERROR, \ format) @@ -1634,7 +1666,8 @@ void g_blow_chunks (void); /* Timer */ -#define G_MICROSEC 1000000 +/* microseconds per second */ +#define G_USEC_PER_SEC 1000000 GTimer* g_timer_new (void); void g_timer_destroy (GTimer *timer); @@ -1657,8 +1690,8 @@ gchar* g_strcanon (gchar *string, gchar subsitutor); gdouble g_strtod (const gchar *nptr, gchar **endptr); -gchar* g_strerror (gint errnum); -gchar* g_strsignal (gint signum); +gchar* g_strerror (gint errnum) G_GNUC_CONST; +gchar* g_strsignal (gint signum) G_GNUC_CONST; gint g_strcasecmp (const gchar *s1, const gchar *s2); gint g_strncasecmp (const gchar *s1, @@ -1803,7 +1836,24 @@ void g_atexit (GVoidFunc func); */ G_INLINE_FUNC gint g_bit_nth_lsf (guint32 mask, gint nth_bit); -#ifdef G_CAN_INLINE +G_INLINE_FUNC gint g_bit_nth_msf (guint32 mask, + gint nth_bit); +G_INLINE_FUNC guint g_bit_storage (guint number); + + +/* Trash Stacks + * elements need to be >= sizeof (gpointer) + */ +G_INLINE_FUNC void g_trash_stack_push (GTrashStack **stack_p, + gpointer data_p); +G_INLINE_FUNC gpointer g_trash_stack_pop (GTrashStack **stack_p); +G_INLINE_FUNC gpointer g_trash_stack_peek (GTrashStack **stack_p); +G_INLINE_FUNC guint g_trash_stack_height (GTrashStack **stack_p); + + +/* inline function implementations + */ +#if defined (G_CAN_INLINE) || defined (__G_UTILS_C__) G_INLINE_FUNC gint g_bit_nth_lsf (guint32 mask, gint nth_bit) @@ -1817,11 +1867,6 @@ g_bit_nth_lsf (guint32 mask, while (nth_bit < 32); return -1; } -#endif /* G_CAN_INLINE */ - -G_INLINE_FUNC gint g_bit_nth_msf (guint32 mask, - gint nth_bit); -#ifdef G_CAN_INLINE G_INLINE_FUNC gint g_bit_nth_msf (guint32 mask, gint nth_bit) @@ -1837,10 +1882,6 @@ g_bit_nth_msf (guint32 mask, while (nth_bit > 0); return -1; } -#endif /* G_CAN_INLINE */ - -G_INLINE_FUNC guint g_bit_storage (guint number); -#ifdef G_CAN_INLINE G_INLINE_FUNC guint g_bit_storage (guint number) { @@ -1854,15 +1895,6 @@ g_bit_storage (guint number) while (number); return n_bits; } -#endif /* G_CAN_INLINE */ - - -/* Trash Stacks - * elements need to be >= sizeof (gpointer) - */ -G_INLINE_FUNC void g_trash_stack_push (GTrashStack **stack_p, - gpointer data_p); -#ifdef G_CAN_INLINE G_INLINE_FUNC void g_trash_stack_push (GTrashStack **stack_p, gpointer data_p) @@ -1872,10 +1904,6 @@ g_trash_stack_push (GTrashStack **stack_p, data->next = *stack_p; *stack_p = data; } -#endif /* G_CAN_INLINE */ - -G_INLINE_FUNC gpointer g_trash_stack_pop (GTrashStack **stack_p); -#ifdef G_CAN_INLINE G_INLINE_FUNC gpointer g_trash_stack_pop (GTrashStack **stack_p) { @@ -1893,10 +1921,6 @@ g_trash_stack_pop (GTrashStack **stack_p) return data; } -#endif /* G_CAN_INLINE */ - -G_INLINE_FUNC gpointer g_trash_stack_peek (GTrashStack **stack_p); -#ifdef G_CAN_INLINE G_INLINE_FUNC gpointer g_trash_stack_peek (GTrashStack **stack_p) { @@ -1906,10 +1930,6 @@ g_trash_stack_peek (GTrashStack **stack_p) return data; } -#endif /* G_CAN_INLINE */ - -G_INLINE_FUNC guint g_trash_stack_height (GTrashStack **stack_p); -#ifdef G_CAN_INLINE G_INLINE_FUNC guint g_trash_stack_height (GTrashStack **stack_p) { @@ -1921,7 +1941,7 @@ g_trash_stack_height (GTrashStack **stack_p) return i; } -#endif /* G_CAN_INLINE */ +#endif /* G_CAN_INLINE || __G_UTILS_C__ */ /* String Chunks @@ -2496,14 +2516,14 @@ void g_date_free (GDate *date); * return to validity). */ gboolean g_date_valid (GDate *date); -gboolean g_date_valid_day (GDateDay day); -gboolean g_date_valid_month (GDateMonth month); -gboolean g_date_valid_year (GDateYear year); -gboolean g_date_valid_weekday (GDateWeekday weekday); -gboolean g_date_valid_julian (guint32 julian_date); +gboolean g_date_valid_day (GDateDay day) G_GNUC_CONST; +gboolean g_date_valid_month (GDateMonth month) G_GNUC_CONST; +gboolean g_date_valid_year (GDateYear year) G_GNUC_CONST; +gboolean g_date_valid_weekday (GDateWeekday weekday) G_GNUC_CONST; +gboolean g_date_valid_julian (guint32 julian_date) G_GNUC_CONST; gboolean g_date_valid_dmy (GDateDay day, GDateMonth month, - GDateYear year); + GDateYear year) G_GNUC_CONST; GDateWeekday g_date_weekday (GDate *date); GDateMonth g_date_month (GDate *date); @@ -2921,14 +2941,22 @@ gint g_io_channel_unix_get_fd (GIOChannel *channel); #define G_WIN32_MSG_HANDLE 19981206 +/* Use this to get a GPollFD from a GIOChannel, so that you can call + * g_io_channel_win32_poll(). After calling this you should only use + * g_io_channel_read() to read from the GIOChannel, i.e. never read() + * or recv() from the underlying file descriptor or SOCKET. + */ +void g_io_channel_win32_make_pollfd (GIOChannel *channel, + GIOCondition condition, + GPollFD *fd); + /* This can be used to wait a until at least one of the channels is readable. * On Unix you would do a select() on the file descriptors of the channels. * This should probably be available for all platforms? */ -gint g_io_channel_win32_poll (GPollFD *fds, - gint n_fds, - GIOCondition condition, - gint timeout); +gint g_io_channel_win32_poll (GPollFD *fds, + gint n_fds, + gint timeout); /* This is used to add polling for Windows messages. GDK (GTk+) programs * should *not* use this. @@ -2942,14 +2970,18 @@ GIOChannel *g_io_channel_win32_new_messages (guint hwnd); /* An IO channel for C runtime (emulated Unix-like) file * descriptors. Identical to g_io_channel_unix_new above. + * After calling g_io_add_watch() on a IO channel returned + * by this function, you shouldn't call read() on the file + * descriptor. */ GIOChannel* g_io_channel_win32_new_fd (int fd); /* Get the C runtime file descriptor of a channel. */ gint g_io_channel_win32_get_fd (GIOChannel *channel); -/* An IO channel for a SOCK_STREAM winsock socket. The parameter should - * be a SOCKET. +/* An IO channel for a SOCK_STREAM winsock socket. The parameter + * should be a SOCKET. After calling g_io_add_watch() on a IO channel + * returned by this function, you shouldn't call recv() on the SOCKET. */ GIOChannel *g_io_channel_win32_new_stream_socket (int socket); @@ -3035,14 +3067,22 @@ gchar * g_win32_error_message (gint error); /* GLib Thread support */ +extern GQuark g_thread_error_quark(); +#define G_THREAD_ERROR g_thread_error_quark() + +typedef enum +{ + G_THREAD_ERROR_AGAIN /* Resource temporarily unavailable */ +} GThreadError; + typedef void (*GThreadFunc) (gpointer value); typedef enum { - G_THREAD_PRIORITY_LOW, - G_THREAD_PRIORITY_NORMAL, - G_THREAD_PRIORITY_HIGH, - G_THREAD_PRIORITY_URGENT + G_THREAD_PRIORITY_LOW, + G_THREAD_PRIORITY_NORMAL, + G_THREAD_PRIORITY_HIGH, + G_THREAD_PRIORITY_URGENT } GThreadPriority; typedef struct _GThread GThread; @@ -3087,7 +3127,8 @@ struct _GThreadFunctions gboolean joinable, gboolean bound, GThreadPriority priority, - gpointer thread); + gpointer thread, + GError **error); void (*thread_yield) (void); void (*thread_join) (gpointer thread); void (*thread_exit) (void); @@ -3106,22 +3147,56 @@ GLIB_VAR gboolean g_threads_got_initialized; */ void g_thread_init (GThreadFunctions *vtable); +/* Errorcheck mutexes. If you define G_ERRORCHECK_MUTEXES, then all + * mutexes will check for re-locking and re-unlocking */ + +/* Initialize thread system with errorcheck mutexes. vtable must be + * NULL.Do not call directly. Use #define G_ERRORCHECK_MUTEXES + * instead. + */ +void g_thread_init_with_errorcheck_mutexes (GThreadFunctions* vtable); + +/* A random number to recognize debug calls to g_mutex_... */ +#define G_MUTEX_DEBUG_MAGIC 0xf8e18ad7 + +#ifdef G_ERRORCHECK_MUTEXES +#define g_thread_init(vtable) g_thread_init_with_errorcheck_mutexes (vtable) +#endif + /* internal function for fallback static mutex implementation */ GMutex* g_static_mutex_get_mutex_impl (GMutex **mutex); /* shorthands for conditional and unconditional function calls */ -#define G_THREAD_UF(name, arglist) \ - (*g_thread_functions_for_glib_use . name) arglist -#define G_THREAD_CF(name, fail, arg) \ - (g_thread_supported () ? G_THREAD_UF (name, arg) : (fail)) -/* keep in mind, all those mutexes and static mutexes are not - * recursive in general, don't rely on that - */ +#define G_THREAD_UF(op, arglist) \ + (*g_thread_functions_for_glib_use . op) arglist +#define G_THREAD_CF(op, fail, arg) \ + (g_thread_supported () ? G_THREAD_UF (op, arg) : (fail)) +#define G_THREAD_ECF(op, fail, mutex, name, type) \ + (g_thread_supported () ? \ + ((type(*)(GMutex*, gulong, gchar*, gchar*)) \ + (*g_thread_functions_for_glib_use . op)) \ + (mutex, G_MUTEX_DEBUG_MAGIC, G_STRINGIFY (name), G_STRLOC) : (fail)) +#ifndef G_ERRORCHECK_MUTEXES +#define g_mutex_lock_with_debug_name(mutex, name) \ + G_THREAD_CF (mutex_lock, (void)0, (mutex)) +#define g_mutex_trylock_with_debug_name(mutex, name) \ + G_THREAD_CF (mutex_trylock, TRUE, (mutex)) +#define g_mutex_unlock_with_debug_name(mutex, name) \ + G_THREAD_CF (mutex_unlock, (void)0, (mutex)) +#else /* G_ERRORCHECK_MUTEXES */ +#define g_mutex_lock_with_debug_name(mutex, name) \ + G_THREAD_ECF (mutex_lock, (void)0, mutex, name, void) +#define g_mutex_trylock_with_debug_name(mutex, name) \ + G_THREAD_ECF (mutex_trylock, TRUE, mutex, name, gboolean) +#define g_mutex_unlock_with_debug_name(mutex, name) \ + G_THREAD_ECF (mutex_unlock, (void)0, mutex, name, void) +#endif /* G_ERRORCHECK_MUTEXES */ + #define g_thread_supported() (g_threads_got_initialized) #define g_mutex_new() G_THREAD_UF (mutex_new, ()) -#define g_mutex_lock(mutex) G_THREAD_CF (mutex_lock, (void)0, (mutex)) -#define g_mutex_trylock(mutex) G_THREAD_CF (mutex_trylock, TRUE, (mutex)) -#define g_mutex_unlock(mutex) G_THREAD_CF (mutex_unlock, (void)0, (mutex)) +#define g_mutex_lock(mutex) g_mutex_lock_with_debug_name(mutex, mutex) +#define g_mutex_trylock(mutex) g_mutex_trylock_with_debug_name(mutex, mutex) +#define g_mutex_unlock(mutex) g_mutex_unlock_with_debug_name(mutex, mutex) #define g_mutex_free(mutex) G_THREAD_CF (mutex_free, (void)0, (mutex)) #define g_cond_new() G_THREAD_UF (cond_new, ()) #define g_cond_signal(cond) G_THREAD_CF (cond_signal, (void)0, (cond)) @@ -3149,11 +3224,12 @@ GThread* g_thread_create (GThreadFunc thread_func, gulong stack_size, gboolean joinable, gboolean bound, - GThreadPriority priority); + GThreadPriority priority, + GError **error); GThread* g_thread_self (); -void g_thread_join (GThread* thread); -void g_thread_set_priority (GThread* thread, - GThreadPriority priority); +void g_thread_join (GThread *thread); +void g_thread_set_priority (GThread *thread, + GThreadPriority priority); /* GStaticMutexes can be statically initialized with the value * G_STATIC_MUTEX_INIT, and then they can directly be used, that is @@ -3161,11 +3237,11 @@ void g_thread_set_priority (GThread* thread, * use */ #define g_static_mutex_lock(mutex) \ - g_mutex_lock (g_static_mutex_get_mutex (mutex)) + g_mutex_lock_with_debug_name (g_static_mutex_get_mutex (mutex), mutex) #define g_static_mutex_trylock(mutex) \ - g_mutex_trylock (g_static_mutex_get_mutex (mutex)) + g_mutex_trylock_with_debug_name (g_static_mutex_get_mutex (mutex), mutex) #define g_static_mutex_unlock(mutex) \ - g_mutex_unlock (g_static_mutex_get_mutex (mutex)) + g_mutex_unlock_with_debug_name (g_static_mutex_get_mutex (mutex), mutex) struct _GStaticPrivate { @@ -3353,20 +3429,23 @@ GThreadPool* g_thread_pool_new (GFunc thread_func, gboolean bound, GThreadPriority priority, gboolean exclusive, - gpointer user_data); + gpointer user_data, + GError **error); /* Push new data into the thread pool. This task is assigned to a thread later * (when the maximal number of threads is reached for that pool) or now * (otherwise). If necessary a new thread will be started. The function * returns immediatly */ void g_thread_pool_push (GThreadPool *pool, - gpointer data); + gpointer data, + GError **error); /* Set the number of threads, which can run concurrently for that pool, -1 * means no limit. 0 means has the effect, that the pool won't process * requests until the limit is set higher again */ void g_thread_pool_set_max_threads (GThreadPool *pool, - gint max_threads); + gint max_threads, + GError **error); gint g_thread_pool_get_max_threads (GThreadPool *pool); /* Get the number of threads assigned to that pool. This number doesn't @@ -3393,11 +3472,36 @@ guint g_thread_pool_get_num_unused_threads (void); /* Stop all currently unused threads, but leave the limit untouched */ void g_thread_pool_stop_unused_threads (void); +typedef enum +{ + G_CONVERT_ERROR_NO_CONVERSION, + G_CONVERT_ERROR_ILLEGAL_SEQUENCE, + G_CONVERT_ERROR_FAILED +} GConvertError; + +#define G_CONVERT_ERROR g_convert_error_quark() +GQuark g_convert_error_quark(); + +gchar* g_convert (const gchar *str, + gint len, + const gchar *to_codeset, + const gchar *from_codeset, + gint *bytes_read, + gint *bytes_written, + GError **error); +gchar* g_convert_with_fallback (const gchar *str, + gint len, + const gchar *to_codeset, + const gchar *from_codeset, + gchar *fallback, + gint *bytes_read, + gint *bytes_written, + GError **error); + #ifdef __cplusplus } #endif /* __cplusplus */ #include -#include #endif /* __G_LIB_H__ */