/* Detect any final memory leak, which should never happen. */ void end_memory(void) { if (cur_blocks || cur_bytes) { put_to_error(); put("LEAK"); put(" ");put_ulong(cur_blocks); put(" ");put_ulong(cur_bytes); die(""); } }
void put_long(long l) { unsigned long ul; if (l < 0) { put("-"); ul = l * -1; } else { ul = l; } put_ulong(ul); }
long lib_ring_buffer_ioctl(struct file *filp, unsigned int cmd, unsigned long arg, struct lib_ring_buffer *buf) { struct channel *chan = buf->backend.chan; const struct lib_ring_buffer_config *config = &chan->backend.config; if (lib_ring_buffer_channel_is_disabled(chan)) return -EIO; switch (cmd) { case RING_BUFFER_SNAPSHOT: /* * First, ensure we perform a "final" flush onto the * stream. This will ensure we create a packet of * padding if we encounter an empty packet. This ensures * the time-stamps right before the snapshot is used as * end of packet timestamp. */ if (!buf->quiescent) lib_ring_buffer_switch_remote_empty(buf); return lib_ring_buffer_snapshot(buf, &buf->cons_snapshot, &buf->prod_snapshot); case RING_BUFFER_SNAPSHOT_GET_CONSUMED: return put_ulong(buf->cons_snapshot, arg); case RING_BUFFER_SNAPSHOT_GET_PRODUCED: return put_ulong(buf->prod_snapshot, arg); case RING_BUFFER_GET_SUBBUF: { unsigned long uconsume; long ret; ret = get_user(uconsume, (unsigned long __user *) arg); if (ret) return ret; /* will return -EFAULT */ ret = lib_ring_buffer_get_subbuf(buf, uconsume); if (!ret) { /* Set file position to zero at each successful "get" */ filp->f_pos = 0; } return ret; } case RING_BUFFER_PUT_SUBBUF: lib_ring_buffer_put_subbuf(buf); return 0; case RING_BUFFER_GET_NEXT_SUBBUF: { long ret; ret = lib_ring_buffer_get_next_subbuf(buf); if (!ret) { /* Set file position to zero at each successful "get" */ filp->f_pos = 0; } return ret; } case RING_BUFFER_PUT_NEXT_SUBBUF: lib_ring_buffer_put_next_subbuf(buf); return 0; case RING_BUFFER_GET_SUBBUF_SIZE: return put_ulong(lib_ring_buffer_get_read_data_size(config, buf), arg); case RING_BUFFER_GET_PADDED_SUBBUF_SIZE: { unsigned long size; size = lib_ring_buffer_get_read_data_size(config, buf); size = PAGE_ALIGN(size); return put_ulong(size, arg); } case RING_BUFFER_GET_MAX_SUBBUF_SIZE: return put_ulong(chan->backend.subbuf_size, arg); case RING_BUFFER_GET_MMAP_LEN: { unsigned long mmap_buf_len; if (config->output != RING_BUFFER_MMAP) return -EINVAL; mmap_buf_len = chan->backend.buf_size; if (chan->backend.extra_reader_sb) mmap_buf_len += chan->backend.subbuf_size; if (mmap_buf_len > INT_MAX) return -EFBIG; return put_ulong(mmap_buf_len, arg); } case RING_BUFFER_GET_MMAP_READ_OFFSET: { unsigned long sb_bindex; if (config->output != RING_BUFFER_MMAP) return -EINVAL; sb_bindex = subbuffer_id_get_index(config, buf->backend.buf_rsb.id); return put_ulong(buf->backend.array[sb_bindex]->mmap_offset, arg); } case RING_BUFFER_FLUSH: lib_ring_buffer_switch_remote(buf); return 0; default: return -ENOIOCTLCMD; } }
CORBA_boolean porbit_put_sv (GIOPSendBuffer *buf, CORBA_TypeCode tc, SV *sv) { switch (tc->kind) { case CORBA_tk_null: case CORBA_tk_void: return CORBA_TRUE; case CORBA_tk_short: return put_short (buf, sv); case CORBA_tk_long: return put_long (buf, sv); case CORBA_tk_ushort: return put_ushort (buf, sv); case CORBA_tk_ulong: return put_ulong (buf, sv); case CORBA_tk_float: return put_float (buf, sv); case CORBA_tk_double: return put_double (buf, sv); case CORBA_tk_char: return put_char (buf, sv); case CORBA_tk_boolean: return put_boolean (buf, sv); case CORBA_tk_octet: return put_octet (buf, sv); case CORBA_tk_enum: return put_enum (buf, tc, sv); case CORBA_tk_struct: return put_struct (buf, tc, sv); case CORBA_tk_sequence: return put_sequence (buf, tc, sv); case CORBA_tk_except: return put_except (buf, tc, sv); case CORBA_tk_objref: return put_objref (buf, tc, sv); case CORBA_tk_union: return put_union (buf, tc, sv); case CORBA_tk_alias: return put_alias (buf, tc, sv); case CORBA_tk_string: return put_string (buf, tc, sv); case CORBA_tk_array: return put_array (buf, tc, sv); case CORBA_tk_longlong: return put_longlong (buf, sv); case CORBA_tk_ulonglong: return put_ulonglong (buf, sv); case CORBA_tk_longdouble: return put_longdouble (buf, sv); case CORBA_tk_TypeCode: return put_typecode (buf, tc, sv); case CORBA_tk_any: return put_any (buf, tc, sv); case CORBA_tk_fixed: return put_fixed (buf, tc, sv); case CORBA_tk_wchar: case CORBA_tk_wstring: case CORBA_tk_Principal: default: warn ("Unsupported output typecode %d\n", tc->kind); return CORBA_FALSE; } }
long lib_ring_buffer_ioctl(struct file *filp, unsigned int cmd, unsigned long arg, struct lib_ring_buffer *buf) { struct channel *chan = buf->backend.chan; const struct lib_ring_buffer_config *config = &chan->backend.config; if (lib_ring_buffer_channel_is_disabled(chan)) return -EIO; switch (cmd) { case RING_BUFFER_SNAPSHOT: return lib_ring_buffer_snapshot(buf, &buf->cons_snapshot, &buf->prod_snapshot); case RING_BUFFER_SNAPSHOT_SAMPLE_POSITIONS: return lib_ring_buffer_snapshot_sample_positions(buf, &buf->cons_snapshot, &buf->prod_snapshot); case RING_BUFFER_SNAPSHOT_GET_CONSUMED: return put_ulong(buf->cons_snapshot, arg); case RING_BUFFER_SNAPSHOT_GET_PRODUCED: return put_ulong(buf->prod_snapshot, arg); case RING_BUFFER_GET_SUBBUF: { unsigned long uconsume; long ret; ret = get_user(uconsume, (unsigned long __user *) arg); if (ret) return ret; /* will return -EFAULT */ ret = lib_ring_buffer_get_subbuf(buf, uconsume); if (!ret) { /* Set file position to zero at each successful "get" */ filp->f_pos = 0; } return ret; } case RING_BUFFER_PUT_SUBBUF: lib_ring_buffer_put_subbuf(buf); return 0; case RING_BUFFER_GET_NEXT_SUBBUF: { long ret; ret = lib_ring_buffer_get_next_subbuf(buf); if (!ret) { /* Set file position to zero at each successful "get" */ filp->f_pos = 0; } return ret; } case RING_BUFFER_PUT_NEXT_SUBBUF: lib_ring_buffer_put_next_subbuf(buf); return 0; case RING_BUFFER_GET_SUBBUF_SIZE: return put_ulong(lib_ring_buffer_get_read_data_size(config, buf), arg); case RING_BUFFER_GET_PADDED_SUBBUF_SIZE: { unsigned long size; size = lib_ring_buffer_get_read_data_size(config, buf); size = PAGE_ALIGN(size); return put_ulong(size, arg); } case RING_BUFFER_GET_MAX_SUBBUF_SIZE: return put_ulong(chan->backend.subbuf_size, arg); case RING_BUFFER_GET_MMAP_LEN: { unsigned long mmap_buf_len; if (config->output != RING_BUFFER_MMAP) return -EINVAL; mmap_buf_len = chan->backend.buf_size; if (chan->backend.extra_reader_sb) mmap_buf_len += chan->backend.subbuf_size; if (mmap_buf_len > INT_MAX) return -EFBIG; return put_ulong(mmap_buf_len, arg); } case RING_BUFFER_GET_MMAP_READ_OFFSET: { unsigned long sb_bindex; if (config->output != RING_BUFFER_MMAP) return -EINVAL; sb_bindex = subbuffer_id_get_index(config, buf->backend.buf_rsb.id); return put_ulong(buf->backend.array[sb_bindex]->mmap_offset, arg); } case RING_BUFFER_FLUSH: lib_ring_buffer_switch_remote(buf); return 0; case RING_BUFFER_FLUSH_EMPTY: lib_ring_buffer_switch_remote_empty(buf); return 0; default: return -ENOIOCTLCMD; } }