From 7fe60435bce6595a9c58a9bfd8244d74b5320e96 Mon Sep 17 00:00:00 2001 From: Benjamin Franzke Date: Tue, 15 Jan 2013 08:46:13 +0100 Subject: Import DirectFB141_2k11R3_beta5 --- Source/DirectFB/lib/voodoo/manager.h | 279 +++++++++++++++++++++++++++++++++++ 1 file changed, 279 insertions(+) create mode 100755 Source/DirectFB/lib/voodoo/manager.h (limited to 'Source/DirectFB/lib/voodoo/manager.h') diff --git a/Source/DirectFB/lib/voodoo/manager.h b/Source/DirectFB/lib/voodoo/manager.h new file mode 100755 index 0000000..ae3189b --- /dev/null +++ b/Source/DirectFB/lib/voodoo/manager.h @@ -0,0 +1,279 @@ +/* + (c) Copyright 2001-2011 The world wide DirectFB Open Source Community (directfb.org) + (c) Copyright 2000-2004 Convergence (integrated media) GmbH + + All rights reserved. + + Written by Denis Oliver Kropp , + Andreas Hundt , + Sven Neumann , + Ville Syrjälä and + Claudio Ciccani . + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the + Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. +*/ + +#ifndef __VOODOO__MANAGER_H__ +#define __VOODOO__MANAGER_H__ + +#include +#include + + +#ifdef __cplusplus +extern "C" { +#include +#include +} + +#include + +#include + + +typedef struct { + VoodooMessageBlockType type; + unsigned int len; + void *ptr; + u32 val; +} VoodooMessageBlock; + + +typedef std::map InstanceMap; + + +class VoodooDispatcher; + + +class VoodooContext { +public: + virtual DirectResult HandleSuper( VoodooManager *manager, + const char *name, + VoodooInstanceID *ret_instance ) = 0; +}; + + +class VoodooManager { +public: + int magic; + + bool is_quit; + +private: + friend class VoodooDispatcher; + + VoodooLink *link; + VoodooConnection *connection; + + VoodooContext *context; + + size_t msg_count; + VoodooMessageSerial msg_serial; + + struct { + DirectMutex lock; + InstanceMap local; + InstanceMap remote; + VoodooInstanceID last; + } instances; + + struct { + DirectMutex lock; + DirectWaitQueue wait_get; + DirectWaitQueue wait_put; + VoodooResponseMessage *current; + } response; + + + VoodooDispatcher *dispatcher; + + + +public: + VoodooManager( VoodooLink *link, + VoodooContext *context ); + ~VoodooManager(); + + + /** New API **/ + + void DispatchPacket ( VoodooPacket *packet ); + bool DispatchReady (); // FIXME: will be obsolete with GetPacket() method, called by connection code to read directly into packet + + + + /** Old API **/ + + void quit (); + + + void handle_disconnect (); + void handle_super ( VoodooSuperMessage *super ); + + void handle_request ( VoodooRequestMessage *request ); + void handle_response ( VoodooResponseMessage *response ); + + +private: + static void *dispatch_async_thread( DirectThread *thread, + void *arg ); + + + + +public: + DirectResult do_super ( const char *name, + VoodooInstanceID *ret_instance ); + + DirectResult do_request ( VoodooInstanceID instance, + VoodooMethodID method, + VoodooRequestFlags flags, + VoodooResponseMessage **ret_response, + VoodooMessageBlock *blocks = NULL, + size_t num_blocks = 0, + size_t data_size = 0 ); + + DirectResult next_response ( VoodooResponseMessage *response, + VoodooResponseMessage **ret_response ); + + DirectResult finish_request ( VoodooResponseMessage *response ); + + DirectResult do_respond ( bool flush, + VoodooMessageSerial request, + DirectResult result, + VoodooInstanceID instance = VOODOO_INSTANCE_NONE, + VoodooMessageBlock *blocks = NULL, + size_t num_blocks = 0, + size_t data_size = 0 ); + +private: + inline void write_blocks ( void *dst, + const VoodooMessageBlock *blocks, + size_t num_blocks ); + + DirectResult lock_response ( VoodooMessageSerial request, + VoodooResponseMessage **ret_response ); + + DirectResult unlock_response ( VoodooResponseMessage *response ); + + +public: + DirectResult register_local ( VoodooInstance *instance, + VoodooInstanceID *ret_instance ); + + DirectResult unregister_local ( VoodooInstanceID instance_id ); + + DirectResult lookup_local ( VoodooInstanceID instance_id, + VoodooInstance **ret_instance ); + + DirectResult register_remote ( VoodooInstance *instance, + VoodooInstanceID instance_id ); + + DirectResult unregister_remote ( VoodooInstanceID instance_id ); + + DirectResult lookup_remote ( VoodooInstanceID instance_id, + VoodooInstance **ret_instance ); +}; +#endif + + + +#ifdef __cplusplus +extern "C" { +#endif + +DirectResult VOODOO_API voodoo_manager_create ( VoodooLink *link, + VoodooClient *client, + VoodooServer *server, + VoodooManager **ret_manager ); + +DirectResult VOODOO_API voodoo_manager_quit ( VoodooManager *manager ); + +bool VOODOO_API voodoo_manager_is_closed ( const VoodooManager *manager ); + +DirectResult VOODOO_API voodoo_manager_destroy ( VoodooManager *manager ); + + +/* Super */ + +DirectResult VOODOO_API voodoo_manager_super ( VoodooManager *manager, + const char *name, + VoodooInstanceID *ret_instance ); + + +/* Request */ + +DirectResult VOODOO_API voodoo_manager_request ( VoodooManager *manager, + VoodooInstanceID instance, + VoodooMethodID method, + VoodooRequestFlags flags, + VoodooResponseMessage **ret_response, ... ); + +DirectResult VOODOO_API voodoo_manager_next_response ( VoodooManager *manager, + VoodooResponseMessage *response, + VoodooResponseMessage **ret_response ); + +DirectResult VOODOO_API voodoo_manager_finish_request ( VoodooManager *manager, + VoodooResponseMessage *response ); + + +/* Response */ + +DirectResult VOODOO_API voodoo_manager_respond ( VoodooManager *manager, + bool flush, + VoodooMessageSerial request, + DirectResult result, + VoodooInstanceID instance, ... ); + + +/* Instances */ + +DirectResult VOODOO_API voodoo_manager_register_local ( VoodooManager *manager, + VoodooInstanceID super, + void *dispatcher, + void *real, + VoodooDispatch dispatch, + VoodooInstanceID *ret_instance_id ); + +DirectResult VOODOO_API voodoo_manager_unregister_local( VoodooManager *manager, + VoodooInstanceID instance_id ); + +DirectResult VOODOO_API voodoo_manager_lookup_local ( VoodooManager *manager, + VoodooInstanceID instance, + void **ret_dispatcher, + void **ret_real ); + +DirectResult VOODOO_API voodoo_manager_register_remote( VoodooManager *manager, + bool super, + void *requestor, + VoodooInstanceID instance ); + +DirectResult VOODOO_API voodoo_manager_lookup_remote ( VoodooManager *manager, + VoodooInstanceID instance, + void **ret_requestor ); + + +/* Security */ + +DirectResult VOODOO_API voodoo_manager_check_allocation( VoodooManager *manager, + unsigned int amount ); + +#ifdef __cplusplus +} +#endif + + +#endif -- cgit