//----------------------------------------------------------------------------- // name: UINT__ join() // desc: shred can call this to get an index into the vector of read pointers //----------------------------------------------------------------------------- UINT__ CBufferAdvance::join( Chuck_Event * event ) { // TODO: necessary? ACQUIRE_MUTEX // index of new pointer that will be pushed back UINT__ read_offset_index; // add new pointer pointing (as pointers do) to current write offset // (shreds don't get interrupted, so m_write_offset will always be correct, right?) // (uh, hope so...) if( !m_free.empty() ) { read_offset_index = m_free.front(); m_free.pop(); //assert( read_offset_index < m_read_offsets.size() ); m_read_offsets[read_offset_index] = ReadOffset( m_write_offset, event ); } else { read_offset_index = m_read_offsets.size(); m_read_offsets.push_back( ReadOffset( m_write_offset, event ) ); } // TODO: necessary? RELEASE_MUTEX // return index return read_offset_index; }
int File::ReadOffsetAlloc(FILE *file, u32 offset, u32 length, u8 **outbuf) { u8 *buffer = NULL; int ret; /* Allocate memory */ buffer = (u8*)Tools::AllocateMemory(length); if (!buffer) return -1; /* Read file */ ret = ReadOffset(file, offset, length, &buffer); if (ret < 0) { delete buffer; buffer = NULL; return ret; } DCFlushRange(buffer, length); /* Set pointer */ *outbuf = buffer; return 0; }