]> git.sesse.net Git - vlc/commitdiff
* ./include/vlc_threads.h, ./src/misc/threads.c: improved the cond_wait
authorSam Hocevar <sam@videolan.org>
Sat, 8 Jun 2002 14:08:46 +0000 (14:08 +0000)
committerSam Hocevar <sam@videolan.org>
Sat, 8 Jun 2002 14:08:46 +0000 (14:08 +0000)
    implementation to avoid races, by using SetEvent instead of PulseEvent.

12 files changed:
bootstrap.sh
include/vlc_symbols.h
include/vlc_threads.h
plugins/macosx/aout_macosx.m
plugins/mpeg_vdec/vpar_pool.c
src/audio_output/audio_output.c
src/input/input.c
src/input/input_dec.c
src/misc/modules_plugin.h
src/misc/objects.c
src/misc/threads.c
src/misc/win32_specific.c

index 7cf2c50cc941b9d7bc6b3b1d306a15c05fcb68b2..ccb7db3806a042452cba5c0403860c1d4d86b305 100755 (executable)
@@ -1,7 +1,7 @@
 #! /bin/sh
 
 ##  bootstrap.sh file for vlc, the VideoLAN Client
-##  $Id: bootstrap.sh,v 1.4 2002/06/07 14:30:40 sam Exp $
+##  $Id: bootstrap.sh,v 1.5 2002/06/08 14:08:46 sam Exp $
 ##
 ##  Authors: Samuel Hocevar <sam@zoy.org>
 
@@ -35,12 +35,12 @@ echo '' >> $file
 echo 'struct module_symbols_s' >> $file
 echo '{' >> $file
 cat include/*.h | grep '^ *VLC_EXPORT.*;' | \
-       sed 's/VLC_EXPORT( *\([^,]*\), *\([^,]*\), *\(.*\));.*/    \1 (* \2_inner) \3;/' >> $file
+       sed 's/VLC_EXPORT( *\([^,]*\), *\([^,]*\), *\(.*\));.*/    \1 (* \2_inner) \3;/' | sort >> $file
 echo '};' >> $file
 echo '' >> $file
 echo '#ifdef __PLUGIN__' >> $file
 cat include/*.h | grep '^ *VLC_EXPORT.*;' | \
-       sed 's/VLC_EXPORT( *\([^,]*\), *\([^,]*\), *\(.*\));.*/#   define \2 p_symbols->\2_inner/' >> $file
+       sed 's/VLC_EXPORT( *\([^,]*\), *\([^,]*\), *\(.*\));.*/#   define \2 p_symbols->\2_inner/' | sort >> $file
 echo '#endif /* __PLUGIN__ */' >> $file
 echo '' >> $file
 echo "$file."
