[jboss-cvs] JBoss Messaging SVN: r3710 - projects/jaio/trunk/jaio/native/src.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Tue Feb 12 16:15:01 EST 2008


Author: clebert.suconic at jboss.com
Date: 2008-02-12 16:15:01 -0500 (Tue, 12 Feb 2008)
New Revision: 3710

Added:
   projects/jaio/trunk/jaio/native/src/AIOException.h
Modified:
   projects/jaio/trunk/jaio/native/src/AIOController.cpp
   projects/jaio/trunk/jaio/native/src/AIOController.h
   projects/jaio/trunk/jaio/native/src/BufferAdapter.h
   projects/jaio/trunk/jaio/native/src/FileOutput.cpp
   projects/jaio/trunk/jaio/native/src/FileOutput.h
   projects/jaio/trunk/jaio/native/src/JNIBufferAdapter.cpp
   projects/jaio/trunk/jaio/native/src/LibAIOController.cpp
   projects/jaio/trunk/jaio/native/src/PageManager.cpp
   projects/jaio/trunk/jaio/native/src/org_jboss_jaio_libaioimpl_LibAIOController.h
Log:
Implementing better paging and exceptions

Modified: projects/jaio/trunk/jaio/native/src/AIOController.cpp
===================================================================
--- projects/jaio/trunk/jaio/native/src/AIOController.cpp	2008-02-12 15:17:13 UTC (rev 3709)
+++ projects/jaio/trunk/jaio/native/src/AIOController.cpp	2008-02-12 21:15:01 UTC (rev 3710)
@@ -1,13 +1,14 @@
+#include <string>
 #include "AIOController.h"
 #include "PageManager.h"
 
-AIOController::AIOController(int fileHandle) : fileOutput(fileHandle)
+AIOController::AIOController(std::string fileName) : fileOutput(fileName)
 {
 	manager = (DataManager *)&fileOutput;
 	usingPaging = false;
 }
 
-AIOController::AIOController(int fileHandle, int pageSize) : fileOutput(fileHandle)
+AIOController::AIOController(std::string fileName, int pageSize) : fileOutput(fileName)
 {
 	manager = new PageManager(pageSize, &fileOutput);
 	usingPaging = true;

Modified: projects/jaio/trunk/jaio/native/src/AIOController.h
===================================================================
--- projects/jaio/trunk/jaio/native/src/AIOController.h	2008-02-12 15:17:13 UTC (rev 3709)
+++ projects/jaio/trunk/jaio/native/src/AIOController.h	2008-02-12 21:15:01 UTC (rev 3710)
@@ -2,6 +2,7 @@
 #define AIOCONTROLLER_H_
 #include <jni.h>
 
+#include <string>
 #include "FileOutput.h"
 #include "DataManager.h"
 
@@ -22,8 +23,8 @@
 	
 	bool usingPaging;
 	
-	AIOController(int fileHandle, int pageSize);
-	AIOController(int fileHandle);
+	AIOController(std::string fileName, int pageSize);
+	AIOController(std::string fileName);
 	virtual ~AIOController();
 };
 #endif /*AIOCONTROLLER_H_*/

Added: projects/jaio/trunk/jaio/native/src/AIOException.h
===================================================================
--- projects/jaio/trunk/jaio/native/src/AIOException.h	                        (rev 0)
+++ projects/jaio/trunk/jaio/native/src/AIOException.h	2008-02-12 21:15:01 UTC (rev 3710)
@@ -0,0 +1,42 @@
+#ifndef AIOEXCEPTION_H_
+#define AIOEXCEPTION_H_
+
+#include <exception>
+#include <string>
+
+class AIOException : public std::exception
+{
+private:
+	int errorCode;
+	std::string message;
+public:
+	AIOException(int _errorCode, std::string & _message) throw() : errorCode(_errorCode), message(_message)
+	{
+		errorCode = _errorCode;
+		message = _message;
+	}
+	
+	AIOException(int _errorCode, const char * _message) throw ()
+	{
+		message = std::string(_message);
+		errorCode = _errorCode;
+	}
+	
+	virtual ~AIOException() throw()
+	{
+		
+	}
+	
+	int inline getErrorCode()
+	{
+		return errorCode;
+	}
+	
+    const char* what() const throw()
+    {
+    	return message.data();
+    }
+	
+};
+
+#endif /*AIOEXCEPTION_H_*/

