[vlc-devel] [vlc-commits] Remove libvlc_free
Steve Lhomme
robux4 at ycbcr.xyz
Fri May 24 10:51:39 CEST 2019
On 2019-05-24 10:35, Steve Lhomme wrote:
> On 2019-05-24 10:04, Rémi Denis-Courmont wrote:
>> If you don't have the right free inside the EXE, you cannot call LibVLC
>
> I said you do the free *inside the DLL* in order to make it work.
I attached the corresponding trivial example updated to free the memory
in the DLL instead of the EXE. And as expected it works just fine.
>> directly as already explained several times. So it's moot whether you
>> have libvlc_free() or not.
>>
>> Le 24 mai 2019 10:44:11 GMT+03:00, Steve Lhomme <robux4 at ycbcr.xyz> a
>> écrit :
>>
>> On 2019-05-24 9:36, Rémi Denis-Courmont wrote:
>>
>> I don't know what point you are trying to make here. Nobody
>> questioned
>> that mismatched heap allocators would crash. Of course they
>> would.
>>
>> The problem is that if you can't get the right free() function,
>> then you
>> can't call libvlc_free().
>>
>>
>> Yes, you can get the right free(), if the free() call is done
>> inside the
>> DLL and not the EXE. It was possible before you removed
>> libvlc_free().
>> It was even documented as such.
>>
>> Now this trivial use case is not even possible with current state of
>> libvlc. The host cannot reliably release the memory it is given.
>>
>> At that point, the code is probably already UB
>>
>> even before freeing the allocation either way.
>>
>> Le 24 mai 2019 09:37:20 GMT+03:00, Steve Lhomme
>> <robux4 at ycbcr.xyz> a écrit :
>>
>> On 2019-05-24 7:44, Steve Lhomme wrote:
>>
>> On 2019-05-24 7:25, Steve Lhomme wrote:
>>
>> On 2019-05-23 17:11, Rémi Denis-Courmont wrote:
>>
>> Le torstaina 23. toukokuuta 2019, 13.57.32 EEST Steve
>> Lhomme a écrit :
>>
>> Here's another one: we could decide to rewrite
>> libvlc in C++ and keep
>> the same ABI. Does that mean we would have to forced
>> libvlc hosts to
>> call "delete psz-str" because we don't feel like
>> keeping
>> libvlc_free() ?
>>
>>
>> You would have to keep using malloc() otherwise you
>> would break the
>> existing
>> ABI 3.0 or 4.0 anyway that says you can use free().
>>
>>
>> That's indeed a problem. I think the free() option should
>> not have
>> been there in the first place. I would rather vote to remove
>> this option.
>>
>> For example we could decide that for performance reasons we
>> allocate
>> using aligned_alloc(). On some system that requires an
>> aligned_free().
>> We cannot do that if we allow free() of a particular runtime.
>>
>>
>> Another use case: building libvlc/vlc with allocation tooling,
>> redirecting malloc/free to debug leaks. Calling free() outside
>> of libvlc
>> with memory allocated this will likely crash or report errors
>> when a
>> legitimate free() is done. We should not tie our hands by
>> allowing
>> free() at all.
>>
>>
>> Attached is a quick example of a library done incorrectly:
>>
>> The EXE links with the *debug* DLL C runtime, as most people
>> would use
>> while debugging their code.
>>
>> The DLL links with the *standard* DLL C runtime, as a
>> distributed DLL
>> would use.
>>
>> Calling free() on the memory returned by the DLL crashes with
>> a heap
>> allocation error. That doesn't happen is the free() is done in
>> the DLL.
>>
>>
>> -- Envoyé de mon appareil Android avec Courriel K-9
>> Mail. Veuillez
>> excuser
>> ma brièveté.
>>
>> ------------------------------------------------------------------------
>> vlc-devel mailing list
>> To unsubscribe or modify your subscription options:
>> https://mailman.videolan.org/listinfo/vlc-devel
>>
>>
>> ------------------------------------------------------------------------
>> vlc-devel mailing list
>> To unsubscribe or modify your subscription options:
>> https://mailman.videolan.org/listinfo/vlc-devel
>>
>>
>> --
>> Envoyé de mon appareil Android avec Courriel K-9 Mail. Veuillez
>> excuser ma brièveté.
>>
>> _______________________________________________
>> vlc-devel mailing list
>> To unsubscribe or modify your subscription options:
>> https://mailman.videolan.org/listinfo/vlc-devel
>>
> _______________________________________________
> vlc-devel mailing list
> To unsubscribe or modify your subscription options:
> https://mailman.videolan.org/listinfo/vlc-devel
-------------- next part --------------
#include <windows.h>
#include <stdio.h>
__declspec(dllexport) void * CallInDll(void)
{
printf("the DLL call\n");
return malloc(100);
}
__declspec(dllexport) void ReleaseMemory(void *my_memory)
{
free(my_memory);
}
-------------- next part --------------
#include <windows.h>
#include <stdio.h>
int main(void) {
printf("the EXE call\n");
HMODULE dll = LoadLibrary("dll_crt.dll");
if (dll == 0) {
printf("DLL not found\n");
return 1;
}
void* (*pfCallInDll)() = GetProcAddress(dll, "CallInDll");
void (*pfReleaseMemory)(void*) = GetProcAddress(dll, "ReleaseMemory");
if (pfCallInDll == NULL || pfReleaseMemory == NULL) {
printf("CallInDll not found\n");
FreeLibrary(dll);
return 1;
}
void *allocated = pfCallInDll();
printf("the DLL was called\n");
pfReleaseMemory(allocated);
printf("the memory was released\n");
FreeLibrary(dll);
return 0;
}
More information about the vlc-devel
mailing list