VirtualBox

Changeset 86496 in vbox for trunk/src/VBox/Devices


Ignore:
Timestamp:
Oct 8, 2020 1:48:53 PM (4 years ago)
Author:
vboxsync
Message:

Devices/pulse_stubs.c: Use RTLdrLoadSystemEx w/ RTLDRLOAD_FLAGS_NO_UNLOAD so it doesn't get flagged as a leak. Cleaned up the code a little. bugref:9841

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/Audio/pulse_stubs.c

    r82968 r86496  
    1616 */
    1717
     18
     19/*********************************************************************************************************************************
     20*   Header Files                                                                                                                 *
     21*********************************************************************************************************************************/
    1822#define LOG_GROUP LOG_GROUP_DRV_HOST_AUDIO
    1923#include <iprt/assert.h>
    2024#include <iprt/ldr.h>
    2125#include <VBox/log.h>
    22 #include <iprt/errcore.h>
     26#include <iprt/err.h>
    2327
    2428#include <pulse/pulseaudio.h>
     
    2630#include "pulse_stubs.h"
    2731
     32
     33/*********************************************************************************************************************************
     34*   Defined Constants And Macros                                                                                                 *
     35*********************************************************************************************************************************/
    2836#define VBOX_PULSE_LIB "libpulse.so.0"
    2937
     
    234242                (t, spec))
    235243
    236 typedef struct
     244#define FUNC_ENTRY(function) { #function , (void (**)(void)) & g_pfn_ ## function }
     245static struct
    237246{
    238     const char *name;
    239     void (**fn)(void);
    240 } SHARED_FUNC;
    241 
    242 #define ELEMENT(function) { #function , (void (**)(void)) & g_pfn_ ## function }
    243 static SHARED_FUNC SharedFuncs[] =
     247    const char *pszName;
     248    void     (**pfn)(void);
     249} const g_aImportedFunctions[] =
    244250{
    245     ELEMENT(pa_bytes_per_second),
    246     ELEMENT(pa_bytes_to_usec),
    247     ELEMENT(pa_channel_map_init_auto),
    248 
    249     ELEMENT(pa_context_connect),
    250     ELEMENT(pa_context_disconnect),
    251     ELEMENT(pa_context_get_server_info),
    252     ELEMENT(pa_context_get_sink_info_by_name),
    253     ELEMENT(pa_context_get_source_info_by_name),
    254     ELEMENT(pa_context_get_state),
    255     ELEMENT(pa_context_unref),
    256     ELEMENT(pa_context_errno),
    257     ELEMENT(pa_context_new),
    258     ELEMENT(pa_context_set_state_callback),
    259 
    260     ELEMENT(pa_frame_size),
    261     ELEMENT(pa_get_library_version),
    262     ELEMENT(pa_operation_unref),
    263     ELEMENT(pa_operation_get_state),
    264     ELEMENT(pa_operation_cancel),
    265     ELEMENT(pa_rtclock_now),
    266     ELEMENT(pa_sample_format_to_string),
    267     ELEMENT(pa_sample_spec_valid),
    268     ELEMENT(pa_strerror),
    269 
    270     ELEMENT(pa_stream_connect_playback),
    271     ELEMENT(pa_stream_connect_record),
    272     ELEMENT(pa_stream_disconnect),
    273     ELEMENT(pa_stream_get_sample_spec),
    274     ELEMENT(pa_stream_set_latency_update_callback),
    275     ELEMENT(pa_stream_write),
    276     ELEMENT(pa_stream_unref),
    277     ELEMENT(pa_stream_get_state),
    278     ELEMENT(pa_stream_get_latency),
    279     ELEMENT(pa_stream_get_timing_info),
    280     ELEMENT(pa_stream_readable_size),
    281     ELEMENT(pa_stream_set_buffer_attr),
    282     ELEMENT(pa_stream_set_state_callback),
    283     ELEMENT(pa_stream_set_underflow_callback),
    284     ELEMENT(pa_stream_set_overflow_callback),
    285     ELEMENT(pa_stream_set_write_callback),
    286     ELEMENT(pa_stream_flush),
    287     ELEMENT(pa_stream_drain),
    288     ELEMENT(pa_stream_trigger),
    289     ELEMENT(pa_stream_new),
    290     ELEMENT(pa_stream_get_buffer_attr),
    291     ELEMENT(pa_stream_peek),
    292     ELEMENT(pa_stream_cork),
    293     ELEMENT(pa_stream_drop),
    294     ELEMENT(pa_stream_writable_size),
    295 
    296     ELEMENT(pa_threaded_mainloop_stop),
    297     ELEMENT(pa_threaded_mainloop_get_api),
    298     ELEMENT(pa_threaded_mainloop_free),
    299     ELEMENT(pa_threaded_mainloop_signal),
    300     ELEMENT(pa_threaded_mainloop_unlock),
    301     ELEMENT(pa_threaded_mainloop_new),
    302     ELEMENT(pa_threaded_mainloop_wait),
    303     ELEMENT(pa_threaded_mainloop_start),
    304     ELEMENT(pa_threaded_mainloop_lock),
    305 
    306     ELEMENT(pa_usec_to_bytes)
     251    FUNC_ENTRY(pa_bytes_per_second),
     252    FUNC_ENTRY(pa_bytes_to_usec),
     253    FUNC_ENTRY(pa_channel_map_init_auto),
     254
     255    FUNC_ENTRY(pa_context_connect),
     256    FUNC_ENTRY(pa_context_disconnect),
     257    FUNC_ENTRY(pa_context_get_server_info),
     258    FUNC_ENTRY(pa_context_get_sink_info_by_name),
     259    FUNC_ENTRY(pa_context_get_source_info_by_name),
     260    FUNC_ENTRY(pa_context_get_state),
     261    FUNC_ENTRY(pa_context_unref),
     262    FUNC_ENTRY(pa_context_errno),
     263    FUNC_ENTRY(pa_context_new),
     264    FUNC_ENTRY(pa_context_set_state_callback),
     265
     266    FUNC_ENTRY(pa_frame_size),
     267    FUNC_ENTRY(pa_get_library_version),
     268    FUNC_ENTRY(pa_operation_unref),
     269    FUNC_ENTRY(pa_operation_get_state),
     270    FUNC_ENTRY(pa_operation_cancel),
     271    FUNC_ENTRY(pa_rtclock_now),
     272    FUNC_ENTRY(pa_sample_format_to_string),
     273    FUNC_ENTRY(pa_sample_spec_valid),
     274    FUNC_ENTRY(pa_strerror),
     275
     276    FUNC_ENTRY(pa_stream_connect_playback),
     277    FUNC_ENTRY(pa_stream_connect_record),
     278    FUNC_ENTRY(pa_stream_disconnect),
     279    FUNC_ENTRY(pa_stream_get_sample_spec),
     280    FUNC_ENTRY(pa_stream_set_latency_update_callback),
     281    FUNC_ENTRY(pa_stream_write),
     282    FUNC_ENTRY(pa_stream_unref),
     283    FUNC_ENTRY(pa_stream_get_state),
     284    FUNC_ENTRY(pa_stream_get_latency),
     285    FUNC_ENTRY(pa_stream_get_timing_info),
     286    FUNC_ENTRY(pa_stream_readable_size),
     287    FUNC_ENTRY(pa_stream_set_buffer_attr),
     288    FUNC_ENTRY(pa_stream_set_state_callback),
     289    FUNC_ENTRY(pa_stream_set_underflow_callback),
     290    FUNC_ENTRY(pa_stream_set_overflow_callback),
     291    FUNC_ENTRY(pa_stream_set_write_callback),
     292    FUNC_ENTRY(pa_stream_flush),
     293    FUNC_ENTRY(pa_stream_drain),
     294    FUNC_ENTRY(pa_stream_trigger),
     295    FUNC_ENTRY(pa_stream_new),
     296    FUNC_ENTRY(pa_stream_get_buffer_attr),
     297    FUNC_ENTRY(pa_stream_peek),
     298    FUNC_ENTRY(pa_stream_cork),
     299    FUNC_ENTRY(pa_stream_drop),
     300    FUNC_ENTRY(pa_stream_writable_size),
     301
     302    FUNC_ENTRY(pa_threaded_mainloop_stop),
     303    FUNC_ENTRY(pa_threaded_mainloop_get_api),
     304    FUNC_ENTRY(pa_threaded_mainloop_free),
     305    FUNC_ENTRY(pa_threaded_mainloop_signal),
     306    FUNC_ENTRY(pa_threaded_mainloop_unlock),
     307    FUNC_ENTRY(pa_threaded_mainloop_new),
     308    FUNC_ENTRY(pa_threaded_mainloop_wait),
     309    FUNC_ENTRY(pa_threaded_mainloop_start),
     310    FUNC_ENTRY(pa_threaded_mainloop_lock),
     311
     312    FUNC_ENTRY(pa_usec_to_bytes)
    307313};
    308 #undef ELEMENT
     314#undef FUNC_ENTRY
    309315
    310316/**
     
    317323int audioLoadPulseLib(void)
    318324{
    319     int rc = VINF_SUCCESS;
    320     unsigned i;
    321     static enum { NO = 0, YES, FAIL } isLibLoaded = NO;
     325    static volatile int g_rc = VERR_IPE_UNINITIALIZED_STATUS;
    322326    RTLDRMOD hLib;
     327    int rc;
    323328
    324329    LogFlowFunc(("\n"));
    325     /* If this is not NO then the function has obviously been called twice,
    326        which is likely to be a bug. */
    327     if (NO != isLibLoaded)
     330
     331    /* If this is not VERR_IPE_UNINITIALIZED_STATUS then the function has
     332       obviously been called twice, which is likely to be a bug. */
     333    rc = g_rc;
     334    AssertMsgReturn(rc == VERR_IPE_UNINITIALIZED_STATUS, ("g_rc=%Rrc\n", rc), rc);
     335
     336    rc = RTLdrLoadSystemEx(VBOX_PULSE_LIB, RTLDRLOAD_FLAGS_NO_UNLOAD, &hLib);
     337    if (RT_SUCCESS(rc))
    328338    {
    329         AssertMsgFailed(("isLibLoaded == %s\n", YES == isLibLoaded ? "YES" : "NO"));
    330         return YES == isLibLoaded ? VINF_SUCCESS : VERR_NOT_SUPPORTED;
     339        unsigned i;
     340        for (i = 0; i < RT_ELEMENTS(g_aImportedFunctions); i++)
     341        {
     342            rc = RTLdrGetSymbol(hLib, g_aImportedFunctions[i].pszName, (void **)g_aImportedFunctions[i].pfn);
     343            if (RT_FAILURE(rc))
     344            {
     345                LogRelFunc(("Failed to resolve function #%u: '%s' (%Rrc)\n", i, g_aImportedFunctions[i].pszName, rc));
     346                break;
     347            }
     348        }
    331349    }
    332     isLibLoaded = FAIL;
    333     rc = RTLdrLoad(VBOX_PULSE_LIB, &hLib);
    334     if (RT_FAILURE(rc))
    335     {
    336         LogRelFunc(("Failed to load library %s\n", VBOX_PULSE_LIB));
    337         return rc;
    338     }
    339     for (i=0; i<RT_ELEMENTS(SharedFuncs); i++)
    340     {
    341         rc = RTLdrGetSymbol(hLib, SharedFuncs[i].name, (void**)SharedFuncs[i].fn);
    342         if (RT_FAILURE(rc))
    343             return rc;
    344     }
    345     isLibLoaded = YES;
     350    else
     351        LogRelFunc(("Failed to load library %s: %Rrc\n", VBOX_PULSE_LIB, rc));
     352    g_rc = rc;
    346353    return rc;
    347354}
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette