void SinkBase::cb_data(mblk_t *m) { uint32_t st = mblk_get_timestamp_info(m); mblk_t *fm = dupmsg(m); mblk_meta_copy(m, fm); MSQueue *queue = post_handle(fm); // 此处 dupmsg(m) 将不会导致 m 被释放 bool first = true; unsigned char *obuf = 0; size_t olen = 0; int index = 0; size_t off = 0; bool key = false; while (mblk_t *om = ms_queue_get(queue)) { int dlen = size_for(index, om); obuf = (unsigned char*)realloc(obuf, off + dlen); save_for(index, om, obuf + off); if (index == 0) key = is_key(index, om); index++; off += dlen; // 处理时间戳回绕 if (first_frame_) { first_frame_ = false; } else { uint32_t delta = st - last_stamp_; // 检查,是否乱序,乱序包直接扔掉! if (delta > 0x80000000) { fprintf(stderr, "??? maybe timestamp confusioned!, curr=%u, last=%u\n", st, last_stamp_); return; } next_stamp_ += delta / payload_freq(); } last_stamp_ = st; freemsg(om); } if (cb_data_ && obuf) { cb_data_(opaque_, next_stamp_, obuf, off, key); } if (obuf) free(obuf); }
E* MmapArrayAllocator<E, F>::allocate(size_t length) { size_t size = size_for(length); int alignment = os::vm_allocation_granularity(); char* addr = os::reserve_memory(size, NULL, alignment, F); if (addr == NULL) { vm_exit_out_of_memory(size, OOM_MMAP_ERROR, "Allocator (reserve)"); } os::commit_memory_or_exit(addr, size, !ExecMem, "Allocator (commit)"); return (E*)addr; }
E* MmapArrayAllocator<E, F>::allocate_or_null(size_t length) { size_t size = size_for(length); int alignment = os::vm_allocation_granularity(); char* addr = os::reserve_memory(size, NULL, alignment, F); if (addr == NULL) { return NULL; } if (os::commit_memory(addr, size, !ExecMem, "Allocator (commit)")) { return (E*)addr; } else { os::release_memory(addr, size); return NULL; } }
E* MallocArrayAllocator<E, F>::allocate(size_t length) { return (E*)AllocateHeap(size_for(length), F); }
void MmapArrayAllocator<E, F>::free(E* addr, size_t length) { bool result = os::release_memory((char*)addr, size_for(length)); assert(result, "Failed to release memory"); }