index 5c7ae6f067c71083060b582cbbb0c6099763da39..306aa36375282fc378cfe1b97342ded7a93c54e7 100644 (file)
 struct module_symbols_s
 {
     aout_fifo_t * (* __aout_CreateFifo_inner) ( vlc_object_t *, int, int, int, int, void * ) ;
-    void (* aout_DestroyFifo_inner) ( aout_fifo_t *p_fifo ) ;
-    int (* __config_GetInt_inner) (vlc_object_t *, const char *) ;
-    void (* __config_PutInt_inner) (vlc_object_t *, const char *, int) ;
-    float (* __config_GetFloat_inner) (vlc_object_t *, const char *) ;
-    void (* __config_PutFloat_inner) (vlc_object_t *, const char *, float) ;
     char * (* __config_GetPsz_inner) (vlc_object_t *, const char *) ;
-    void (* __config_PutPsz_inner) (vlc_object_t *, const char *, char *) ;
-    int (* __config_LoadCmdLine_inner) ( vlc_object_t *, int *, char *[], vlc_bool_t ) ;
     char * (* config_GetHomeDir_inner) ( void ) ;
+    char * (* input_OffsetToTime_inner) ( input_thread_t *, char *, off_t ) ;
+    char * (* mstrtime_inner) ( char *psz_buffer, mtime_t date ) ;
+    const char * (* DecodeLanguage_inner) ( u16 ) ;
+    const iso639_lang_t * (* GetLang_1_inner) ( const char * ) ;
+    const iso639_lang_t * (* GetLang_2B_inner) ( const char * ) ;
+    const iso639_lang_t * (* GetLang_2T_inner) ( const char * ) ;
+    data_buffer_t * (* input_NewBuffer_inner) ( input_buffers_t *, size_t ) ;
+    data_packet_t * (* input_NewPacket_inner) ( input_buffers_t *, size_t ) ;
+    data_packet_t * (* input_ShareBuffer_inner) ( input_buffers_t *, data_buffer_t * ) ;
+    es_descriptor_t * (* input_AddES_inner) ( input_thread_t *, pgrm_descriptor_t *, u16, size_t ) ;
+    es_descriptor_t * (* input_FindES_inner) ( input_thread_t *, u16 ) ;
+    es_descriptor_t * (* input_ParsePS_inner) ( input_thread_t *, data_packet_t * ) ;
+    float (* __config_GetFloat_inner) (vlc_object_t *, const char *) ;
+    input_area_t * (* input_AddArea_inner) ( input_thread_t * ) ;
+    int (* __config_GetInt_inner) (vlc_object_t *, const char *) ;
+    int (* __config_LoadCmdLine_inner) ( vlc_object_t *, int *, char *[], vlc_bool_t ) ;
     int (* __config_LoadConfigFile_inner) ( vlc_object_t *, const char * ) ;
     int (* __config_SaveConfigFile_inner) ( vlc_object_t *, const char * ) ;
-    module_config_t * (* config_FindConfig_inner) ( vlc_object_t *, const char *psz_name ) ;
-    void (* config_Duplicate_inner) ( module_t *, module_config_t * ) ;
-    void (* config_SetCallbacks_inner) ( module_config_t *, module_config_t * ) ;
-    void (* config_UnsetCallbacks_inner) ( module_config_t * ) ;
-    void (* InitBitstream_inner) ( bit_stream_t *, decoder_fifo_t *, void ( * )( bit_stream_t *, vlc_bool_t ), void * p_callback_arg ) ;
-    vlc_bool_t (* NextDataPacket_inner) ( decoder_fifo_t *, data_packet_t ** ) ;
-    void (* BitstreamNextDataPacket_inner) ( bit_stream_t * ) ;
-    u32 (* UnalignedShowBits_inner) ( bit_stream_t *, unsigned int ) ;
-    void (* UnalignedRemoveBits_inner) ( bit_stream_t * ) ;
-    u32 (* UnalignedGetBits_inner) ( bit_stream_t *, unsigned int ) ;
-    void (* CurrentPTS_inner) ( bit_stream_t *, mtime_t *, mtime_t * ) ;
-    void (* DecoderError_inner) ( decoder_fifo_t * p_fifo ) ;
-    void (* __input_SetStatus_inner) ( vlc_object_t *, int ) ;
-    void (* __input_Seek_inner) ( vlc_object_t *, off_t, int ) ;
-    void (* __input_Tell_inner) ( vlc_object_t *, stream_position_t * ) ;
-    void (* input_DumpStream_inner) ( input_thread_t * ) ;
-    char * (* input_OffsetToTime_inner) ( input_thread_t *, char *, off_t ) ;
-    int (* input_ChangeES_inner) ( input_thread_t *, es_descriptor_t *, u8 ) ;
-    int (* input_ToggleES_inner) ( input_thread_t *, es_descriptor_t *, vlc_bool_t ) ;
+    int (* __intf_Eject_inner) ( vlc_object_t *, const char * ) ;
+    int (* __network_ChannelCreate_inner) ( vlc_object_t * ) ;
+    int (* __network_ChannelJoin_inner) ( vlc_object_t *, int ) ;
+    int (* __vlc_cond_destroy_inner) ( char *, int, vlc_cond_t * ) ;
+    int (* __vlc_cond_init_inner) ( vlc_object_t *, vlc_cond_t * ) ;
+    int (* __vlc_mutex_destroy_inner) ( char *, int, vlc_mutex_t * ) ;
+    int (* __vlc_mutex_init_inner) ( vlc_object_t *, vlc_mutex_t * ) ;
+    int (* __vlc_thread_create_inner) ( vlc_object_t *, char *, int, char *, void * ( * ) ( void * ), vlc_bool_t ) ;
+    int (* __vlc_threads_init_inner) ( vlc_object_t * ) ;
+    int (* input_AccessInit_inner) ( input_thread_t * ) ;
     int (* input_ChangeArea_inner) ( input_thread_t *, input_area_t * ) ;
+    int (* input_ChangeES_inner) ( input_thread_t *, es_descriptor_t *, u8 ) ;
     int (* input_ChangeProgram_inner) ( input_thread_t *, u16 ) ;
+    int (* input_ClockManageControl_inner) ( input_thread_t *, pgrm_descriptor_t *, mtime_t ) ;
     int (* input_InitStream_inner) ( input_thread_t *, size_t ) ;
-    void (* input_EndStream_inner) ( input_thread_t * ) ;
-    pgrm_descriptor_t * (* input_FindProgram_inner) ( input_thread_t *, u16 ) ;
-    pgrm_descriptor_t * (* input_AddProgram_inner) ( input_thread_t *, u16, size_t ) ;
-    void (* input_DelProgram_inner) ( input_thread_t *, pgrm_descriptor_t * ) ;
-    int (* input_SetProgram_inner) ( input_thread_t *, pgrm_descriptor_t * ) ;
-    input_area_t * (* input_AddArea_inner) ( input_thread_t * ) ;
-    void (* input_DelArea_inner) ( input_thread_t *, input_area_t * ) ;
-    es_descriptor_t * (* input_FindES_inner) ( input_thread_t *, u16 ) ;
-    es_descriptor_t * (* input_AddES_inner) ( input_thread_t *, pgrm_descriptor_t *, u16, size_t ) ;
-    void (* input_DelES_inner) ( input_thread_t *, es_descriptor_t * ) ;
     int (* input_SelectES_inner) ( input_thread_t *, es_descriptor_t * ) ;
+    int (* input_SetProgram_inner) ( input_thread_t *, pgrm_descriptor_t * ) ;
+    int (* input_ToggleES_inner) ( input_thread_t *, es_descriptor_t *, vlc_bool_t ) ;
     int (* input_UnselectES_inner) ( input_thread_t *, es_descriptor_t * ) ;
-    void (* input_DecodePES_inner) ( decoder_fifo_t *, pes_packet_t * ) ;
-    int (* input_ClockManageControl_inner) ( input_thread_t *, pgrm_descriptor_t *, mtime_t ) ;
-    void (* input_ClockManageRef_inner) ( input_thread_t *, pgrm_descriptor_t *, mtime_t ) ;
+    int (* playlist_Add_inner) ( playlist_t *, const char *, int, int ) ;
+    int (* playlist_Delete_inner) ( playlist_t *, int ) ;
+    int (* vlc_threads_end_inner) ( void ) ;
+    int (* vout_ChromaCmp_inner) ( u32, u32 ) ;
+    module_config_t * (* config_FindConfig_inner) ( vlc_object_t *, const char *psz_name ) ;
+    module_t * (* __module_Need_inner) ( vlc_object_t *, int, char *, void * ) ;
+    msg_subscription_t* (* __msg_Subscribe_inner) ( vlc_object_t * ) ;
     mtime_t (* input_ClockGetTS_inner) ( input_thread_t *, pgrm_descriptor_t *, mtime_t ) ;
-    void (* input_BuffersEnd_inner) ( input_thread_t *, input_buffers_t * ) ;
-    data_buffer_t * (* input_NewBuffer_inner) ( input_buffers_t *, size_t ) ;
-    void (* input_ReleaseBuffer_inner) ( input_buffers_t *, data_buffer_t * ) ;
-    data_packet_t * (* input_ShareBuffer_inner) ( input_buffers_t *, data_buffer_t * ) ;
-    data_packet_t * (* input_NewPacket_inner) ( input_buffers_t *, size_t ) ;
-    void (* input_DeletePacket_inner) ( input_buffers_t *, data_packet_t * ) ;
+    mtime_t (* mdate_inner) ( void ) ;
     pes_packet_t * (* input_NewPES_inner) ( input_buffers_t * ) ;
-    void (* input_DeletePES_inner) ( input_buffers_t *, pes_packet_t * ) ;
+    pgrm_descriptor_t * (* input_AddProgram_inner) ( input_thread_t *, u16, size_t ) ;
+    pgrm_descriptor_t * (* input_FindProgram_inner) ( input_thread_t *, u16 ) ;
+    picture_t * (* vout_CreatePicture_inner) ( vout_thread_t *, vlc_bool_t, vlc_bool_t, vlc_bool_t ) ;
+    ssize_t (* input_FDNetworkRead_inner) ( input_thread_t *, byte_t *, size_t ) ;
+    ssize_t (* input_FDRead_inner) ( input_thread_t *, byte_t *, size_t ) ;
     ssize_t (* input_FillBuffer_inner) ( input_thread_t * ) ;
     ssize_t (* input_Peek_inner) ( input_thread_t *, byte_t **, size_t ) ;
-    ssize_t (* input_SplitBuffer_inner) ( input_thread_t *, data_packet_t **, size_t ) ;
-    int (* input_AccessInit_inner) ( input_thread_t * ) ;
-    void (* input_AccessReinit_inner) ( input_thread_t * ) ;
-    void (* input_AccessEnd_inner) ( input_thread_t * ) ;
-    void (* input_ParsePES_inner) ( input_thread_t *, es_descriptor_t * ) ;
-    void (* input_GatherPES_inner) ( input_thread_t *, data_packet_t *, es_descriptor_t *, vlc_bool_t, vlc_bool_t ) ;
     ssize_t (* input_ReadPS_inner) ( input_thread_t *, data_packet_t ** ) ;
-    es_descriptor_t * (* input_ParsePS_inner) ( input_thread_t *, data_packet_t * ) ;
     ssize_t (* input_ReadTS_inner) ( input_thread_t *, data_packet_t ** ) ;
+    ssize_t (* input_SplitBuffer_inner) ( input_thread_t *, data_packet_t **, size_t ) ;
+    subpicture_t * (* vout_CreateSubPicture_inner) ( vout_thread_t *, int, int ) ;
+    u32 (* UnalignedGetBits_inner) ( bit_stream_t *, unsigned int ) ;
+    u32 (* UnalignedShowBits_inner) ( bit_stream_t *, unsigned int ) ;
+    vlc_bool_t (* NextDataPacket_inner) ( decoder_fifo_t *, data_packet_t ** ) ;
+    void (* BitstreamNextDataPacket_inner) ( bit_stream_t * ) ;
+    void (* CurrentPTS_inner) ( bit_stream_t *, mtime_t *, mtime_t * ) ;
+    void (* DecoderError_inner) ( decoder_fifo_t * p_fifo ) ;
+    void (* InitBitstream_inner) ( bit_stream_t *, decoder_fifo_t *, void ( * )( bit_stream_t *, vlc_bool_t ), void * p_callback_arg ) ;
+    void (* UnalignedRemoveBits_inner) ( bit_stream_t * ) ;
+    void (* __config_PutFloat_inner) (vlc_object_t *, const char *, float) ;
+    void (* __config_PutInt_inner) (vlc_object_t *, const char *, int) ;
+    void (* __config_PutPsz_inner) (vlc_object_t *, const char *, char *) ;
+    void (* __input_Seek_inner) ( vlc_object_t *, off_t, int ) ;
+    void (* __input_SetStatus_inner) ( vlc_object_t *, int ) ;
+    void (* __input_Tell_inner) ( vlc_object_t *, stream_position_t * ) ;
+    void (* __msg_Dbg_inner) ( void *, const char *, ... ) ;
+    void (* __msg_Err_inner) ( void *, const char *, ... ) ;
+    void (* __msg_Generic_inner) ( vlc_object_t *, int, const char *, const char *, ... ) ;
+    void (* __msg_Info_inner) ( void *, const char *, ... ) ;
+    void (* __msg_Unsubscribe_inner) ( vlc_object_t *, msg_subscription_t * ) ;
+    void (* __msg_Warn_inner) ( void *, const char *, ... ) ;
+    void (* __vlc_dumpstructure_inner) ( vlc_object_t * ) ;
+    void (* __vlc_object_attach_inner) ( vlc_object_t *, vlc_object_t * ) ;
+    void (* __vlc_object_destroy_inner) ( vlc_object_t * ) ;
+    void (* __vlc_object_detach_all_inner) ( vlc_object_t * ) ;
+    void (* __vlc_object_detach_inner) ( vlc_object_t *, vlc_object_t * ) ;
+    void (* __vlc_object_release_inner) ( vlc_object_t * ) ;
+    void (* __vlc_object_yield_inner) ( vlc_object_t * ) ;
+    void (* __vlc_thread_join_inner) ( vlc_object_t *, char *, int ) ;
+    void (* __vlc_thread_ready_inner) ( vlc_object_t * ) ;
+    void (* aout_DestroyFifo_inner) ( aout_fifo_t *p_fifo ) ;
+    void (* config_Duplicate_inner) ( module_t *, module_config_t * ) ;
+    void (* config_SetCallbacks_inner) ( module_config_t *, module_config_t * ) ;
+    void (* config_UnsetCallbacks_inner) ( module_config_t * ) ;
+    void (* input_AccessEnd_inner) ( input_thread_t * ) ;
+    void (* input_AccessReinit_inner) ( input_thread_t * ) ;
+    void (* input_BuffersEnd_inner) ( input_thread_t *, input_buffers_t * ) ;
+    void (* input_ClockManageRef_inner) ( input_thread_t *, pgrm_descriptor_t *, mtime_t ) ;
+    void (* input_DecodePES_inner) ( decoder_fifo_t *, pes_packet_t * ) ;
+    void (* input_DelArea_inner) ( input_thread_t *, input_area_t * ) ;
+    void (* input_DelES_inner) ( input_thread_t *, es_descriptor_t * ) ;
+    void (* input_DelProgram_inner) ( input_thread_t *, pgrm_descriptor_t * ) ;
+    void (* input_DeletePES_inner) ( input_buffers_t *, pes_packet_t * ) ;
+    void (* input_DeletePacket_inner) ( input_buffers_t *, data_packet_t * ) ;
     void (* input_DemuxPS_inner) ( input_thread_t *, data_packet_t * ) ;
     void (* input_DemuxTS_inner) ( input_thread_t *, data_packet_t *, void(*) ( input_thread_t *, data_packet_t *, es_descriptor_t *, vlc_bool_t ) ) ;
+    void (* input_DumpStream_inner) ( input_thread_t * ) ;
+    void (* input_EndStream_inner) ( input_thread_t * ) ;
     void (* input_FDClose_inner) ( input_thread_t * ) ;
     void (* input_FDNetworkClose_inner) ( input_thread_t * ) ;
-    ssize_t (* input_FDRead_inner) ( input_thread_t *, byte_t *, size_t ) ;
-    ssize_t (* input_FDNetworkRead_inner) ( input_thread_t *, byte_t *, size_t ) ;
     void (* input_FDSeek_inner) ( input_thread_t *, off_t ) ;
-    int (* __intf_Eject_inner) ( vlc_object_t *, const char * ) ;
-    const iso639_lang_t * (* GetLang_1_inner) ( const char * ) ;
-    const iso639_lang_t * (* GetLang_2T_inner) ( const char * ) ;
-    const iso639_lang_t * (* GetLang_2B_inner) ( const char * ) ;
-    const char * (* DecodeLanguage_inner) ( u16 ) ;
-    module_t * (* __module_Need_inner) ( vlc_object_t *, int, char *, void * ) ;
+    void (* input_GatherPES_inner) ( input_thread_t *, data_packet_t *, es_descriptor_t *, vlc_bool_t, vlc_bool_t ) ;
+    void (* input_ParsePES_inner) ( input_thread_t *, es_descriptor_t * ) ;
+    void (* input_ReleaseBuffer_inner) ( input_buffers_t *, data_buffer_t * ) ;
     void (* module_Unneed_inner) ( module_t * ) ;
-    char * (* mstrtime_inner) ( char *psz_buffer, mtime_t date ) ;
-    mtime_t (* mdate_inner) ( void ) ;
-    void (* mwait_inner) ( mtime_t date ) ;
     void (* msleep_inner) ( mtime_t delay ) ;
-    int (* __network_ChannelJoin_inner) ( vlc_object_t *, int ) ;
-    int (* __network_ChannelCreate_inner) ( vlc_object_t * ) ;
+    void (* mwait_inner) ( mtime_t date ) ;
     void (* playlist_Command_inner) ( playlist_t *, int, int ) ;
-    int (* playlist_Add_inner) ( playlist_t *, const char *, int, int ) ;
-    int (* playlist_Delete_inner) ( playlist_t *, int ) ;
-    vout_thread_t * (* __vout_CreateThread_inner) ( vlc_object_t *, int, int, u32, int ) ;
-    void (* vout_DestroyThread_inner) ( vout_thread_t * ) ;
-    int (* vout_ChromaCmp_inner) ( u32, u32 ) ;
-    picture_t * (* vout_CreatePicture_inner) ( vout_thread_t *, vlc_bool_t, vlc_bool_t, vlc_bool_t ) ;
     void (* vout_AllocatePicture_inner) ( vout_thread_t *, picture_t *, int, int, u32 ) ;
+    void (* vout_DatePicture_inner) ( vout_thread_t *, picture_t *, mtime_t ) ;
     void (* vout_DestroyPicture_inner) ( vout_thread_t *, picture_t * ) ;
+    void (* vout_DestroySubPicture_inner) ( vout_thread_t *, subpicture_t * ) ;
+    void (* vout_DestroyThread_inner) ( vout_thread_t * ) ;
     void (* vout_DisplayPicture_inner) ( vout_thread_t *, picture_t * ) ;
-    void (* vout_DatePicture_inner) ( vout_thread_t *, picture_t *, mtime_t ) ;
+    void (* vout_DisplaySubPicture_inner) ( vout_thread_t *, subpicture_t * ) ;
     void (* vout_LinkPicture_inner) ( vout_thread_t *, picture_t * ) ;
-    void (* vout_UnlinkPicture_inner) ( vout_thread_t *, picture_t * ) ;
     void (* vout_PlacePicture_inner) ( vout_thread_t *, int, int, int *, int *, int *, int * ) ;
-    subpicture_t * (* vout_CreateSubPicture_inner) ( vout_thread_t *, int, int ) ;
-    void (* vout_DestroySubPicture_inner) ( vout_thread_t *, subpicture_t * ) ;
-    void (* vout_DisplaySubPicture_inner) ( vout_thread_t *, subpicture_t * ) ;
-    void (* __msg_Generic_inner) ( vlc_object_t *, int, const char *, const char *, ... ) ;
-    void (* __msg_Info_inner) ( void *, const char *, ... ) ;
-    void (* __msg_Err_inner) ( void *, const char *, ... ) ;
-    void (* __msg_Warn_inner) ( void *, const char *, ... ) ;
-    void (* __msg_Dbg_inner) ( void *, const char *, ... ) ;
-    msg_subscription_t* (* __msg_Subscribe_inner) ( vlc_object_t * ) ;
-    void (* __msg_Unsubscribe_inner) ( vlc_object_t *, msg_subscription_t * ) ;
+    void (* vout_UnlinkPicture_inner) ( vout_thread_t *, picture_t * ) ;
     void * (* __vlc_object_create_inner) ( vlc_object_t *, int ) ;
-    void (* __vlc_object_destroy_inner) ( vlc_object_t * ) ;
     void * (* __vlc_object_find_inner) ( vlc_object_t *, int, int ) ;
-    void (* __vlc_object_yield_inner) ( vlc_object_t * ) ;
-    void (* __vlc_object_release_inner) ( vlc_object_t * ) ;
-    void (* __vlc_object_detach_inner) ( vlc_object_t *, vlc_object_t * ) ;
-    void (* __vlc_object_detach_all_inner) ( vlc_object_t * ) ;
-    void (* __vlc_object_attach_inner) ( vlc_object_t *, vlc_object_t * ) ;
-    void (* __vlc_dumpstructure_inner) ( vlc_object_t * ) ;
-    int (* __vlc_threads_init_inner) ( vlc_object_t * ) ;
-    int (* vlc_threads_end_inner) ( void ) ;
-    int (* __vlc_mutex_init_inner) ( vlc_object_t *, vlc_mutex_t * ) ;
-    int (* __vlc_mutex_destroy_inner) ( char *, int, vlc_mutex_t * ) ;
-    int (* vlc_cond_init_inner) ( vlc_cond_t * ) ;
-    int (* __vlc_cond_destroy_inner) ( char *, int, vlc_cond_t * ) ;
-    int (* __vlc_thread_create_inner) ( vlc_object_t *, char *, int, char *, void * ( * ) ( void * ), vlc_bool_t ) ;
-    void (* __vlc_thread_ready_inner) ( vlc_object_t * ) ;
-    void (* __vlc_thread_join_inner) ( vlc_object_t *, char *, int ) ;
+    vout_thread_t * (* __vout_CreateThread_inner) ( vlc_object_t *, int, int, u32, int ) ;
 };
 
 #ifdef __PLUGIN__
+#   define BitstreamNextDataPacket p_symbols->BitstreamNextDataPacket_inner
+#   define CurrentPTS p_symbols->CurrentPTS_inner
+#   define DecodeLanguage p_symbols->DecodeLanguage_inner
+#   define DecoderError p_symbols->DecoderError_inner
+#   define GetLang_1 p_symbols->GetLang_1_inner
+#   define GetLang_2B p_symbols->GetLang_2B_inner
+#   define GetLang_2T p_symbols->GetLang_2T_inner
+#   define InitBitstream p_symbols->InitBitstream_inner
+#   define NextDataPacket p_symbols->NextDataPacket_inner
+#   define UnalignedGetBits p_symbols->UnalignedGetBits_inner
+#   define UnalignedRemoveBits p_symbols->UnalignedRemoveBits_inner
+#   define UnalignedShowBits p_symbols->UnalignedShowBits_inner
 #   define __aout_CreateFifo p_symbols->__aout_CreateFifo_inner
-#   define aout_DestroyFifo p_symbols->aout_DestroyFifo_inner
-#   define __config_GetInt p_symbols->__config_GetInt_inner
-#   define __config_PutInt p_symbols->__config_PutInt_inner
 #   define __config_GetFloat p_symbols->__config_GetFloat_inner
-#   define __config_PutFloat p_symbols->__config_PutFloat_inner
+#   define __config_GetInt p_symbols->__config_GetInt_inner
 #   define __config_GetPsz p_symbols->__config_GetPsz_inner
