不同操作用同一个函数，但是不同的flag来控制行为，代码会比较晦涩。
应该拆成 Pending 和 Free 的两个函数