swoole_buffer提供的recycle操作用于回收缓冲中已经废弃的内存。
swoole_buffer->recycle();
此方法能够在不清空缓冲区和使用 swoole_buffer->clear() 的情况下,回收通过 swoole_buffer->substr() 移除但仍存在的部分内存空间。
下面我们看下其实现过程。
static PHP_METHOD(swoole_buffer, recycle)
{
swString *buffer = swoole_get_object(getThis());//获取swoole内部封装对象
swoole_buffer_recycle(buffer);//执行回收动作
zend_update_property_long(swoole_buffer_class_entry_ptr, getThis(), ZEND_STRL("length"), buffer->length TSRMLS_CC);//更新swoole_buffer对象的属性信息
}
static void swoole_buffer_recycle(swString *buffer)
{
if (buffer->offset == 0)//offset从0开始,不需要回收
{
return;
}
long length;
length = buffer->length - buffer->offset;//将length更新为从0开始记录时的长度信息
if (length > 0)//需要做回收
{
memmove(buffer->str, buffer->str + buffer->offset, length);//通过linux函数memmove执行内存拷贝
}
buffer->offset = 0;//更新offset属性为0,即从头开始记录
buffer->length = length;//更新length属性
}