-#   define __config_PutPsz p_symbols->__config_PutPsz_inner
 #   define __config_LoadCmdLine p_symbols->__config_LoadCmdLine_inner
-#   define config_GetHomeDir p_symbols->config_GetHomeDir_inner
 #   define __config_LoadConfigFile p_symbols->__config_LoadConfigFile_inner
+#   define __config_PutFloat p_symbols->__config_PutFloat_inner
+#   define __config_PutInt p_symbols->__config_PutInt_inner
+#   define __config_PutPsz p_symbols->__config_PutPsz_inner
 #   define __config_SaveConfigFile p_symbols->__config_SaveConfigFile_inner
-#   define config_FindConfig p_symbols->config_FindConfig_inner
+#   define __input_Seek p_symbols->__input_Seek_inner
+#   define __input_SetStatus p_symbols->__input_SetStatus_inner
+#   define __input_Tell p_symbols->__input_Tell_inner
+#   define __intf_Eject p_symbols->__intf_Eject_inner
+#   define __module_Need p_symbols->__module_Need_inner
+#   define __msg_Dbg p_symbols->__msg_Dbg_inner
+#   define __msg_Err p_symbols->__msg_Err_inner
+#   define __msg_Generic p_symbols->__msg_Generic_inner
+#   define __msg_Info p_symbols->__msg_Info_inner
+#   define __msg_Subscribe p_symbols->__msg_Subscribe_inner
+#   define __msg_Unsubscribe p_symbols->__msg_Unsubscribe_inner
+#   define __msg_Warn p_symbols->__msg_Warn_inner
+#   define __network_ChannelCreate p_symbols->__network_ChannelCreate_inner
+#   define __network_ChannelJoin p_symbols->__network_ChannelJoin_inner
+#   define __vlc_cond_destroy p_symbols->__vlc_cond_destroy_inner
+#   define __vlc_cond_init p_symbols->__vlc_cond_init_inner
+#   define __vlc_dumpstructure p_symbols->__vlc_dumpstructure_inner
+#   define __vlc_mutex_destroy p_symbols->__vlc_mutex_destroy_inner
+#   define __vlc_mutex_init p_symbols->__vlc_mutex_init_inner
+#   define __vlc_object_attach p_symbols->__vlc_object_attach_inner
+#   define __vlc_object_create p_symbols->__vlc_object_create_inner
+#   define __vlc_object_destroy p_symbols->__vlc_object_destroy_inner
+#   define __vlc_object_detach p_symbols->__vlc_object_detach_inner
+#   define __vlc_object_detach_all p_symbols->__vlc_object_detach_all_inner
+#   define __vlc_object_find p_symbols->__vlc_object_find_inner
+#   define __vlc_object_release p_symbols->__vlc_object_release_inner
+#   define __vlc_object_yield p_symbols->__vlc_object_yield_inner
+#   define __vlc_thread_create p_symbols->__vlc_thread_create_inner
+#   define __vlc_thread_join p_symbols->__vlc_thread_join_inner
+#   define __vlc_thread_ready p_symbols->__vlc_thread_ready_inner
+#   define __vlc_threads_init p_symbols->__vlc_threads_init_inner
+#   define __vout_CreateThread p_symbols->__vout_CreateThread_inner
+#   define aout_DestroyFifo p_symbols->aout_DestroyFifo_inner
 #   define config_Duplicate p_symbols->config_Duplicate_inner
+#   define config_FindConfig p_symbols->config_FindConfig_inner
+#   define config_GetHomeDir p_symbols->config_GetHomeDir_inner
 #   define config_SetCallbacks p_symbols->config_SetCallbacks_inner
 #   define config_UnsetCallbacks p_symbols->config_UnsetCallbacks_inner
-#   define InitBitstream p_symbols->InitBitstream_inner
-#   define NextDataPacket p_symbols->NextDataPacket_inner
-#   define BitstreamNextDataPacket p_symbols->BitstreamNextDataPacket_inner
-#   define UnalignedShowBits p_symbols->UnalignedShowBits_inner
-#   define UnalignedRemoveBits p_symbols->UnalignedRemoveBits_inner
-#   define UnalignedGetBits p_symbols->UnalignedGetBits_inner
-#   define CurrentPTS p_symbols->CurrentPTS_inner
-#   define DecoderError p_symbols->DecoderError_inner
-#   define __input_SetStatus p_symbols->__input_SetStatus_inner
-#   define __input_Seek p_symbols->__input_Seek_inner
-#   define __input_Tell p_symbols->__input_Tell_inner
-#   define input_DumpStream p_symbols->input_DumpStream_inner
-#   define input_OffsetToTime p_symbols->input_OffsetToTime_inner
-#   define input_ChangeES p_symbols->input_ChangeES_inner
-#   define input_ToggleES p_symbols->input_ToggleES_inner
-#   define input_ChangeArea p_symbols->input_ChangeArea_inner
-#   define input_ChangeProgram p_symbols->input_ChangeProgram_inner
-#   define input_InitStream p_symbols->input_InitStream_inner
-#   define input_EndStream p_symbols->input_EndStream_inner
-#   define input_FindProgram p_symbols->input_FindProgram_inner
-#   define input_AddProgram p_symbols->input_AddProgram_inner
-#   define input_DelProgram p_symbols->input_DelProgram_inner
-#   define input_SetProgram p_symbols->input_SetProgram_inner
+#   define input_AccessEnd p_symbols->input_AccessEnd_inner
+#   define input_AccessInit p_symbols->input_AccessInit_inner
+#   define input_AccessReinit p_symbols->input_AccessReinit_inner
 #   define input_AddArea p_symbols->input_AddArea_inner
-#   define input_DelArea p_symbols->input_DelArea_inner
-#   define input_FindES p_symbols->input_FindES_inner
 #   define input_AddES p_symbols->input_AddES_inner
-#   define input_DelES p_symbols->input_DelES_inner
-#   define input_SelectES p_symbols->input_SelectES_inner
-#   define input_UnselectES p_symbols->input_UnselectES_inner
-#   define input_DecodePES p_symbols->input_DecodePES_inner
+#   define input_AddProgram p_symbols->input_AddProgram_inner
+#   define input_BuffersEnd p_symbols->input_BuffersEnd_inner
+#   define input_ChangeArea p_symbols->input_ChangeArea_inner
+#   define input_ChangeES p_symbols->input_ChangeES_inner
+#   define input_ChangeProgram p_symbols->input_ChangeProgram_inner
+#   define input_ClockGetTS p_symbols->input_ClockGetTS_inner
 #   define input_ClockManageControl p_symbols->input_ClockManageControl_inner
 #   define input_ClockManageRef p_symbols->input_ClockManageRef_inner
