Mercurial > hg > octave-nkf
view src/gripes.cc @ 13985:43cc49c7abd1
Use thread-safe atomic reference counting (GCC and MSVC).
* configure.ac: New --enable-atomic-refcount argument.
(octave_allocator): Fix USE_OCTAVE_ALLOCATOR variable assignment.
(OCTAVE_CONFIG_INCLUDED): New macro in config.h.
* oct-refcount.h (OCTREFCOUNT_ATOMIC_INCREMENT,
OCTREFCOUNT_ATOMIC_INCREMENT_POST, OCTREFCOUNT_ATOMIC_DECREMENT,
OCTREFCOUNT_ATOMIC_DECREMENT_POST): New macro, defined for MSVC and GCC
when USE_ATOMIC_REFCOUNT is defined.
(octave_refcount:operator++, octave_refcount::operator--): Use them.
(octave_refcount::operator count_type): Cast returned value to volatile.
(octave_refcount::direct): Remove unsafe member.
* Array.h (Array::make_unique): Delete rep if refcount reaches 0.
* Sparse.h (Sparse::make_unique): Delete rep if refcount reaches 0.
* Array.h (Array:~Array, Array::operator=): Delete rep only when refcount is
excatly 0.
* Array.cc (Array::clear): Likewise.
* Sparse.cc (Sparse::~Sparse, Sparse::operator=): Likewise.
* SparseCmplxQR.h (SparseCmplxQR::~SparseCmplxQR, SparseCmplxQR::operator=):
Likewise.
* SparseQR.h (SparseQR::~SparseQR, SparseQR::operator=): Likewise.
* sparse-base-chol.h (sparse_base_chol::~sparse_base_chol,
sparse_base_chol::operator): Likewise.
* dim-vector.h (oct-refcount.h): New included header.
(dim_vector::make_unique, dim_vector::resize): Use OCTREFCOUNT_ATOMIC_DECREMENT
macro and delete rep when refcount reaches 0.
(dim_vector::dim_vector): Use OCTREFCOUNT_ATOMIC_INCREMENT.
(dim_vector::operator=): Use OCTREFCOUNT_ATOMIC_INCREMENT and
OCTREFCOUNT_ATOMIC_DECREMENT.
(dim_vector::~dim_vector): Use OCTREFCOUNT_ATOMIC_DECREMENT.
* oct-mutex.h (oct-refcount.h): New included header.
(octave_base_mutex::count): Use octave_refcount class.
* gl-render.cc (oct-refcount.h): New included header.
* graphics.h.in (oct-refcount.h): Likewise.
(base_property::count, base_graphics_toolkit::count,
base_graphics_object::count, base_graphics_event::count): Use octave_refcount.
(property::~property, property::operator=): Delete rep only when refcountn is
excatly 0.
* oct-map.h (octave_fields::make_unique): Delete rep when refcount reaches 0.
* oct-stream.h (oct-refcount.h): New included header.
(octave_base_stream::count): Use octave_refcount class.
* ov.h (octave_value::make_unique): Delete rep when refcount reaches 0.
* symtab.h (oct-refcount.h): New included header.
(symbol_record_rep::count, fcn_info_rep::count): Use octave_refcount class.
* DLD-FUNCTIONS/urlwrite.cc (oct-refcount.h): New included header.
(curl_handle_rep::count): Use octave_refcount class.
author | Michael Goffioul <michael.goffioul@gmail.com> |
---|---|
date | Sat, 03 Dec 2011 15:19:42 +0000 |
parents | 4ced6b90fffb |
children | 72c96de7a403 |
line wrap: on
line source
/* Copyright (C) 1993-2011 John W. Eaton This file is part of Octave. Octave is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. Octave is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Octave; see the file COPYING. If not, see <http://www.gnu.org/licenses/>. */ #ifdef HAVE_CONFIG_H #include <config.h> #endif #include "defun.h" #include "error.h" #include "gripes.h" #include "oct-obj.h" #include "utils.h" void gripe_not_supported (const char *fcn) { error ("%s: not supported on this system", fcn); } void gripe_not_implemented (const char *fcn) { error ("%s: not implemented", fcn); } void gripe_string_invalid (void) { error ("std::string constant used in invalid context"); } void gripe_range_invalid (void) { error ("range constant used in invalid context"); } void gripe_nonconformant (void) { error ("nonconformant matrices"); } void gripe_nonconformant (octave_idx_type r1, octave_idx_type c1, octave_idx_type r2, octave_idx_type c2) { error ("nonconformant matrices (op1 is %dx%d, op2 is %dx%d)", r1, c1, r2, c2); } void gripe_empty_arg (const char *name, bool is_error) { if (is_error) error ("%s: empty matrix is invalid as an argument", name); else warning ("%s: argument is empty matrix", name); } void gripe_square_matrix_required (const char *name) { error ("%s: argument must be a square matrix", name); } void gripe_user_supplied_eval (const char *name) { error ("%s: evaluation of user-supplied function failed", name); } void gripe_user_returned_invalid (const char *name) { error ("%s: user-supplied function returned invalid value", name); } void gripe_invalid_conversion (const std::string& from, const std::string& to) { error ("invalid conversion from %s to %s", from.c_str (), to.c_str ()); } void gripe_invalid_value_specified (const char *name) { warning ("invalid value specified for `%s'", name); } void gripe_2_or_3_dim_plot (void) { error ("plot: can only plot in 2 or 3 dimensions"); } void gripe_unrecognized_float_fmt (void) { error ("unrecognized floating point format requested"); } void gripe_unrecognized_data_fmt (const char *warn_for) { error ("%s: unrecognized data format requested", warn_for); } void gripe_data_conversion (const char *from, const char *to) { error ("unable to convert from %s to %s format", from, to); } void gripe_wrong_type_arg (const char *name, const char *s, bool is_error) { if (is_error) error ("%s: wrong type argument `%s'", name, s); else warning ("%s: wrong type argument `%s'", name, s); } void gripe_wrong_type_arg (const char *name, const std::string& s, bool is_error) { gripe_wrong_type_arg (name, s.c_str (), is_error); } void gripe_wrong_type_arg (const char *name, const octave_value& tc, bool is_error) { std::string type = tc.type_name (); gripe_wrong_type_arg (name, type, is_error); } void gripe_wrong_type_arg (const std::string& name, const octave_value& tc, bool is_error) { gripe_wrong_type_arg (name.c_str (), tc, is_error); } void gripe_wrong_type_arg_for_unary_op (const octave_value& op) { std::string type = op.type_name (); error ("invalid operand `%s' for unary operator", type.c_str ()); } void gripe_wrong_type_arg_for_binary_op (const octave_value& op) { std::string type = op.type_name (); error ("invalid operand `%s' for binary operator", type.c_str ()); } void gripe_implicit_conversion (const char *id, const char *from, const char *to) { warning_with_id (id, "implicit conversion from %s to %s", from, to); } void gripe_implicit_conversion (const std::string& id, const std::string& from, const std::string& to) { warning_with_id (id.c_str (), "implicit conversion from %s to %s", from.c_str (), to.c_str ()); } void gripe_divide_by_zero (void) { warning_with_id ("Octave:divide-by-zero", "division by zero"); } void gripe_logical_conversion (void) { warning_with_id ("Octave:logical-conversion", "value not equal to 1 or 0 converted to logical 1"); } void gripe_library_execution_error (void) { octave_exception_state = octave_no_exception; if (! error_state) error ("caught execution error in library function"); } void gripe_invalid_inquiry_subscript (void) { error ("invalid dimension inquiry of a non-existent value"); } void gripe_indexed_cs_list (void) { error ("a cs-list cannot be further indexed"); } void gripe_nonbraced_cs_list_assignment (void) { error ("invalid assignment to cs-list outside multiple assignment"); } void gripe_warn_complex_cmp (void) { warning_with_id ("Octave:matlab-incompatible", "potential Matlab compatibility problem: comparing complex numbers"); }