Modified: projects/jaio/trunk/jaio/native/src/BufferAdapter.h
===================================================================
--- projects/jaio/trunk/jaio/native/src/BufferAdapter.h	2008-02-12 15:17:13 UTC (rev 3709)
+++ projects/jaio/trunk/jaio/native/src/BufferAdapter.h	2008-02-12 21:15:01 UTC (rev 3710)
@@ -4,8 +4,11 @@
 #include <iostream>
 class BufferAdapter
 {
+private:
+    // The number of pages that are expected to be used by this Buffer
+    int blocks;
 public:
-	BufferAdapter()
+	BufferAdapter() : blocks(1)
 	{
 		
 	}
@@ -14,6 +17,27 @@
 		
 	}
 	
+	void setBlocks(int _blocks)
+	{
+		blocks = _blocks;
+		std::cout << "blocks = " << blocks << "\n";
+	}
+	
+	void addBlock()
+	{
+		// TODO: Do I need to mutex here?
+		blocks++;
+	}
+	
+	void completeBlock()
+	{
+		// TODO: Do I need to mutex here?
+		if (--blocks <= 0)
+		{
+			done();
+		}
+	}
+	
 	virtual void addref() = 0;
 	virtual void deleteRef() = 0;
 	virtual void encode(const int& size, void *) = 0;

Modified: projects/jaio/trunk/jaio/native/src/FileOutput.cpp
===================================================================
--- projects/jaio/trunk/jaio/native/src/FileOutput.cpp	2008-02-12 15:17:13 UTC (rev 3709)
+++ projects/jaio/trunk/jaio/native/src/FileOutput.cpp	2008-02-12 21:15:01 UTC (rev 3710)
@@ -1,16 +1,28 @@
-#include "FileOutput.h"
 #include <list>
 #include <iostream>
 #include <memory.h>
 #include <fcntl.h>
+#include "FileOutput.h"
+#include "AIOException.h"
 
-FileOutput::FileOutput(int _fileHandle)
+FileOutput::FileOutput(std::string & _fileName)
 {
-	fileHandle = _fileHandle;
+	fileName = _fileName;
+	
+	fileHandle = open(fileName.data(),  O_WRONLY | O_CREAT, 0666);
+	if (fileHandle < 0)
+	{
+		throw AIOException(1, "Can't open file"); 
+	}
+
 }
 
 FileOutput::~FileOutput()
 {
+	if (close(fileHandle))
+	{
+		throw AIOException(2,"Can't close file");
+	}
 }
 
 void FileOutput::completePage(long size, void * page, std::list<BufferAdapter *> * adapters)
@@ -18,8 +30,7 @@
 	::write(fileHandle, page, size);
 	for (std::list<BufferAdapter *>::iterator iter = adapters->begin(); iter != adapters->end(); iter++)
 	{
-		std::cout << "Element read\n\n";
-		(*iter)->done();
+		(*iter)->completeBlock();
 		(*iter)->deleteRef();
 	}
 	
@@ -33,9 +44,9 @@
 {
 	int size = adapter->blockSize();
 	void * buffer = malloc(size);
+	adapter->encode(size, buffer);
 	::write(fileHandle, buffer, size);
-	adapter->encode(size, buffer);
-	adapter->done();
+	adapter->completeBlock();
 	adapter->deleteRef();
 	free(buffer);
 }

Modified: projects/jaio/trunk/jaio/native/src/FileOutput.h
===================================================================
--- projects/jaio/trunk/jaio/native/src/FileOutput.h	2008-02-12 15:17:13 UTC (rev 3709)
+++ projects/jaio/trunk/jaio/native/src/FileOutput.h	2008-02-12 21:15:01 UTC (rev 3710)
@@ -3,17 +3,24 @@
 
 #include "PageObserver.h"
 #include "DataManager.h"