-#   define input_ClockGetTS p_symbols->input_ClockGetTS_inner
-#   define input_BuffersEnd p_symbols->input_BuffersEnd_inner
-#   define input_NewBuffer p_symbols->input_NewBuffer_inner
-#   define input_ReleaseBuffer p_symbols->input_ReleaseBuffer_inner
-#   define input_ShareBuffer p_symbols->input_ShareBuffer_inner
-#   define input_NewPacket p_symbols->input_NewPacket_inner
-#   define input_DeletePacket p_symbols->input_DeletePacket_inner
-#   define input_NewPES p_symbols->input_NewPES_inner
+#   define input_DecodePES p_symbols->input_DecodePES_inner
+#   define input_DelArea p_symbols->input_DelArea_inner
+#   define input_DelES p_symbols->input_DelES_inner
+#   define input_DelProgram p_symbols->input_DelProgram_inner
 #   define input_DeletePES p_symbols->input_DeletePES_inner
-#   define input_FillBuffer p_symbols->input_FillBuffer_inner
-#   define input_Peek p_symbols->input_Peek_inner
-#   define input_SplitBuffer p_symbols->input_SplitBuffer_inner
-#   define input_AccessInit p_symbols->input_AccessInit_inner
-#   define input_AccessReinit p_symbols->input_AccessReinit_inner
-#   define input_AccessEnd p_symbols->input_AccessEnd_inner
-#   define input_ParsePES p_symbols->input_ParsePES_inner
-#   define input_GatherPES p_symbols->input_GatherPES_inner
-#   define input_ReadPS p_symbols->input_ReadPS_inner
-#   define input_ParsePS p_symbols->input_ParsePS_inner
-#   define input_ReadTS p_symbols->input_ReadTS_inner
+#   define input_DeletePacket p_symbols->input_DeletePacket_inner
 #   define input_DemuxPS p_symbols->input_DemuxPS_inner
 #   define input_DemuxTS p_symbols->input_DemuxTS_inner
+#   define input_DumpStream p_symbols->input_DumpStream_inner
+#   define input_EndStream p_symbols->input_EndStream_inner
 #   define input_FDClose p_symbols->input_FDClose_inner
 #   define input_FDNetworkClose p_symbols->input_FDNetworkClose_inner
-#   define input_FDRead p_symbols->input_FDRead_inner
 #   define input_FDNetworkRead p_symbols->input_FDNetworkRead_inner
+#   define input_FDRead p_symbols->input_FDRead_inner
 #   define input_FDSeek p_symbols->input_FDSeek_inner
-#   define __intf_Eject p_symbols->__intf_Eject_inner
-#   define GetLang_1 p_symbols->GetLang_1_inner
-#   define GetLang_2T p_symbols->GetLang_2T_inner
-#   define GetLang_2B p_symbols->GetLang_2B_inner
-#   define DecodeLanguage p_symbols->DecodeLanguage_inner
-#   define __module_Need p_symbols->__module_Need_inner
+#   define input_FillBuffer p_symbols->input_FillBuffer_inner
+#   define input_FindES p_symbols->input_FindES_inner
+#   define input_FindProgram p_symbols->input_FindProgram_inner
+#   define input_GatherPES p_symbols->input_GatherPES_inner
+#   define input_InitStream p_symbols->input_InitStream_inner
+#   define input_NewBuffer p_symbols->input_NewBuffer_inner
+#   define input_NewPES p_symbols->input_NewPES_inner
+#   define input_NewPacket p_symbols->input_NewPacket_inner
+#   define input_OffsetToTime p_symbols->input_OffsetToTime_inner
+#   define input_ParsePES p_symbols->input_ParsePES_inner
+#   define input_ParsePS p_symbols->input_ParsePS_inner
+#   define input_Peek p_symbols->input_Peek_inner
+#   define input_ReadPS p_symbols->input_ReadPS_inner
+#   define input_ReadTS p_symbols->input_ReadTS_inner
+#   define input_ReleaseBuffer p_symbols->input_ReleaseBuffer_inner
+#   define input_SelectES p_symbols->input_SelectES_inner
+#   define input_SetProgram p_symbols->input_SetProgram_inner
+#   define input_ShareBuffer p_symbols->input_ShareBuffer_inner
+#   define input_SplitBuffer p_symbols->input_SplitBuffer_inner
+#   define input_ToggleES p_symbols->input_ToggleES_inner
+#   define input_UnselectES p_symbols->input_UnselectES_inner
+#   define mdate p_symbols->mdate_inner
 #   define module_Unneed p_symbols->module_Unneed_inner
+#   define msleep p_symbols->msleep_inner
 #   define mstrtime p_symbols->mstrtime_inner
-#   define mdate p_symbols->mdate_inner
 #   define mwait p_symbols->mwait_inner
-#   define msleep p_symbols->msleep_inner
-#   define __network_ChannelJoin p_symbols->__network_ChannelJoin_inner
-#   define __network_ChannelCreate p_symbols->__network_ChannelCreate_inner
-#   define playlist_Command p_symbols->playlist_Command_inner
 #   define playlist_Add p_symbols->playlist_Add_inner
+#   define playlist_Command p_symbols->playlist_Command_inner
 #   define playlist_Delete p_symbols->playlist_Delete_inner
-#   define __vout_CreateThread p_symbols->__vout_CreateThread_inner
-#   define vout_DestroyThread p_symbols->vout_DestroyThread_inner
+#   define vlc_threads_end p_symbols->vlc_threads_end_inner
+#   define vout_AllocatePicture p_symbols->vout_AllocatePicture_inner
 #   define vout_ChromaCmp p_symbols->vout_ChromaCmp_inner
 #   define vout_CreatePicture p_symbols->vout_CreatePicture_inner
-#   define vout_AllocatePicture p_symbols->vout_AllocatePicture_inner
+#   define vout_CreateSubPicture p_symbols->vout_CreateSubPicture_inner
+#   define vout_DatePicture p_symbols->vout_DatePicture_inner
 #   define vout_DestroyPicture p_symbols->vout_DestroyPicture_inner
+#   define vout_DestroySubPicture p_symbols->vout_DestroySubPicture_inner
+#   define vout_DestroyThread p_symbols->vout_DestroyThread_inner
 #   define vout_DisplayPicture p_symbols->vout_DisplayPicture_inner
-#   define vout_DatePicture p_symbols->vout_DatePicture_inner
+#   define vout_DisplaySubPicture p_symbols->vout_DisplaySubPicture_inner
 #   define vout_LinkPicture p_symbols->vout_LinkPicture_inner
-#   define vout_UnlinkPicture p_symbols->vout_UnlinkPicture_inner
 #   define vout_PlacePicture p_symbols->vout_PlacePicture_inner
-#   define vout_CreateSubPicture p_symbols->vout_CreateSubPicture_inner
-#   define vout_DestroySubPicture p_symbols->vout_DestroySubPicture_inner
-#   define vout_DisplaySubPicture p_symbols->vout_DisplaySubPicture_inner
-#   define __msg_Generic p_symbols->__msg_Generic_inner
-#   define __msg_Info p_symbols->__msg_Info_inner
-#   define __msg_Err p_symbols->__msg_Err_inner
-#   define __msg_Warn p_symbols->__msg_Warn_inner
-#   define __msg_Dbg p_symbols->__msg_Dbg_inner
-#   define __msg_Subscribe p_symbols->__msg_Subscribe_inner
-#   define __msg_Unsubscribe p_symbols->__msg_Unsubscribe_inner
-#   define __vlc_object_create p_symbols->__vlc_object_create_inner
-#   define __vlc_object_destroy p_symbols->__vlc_object_destroy_inner
-#   define __vlc_object_find p_symbols->__vlc_object_find_inner
-#   define __vlc_object_yield p_symbols->__vlc_object_yield_inner
-#   define __vlc_object_release p_symbols->__vlc_object_release_inner
-#   define __vlc_object_detach p_symbols->__vlc_object_detach_inner
-#   define __vlc_object_detach_all p_symbols->__vlc_object_detach_all_inner
-#   define __vlc_object_attach p_symbols->__vlc_object_attach_inner
-#   define __vlc_dumpstructure p_symbols->__vlc_dumpstructure_inner
-#   define __vlc_threads_init p_symbols->__vlc_threads_init_inner
-#   define vlc_threads_end p_symbols->vlc_threads_end_inner
-#   define __vlc_mutex_init p_symbols->__vlc_mutex_init_inner
-#   define __vlc_mutex_destroy p_symbols->__vlc_mutex_destroy_inner
-#   define vlc_cond_init p_symbols->vlc_cond_init_inner
-#   define __vlc_cond_destroy p_symbols->__vlc_cond_destroy_inner
-#   define __vlc_thread_create p_symbols->__vlc_thread_create_inner
-#   define __vlc_thread_ready p_symbols->__vlc_thread_ready_inner
-#   define __vlc_thread_join p_symbols->__vlc_thread_join_inner
+#   define vout_UnlinkPicture p_symbols->vout_UnlinkPicture_inner
 #endif /* __PLUGIN__ */
 
