memblock使用了共享内存技术,pulseaudio使用memblock来传递大块数据,这种用在进程间数据传递的时候是非常高效率的。
内存分配与使用
PA启动后先分一大块共享内存(mempool),如果没有启动参数指定的话, 这个mempool的总大小为64KB * 1024,因为采用共享内存技术,所以实际在运行的时候用多少内存就实际分配这么多,不会一下子需要64MB。对于mempool,系统调用下面的API 分配释放。
pool = pa_mempool_new(TRUE, 0);
pa_mempool_free(pool);
对于64KB * 1024,64KB成为memblock,一共有1024个块。从pool申请block的API有多个,一般采用
block = pa_memblock_new (pool_a, sizeof(txt));
需要注意的是,一个内存块可以被共享,所以,他的释放函数有些非常规,从成对编程的原则考虑,你有一个new函数,必定有个对应的free(或者release,delete等)函数,确实这个函数
memblock_free(block);
但是你不应该直接调用这个free函数,你应该调用
pa_memblock_unref(block);
没有留意到这点,看代码的时候可能会觉得很奇怪。
现在有了block,但是还不能读写这个块中的内存,要想读写,如此这般
x = pa_memblock_acquire(block);
snprintf(x, pa_memblock_get_length(block), "%s", txt);
pa_memblock_release(block);
传递数据的API
另外,memblock的模块提供了API用于传递memblock,这些API可用于大数据的传输。
首先建立一个export和inport,他们分别用来送数据和收数据
export_a = pa_memexport_new(pool_a, revoke_cb, (void*) "A");
import_b = pa_memimport_new(pool_b, release_cb, (void*) "B");
然后用这个API可以将数据送出
r = pa_memexport_put(export_a, mb_a, &id, &shm_id, &offset, &size);
上述调用的后四个参数用于获取这个传递的memblock,这四个数据可以很快的传递到其他进程,然后此进程可以调用
mb_b = pa_memimport_get(import_b, id, shm_id, offset, size);
来获取memblock。
接口灵活,效率也高