+#include <string>
 
 class FileOutput : public PageObserver, DataManager
 {
 private:
 	int fileHandle;
+	std::string fileName;
 public:
-	FileOutput(int fileHandle);
+	FileOutput(std::string & _fileName);
 	virtual ~FileOutput();
 	void completePage(long size, void *, std::list<BufferAdapter *> *);
 	void addData(BufferAdapter * adapter);
 	
+	int getHandle()
+	{
+		return fileHandle;
+	}
+	
 	// Nothing to be done on FileOutput 
 	void flushMemory()
 	{

Modified: projects/jaio/trunk/jaio/native/src/JNIBufferAdapter.cpp
===================================================================
--- projects/jaio/trunk/jaio/native/src/JNIBufferAdapter.cpp	2008-02-12 15:17:13 UTC (rev 3709)
+++ projects/jaio/trunk/jaio/native/src/JNIBufferAdapter.cpp	2008-02-12 21:15:01 UTC (rev 3710)
@@ -21,7 +21,6 @@
 }
 void JNIBufferAdapter::done()
 {
-	std::cout << "Calling done " << controller->done << "\n";
 	controller->env->CallVoidMethod(obj,controller->done); 
 	return;
 }

Modified: projects/jaio/trunk/jaio/native/src/LibAIOController.cpp
===================================================================
--- projects/jaio/trunk/jaio/native/src/LibAIOController.cpp	2008-02-12 15:17:13 UTC (rev 3709)
+++ projects/jaio/trunk/jaio/native/src/LibAIOController.cpp	2008-02-12 21:15:01 UTC (rev 3710)
@@ -12,6 +12,7 @@
 #include "JavaUtilities.h"
 #include "AIOController.h"
 #include "JNIBufferAdapter.h"
+#include "AIOException.h"
 
 //using namespace jbm;
 
@@ -23,35 +24,32 @@
 JNIEXPORT jlong JNICALL Java_org_jboss_jaio_libaioimpl_LibAIOController_init__Ljava_lang_String_2Ljava_lang_Class_2
   (JNIEnv * env, jclass, jstring jstrFileName, jclass clazz)
 {
-	std::string fileName = convertJavaString(env, jstrFileName);
-	
-
-	int handle = open(fileName.data(),  O_WRONLY | O_CREAT, 0666);
-	if (handle < 0)
+	try
 	{
-		throwException(env, "java/lang/RuntimeException", "Can't open file");
+		std::string fileName = convertJavaString(env, jstrFileName);
+		
+		AIOController * controller = new AIOController(fileName);
+		controller->done = env->GetMethodID(clazz,"done","()V");
+		if (!controller->done) return 0;
+		
+		controller->encode = env->GetMethodID(clazz,"encode","(Ljava/nio/ByteBuffer;)V");
+		if (!controller->done) return 0;
+		
+		controller->decode = env->GetMethodID(clazz,"decode","(ILjava/nio/ByteBuffer;)V");
+		if (!controller->done) return 0;
+		
+		controller->encodeSize = env->GetMethodID(clazz,"encodeSize","()I");
+		if (!controller->done) return 0;
+		
+		
+	    controller->env = env;	
+		
+	    return (jlong)controller;
+	}
+	catch (AIOException& e){
+		throwException(env, "java/lang/RuntimeException", e.what());
 		return 0;
 	}
-	
-	AIOController * controller = new AIOController(handle);
-	controller->done = env->GetMethodID(clazz,"done","()V");
-	if (!controller->done) return 0;
-	
-	controller->encode = env->GetMethodID(clazz,"encode","(Ljava/nio/ByteBuffer;)V");
-	if (!controller->done) return 0;
-	
-	controller->decode = env->GetMethodID(clazz,"decode","(ILjava/nio/ByteBuffer;)V");
-	if (!controller->done) return 0;
-	
-	controller->encodeSize = env->GetMethodID(clazz,"encodeSize","()I");
-	if (!controller->done) return 0;
-	
-	
-	controller->fileHandle = handle;
-	
-    controller->env = env;	
-	
-    return (jlong)controller;
 }
 
 /*
@@ -62,49 +60,77 @@
 JNIEXPORT jlong JNICALL Java_org_jboss_jaio_libaioimpl_LibAIOController_init__Ljava_lang_String_2ILjava_lang_Class_2
   (JNIEnv * env, jclass, jstring jstrFileName, jint pageSize, jclass clazz)
 {
-	std::string fileName = convertJavaString(env, jstrFileName);
-	
-	int handle = open(fileName.data(),  O_WRONLY | O_CREAT, 0666);
-	if (handle < 0)
+	try
 	{
-		throwException(env, "java/lang/RuntimeException", "Can't open file");
+		std::string fileName = convertJavaString(env, jstrFileName);
+		
+		AIOController * controller = new AIOController(fileName, pageSize);
+		controller->done = env->GetMethodID(clazz,"done","()V");
+		if (!controller->done) return 0;
+		
+		controller->encode = env->GetMethodID(clazz,"encode","(Ljava/nio/ByteBuffer;)V");
+		if (!controller->done) return 0;
+		
+		controller->decode = env->GetMethodID(clazz,"decode","(ILjava/nio/ByteBuffer;)V");
+		if (!controller->done) return 0;
+		
+		controller->encodeSize = env->GetMethodID(clazz,"encodeSize","()I");
+		if (!controller->done) return 0;
+		
+		
+	    controller->env = env;	
+		
+	    return (jlong)controller;
+	}
+	catch (AIOException& e){
+		throwException(env, "java/lang/RuntimeException", e.what());
 		return 0;
 	}
 	
-	AIOController * controller = new AIOController(handle, pageSize);
-	controller->done = env->GetMethodID(clazz,"done","()V");
-	if (!controller->done) return 0;
-	
-	controller->encode = env->GetMethodID(clazz,"encode","(Ljava/nio/ByteBuffer;)V");
-	if (!controller->done) return 0;
-	
-	controller->decode = env->GetMethodID(clazz,"decode","(ILjava/nio/ByteBuffer;)V");
-	if (!controller->done) return 0;
-	
-	controller->encodeSize = env->GetMethodID(clazz,"encodeSize","()I");
-	if (!controller->done) return 0;
-	
-	
-	controller->fileHandle = handle;
-	
-    controller->env = env;	
-	
-    return (jlong)controller;
 }
 
 
 JNIEXPORT void JNICALL Java_org_jboss_jaio_libaioimpl_LibAIOController_append
-  (JNIEnv *, jclass, jlong controllerAddress, jobject obj)
+  (JNIEnv *env, jclass, jlong controllerAddress, jobject obj)
 {
-	AIOController * controller = (AIOController *) controllerAddress;
-	JNIBufferAdapter * adapter = new JNIBufferAdapter(controller, obj);
-	controller->manager->addData(adapter);
+	try
+	{
+		AIOController * controller = (AIOController *) controllerAddress;
+		JNIBufferAdapter * adapter = new JNIBufferAdapter(controller, obj);
+		controller->manager->addData(adapter);
+	}
+	catch (AIOException& e)
+	{
+		throwException(env, "java/lang/RuntimeException", e.what());
+	}
 }
 
 JNIEXPORT void JNICALL Java_org_jboss_jaio_libaioimpl_LibAIOController_flushMemory
-  (JNIEnv *, jclass, jlong controllerAddress)
+  (JNIEnv *env, jclass, jlong controllerAddress)
 {
-	AIOController * controller = (AIOController *) controllerAddress;
-	controller->manager->flushMemory();
+	try
+	{
+		AIOController * controller = (AIOController *) controllerAddress;
+		controller->manager->flushMemory();
 	
+	}
+	catch (AIOException& e)
+	{
+		throwException(env, "java/lang/RuntimeException", e.what());
+	}
 }
+
+
+JNIEXPORT void JNICALL Java_org_jboss_jaio_libaioimpl_LibAIOController_closeInternal
+  (JNIEnv *env, jclass, jlong controllerAddress)
+{
+	try
+	{
+		AIOController * controller = (AIOController *) controllerAddress;
+		delete controller;
+	}
+	catch (AIOException& e)
+	{
+		throwException(env, "java/lang/RuntimeException", e.what());
+	}
+}

Modified: projects/jaio/trunk/jaio/native/src/PageManager.cpp
===================================================================
--- projects/jaio/trunk/jaio/native/src/PageManager.cpp	2008-02-12 15:17:13 UTC (rev 3709)
+++ projects/jaio/trunk/jaio/native/src/PageManager.cpp	2008-02-12 21:15:01 UTC (rev 3710)
@@ -33,11 +33,15 @@
 	
 	if (pagePosition + size > pageSize)
 	{
+		int bytesToPage = pageSize - pagePosition;
+		
 		char * mem = (char *)malloc(size);
 		memset(mem, 0, size);
 		adapter->encode(size, mem);
 		long local = 0;
 		
+		adapter->setBlocks(((size - bytesToPage) / pageSize)   + 1);
+
 		while (size - local > 0)
 		{
 			adapter->addref();
@@ -53,9 +57,10 @@
 			}
 		}
 		
+		
 		adapter->deleteRef();
 		
-		delete mem;
+		free(mem);
 	}
 	else
 	{

Modified: projects/jaio/trunk/jaio/native/src/org_jboss_jaio_libaioimpl_LibAIOController.h
===================================================================
--- projects/jaio/trunk/jaio/native/src/org_jboss_jaio_libaioimpl_LibAIOController.h	2008-02-12 15:17:13 UTC (rev 3709)
+++ projects/jaio/trunk/jaio/native/src/org_jboss_jaio_libaioimpl_LibAIOController.h	2008-02-12 21:15:01 UTC (rev 3710)
@@ -39,6 +39,14 @@
 JNIEXPORT void JNICALL Java_org_jboss_jaio_libaioimpl_LibAIOController_flushMemory
   (JNIEnv *, jclass, jlong);
 
+/*
+ * Class:     org_jboss_jaio_libaioimpl_LibAIOController
+ * Method:    closeInternal
+ * Signature: (J)V
+ */
+JNIEXPORT void JNICALL Java_org_jboss_jaio_libaioimpl_LibAIOController_closeInternal
+  (JNIEnv *, jclass, jlong);
+
 #ifdef __cplusplus
 }
 #endif




More information about the jboss-cvs-commits mailing list