index 4fd8d7024a5cfdb0c6be1ee4e8947c71c3c950c1..90e18ea38c44e047fe0475a5a59e8242dd600e23 100644 (file)
@@ -3,7 +3,7 @@
  * This header provides a portable threads implementation.
  *****************************************************************************
  * Copyright (C) 1999, 2000 VideoLAN
- * $Id: vlc_threads.h,v 1.2 2002/06/02 13:38:03 gbazin Exp $
+ * $Id: vlc_threads.h,v 1.3 2002/06/08 14:08:46 sam Exp $
  *
  * Authors: Jean-Marc Dressler <polux@via.ecp.fr>
  *          Samuel Hocevar <sam@via.ecp.fr>
@@ -108,15 +108,23 @@ typedef unsigned (__stdcall *PTHREAD_START) (void *);
 
 typedef struct
 {
-    CRITICAL_SECTION    csection;
+    /* WinNT/2K/XP implementation */
     HANDLE              mutex;
-    SIGNALOBJECTANDWAIT SignalObjectAndWait;
+    /* Win95/98/ME implementation */
+    CRITICAL_SECTION    csection;
 } vlc_mutex_t;
 
 typedef struct
 {
-    int             i_waiting_threads;
-    HANDLE          signal;
+    int                 i_waiting_threads;
+    /* WinNT/2K/XP implementation */
+    HANDLE              semaphore;
+    HANDLE              signal;
+    vlc_bool_t          b_broadcast;
+    SIGNALOBJECTANDWAIT SignalObjectAndWait;
+    /* Win95/98/ME implementation */
+    enum                { SIGNAL = 0, BROADCAST = 1 };
+    HANDLE              p_events[2];
 } vlc_cond_t;
 
 #elif defined( PTHREAD_COND_T_IN_PTHREAD_H )
@@ -174,7 +182,7 @@ VLC_EXPORT( int,  __vlc_threads_init,  ( vlc_object_t * ) );
 VLC_EXPORT( int,    vlc_threads_end,   ( void ) );
 VLC_EXPORT( int,  __vlc_mutex_init,    ( vlc_object_t *, vlc_mutex_t * ) );
 VLC_EXPORT( int,  __vlc_mutex_destroy, ( char *, int, vlc_mutex_t * ) );
-VLC_EXPORT( int,    vlc_cond_init,     ( vlc_cond_t * ) );
+VLC_EXPORT( int,  __vlc_cond_init,     ( vlc_object_t *, vlc_cond_t * ) );
 VLC_EXPORT( int,  __vlc_cond_destroy,  ( char *, int, vlc_cond_t * ) );
 VLC_EXPORT( int,  __vlc_thread_create, ( vlc_object_t *, char *, int, char *, void * ( * ) ( void * ), vlc_bool_t ) );
 VLC_EXPORT( void, __vlc_thread_ready,  ( vlc_object_t * ) );
