// This function should match SharkStack::CreateStackOverflowCheck
inline void ZeroStack::overflow_check(int required_words, TRAPS) {
  // Check the Zero stack
  if (available_words() < required_words) {
    handle_overflow(THREAD);
    return;
  }

  // Check the ABI stack
  if (abi_stack_available(THREAD) < 0) {
    handle_overflow(THREAD);
    return;
  }
}
Пример #2
0
bool rs_add_elem_new( remset_t *rs, word w ) 
{
  word mask, *tbl, *b, *pooltop, *poollim, tblsize, h;
  bool overflowed = FALSE;
  remset_data_t *data = DATA(rs);

  assert2(! rs_isremembered( rs, w ));

  pooltop = data->curr_pool->top;
  poollim = data->curr_pool->lim;
  tbl = data->tbl_bot;
  tblsize = data->tbl_lim - tbl;
  mask = tblsize-1;

  h = hash_object( w, mask );

  if (pooltop == poollim) {
    handle_overflow( rs, 0, pooltop );
    pooltop = data->curr_pool->top;
    poollim = data->curr_pool->lim;
    overflowed = TRUE;
  }
  *pooltop = w;
  *(pooltop+1) = tbl[h];
  tbl[h] = (word)pooltop;
  pooltop += 2;
  data->curr_pool->top = pooltop;
  data->curr_pool->lim = poollim;
  data->stats.recorded += 1;
  rs->live += 1;

  return overflowed;
}
Пример #3
0
/* Adds w to remset rs.  Returns true if rs overflowed when inserting w. */
bool rs_add_elem( remset_t *rs, word w ) 
{
  word mask, *tbl, *b, *pooltop, *poollim, tblsize, h;
  bool overflowed = FALSE;
  remset_data_t *data = DATA(rs);
  pooltop = data->curr_pool->top;
  poollim = data->curr_pool->lim;
  tbl = data->tbl_bot;
  tblsize = data->tbl_lim - tbl;
  mask = tblsize-1;

  h = hash_object( w, mask );
  b = (word*)tbl[ h ];
  while (b != 0 && *b != w) 
    b = (word*)*(b+1);
  if (b == 0) {
    if (pooltop == poollim) {
      handle_overflow( rs, 0, pooltop );
      pooltop = data->curr_pool->top;
      poollim = data->curr_pool->lim;
      overflowed = TRUE;
    }
    *pooltop = w;
    *(pooltop+1) = tbl[h];
    tbl[h] = (word)pooltop;
    pooltop += 2;
    data->curr_pool->top = pooltop;
    data->curr_pool->lim = poollim;
    data->stats.recorded += 1;
    rs->live += 1;
  }

  return overflowed;
}
Пример #4
0
static void *thread_func(void* data) {
	(void) data;
	while(1) {
		mlock();
		if(playa.thread_music_status == TS_STOPPING) {
			playa.thread_music_status = TS_WAITING;
			munlock();
			msleep(1);
			continue;
		} else if(playa.thread_music_status == TS_DONE || playa.thread_music_status == TS_WAITING) {
			munlock();
			msleep(4);
			continue;
		}
		munlock();
		if(MUSIC_FINISHED()) {
			mlock();
			playa.thread_music_status = TS_DONE;
			munlock();
			continue;
		}
		GEN_MUSIC();
		if(MUSIC_AVAIL()) {
			//dprintf(2, "writing %zu bytes...\n", (size_t) playa.out_wave.pos);
			slock();
			if(playa.play_waveslot != -1) {
				struct ByteArray* mine = &playa.wave_streams[playa.play_waveslot];
				if(!mine->bytesAvailable(mine)) {
					playa.play_waveslot = -1;
					goto mixin_done;
				}
				struct ByteArray* out = &playa.out_wave;
				off_t savepos = out->pos;
				size_t avail = mine->bytesAvailable(mine);
				size_t upsample_factor = 44100 / playa.wavhdr.wave_hdr.samplerate;
				size_t processed_m = 0, processed_w = 0;
				size_t readbytes = playa.wavhdr.wave_hdr.bitwidth == 8 ? 1 : 2;
				int chan[2] = { 0, 0 };
				int next[2];
				ByteArray_set_position(out, 0);
				while(processed_m < (size_t)savepos && processed_w < avail) {
					size_t c, u;
					for(c = 0; c < 2; c++) {
						if(c < playa.wavhdr.wave_hdr.channels) {
							if(readbytes == 1) next[c] = ((uint8_t) ByteArray_readByte(mine) - 128) * 256;
							else next[c] = ByteArray_readShort(mine);
							handle_overflow(&next[c]);
						} else 
							next[c] = next[c - 1];
						processed_w += readbytes;
					}
					for(u = 0; u < upsample_factor; u++) {
						for(c = 0; c < 2; c++) {
							int interpolated = u == 0 ? chan[c] : 
								chan[c] + ((next[c]-chan[c]) * ((float)u/(float)upsample_factor));
							interpolated = (float) interpolated * 0.3; // decrease volume to avoid overflow
							int music = GET_MUSIC_WORD();
							int sample = music + interpolated;
							if(handle_overflow(&sample)) dprintf(2, "overflow\n");
							MUSIC_REWIND_WORD();
							ByteArray_writeShort(out, sample);
							processed_m += 2;
						}
					}
					for (c=0; c<2; c++) chan[c] = next[c];
				}
				ByteArray_set_position(out, savepos);
			}
			mixin_done:
			sunlock();
			BACKEND_WRITE(&playa.writer.ao, playa.wave_buffer, playa.out_wave.pos);
			//dprintf(2, "done\n");
			playa.out_wave.pos = 0;
		}
	}
	return 0;
}