blob: 32a70986ff1e0ed5e42c31836d847ff0398241f5 [file] [log] [blame]
1.1/2.0
-------
alloc:
- malloc() returning NULL doesn't usually mean that we're temporarily out
of memory these days, but out of address space or some other fault;
looping on it is probably not the right thing to do.
- Maybe have some reserved sump pages that we use for temporary
allocations that must succeed, and have an nih_must_alloc() function
- Some are because we can't easily deal with failure, we should try
harder or free memory first
macros:
- audit uses of NIH_MUST and try and remove them where possible.
- NIH_ZERO is probably never right, syscalls need their errnos checked
and action taken on just about everything except EINTR and EAGAIN
- assert on conditions we don't know how to handle
misc:
- try and make sure each basic object type has an _init() function, this shall
take a const void *parent which it uses for any internal allocations.
The _new() function calls it with parent and the object set to the same
value.
- except when we need to separately manage the life cycle of the objects
(e.g. current main loop code)
- and except when references will be taken (since otherwise we'd have to
stash the parent somewhere)
- destructors should be mentioned in _init() documentation and chained
in _destroy() functions
- generally start moving to function pointers being Handlers rather than
clever names
error:
- final audit that we always push an error context before calling a
handler function
- use nih_error_steal() and nih_error_raise_error() to raise it in the
parent context
- final audit that raised error is included in a new context for error
handler functions and context popped afterwards without freeing the
error (we expect the function to do that to indicate it actually
handled it)
poll:
- new epoll/eventfd based loop that replaces the old main loop code
(there's copies of this floating around that I need to merge together)
event:
- uses new poll code to wrap an eventfd() for the simplest kind of event
handling
buffer:
- separate out buffer code into NihBuffer, it's probably useful for
other things too; I can think of a few places where we grow strings
and I could just use this
io:
- separate out the NihIoWatch code, this should largely go away with
the new poll code
- separate out the NihIoMessage code into NihMessage, it behaves
sufficiently differently that it should be separate
- the remaining code is pure buffered stream I/O
- there's a couple of tricky tests left to do:
- nih_io_message_recv() with socket types other than PF_UNIX
- nih_io_message_recv() when recv() fails
- nih_io_watcher() with write error and free called
timers:
- rewrite based on new poll code and timerfd()
- clock selection and sub-second resolution
- calendar scheduled timers
signal:
- rewrite based on new poll code and signalfd()
- the API will probably change massively since you'll just add a signal
watch, with one or more signals, rather than the set/add handler stuff
child:
- update to new signal API
- call wait() for each child signal
file:
- nih_dir_walk() is buggy and doesn't work in some situations (probably)
- should use openat() to save string copying
- avoid stat() where possible
- depth-first and depth-last modes
- parent directory fd
- add the allocating fgets() code that's floating around, rebased onto
NihBuffer
- probably a bug in nih_file_map/unmap
watch:
- nih_watch_new() is buggy when subdirs is FALSE
- should use openat() to save string copying
- inotify already has an IN_ISDIR flag to let us know that we got an event
for a directory, so we don't really need to stat() it or pass a statbuf
around; except maybe for compatibility with the walk code.
- handle IN_Q_OVERFLOW in some sane manner, at least log it.
- ideally we could rework this based off something like fanotify(), since
it's expensive to walk large files with this
- see the Upstart conf file for the fact that this API doesn't actually
work in practice for watching files - easier nih_watch_file() API?
dbus:
- property naming isn't consistent with D-Bus recommendations, which says
we should use TitleCase for them, see recent D-Bus thread
- need to ignore standard/built-in D-Bus interfaces such as Peer,
Properties and Introspectable when parsing introspection data
- ideally have pre-canned code that would work on any proxy, would
mean we need to generate code and link with it again
- allow structures to be named and re-used by multiple interface members
- structure name hints come from annotations on arguments and properties
- this means only marshal() and demarshal() need to the extra name list
argument
- (de)marshal_array() just passes it on
- (de)marshal_struct() uses the first item in the name list, then passes
on the next (need returnable pointer so we know where we got to)
- never destroy the original list or pointer, we probably use it
several times (each property function)
- use annotations on annotations for the member names:
com.netsplit.Nih.Struct foo
com.netsplit.Nih.StructMember jazz
com.netsplit.Nih.StructMember ratchett
- check whether the struct is already in the list, if not add it
using the member names here, if it use the names there and warn/error on
names here
- NihDBusProxy always tracks the remote name, which is expensive and
annoying since you need one for every object and have to recreate them
in every reply function and signal function
- passing NULL for the name to the _new() function and setting the name
by hand later is one solution
- allowing no tracking is another
- but required for signals, so maybe only activated if a lost handler
is created or a signal attached?
- create a proxy from another, could share the same name tracking code
(in which case make it an object)
- then find a way of getting those to reply and signal functions
- we're not using the no_reply annotation
- object implementation probably shouldn't - the client is free to ignore
the annotation so might be waiting for a reply, so we should send one
anyway
- proxy implementation is interesting, because we need to wait for a reply
to get an error return; we wouldn't want a sync function or even a notify
function or even a pending call :-/
- doc strings for methods, signals, arguments, etc.
- annotation would be used to set them
- auto-generate doc strings for output functions
- what if we want both proxy and object code in one source?
- right now, the method names would conflict
- arrays would need to be generated for both