@@ -327,6 +335,12 @@ static inline int __vlc_mutex_unlock( char * psz_file, int i_line,
         __vlc_mutex_destroy( "(unknown)", 0, P_MUTEX )
 #endif
 
+/*****************************************************************************
+ * vlc_cond_init: initialize a condition
+ *****************************************************************************/
+#define vlc_cond_init( P_THIS, P_COND )                                   \
+    __vlc_cond_init( CAST_TO_VLC_OBJECT(P_THIS), P_COND )
+
 /*****************************************************************************
  * vlc_cond_signal: start a thread on condition completion
  *****************************************************************************/
@@ -342,7 +356,17 @@ static inline int vlc_cond_signal( vlc_cond_t *p_condvar )
     /* Release one waiting thread if one is available. */
     /* For this trick to work properly, the vlc_cond_signal must be surrounded
      * by a mutex. This will prevent another thread from stealing the signal */
-    PulseEvent( p_condvar->signal );
+    if( p_condvar->i_waiting_threads )
+    {
+        if( p_condvar->signal )
+        {
+            ReleaseSemaphore( p_condvar->semaphore, 1, 0 );
+        }
+        else
+        {
+            SetEvent( p_condvar->p_events[SIGNAL] );
+        }
+    }
     return 0;
 
 #elif defined( PTHREAD_COND_T_IN_PTHREAD_H )
@@ -413,10 +437,22 @@ static inline int vlc_cond_broadcast( vlc_cond_t *p_condvar )
 
 #elif defined( WIN32 )
     /* Release all waiting threads. */
-    while( p_condvar->i_waiting_threads )
+    if( p_condvar->i_waiting_threads )
     {
-        PulseEvent( p_condvar->signal );
-        Sleep( 1 ); /* deschedule the current thread */
+        if( p_condvar->signal )
+        {
+            p_condvar->b_broadcast = 1;
+            /* This call is atomic */
+            ReleaseSemaphore( p_condvar->semaphore,
+                              p_condvar->i_waiting_threads, 0 );
+            /* Wait for all threads to get the semaphore */
+            WaitForSingleObject( p_condvar->signal, INFINITE );
+            p_condvar->b_broadcast = 0;
+        }
+        else
+        {
+            SetEvent( p_condvar->p_events[BROADCAST] );
+        }
     }
     return 0;
 
@@ -497,30 +533,55 @@ static inline int __vlc_cond_wait( char * psz_file, int i_line,
     return i_ret;
 
 #elif defined( WIN32 )
-    /* It is only possible to atomically release the mutex and initiate the
-     * waiting on WinNT/2K/XP. Win9x doesn't have SignalObjectAndWait().
-     */
-    int i_result;
-
-    p_condvar->i_waiting_threads ++;
+    /* Increase our wait count */
+    p_condvar->i_waiting_threads++;
 
-    if( p_mutex->mutex )
+    if( p_condvar->signal )
     {
-        p_mutex->SignalObjectAndWait( p_mutex->mutex, p_condvar->signal,
-                                      INFINITE, FALSE );
+        /* It is only possible to atomically release the mutex and initiate the
+         * waiting on WinNT/2K/XP. Win9x doesn't have SignalObjectAndWait(). */
+        p_condvar->SignalObjectAndWait( p_mutex->mutex, p_condvar->semaphore,
+                                        INFINITE, FALSE );
+        /* XXX: we should protect i_waiting_threads with a mutex, but
+         * is it really worth it ? */
+        p_condvar->i_waiting_threads--;
+
+        if( p_condvar->b_broadcast
+             && p_condvar->i_waiting_threads == 0 )
+        {
+            p_condvar->SignalObjectAndWait( p_condvar->signal, p_mutex->mutex,
+                                            INFINITE, FALSE );
+        }
+        else
+        {
+            /* Just take back the lock */
+            WaitForSingleObject( p_mutex->mutex, INFINITE );
+        }
+        return 0;
     }
     else
     {
-        /* Release the mutex */
-        vlc_mutex_unlock( p_mutex );
-        i_result = WaitForSingleObject( p_condvar->signal, INFINITE); 
-        p_condvar->i_waiting_threads --;
-    }
+        int i_ret;
 
-    /* Reacquire the mutex before returning. */
-    vlc_mutex_lock( p_mutex );
+        /* Release the mutex, wait, and reacquire. */
+        LeaveCriticalSection( &p_mutex->csection );
+        i_ret = WaitForMultipleObjects( 2, p_condvar->p_events,
+                                        FALSE, INFINITE );
+        EnterCriticalSection( &p_mutex->csection );
+
+        /* Decrease our wait count */
+        p_condvar->i_waiting_threads--;
 
-    return( i_result == WAIT_FAILED );
+        /* If we are the last waiter and it was a broadcast signal, reset
+         * the broadcast event. */
+        if( i_ret == WAIT_OBJECT_0 + BROADCAST
+             && p_condvar->i_waiting_threads == 0 )
+        {
+            ResetEvent( p_condvar->p_events[BROADCAST] );
+        }
+
+        return( i_ret == WAIT_FAILED );
+    }
 
 #elif defined( PTHREAD_COND_T_IN_PTHREAD_H )
 
index a7b5b3c48cd6b3a286c69541eca57c033cca9d32..c9d80f48f42ddbdaf4dbee824b00668a821662b4 100644 (file)
@@ -2,7 +2,7 @@
  * aout_macosx.c : CoreAudio output plugin
  *****************************************************************************
  * Copyright (C) 2001 VideoLAN
- * $Id: aout_macosx.m,v 1.5 2002/06/01 12:32:00 sam Exp $
+ * $Id: aout_macosx.m,v 1.6 2002/06/08 14:08:46 sam Exp $
  *
  * Authors: Colin Delacroix <colin@zoy.org>
  *          Jon Lech Johansen <jon-vl@nanocrew.net>
@@ -157,7 +157,7 @@ static int aout_Open( aout_thread_t *p_aout )
 
     /* initialize mutex and cond */
     vlc_mutex_init( p_aout, &p_aout->p_sys->mutex_lock );
-    vlc_cond_init( &p_aout->p_sys->cond_sync );
+    vlc_cond_init( p_aout, &p_aout->p_sys->cond_sync );
 
     /* initialize source stream format */
     memcpy( &p_aout->p_sys->s_src_stream_format,
index f8bfe6d912eb85de3f49926ab472f45b4e94c797..7f73c22f70870cbdeba9cdbda1d5f06126324695 100644 (file)
@@ -2,7 +2,7 @@
  * vpar_pool.c : management of the pool of decoder threads
  *****************************************************************************
  * Copyright (C) 2001 VideoLAN
- * $Id: vpar_pool.c,v 1.11 2002/06/02 09:03:54 sam Exp $
+ * $Id: vpar_pool.c,v 1.12 2002/06/08 14:08:46 sam Exp $
  *
  * Authors: Christophe Massiot <massiot@via.ecp.fr>
  *
@@ -57,8 +57,8 @@ void vpar_InitPool( vpar_thread_t * p_vpar )
 
     /* Initialize mutex and cond. */
     vlc_mutex_init( p_vpar->p_fifo, &p_vpar->pool.lock );
-    vlc_cond_init( &p_vpar->pool.wait_empty );
-    vlc_cond_init( &p_vpar->pool.wait_undecoded );
+    vlc_cond_init( p_vpar->p_fifo, &p_vpar->pool.wait_empty );
+    vlc_cond_init( p_vpar->p_fifo, &p_vpar->pool.wait_undecoded );
 
     /* Spawn optional video decoder threads. */
     p_vpar->pool.i_smp = 0;
index 8caf9b8a529b657b82ac635489bd71de6d7a73b9..9da3637ccfaf0a0a839dead0ccb484f4d916f396 100644 (file)
@@ -2,7 +2,7 @@
  * audio_output.c : audio output thread
  *****************************************************************************
  * Copyright (C) 1999-2001 VideoLAN
- * $Id: audio_output.c,v 1.85 2002/06/01 12:32:01 sam Exp $
+ * $Id: audio_output.c,v 1.86 2002/06/08 14:08:46 sam Exp $
  *
  * Authors: Michel Kaempf <maxx@via.ecp.fr>
  *          Cyril Deguet <asmax@via.ecp.fr>
@@ -154,7 +154,7 @@ static int aout_SpawnThread( aout_thread_t * p_aout )
     {
         p_aout->fifo[i_index].i_format = AOUT_FIFO_NONE;
         vlc_mutex_init( p_aout, &p_aout->fifo[i_index].data_lock );
-        vlc_cond_init( &p_aout->fifo[i_index].data_wait );
+        vlc_cond_init( p_aout, &p_aout->fifo[i_index].data_wait );
     }
 
     /* Compute the size (in audio units) of the audio output buffer. Although
index a3669f60e8bd5cd4dd660781a4a71ae67970f7ef..bc6a7b3b781edd787e9b48b328a2aa8e6ac17a63 100644 (file)
@@ -4,7 +4,7 @@
  * decoders.
  *****************************************************************************
  * Copyright (C) 1998-2001 VideoLAN
- * $Id: input.c,v 1.203 2002/06/07 23:53:44 sam Exp $
+ * $Id: input.c,v 1.204 2002/06/08 14:08:46 sam Exp $
  *
  * Authors: Christophe Massiot <massiot@via.ecp.fr>
  *
@@ -112,7 +112,7 @@ input_thread_t *__input_CreateThread( vlc_object_t *p_parent,
 
     /* Set locks. */
     vlc_mutex_init( p_input, &p_input->stream.stream_lock );
-    vlc_cond_init( &p_input->stream.stream_wait );
+    vlc_cond_init( p_input, &p_input->stream.stream_wait );
     vlc_mutex_init( p_input, &p_input->stream.control.control_lock );
 
     /* Initialize stream description */
index 39f527419218e9df55af8ba71843ab53fb92f5a8..f9a37f9e653289dc7207355619c46cb36d19aae9 100644 (file)
@@ -2,7 +2,7 @@
  * input_dec.c: Functions for the management of decoders
  *****************************************************************************
  * Copyright (C) 1999-2001 VideoLAN
- * $Id: input_dec.c,v 1.38 2002/06/02 09:03:54 sam Exp $
+ * $Id: input_dec.c,v 1.39 2002/06/08 14:08:46 sam Exp $
  *
  * Authors: Christophe Massiot <massiot@via.ecp.fr>
  *
@@ -229,7 +229,7 @@ static decoder_fifo_t * CreateDecoderFifo( input_thread_t * p_input,
 
     /* Initialize the p_fifo structure */
     vlc_mutex_init( p_input, &p_fifo->data_lock );
-    vlc_cond_init( &p_fifo->data_wait );
+    vlc_cond_init( p_input, &p_fifo->data_wait );
     p_es->p_decoder_fifo = p_fifo;
 
     p_fifo->i_id = p_es->i_id;
index 6820e0608f02dfcbdb003aaaa5139a94472a134a..62528a31797f6d84a5bc9a7d6070c8a7a671299f 100644 (file)
@@ -268,9 +268,6 @@ static inline const char * module_error( char *psz_buffer )
     (p_symbols)->msleep_inner = msleep; \
     (p_symbols)->__network_ChannelJoin_inner = __network_ChannelJoin; \
     (p_symbols)->__network_ChannelCreate_inner = __network_ChannelCreate; \
-    (p_symbols)->playlist_Command_inner = playlist_Command; \
-    (p_symbols)->playlist_Add_inner = playlist_Add; \
-    (p_symbols)->playlist_Delete_inner = playlist_Delete; \
     (p_symbols)->__vout_CreateThread_inner = __vout_CreateThread; \
     (p_symbols)->vout_DestroyThread_inner = vout_DestroyThread; \
     (p_symbols)->vout_ChromaCmp_inner = vout_ChromaCmp; \
@@ -301,11 +298,14 @@ static inline const char * module_error( char *psz_buffer )
     (p_symbols)->__vlc_object_detach_all_inner = __vlc_object_detach_all; \
     (p_symbols)->__vlc_object_attach_inner = __vlc_object_attach; \
     (p_symbols)->__vlc_dumpstructure_inner = __vlc_dumpstructure; \
+    (p_symbols)->playlist_Command_inner = playlist_Command; \
+    (p_symbols)->playlist_Add_inner = playlist_Add; \
+    (p_symbols)->playlist_Delete_inner = playlist_Delete; \
     (p_symbols)->__vlc_threads_init_inner = __vlc_threads_init; \
     (p_symbols)->vlc_threads_end_inner = vlc_threads_end; \
     (p_symbols)->__vlc_mutex_init_inner = __vlc_mutex_init; \
     (p_symbols)->__vlc_mutex_destroy_inner = __vlc_mutex_destroy; \
-    (p_symbols)->vlc_cond_init_inner = vlc_cond_init; \
+    (p_symbols)->__vlc_cond_init_inner = __vlc_cond_init; \
     (p_symbols)->__vlc_cond_destroy_inner = __vlc_cond_destroy; \
     (p_symbols)->__vlc_thread_create_inner = __vlc_thread_create; \
     (p_symbols)->__vlc_thread_ready_inner = __vlc_thread_ready; \
index ad1a778421bc48be242244d24754a533e3a5fabb..6e8d689968d442d9156646d8427016456c3d635e 100644 (file)
@@ -2,7 +2,7 @@
  * objects.c: vlc_object_t handling
  *****************************************************************************
  * Copyright (C) 2002 VideoLAN
- * $Id: objects.c,v 1.10 2002/06/07 23:53:44 sam Exp $
+ * $Id: objects.c,v 1.11 2002/06/08 14:08:46 sam Exp $
  *
  * Authors: Samuel Hocevar <sam@zoy.org>
  *
@@ -147,7 +147,7 @@ void * __vlc_object_create( vlc_object_t *p_this, int i_type )
     p_new->i_children = 0;
 
     vlc_mutex_init( p_new, &p_new->object_lock );
-    vlc_cond_init( &p_new->object_wait );
+    vlc_cond_init( p_new, &p_new->object_wait );
 
     //msg_Dbg( p_new, "created object" );
 
index 890b9a7704e234eb9318d87521e464610942064d..5bacf2dbfc8db80c12b41031ffd3f3b9cda55e40 100644 (file)
@@ -2,7 +2,7 @@
  * threads.c : threads implementation for the VideoLAN client
  *****************************************************************************
  * Copyright (C) 1999, 2000, 2001, 2002 VideoLAN
- * $Id: threads.c,v 1.6 2002/06/04 00:11:12 sam Exp $
+ * $Id: threads.c,v 1.7 2002/06/08 14:08:46 sam Exp $
  *
  * Authors: Jean-Marc Dressler <polux@via.ecp.fr>
  *          Samuel Hocevar <sam@zoy.org>
@@ -176,13 +176,12 @@ int __vlc_mutex_init( vlc_object_t *p_this, vlc_mutex_t *p_mutex )
     {
         /* We are running on NT/2K/XP, we can use SignalObjectAndWait */
         p_mutex->mutex = CreateMutex( 0, FALSE, 0 );
-        p_mutex->SignalObjectAndWait = p_this->p_vlc->SignalObjectAndWait;
         return ( p_mutex->mutex ? 0 : 1 );
     }
     else
     {
-        InitializeCriticalSection( &p_mutex->csection );
         p_mutex->mutex = NULL;
+        InitializeCriticalSection( &p_mutex->csection );
         return 0;
     }
 
@@ -278,7 +277,7 @@ int __vlc_mutex_destroy( char * psz_file, int i_line, vlc_mutex_t *p_mutex )
 /*****************************************************************************
  * vlc_cond_init: initialize a condition
  *****************************************************************************/
-int vlc_cond_init( vlc_cond_t *p_condvar )
+int __vlc_cond_init( vlc_object_t *p_this, vlc_cond_t *p_condvar )
 {
 #if defined( PTH_INIT_IN_PTH_H )
     return pth_cond_init( p_condvar );
@@ -288,16 +287,32 @@ int vlc_cond_init( vlc_cond_t *p_condvar )
     return ( *p_condvar == NULL ) ? errno : 0;
 
 #elif defined( WIN32 )
-    /* initialise counter */
+    /* Initialize counter */
     p_condvar->i_waiting_threads = 0;
 
-    /* Create an auto-reset event. */
-    p_condvar->signal = CreateEvent( NULL, /* no security */
-                                     FALSE,  /* auto-reset event */
-                                     FALSE,  /* non-signaled initially */
-                                     NULL ); /* unnamed */
+    if( (GetVersion() < 0x80000000) && !p_this->p_vlc->b_fast_pthread )
+    {
+        /* Create an auto-reset event and a semaphore. */
+        p_condvar->signal = CreateEvent( NULL, FALSE, FALSE, NULL );
+        p_condvar->semaphore = CreateSemaphore( NULL, 0, 0x7fffffff, NULL );
+
+        p_condvar->b_broadcast = 0;
+
+        /* We are running on NT/2K/XP, we can use SignalObjectAndWait */
+        p_condvar->SignalObjectAndWait = p_this->p_vlc->SignalObjectAndWait;
+
+        return !p_condvar->signal || !p_condvar->semaphore;
+    }
+    else
+    {
+        p_condvar->signal = NULL;
 
-    return( !p_condvar->signal );
+        /* Create an auto-reset event and a manual-reset event. */
+        p_condvar->p_events[SIGNAL] = CreateEvent( NULL, FALSE, FALSE, NULL );
+        p_condvar->p_events[BROADCAST] = CreateEvent( NULL, TRUE, FALSE, NULL );
+
+        return !p_condvar->p_events[SIGNAL] || !p_condvar->p_events[BROADCAST];
+    }
 
 #elif defined( PTHREAD_COND_T_IN_PTHREAD_H )
     return pthread_cond_init( p_condvar, NULL );
@@ -341,7 +356,16 @@ int __vlc_cond_destroy( char * psz_file, int i_line, vlc_cond_t *p_condvar )
     return st_cond_destroy( *p_condvar );
 
 #elif defined( WIN32 )
-    return( !CloseHandle( p_condvar->signal ) );
+    if( p_condvar->signal )
+    {
+        return !CloseHandle( p_condvar->signal )
+                 || !CloseHandle( p_condvar->semaphore );
+    }
+    else
+    {
+        return !CloseHandle( p_condvar->p_events[SIGNAL] )
+                 || !CloseHandle( p_condvar->p_events[BROADCAST] );
+    }
 
 #elif defined( PTHREAD_COND_T_IN_PTHREAD_H )
     int i_result = pthread_cond_destroy( p_condvar );
@@ -381,7 +405,7 @@ int __vlc_thread_create( vlc_object_t *p_this, char * psz_file, int i_line,
     wrapper.p_data = (void *)p_this;
     getitimer( ITIMER_PROF, &wrapper.itimer );
     vlc_mutex_init( p_this, &wrapper.lock );
-    vlc_cond_init( &wrapper.wait );
+    vlc_cond_init( p_this, &wrapper.wait );
     vlc_mutex_lock( &wrapper.lock );
 
     /* Alter user-passed data so that we call the wrapper instead
@@ -438,17 +462,17 @@ int __vlc_thread_create( vlc_object_t *p_this, char * psz_file, int i_line,
 
     if( i_ret == 0 )
     {
-        msg_Dbg( p_this, "thread %d (%s) created (%s:%d)",
-                         p_this->thread_id, psz_name, psz_file, i_line );
-
-        p_this->b_thread = 1;
-
         if( b_wait )
         {
             msg_Dbg( p_this, "waiting for thread completion" );
             vlc_cond_wait( &p_this->object_wait, &p_this->object_lock );
         }
 
+        p_this->b_thread = 1;
+
+        msg_Dbg( p_this, "thread %d (%s) created (%s:%d)",
+                         p_this->thread_id, psz_name, psz_file, i_line );
+
         vlc_mutex_unlock( &p_this->object_lock );
     }
     else
index fe5c795d0ee2555421063f326ed80abc08f0fdb2..a1048f844266592f7f24ecddd3ef69f037d15a57 100644 (file)
@@ -2,7 +2,7 @@
  * win32_specific.c: Win32 specific features 
  *****************************************************************************
  * Copyright (C) 2001 VideoLAN
- * $Id: win32_specific.c,v 1.11 2002/06/02 14:26:16 gbazin Exp $
+ * $Id: win32_specific.c,v 1.12 2002/06/08 14:08:46 sam Exp $
  *
  * Authors: Samuel Hocevar <sam@zoy.org>
  *          Gildas Bazin <gbazin@netcourrier.com>
@@ -60,7 +60,7 @@ void system_Init( vlc_t *p_this, int *pi_argc, char *ppsz_argv[] )
  *****************************************************************************/
 void system_Configure( vlc_t *p_this )
 {
-    p_this->p_vlc->b_fast_pthread = config_GetInt( p_this, "fast_pthread" );
+    p_this->p_vlc->b_fast_pthread = config_GetInt( p_this, "fast-pthread" );
 }
 
 /*****************************************************************************