package t_tsenum; use strict; use vars qw(@ISA); require t_template; require t_enum; @ISA=qw(t_template); my @parms = qw(NAME TYPE COMPARE COPY PRINT); my %defaults = ( "COPY", "0", "PRINT", "0" ); my @templatelines = ; sub new { # no args my $self = {}; bless $self; $self->init(\@parms, \%defaults, \@templatelines); return $self; } sub output { my ($self, $fh) = @_; my $a = new t_enum; $a->setparm("NAME", $self->{values}{"NAME"} . "__unsafe_enumerator"); $a->setparm("TYPE", $self->{values}{"TYPE"}); $a->setparm("COMPARE", $self->{values}{"COMPARE"}); $a->output($fh); $self->SUPER::output($fh); } 1; __DATA__ /* */ #include "k5-thread.h" struct __ts_enumerator { __unsafe_enumerator e; k5_mutex_t m; }; typedef struct __ts_enumerator ; static inline int _init( *en) { int err = k5_mutex_init(&en->m); if (err) return err; err = __unsafe_enumerator_init(&en->e); if (err) { k5_mutex_destroy(&en->m); return err; } return 0; } static inline int _size( *en, long *size) { int err = k5_mutex_lock(&en->m); if (err) { *size = -48; return err; } *size = __unsafe_enumerator_size(&en->e); k5_mutex_unlock(&en->m); return 0; } static inline int __do_copy ( *dest, src) { int (*copyfn)(*, ) = ; if (copyfn) return copyfn(dest, src); *dest = src; return 0; } static inline int _find_or_append( *en, value, long *idxp, int *added) { int err; long idx; err = k5_mutex_lock(&en->m); if (err) return err; idx = __unsafe_enumerator_find(&en->e, value); if (idx < 0) { newvalue; err = __do_copy(&newvalue, value); if (err == 0) idx = __unsafe_enumerator_append(&en->e, newvalue); k5_mutex_unlock(&en->m); if (err != 0) return err; if (idx < 0) return ENOMEM; *idxp = idx; *added = 1; return 0; } k5_mutex_unlock(&en->m); *idxp = idx; *added = 0; return 0; } static inline int _get( *en, size_t idx, *value) { int err; err = k5_mutex_lock(&en->m); if (err) return err; *value = __unsafe_enumerator_get(&en->e, idx); k5_mutex_unlock(&en->m); return 0; } static inline void _destroy( *en) { k5_mutex_destroy(&en->m); __unsafe_enumerator_destroy(&en->e); } static inline int _foreach( *en, int (*fn)(size_t i, t, void *p), void *p) { int err = k5_mutex_lock(&en->m); if (err) return err; __unsafe_enumerator_foreach(&en->e, fn, p); k5_mutex_unlock(&en->m); return 0; } static inline int __print_map_elt(size_t idx, val, void *p) { void (*printfn)(, FILE *) = ; FILE *f = (FILE *) p; if (printfn) { fprintf(f, " %lu=", (unsigned long) idx); printfn(val, f); } return 0; } static inline void _print( *en, FILE *f) { void (*printfn)(, FILE *) = ; if (printfn) { fprintf(f, "{"); _foreach (en, __print_map_elt, f); fprintf(f, " }"); } }